This commit is contained in:
Thomas Arek Glod 2026-04-23 00:23:13 +08:00 committed by GitHub
commit 7d8575009d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -528,7 +528,8 @@ function formatBytes(bytes: number): string {
export function convertFromMessages(messages: z.infer<typeof Message>[]): ModelMessage[] {
const result: ModelMessage[] = [];
for (const msg of messages) {
for (let i = 0; i < messages.length; i++) {
const msg = messages[i];
const { providerOptions } = msg;
switch (msg.role) {
case "assistant":
@ -602,23 +603,50 @@ export function convertFromMessages(messages: z.infer<typeof Message>[]): ModelM
});
}
break;
case "tool":
case "tool": {
// Collect all consecutive tool messages into a single message
// This is required by Anthropic's API which expects all tool_result blocks
// for parallel tool calls to be in a single message
const toolResults: Array<{
type: "tool-result";
toolCallId: string;
toolName: string;
output: { type: "text"; value: string };
}> = [];
// Add current tool message
toolResults.push({
type: "tool-result",
toolCallId: msg.toolCallId,
toolName: msg.toolName,
output: {
type: "text",
value: msg.content,
},
});
// Collect any consecutive tool messages
while (i + 1 < messages.length && messages[i + 1].role === "tool") {
i++;
const nextMsg = messages[i] as z.infer<typeof ToolMessage>;
toolResults.push({
type: "tool-result",
toolCallId: nextMsg.toolCallId,
toolName: nextMsg.toolName,
output: {
type: "text",
value: nextMsg.content,
},
});
}
result.push({
role: "tool",
content: [
{
type: "tool-result",
toolCallId: msg.toolCallId,
toolName: msg.toolName,
output: {
type: "text",
value: msg.content,
},
},
],
content: toolResults,
providerOptions,
});
break;
}
}
}
// doing this because: https://github.com/OpenRouterTeam/ai-sdk-provider/issues/262