mirror of
https://github.com/justlovemaki/AIClient-2-API.git
synced 2026-04-27 02:15:50 +03:00
[GH-ISSUE #18] 代理在使用 LangChain 的 with_structured_output 功能时,未能正确处理工具调用(Tool Calling)请求 #16
Labels
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/AIClient-2-API-justlovemaki#16
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @bosens-China on GitHub (Aug 5, 2025).
Original GitHub issue: https://github.com/justlovemaki/AIClient-2-API/issues/18
一、环境信息
~0.2.0gemini-1.5-pro(通过gemini-cli-oauth模式)langchain-openai)二、问题描述
当我尝试使用 LangChain 的
.with_structured_output()方法,通过AIClient-2-API代理调用 Gemini 1.5 Pro 模型时,程序会抛出pydantic.ValidationError。错误日志显示,模型返回的并非纯净的 JSON 字符串,而是包含了对话式的开场白和 Markdown 的代码块标记,例如:`Of course, here is the... ```json ... ````。
这表明
AIClient-2-API代理在转发请求时,可能丢失了结构化输出所必需的“工具调用 (Tool Calling)”协议信息,导致 Gemini 模型将请求理解成了一个普通的聊天任务,而非严格的 JSON 生成任务。三、复现步骤
1. 定义 Pydantic 模型 (用于结构化输出)
四、期望行为
当使用
structured_llm_proxy.invoke()时,我期望AIClient-2-API能够正确地将 LangChain 的工具调用请求转发给 Gemini,并返回一个可以被BatchOutput模型直接解析的、纯净的 JSON 字符串。五、实际行为
程序抛出
pydantic.ValidationError,因为从代理返回的响应文本包含了非 JSON 的额外内容,导致解析失败。错误信息如下:六、根本原因推断
我推断问题的根本原因在于
AIClient-2-API在转换 OpenAI 兼容的 API 请求到 Gemini 原生请求时,没有正确处理或转发‘工具调用’(Tool Calling / Function Calling)相关的参数。当 LangChain 使用
.with_structured_output()时,它发送的 OpenAI 格式请求中会包含tools和tool_choice字段。代理服务很可能忽略了这些字段,只提取了messages数组中的内容,并将其作为一个普通的聊天请求发送给了 Gemini。因此,Gemini 从未收到“必须使用工具进行输出”的指令,导致其退回到了默认的、对话式的响应模式。
七、修复建议
建议检查代理服务中处理
/v1/chat/completions请求的核心逻辑。需要增加对请求体中tools和tool_choice参数的识别和转换,将其正确地映射为 Gemini API 所需的tools参数格式。@justlovemaki commented on GitHub (Aug 5, 2025):
在源码convert.js的toGeminiRequestFromOpenAI中是有工具调用的转换的。
我推测是使用的模型输出不稳定,提示词可以再优化一下,增加禁止行为,让输出更确定。也可能是gemini-1.5不支持工具调用。
另外,你可以增加日志,把转换前和转换后的request作为文件传上来,这样更有利于排查问题。
@bosens-China commented on GitHub (Aug 5, 2025):
切换到2.5pro也是同样的问题,在调试的时候发现有一些非结构的输出,例如“用户要求...”这个推测才是导致无法结构化输出的原因,你在使用的过程中有相关的调用成功示例吗?
我使用了gemni的api密钥,发现是可以的,所以提示词的问题可能关系不大。
@justlovemaki commented on GitHub (Aug 5, 2025):
所以还是得看你的请求json,把转换前和转换后的request作为文件传上来。
请求里传了工具调用with_structured_output,返回的不是json,就可以排除工具调用没传得问题, 可能是模型不支持调用工具。
“例如“用户要求...”这个推测才是导致无法结构化输出的原因”,应该是开了think,把think标签得内容移除,或者关闭think试一下。