105 lines
2.7 KiB
TypeScript
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;
|
|
}
|