hts/packages/isdk/openai/convert-to-openai-chat-mess...

105 lines
2.7 KiB
TypeScript

import { LanguageModelV1Prompt } from '@ai-sdk/provider';
import { convertUint8ArrayToBase64 } from '../spec';
import { OpenAIChatPrompt } from './openai-chat-prompt';
export function convertToOpenAIChatMessages(
prompt: LanguageModelV1Prompt,
): OpenAIChatPrompt {
const messages: OpenAIChatPrompt = [];
for (const { role, content } of prompt) {
switch (role) {
case 'system': {
messages.push({ role: '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': {
return {
type: 'image_url',
image_url: {
url:
part.image instanceof URL
? part.image.toString()
: `data:${
part.mimeType ?? 'image/jpeg'
};base64,${convertUint8ArrayToBase64(part.image)}`,
},
};
}
}
}),
});
break;
}
case 'assistant': {
let text = '';
const toolCalls: Array<{
id: string;
type: 'function';
function: { name: string; arguments: string };
}> = [];
for (const part of content) {
switch (part.type) {
case 'text': {
text += part.text;
break;
}
case 'tool-call': {
toolCalls.push({
id: part.toolCallId,
type: 'function',
function: {
name: part.toolName,
arguments: JSON.stringify(part.args),
},
});
break;
}
default: {
const _exhaustiveCheck: never = part;
throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
}
}
}
messages.push({
role: 'assistant',
content: text,
tool_calls: toolCalls.length > 0 ? toolCalls : undefined,
});
break;
}
case 'tool': {
for (const toolResponse of content) {
messages.push({
role: 'tool',
tool_call_id: toolResponse.toolCallId,
content: JSON.stringify(toolResponse.result),
});
}
break;
}
default: {
const _exhaustiveCheck: never = role;
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
}
}
}
return messages;
}