Skip to content

Commit 2eed829

Browse files
committed
add support for anthropic pdf
1 parent de327f6 commit 2eed829

File tree

2 files changed

+84
-1
lines changed

2 files changed

+84
-1
lines changed

src/providers/anthropic/chatComplete.ts

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,40 @@ interface AnthropicTextContentItem {
6363
text: string;
6464
}
6565

66+
interface AnthropicUrlPdfContentItem {
67+
type: 'document';
68+
source: {
69+
type: 'url';
70+
url: string;
71+
};
72+
}
73+
74+
interface AnthropicBase64PdfContentItem {
75+
type: 'document';
76+
source: {
77+
type: 'base64';
78+
data: string;
79+
media_type: string;
80+
};
81+
}
82+
83+
interface AnthropicPlainTextContentItem {
84+
type: 'document';
85+
source: {
86+
type: 'text';
87+
data: string;
88+
media_type: string;
89+
};
90+
}
91+
6692
type AnthropicMessageContentItem =
6793
| AnthropicToolResultContentItem
6894
| AnthropicBase64ImageContentItem
6995
| AnthropicUrlImageContentItem
70-
| AnthropicTextContentItem;
96+
| AnthropicTextContentItem
97+
| AnthropicUrlPdfContentItem
98+
| AnthropicBase64PdfContentItem
99+
| AnthropicPlainTextContentItem;
71100

72101
interface AnthropicMessage extends Message, PromptCache {
73102
content: AnthropicMessageContentItem[];
@@ -166,6 +195,46 @@ const transformAndAppendImageContentItem = (
166195
}
167196
};
168197

198+
const transformAndAppendFileContentItem = (
199+
item: ContentType,
200+
transformedMessage: AnthropicMessage
201+
) => {
202+
const mimeType =
203+
(item.file?.mime_type as keyof typeof fileExtensionMimeTypeMap) ||
204+
fileExtensionMimeTypeMap.pdf;
205+
if (item.file?.file_url) {
206+
transformedMessage.content.push({
207+
type: 'document',
208+
source: {
209+
type: 'url',
210+
url: item.file.file_url,
211+
},
212+
});
213+
} else if (item.file?.file_data) {
214+
const contentType =
215+
mimeType === fileExtensionMimeTypeMap.txt ? 'text' : 'base64';
216+
if (contentType === 'text') {
217+
transformedMessage.content.push({
218+
type: 'document',
219+
source: {
220+
type: contentType,
221+
data: item.file.file_data,
222+
media_type: mimeType,
223+
},
224+
});
225+
} else {
226+
transformedMessage.content.push({
227+
type: 'document',
228+
source: {
229+
type: contentType,
230+
data: item.file.file_data,
231+
media_type: mimeType,
232+
},
233+
});
234+
}
235+
}
236+
};
237+
169238
export const AnthropicChatCompleteConfig: ProviderConfig = {
170239
model: {
171240
param: 'model',
@@ -205,6 +274,8 @@ export const AnthropicChatCompleteConfig: ProviderConfig = {
205274
});
206275
} else if (item.type === 'image_url') {
207276
transformAndAppendImageContentItem(item, transformedMessage);
277+
} else if (item.type === 'file') {
278+
transformAndAppendFileContentItem(item, transformedMessage);
208279
}
209280
});
210281
messages.push(transformedMessage as AnthropicMessage);

src/types/requestBody.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ export interface Config {
216216
}
217217

218218
/**
219+
* TODO: make this a union type
219220
* A message content type.
220221
* @interface
221222
*/
@@ -230,6 +231,17 @@ export interface ContentType extends PromptCache {
230231
mime_type?: string;
231232
};
232233
data?: string;
234+
file?: {
235+
file_data?: string;
236+
file_id?: string;
237+
file_name?: string;
238+
file_url?: string;
239+
mime_type?: string;
240+
};
241+
input_audio?: {
242+
data: string;
243+
format: string; //defaults to auto
244+
};
233245
}
234246

235247
export interface ToolCall {

0 commit comments

Comments
 (0)