Merge 090592b41ec9728fad9e5adba96ca829e0dd2f82 into 5e417b44e1540f528d2ae63e3e20229a902d1db2

This commit is contained in:
yangyitao 2026-03-21 02:35:36 +00:00 committed by GitHub
commit e2f8cb7192
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 2 deletions

View File

@ -54,6 +54,32 @@ describe("convertToOllamaMessages", () => {
]);
});
it("parses stringified JSON arguments from OpenAI-compat tool calls", () => {
const messages = [
{
role: "assistant",
content: [
{ type: "toolCall", id: "call_2", name: "bash", arguments: '{"command":"ls -la"}' },
],
},
];
const result = convertToOllamaMessages(messages);
expect(result[0].tool_calls).toEqual([
{ function: { name: "bash", arguments: { command: "ls -la" } } },
]);
});
it("handles malformed JSON string arguments gracefully", () => {
const messages = [
{
role: "assistant",
content: [{ type: "toolCall", id: "call_3", name: "bash", arguments: "not-json" }],
},
];
const result = convertToOllamaMessages(messages);
expect(result[0].tool_calls).toEqual([{ function: { name: "bash", arguments: {} } }]);
});
it("converts tool result messages with 'tool' role", () => {
const messages = [{ role: "tool", content: "file1.txt\nfile2.txt" }];
const result = convertToOllamaMessages(messages);

View File

@ -246,6 +246,25 @@ function extractOllamaImages(content: unknown): string[] {
.map((part) => part.data);
}
/** Parse arguments that may arrive as a JSON string (OpenAI-compat endpoints) into an object. */
function ensureArgsObject(args: unknown): Record<string, unknown> {
if (typeof args === "string") {
try {
const parsed = JSON.parse(args);
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return parsed as Record<string, unknown>;
}
} catch {
// Malformed JSON return empty args so the call can still proceed.
}
return {};
}
if (args && typeof args === "object" && !Array.isArray(args)) {
return args as Record<string, unknown>;
}
return {};
}
function extractToolCalls(content: unknown): OllamaToolCall[] {
if (!Array.isArray(content)) {
return [];
@ -254,9 +273,9 @@ function extractToolCalls(content: unknown): OllamaToolCall[] {
const result: OllamaToolCall[] = [];
for (const part of parts) {
if (part.type === "toolCall") {
result.push({ function: { name: part.name, arguments: part.arguments } });
result.push({ function: { name: part.name, arguments: ensureArgsObject(part.arguments) } });
} else if (part.type === "tool_use") {
result.push({ function: { name: part.name, arguments: part.input } });
result.push({ function: { name: part.name, arguments: ensureArgsObject(part.input) } });
}
}
return result;