快速结论:这个报错通常出现在通过 LiteLLM 的 Google/Vertex 原生 generate_content(含 streamGenerateContent)路径转发工具调用请求时,上游本应强制或约束函数调用的 toolConfig 被丢弃,导致合法的工具调用请求返回空响应:HTTP 200、单个 SSE 事件、candidates[0].content.parts[0].text == ""、finishReason == "STOP",且没有后续 functionCall。优先排查 LiteLLM 版本是否已包含上游对 toolConfig 的透传修复。
适用环境:Issue 中已确认的环境信息为:工具 LiteLLM;厂商路径 Google Gemini / Vertex 原生 generate_content;请求端点形如 /v1beta/models/gemini-3-flash-preview:streamGenerateContent?alt=sse。Issue 未提供操作系统、Python、CUDA、显卡或具体依赖版本信息,无法据此补充。
最快修复方案:暂无确认的一步修复方案。Issue 讨论摘要指出,当前上游版本已将 toolConfig 纳入共享的原生请求字段允许列表(shared native request field allowlist)并合并进下游厂商请求,报告因此被关闭。可优先尝试升级到包含该修复的 LiteLLM 版本,再复测原请求;Issue 未给出具体版本号,升级前请自行核对目标版本是否包含所指的字段允许列表改动。
注意事项:Issue 明确指出同一次转换中 generationConfig.thinkingConfig 被重命名为 generationConfig.thinking_config,但这不是导致请求失效的原因,不要围绕该重命名做无效改动。修复只针对原生 Vertex/Google 路径的字段透传;其它代理路径是否受影响,Issue 未给出证据。
问题场景
用户通过 LiteLLM 代理向 Gemini/Vertex 发送原生格式请求(请求体顶层包含 contents、generationConfig、systemInstruction、tools、toolConfig),其中 toolConfig.functionCallingConfig.mode 设为 ANY,并带有历史工具调用与 functionResponse,要求模型继续发起工具调用(如 execute_command)。请求返回 HTTP 200 但内容为空,模型没有继续调用工具。
报错原文
[Bug]: Native Gemini/Vertex `generate_content` drops `toolConfig`, causing empty STOP on valid tool-calling requests
HTTP 200
candidates[0].content.parts[0].text == ""
finishReason == "STOP"
no follow-up `functionCall`
Original payload keys:
['contents', 'generationConfig', 'systemInstruction', 'toolConfig', 'tools']
LiteLLM-transformed payload keys:
['contents', 'generationConfig', 'model', 'systemInstruction', 'tools']
原因分析
最可能的原因是:LiteLLM 的原生 Google/Vertex 请求转换在转发前没有保留顶层 toolConfig。用户通过 LiteLLM 的原生 Vertex 转换在本地重建请求体验证过,转换后的 payload 中 contents 保持不变、toolConfig 缺失,generationConfig.thinkingConfig 被映射为 generationConfig.thinking_config。作者已明确排除 thinkingConfig 重命名这一因素,认为缺失的 toolConfig 才是导致行为从正常的后续工具调用变成空 STOP 响应的原因。按讨论摘要,后续上游修复方式是将 toolConfig 加入共享原生请求字段允许列表,使其被合并进下游厂商请求。
环境排查
- 确认 LiteLLM 版本:是否为包含
toolConfig透传修复的版本(Issue 未给出具体版本号,需对照所用版本的litellm/llms/base_llm/google_genai/transformation.py中字段允许列表是否含toolConfig)。 - 确认请求路径:是否为 Google/Vertex 原生
generate_content/streamGenerateContent路径,而非其它代理转换路径。 - 确认请求体:顶层是否确实携带
toolConfig,且functionCallingConfig.mode为预期值(如ANY)。 - 确认响应特征:是否为
HTTP 200+ 单个 SSE 事件 + 空text+finishReason为STOP+ 无functionCall。 - Issue 未提供操作系统、Python、CUDA、显卡信息,无需核对这些项。
解决步骤
- 升级 LiteLLM 到包含
toolConfig字段透传修复的版本。可核对目标版本对应的litellm/llms/base_llm/google_genai/transformation.py,确认共享原生请求字段允许列表中包含toolConfig。 - 升级后,用 Issue 中给出的原始请求体(顶层同时包含
tools和toolConfig.functionCallingConfig.mode = "ANY")重新发送到/v1beta/models/<model>:streamGenerateContent?alt=sse复测。 - 如仍复现,在 LiteLLM 原生日志或调试输出中抓取实际转发给 Vertex 的请求体,检查顶层键是否包含
toolConfig,并确认contents与generationConfig未被意外改动。 - 若确认目标版本仍未透传
toolConfig,可优先尝试临时绕行:在 LiteLLM 侧将请求转换为 OpenAI 兼容格式后再由 LiteLLM 转发,或在调用端显式携带工具配置;注意这两种做法均为推测性绕行,Issue 中并未验证。
验证方法
重新发送原工具调用请求后,响应应不再是空 STOP:期望 candidates[0].content.parts 中出现后续 functionCall(例如 execute_command),或在 mode: "ANY" 约束下返回符合预期的工具调用,而不是 text == "" 且 finishReason == "STOP" 的空响应。同时建议直接在转发请求体中确认 toolConfig 已保留。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


