Gemini continuation and /compact fail with "Tool name is required" on mixed-model history
还没有人认领这个 Issue。
评估
调研方向
No source files or tests are named. Start by tracing cross-model history normalization and the Gemini request adaptation, including how custom.name is handled during normal requests and /compact. Done means supported model switching, resume, rewind, and compaction no longer fail on historical apply_patch calls, with a regression test covering the mixed-model history.
由索引模型根据 Issue 内容生成。
描述
Describe the bug
A long-lived, mixed-model Copilot CLI session fails to continue with Gemini:
400 Tool name is required for Gemini requests
{"message":"Tool name is required for Gemini requests","code":"invalid_tool_call_format"}
Multiple normal prompts fail before any new tool executes. Manual /compact also fails with the same error, so compaction does not provide recovery in this session.
The captured failed compaction request provides a useful triage lead: its history contains three GPT-originated type: "custom" / custom.name: "apply_patch" calls among ordinary function calls. All tool results have matching, preceding calls with nonempty names when both call types are accounted for. This is not evidence of a missing tool name in the persisted call itself.
Suspected area: cross-model history normalization / Gemini request adaptation. This is a hypothesis, not a confirmed root cause or an assertion that two independent bugs exist.
Affected version
- Copilot CLI 1.0.86, verified from the running process's loaded
.../1.0.86/prebuilds/darwin-arm64/runtime.node. - Session originally created under 1.0.83 and subsequently resumed across updates; the version that introduced the failure is unknown.
- Model at failure:
gemini-3.8-flash. - Earlier turns used
gpt-6-astra, including built-inapply_patch. - macOS 26.7, Apple Silicon (
arm64), tmux.
Steps to reproduce the behavior
Observed workflow, not yet a clean-room/minimal reproducer:
- Continue a long-lived session that has used both GPT and Gemini, with previous compactions and tool calls.
- GPT turns in that history use built-in
apply_patch, persisted as custom tool calls. - Continue later with Gemini. Conversation-only rewinds and process resume/restart occurred before the reported failures. Their causal role has not been isolated; switching models alone is not claimed to reproduce this.
- Submit a normal follow-up prompt. It fails with
invalid_tool_call_format. - Retry later: the same error recurs.
- Run
/compact: it also fails, withsession.compaction_complete.success: falseanderror: "host-rethrow: 400 Tool name is required for Gemini requests".
The real environment includes user hooks, plugins, and MCP servers. These have not been eliminated in a fresh configuration. This report does not establish reproducibility in a stock installation.
Expected behavior
A session created through supported model switching, tool use, resume, and rewind should remain usable. Historical custom tool calls should be translated into a supported representation when replayed to another provider, or the CLI should provide an actionable compatibility/recovery error without silently discarding history.
Additional context
Captured request metadata
For the failed manual compaction, model.model_call_failure records:
{
"model": "gemini-3.8-flash",
"status": 400,
"api_endpoint": "/chat/completions",
"transport": "http",
"failure_kind": "api",
"badRequestKind": "structured_error",
"errorCode": "invalid_tool_call_format"
}
Parsing that event's JSON-encoded requestMessages locally:
| Check | Result |
|---|---|
| Messages | 506 |
| Assistant tool calls | 258 |
Function calls with nonempty function.name |
255 |
Custom calls with nonempty custom.name |
3, all apply_patch |
| Tool-result messages | 258 |
| Results without a matching preceding named call | 0 |
The three custom calls are at zero-based message indices 85, 107, and 115; their matching results immediately follow. All 258 result messages omit a standalone name; each has a tool_call_id that resolves to its preceding call. This alone is not asserted to be invalid in the OpenAI-shaped intermediate format.
Synthetic structural illustration only (not an executed reproducer; IDs, input, and output replaced):
[
{
"role": "assistant",
"content": "",
"tool_calls": [{
"id": "custom_call_example",
"type": "custom",
"custom": {
"name": "apply_patch",
"input": "<synthetic patch placeholder>"
}
}]
},
{
"role": "tool",
"tool_call_id": "custom_call_example",
"content": "<synthetic result placeholder>"
}
]
Please check whether the Gemini adapter handles custom.name, rather than assuming every historical call has function.name. The captured request does not establish which field the server rejected; it is not a capture of the final native Gemini payload.
Trace correlation
| UTC time, 2026-09-19 | Operation | Request ID | Service request ID |
|---|---|---|---|
| 21:44:48 | Normal prompt: HTTP 400 | 7B0D:345026:2C3E730:36BEE94:6AAF024C |
138e7b2d-aebe-4123-97f2-8b61e81f383e |
| 22:07:00 | Later normal prompt: HTTP 400 | 7F6E:178245:2FFDC9D:3C2C1FB:6AAF077F |
4b9439d5-7085-490b-8815-a43414f9cea4 |
| 22:07:20 | Manual compaction: HTTP 400 | 4DFE:3B6359:2FDC2F9:3C0B645:6AAF0797 |
90eafc3c-9e21-4633-a126-9f3bfc45a047 |
Important limits / ruled-out inference
- Some persisted event
parentIdlinks are dangling, but following those links alone incorrectly suggested an orphaned image-view result. The actual captured request contains both image-view calls, their names, and their results. Therefore, an orphan caused by rewind is not established. - Successful later Gemini turns exist after the original custom-tool turns. This is not established as an immediate model-switch failure; resume/replay or runtime-version differences may matter.
- No controlled retry with only the custom calls normalized has been performed. No successful model-switch workaround is claimed.
- The live session was inspected read-only. No repair, event deletion, or history rewrite was performed for this investigation.
- No original conversation, image, patch contents, filesystem paths, or configuration is attached. Only structural findings and request-correlation metadata are included.
Related but not established as duplicates: broader Gemini 400 report and older tool-use/result corruption report.
- 主要语言
- Shell
- 星标
- 11.2k
- 派生
- 1.9k
- 平均合并
- 14 小时 16 分钟
- 30 天内合并 PR
- 6
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
github/copilot-cli 的其他 Issue
-
triage
难度 2/5 1-3 小时 新手友好度 75/100
github/copilot-cli#4932 ·
-
triage
难度 2/5 1-3 小时 新手友好度 78/100
github/copilot-cli#4909 ·
-
triage
难度 2/5 1-3 小时 新手友好度 76/100
github/copilot-cli#4906 ·
-
triage
难度 2/5 1-3 小时 新手友好度 72/100
github/copilot-cli#4848 ·
-
area:agents area:mcp
难度 2/5 1-3 小时 新手友好度 72/100
github/copilot-cli#4729 ·
查看 github/copilot-cli 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 75/100
elastic/gradle-plugins#156 ·
-
Priority/High ready-for-agent Severity/Major Type/Bug
难度 2/5 1-3 小时 新手友好度 75/100
-
comp/cli P3 type/docs
难度 2/5 1-3 小时 新手友好度 75/100
NousResearch/hermes-agent#119756 · 1 条评论 ·
-
comp: build/pipeline type: bug version: current (v17+)
难度 2/5 1-3 小时 新手友好度 74/100
angular/angularfire#3766 ·
-
out-of-date
难度 2/5 1-3 小时 新手友好度 70/100
CachyOS/CachyOS-PKGBUILDS#1903 ·