From 2930437616690e617ed1b07c493b75a92349e136 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Tue, 16 Sep 2025 20:21:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(convert):=20=E4=BF=AE=E5=A4=8DClaude?= =?UTF-8?q?=E5=88=B0Gemini=E5=B7=A5=E5=85=B7=E8=BD=AC=E6=8D=A2=E7=9A=84?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构工具转换逻辑以匹配Gemini API要求的格式,确保工具名称和描述为字符串类型,并移除input_schema中的$schema字段。当没有有效工具时正确删除tools数组。 --- src/convert.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/convert.js b/src/convert.js index 194a2a5..0fa21e2 100644 --- a/src/convert.js +++ b/src/convert.js @@ -1696,20 +1696,24 @@ export function toGeminiRequestFromClaude(claudeRequest) { // Handle tools if (Array.isArray(claudeRequest.tools)) { - geminiRequest.tools = claudeRequest.tools.map(tool => { - // Ensure tool is a valid object and has a name - if (!tool || typeof tool !== 'object' || !tool.name) { - console.warn("Skipping invalid tool declaration in claudeRequest.tools."); - return null; // Return null for invalid tools, filter out later - } + geminiRequest.tools = [{ + functionDeclarations: claudeRequest.tools.map(tool => { + // Ensure tool is a valid object and has a name + if (!tool || typeof tool !== 'object' || !tool.name) { + console.warn("Skipping invalid tool declaration in claudeRequest.tools."); + return null; // Return null for invalid tools, filter out later + } - const geminiTool = {}; - geminiTool[tool.name] = tool.input_schema && typeof tool.input_schema === 'object' ? tool.input_schema : {}; - return geminiTool; - }).filter(Boolean); // Filter out any nulls from invalid tool declarations - - // If no valid tools, remove the tools array - if (geminiRequest.tools.length === 0) { + delete tool.input_schema.$schema; + return { + name: String(tool.name), // Ensure name is string + description: String(tool.description || ''), // Ensure description is string + parameters: tool.input_schema && typeof tool.input_schema === 'object' ? tool.input_schema : { type: 'object', properties: {} } + }; + }).filter(Boolean) // Filter out any nulls from invalid tool declarations + }]; + // If no valid functionDeclarations, remove the tools array + if (geminiRequest.tools[0].functionDeclarations.length === 0) { delete geminiRequest.tools; } }