[llm] Gemini 3 tool loop fails with 400: thought signature is not sent back
维护者通常 1 天内回复
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 76/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- python
调研方向
Start with the stream and non-stream parsers in ms_agent/llm/transport/openai_compat.py, then trace _merge_stream_message and Message.to_dict_clean. Keep extra_content through parsing, merging, and serialization; done means the thought signature survives the tool-call round trip. Run the relevant tests in tests/llm and tests/agent.
由索引模型根据 Issue 内容生成。
描述
Found while testing LLM provider integrations in agent frameworks: an automated tool flags candidates and each one is reproduced before it is reported. Reproduced on 6d90d84 with a local stub that applies Google's documented rule, so the 400 below is mimicked, not from a live call.
Initial Checks
- I have searched related issues and docs but cannot get the expected help.
- The bug has not been fixed in the latest version.
A clear and concise description of what the bug is.
An agent on the built-in google provider with a Gemini 3 model (gemini-3.5-flash here) stops at its first tool result. On Gemini's OpenAI-compatible endpoint the signature comes on the tool call as extra_content.google.thought_signature. ms-agent does not keep that field, so the next request replays the call without it. Google's thought signatures page says: "If a required thought signature is not returned when using Gemini 3 models, the model will return a 400 error." The same message was reported from the real API on another project in shy3130/tick-stock-panel#452.
Repro against a local stub of that endpoint. Its first reply is a read_file call with a signature, and it answers 400 when the signature does not come back:
agent = LLMAgent(config=OmegaConf.create({
'llm': {'service': 'google', 'model': 'gemini-3.5-flash',
'google_api_key': 'test', 'google_base_url': STUB_URL},
'generation_config': {'stream': True},
'tools': {'file_system': {'mcp': False, 'include': ['read_file']}},
'output_dir': work_dir,
}))
asyncio.run(agent.run('read a.txt'))
openai.BadRequestError: Error code: 400 - Function call is missing a thought_signature in functionCall parts.
turn 1 reply signature: CsUBAY89a1_fake_signature_from_turn_1==
turn 2 request tool call: {"id": "call_1", "type": "function", "function": {"name": "file_system---read_file", "arguments": "{\"paths\": [\"a.txt\"]}"}}
Same result without streaming, and on the legacy OpenAI client with service: openai and a Gemini base URL. Expected: the tool call in the second request keeps its extra_content.
The parsers build ToolCall from id, index, type and function only (stream parser, and the non-stream one next to it), and Message.to_dict_clean rebuilds the wire tool call from those same keys. Thinking cannot be switched off on these models, so reasoning_effort: off does not avoid it.
Fix idea: keep extra_content on ToolCall in both parsers and in _merge_stream_message, and put it back in to_dict_clean. With that in the router transport and the legacy client the stub run finishes, the field survives the session log round trip, and the tests in tests/llm and tests/agent that I ran still pass.
Versions / Dependencies
ms-agent 1.6.0 at 6d90d84 (main), Python 3.12.4, openai 3.41.0, Linux.
- 主要语言
- Python
- 星标
- 4.4k
- 派生
- 544
- 平均合并
- 2 天 12 小时
- 30 天内合并 PR
- 5
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
modelscope/ms-agent 的其他 Issue
-
Skill search returns stale results after all skills are disabled or removed可能已有人在做 @AWUQAQ 于 63 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
modelscope/ms-agent#974 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 30/100
modelscope/ms-agent#1047 ·
维护者通常 1 天内回复
-
fetch_page web tool performs unrestricted server-side HTTP fetch of agent-supplied URLs (SSRF)可能已有人在做 @SiyuanChenToDo 于 27 天前认领。 未关闭
难度 4/5 3-5 天 新手友好度 45/100
modelscope/ms-agent#1018 ·
维护者通常 1 天内回复
-
难度 5/5 一周以上 新手友好度 25/100
modelscope/ms-agent#1011 ·
维护者通常 1 天内回复
-
[tool] Document authenticated Streamable HTTP MCP setup可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 3/5 1-2 天 新手友好度 68/100
modelscope/ms-agent#1003 · 2 条评论 ·
维护者通常 1 天内回复
查看 modelscope/ms-agent 的全部 Issue
相似的 Issue
-
enhancement
难度 2/5 1-3 小时 新手友好度 76/100
Sienna-Platform/SiennaSchemas#130 ·
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
-
难度 1/5 1 小时以内 新手友好度 85/100
firedrakeproject/Irksome#293 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
ida-arbeitszeit/workers-control#1578 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
aws-samples/sample-per-model-bedrock#898 ·
维护者通常 1 天内回复