-
-
Notifications
You must be signed in to change notification settings - Fork 7.8k
/
anthropicHelpers.ts
57 lines (47 loc) 路 1.6 KB
/
anthropicHelpers.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import Anthropic from '@anthropic-ai/sdk';
import { OpenAIChatMessage, UserMessageContentPart } from '../types';
import { parseDataUri } from './uriParser';
export const buildAnthropicBlock = (
content: UserMessageContentPart,
): Anthropic.ContentBlock | Anthropic.ImageBlockParam => {
switch (content.type) {
case 'text': {
return content;
}
case 'image_url': {
const { mimeType, base64 } = parseDataUri(content.image_url.url);
return {
source: {
data: base64 as string,
media_type: mimeType as Anthropic.ImageBlockParam.Source['media_type'],
type: 'base64',
},
type: 'image',
};
}
}
};
export const buildAnthropicMessage = (
message: OpenAIChatMessage,
): Anthropic.Messages.MessageParam => {
const content = message.content as string | UserMessageContentPart[];
return {
content: typeof content === 'string' ? content : content.map((c) => buildAnthropicBlock(c)),
role: message.role === 'function' || message.role === 'system' ? 'assistant' : message.role,
};
};
export const buildAnthropicMessages = (
oaiMessages: OpenAIChatMessage[],
): Anthropic.Messages.MessageParam[] => {
const messages: Anthropic.Messages.MessageParam[] = [];
let lastRole = 'assistant';
oaiMessages.forEach((message) => {
const anthropicMessage = buildAnthropicMessage(message);
if (lastRole === anthropicMessage.role) {
messages.push({ content: '_', role: lastRole === 'user' ? 'assistant' : 'user' });
}
lastRole = anthropicMessage.role;
messages.push(anthropicMessage);
});
return messages;
};