Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .speakeasy/in.openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down
38 changes: 38 additions & 0 deletions tests/e2e/chat.test.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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);
});
});