400 "Missing namespace for function_call" for deferred/tool-search tools (e.g. extensions_manage) on 1.0.80
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Shell
- Sterne
- 11.2k
- Forks
- 1.9k
- Ø Merge
- 14 Std. 16 Min.
- Gemergte PRs (30 T.)
- 6
Beschreibung
Describe the bug
Description
On Copilot CLI 1.0.80, calls to tools discovered via deferred tool search intermittently fail with:
Execution failed: CAPIError: 400 Missing namespace for function_call '<tool_name>'. It does not exist in the default namespace. Round-trip the model's function_call item with its namespace field included. (Request ID: )
Observed against:
- A locally installed extension tool:
agenttools-prwatch_pool(pluginprwatch:prwatch) - A built-in tool:
extensions_manage
Both are (or can be) discovered via deferred tool_search_call rather than eager loading, and the model's function_call item appears to lose its namespace field when round-tripped back to CAPI on a subsequent turn, producing the 400 above.
Impact
Any session that discovers the affected tool via deferred tool search becomes unable to invoke it at all, with no recovery path other than avoiding the tool. This is not scoped to third-party extensions — it also hit a built-in tool (extensions_manage), suggesting the root cause is in the deferred-tool-search/round-trip serialization path itself.
Root cause (as best diagnosed locally)
- Tools default
deferto auto/tool-search deferral, so they're discovered lazily viatool_search_call, with call-id → namespace mapping carried inserverTools.functionCallNamespaces. - When that deferred
function_callitem is replayed on a later request without itsnamespacefield, CAPI rejects it with the 400 above. - Matches a similar reported issue in a sibling CLI: openai/codex#23839 ("Namespaced MCP tool calls fail after deferred tool discovery"), same error text, same likely cause.
Workarounds applied locally
- Per-extension: set
defer: "never"on our own extension's tools so they're eagerly loaded (doesn't help built-in tools). - Global: set
"toolSearch": falsein~/.copilot/settings.jsonto disable deferred tool search app-wide. After this, bothextensions_manageand the previously-failing extension tool succeeded with no further namespace errors.
Neither is a real fix — (1) doesn't cover built-ins, (2) disables a supported performance feature entirely.
Expected behavior
Deferred tool calls should retain their namespace field when round-tripped back to the model/CAPI on subsequent turns, regardless of whether the tool is built-in or from an installed extension, so toolSearch can stay enabled without risking a 400 on invocation.
Environment
- Copilot CLI version: 1.0.80
- OS: Windows
- Reproduced with: a locally installed plugin extension (
prwatch:prwatch) and a built-in tool (extensions_manage)
Related
- openai/codex#23839 — same error text and same deferred-tool-discovery/namespace-round-trip root cause in a related CLI.
Suggested fix direction
Cache the call_id → namespace mapping (as captured in serverTools.functionCallNamespaces) and reattach namespace when serializing/replaying the corresponding function_call item on the next request, instead of relying on the model to carry it forward verbatim.
Affected version
1.0.80
Steps to reproduce the behavior
No response
Expected behavior
No response
Additional context
No response
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Verfolge die Behandlung von deferred tool_search_call bis zur Serialisierung und Wiedergabe von function_call zurück, beginnend mit der im Bericht erwähnten Zuordnung serverTools.functionCallNamespaces. Reproduziere das Problem mit deferred extensions_manage oder einem Extension-Tool, während toolSearch aktiviert ist, und überprüfe anschließend, dass der Namespace die nächste Anfrage übersteht und der CAPI 400 nicht mehr auftritt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Bereich
- api, cli
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Aktiv
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 55/100