From 7f7fc78072a2d5fc11e1b91ee5708b6a805e9d74 Mon Sep 17 00:00:00 2001 From: hex2077 Date: Sun, 14 Sep 2025 21:37:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor(convert):=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=BD=AC=E6=8D=A2=E9=80=BB=E8=BE=91=E5=B9=B6?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构了从OpenAI和Claude请求转换Gemini工具的逻辑,移除了functionDeclarations包装层,直接映射工具名称和参数。同时优化了无效工具的过滤处理,保持代码一致性。 --- src/convert.js | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/src/convert.js b/src/convert.js index 2dc6a4e..194a2a5 100644 --- a/src/convert.js +++ b/src/convert.js @@ -1042,13 +1042,11 @@ export function toGeminiRequestFromOpenAI(openaiRequest) { // Handle tools and tool_choice if (openaiRequest.tools?.length) { - geminiRequest.tools = [{ - functionDeclarations: openaiRequest.tools.map(t => ({ - name: t.function.name, - description: t.function.description, - parameters: t.function.parameters - })) - }]; + geminiRequest.tools = openaiRequest.tools.map(t => { + const tool = {}; + tool[t.function.name] = t.function.parameters || {}; + return tool; + }); } if (openaiRequest.tool_choice) { @@ -1698,24 +1696,20 @@ export function toGeminiRequestFromClaude(claudeRequest) { // Handle tools if (Array.isArray(claudeRequest.tools)) { - 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 - } + 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 + } - 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) { + 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 geminiRequest.tools; } }