diff --git a/.speakeasy/in.openapi.yaml b/.speakeasy/in.openapi.yaml index 4047ff25..457c8c03 100644 --- a/.speakeasy/in.openapi.yaml +++ b/.speakeasy/in.openapi.yaml @@ -5046,12 +5046,36 @@ components: - type - video_url type: object + ChatMessageContentItemFile: + type: object + properties: + type: + type: string + const: file + file: + type: object + properties: + filename: + type: string + file_data: + type: string + description: URL or base64-encoded file data + file_id: + type: string + description: ID of a previously uploaded file + required: + - filename + required: + - type + - file + description: File content item for PDFs and other documents ChatMessageContentItem: oneOf: - $ref: '#/components/schemas/ChatMessageContentItemText' - $ref: '#/components/schemas/ChatMessageContentItemImage' - $ref: '#/components/schemas/ChatMessageContentItemAudio' - $ref: '#/components/schemas/ChatMessageContentItemVideo' + - $ref: '#/components/schemas/ChatMessageContentItemFile' type: object discriminator: propertyName: type @@ -5061,6 +5085,7 @@ components: input_audio: '#/components/schemas/ChatMessageContentItemAudio' input_video: '#/components/schemas/ChatMessageContentItemVideo' video_url: '#/components/schemas/ChatMessageContentItemVideo' + file: '#/components/schemas/ChatMessageContentItemFile' ChatMessageToolCall: type: object properties: diff --git a/tests/e2e/chat.test.ts b/tests/e2e/chat.test.ts index b5ad310a..3fb134b0 100644 --- a/tests/e2e/chat.test.ts +++ b/tests/e2e/chat.test.ts @@ -1,4 +1,5 @@ import type { ChatStreamingResponseChunkData } from '../../src/models/chatstreamingresponsechunk.js'; +import type { ChatMessageContentItemFile } from '../../src/models/chatmessagecontentitemfile.js'; import { beforeAll, describe, expect, it } from 'vitest'; import { OpenRouter } from '../../src/sdk/sdk.js'; @@ -184,4 +185,41 @@ describe('Chat E2E Tests', () => { expect(foundFinishReason).toBe(true); }, 10000); }); + + describe('chat.send() - File Content Type', () => { + it('should successfully send a request with file content (PDF via URL)', async () => { + const fileContent: ChatMessageContentItemFile = { + type: 'file', + file: { + filename: 'bitcoin.pdf', + fileData: 'https://bitcoin.org/bitcoin.pdf', + }, + }; + + const response = await client.chat.send({ + model: 'anthropic/claude-sonnet-4', + messages: [ + { + role: 'user', + content: [ + { type: 'text', text: 'What is the title of this document? Reply in 10 words or less.' }, + fileContent, + ], + }, + ], + maxTokens: 50, + stream: false, + }); + + expect(response).toBeDefined(); + expect(Array.isArray(response.choices)).toBe(true); + expect(response.choices.length).toBeGreaterThan(0); + + const content = response.choices[0]?.message?.content; + expect(content).toBeDefined(); + expect(typeof content).toBe('string'); + // The response should mention Bitcoin or the paper title + expect((content as string).toLowerCase()).toMatch(/bitcoin|peer|electronic|cash/); + }, 30000); + }); });