[Bug]: Native Gemini/Vertex `generate_content` drops `toolConfig`, causing empty STOP on valid tool-calling requests

这个报错通常出现在通过 LiteLLM 的 Google/Vertex 原生 generate_content (含 streamGenerateContent )路径转发工具调用请求时,上游本应强制或约束函数调用的 toolConfig 被丢弃,导致合法的工具调用请求返回空响应: HTTP 200

快速结论:这个报错通常出现在通过 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、显卡信息,无需核对这些项。

解决步骤

  1. 升级 LiteLLM 到包含 toolConfig 字段透传修复的版本。可核对目标版本对应的 litellm/llms/base_llm/google_genai/transformation.py,确认共享原生请求字段允许列表中包含 toolConfig。
  2. 升级后,用 Issue 中给出的原始请求体(顶层同时包含 tools 和 toolConfig.functionCallingConfig.mode = "ANY")重新发送到 /v1beta/models/<model>:streamGenerateContent?alt=sse 复测。
  3. 如仍复现,在 LiteLLM 原生日志或调试输出中抓取实际转发给 Vertex 的请求体,检查顶层键是否包含 toolConfig,并确认 contents 与 generationConfig 未被意外改动。
  4. 若确认目标版本仍未透传 toolConfig,可优先尝试临时绕行:在 LiteLLM 侧将请求转换为 OpenAI 兼容格式后再由 LiteLLM 转发,或在调用端显式携带工具配置;注意这两种做法均为推测性绕行,Issue 中并未验证。

验证方法

重新发送原工具调用请求后,响应应不再是空 STOP:期望 candidates[0].content.parts 中出现后续 functionCall(例如 execute_command),或在 mode: "ANY" 约束下返回符合预期的工具调用,而不是 text == "" 且 finishReason == "STOP" 的空响应。同时建议直接在转发请求体中确认 toolConfig 已保留。

参考来源

BerriAI/litellm #23491

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 35203

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注