hts/packages/isdk/anthropic/convert-to-anthropic-messag...

101 lines
2.5 KiB
TypeScript

import {
LanguageModelV1Prompt,
UnsupportedFunctionalityError,
} from '@ai-sdk/provider';
import { convertUint8ArrayToBase64 } from '../spec';
import {
AnthropicMessage,
AnthropicMessagesPrompt,
} from './anthropic-messages-prompt';
export function convertToAnthropicMessagesPrompt(
prompt: LanguageModelV1Prompt,
): AnthropicMessagesPrompt {
let system: string | undefined;
const messages: AnthropicMessage[] = [];
for (const { role, content } of prompt) {
switch (role) {
case 'system': {
system = content;
break;
}
case 'user': {
messages.push({
role: 'user',
content: content.map(part => {
switch (part.type) {
case 'text': {
return { type: 'text', text: part.text };
}
case 'image': {
if (part.image instanceof URL) {
throw new UnsupportedFunctionalityError({
functionality: 'URL image parts',
});
} else {
return {
type: 'image',
source: {
type: 'base64',
media_type: part.mimeType ?? 'image/jpeg',
data: convertUint8ArrayToBase64(part.image),
},
};
}
}
}
}),
});
break;
}
case 'assistant': {
messages.push({
role: 'assistant',
content: content.map(part => {
switch (part.type) {
case 'text': {
return { type: 'text', text: part.text };
}
case 'tool-call': {
return {
type: 'tool_use',
id: part.toolCallId,
name: part.toolName,
input: part.args,
};
}
}
}),
});
break;
}
case 'tool': {
messages.push({
role: 'user',
content: content.map(part => ({
type: 'tool_result',
tool_use_id: part.toolCallId,
content: JSON.stringify(part.result),
is_error: part.isError,
})),
});
break;
}
default: {
const _exhaustiveCheck: never = role;
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
}
}
}
return {
system,
messages,
};
}