hts/packages/isdk/mistral/convert-to-mistral-chat-mes...

106 lines
2.6 KiB
TypeScript

import {
LanguageModelV1Prompt,
UnsupportedFunctionalityError,
} from '@ai-sdk/provider';
import { MistralChatPrompt } from './mistral-chat-prompt';
export function convertToMistralChatMessages(
prompt: LanguageModelV1Prompt,
): MistralChatPrompt {
const messages: MistralChatPrompt = [];
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 part.text;
}
case 'image': {
throw new UnsupportedFunctionalityError({
functionality: 'image-part',
});
}
}
})
.join(''),
});
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.map(({ function: { name, arguments: args } }) => ({
id: 'null',
type: 'function',
function: { name, arguments: args },
}))
: undefined,
});
break;
}
case 'tool': {
for (const toolResponse of content) {
messages.push({
role: 'tool',
name: toolResponse.toolName,
content: JSON.stringify(toolResponse.result),
});
}
break;
}
default: {
const _exhaustiveCheck: never = role;
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
}
}
}
return messages;
}