anomalyco / anomalyco/opencode
[Zen] Meta backend (Console Go) returns namespaced tool calls with dotted names, breaking Codex subagents (multi_agent_v1)
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 209k
- Forks
- 27.5k
- PR merge metrics
- PR metrics pending
Description
Summary
When using a Codex client through https://opencode.ai/zen/go/v1/responses with model muse-spark-1.3-contributor (Meta backend, "Console Go"), namespaced tool calls are returned with a dotted name and no namespace field, which the Codex client router cannot route. Subagents (multi_agent_v1.*) are deterministically unusable on this path, while the exact same request shape works fine on other backends behind the same gateway (e.g. DeepSeek).
Failing shape (Muse Spark path)
Backend returns the call as:
{"type":"function_call","name":"multi_agent_v1.spawn_agent","call_id":"call_01a0b82523fe76ec981998481652cc7c"}
No namespace field, client-shaped call id. Codex core (codex_core::tools::router) rejects it:
error=unsupported call: multi_agent_v1.spawn_agent
The call never executes; no subagent is created. 100% reproducible (every attempt).
Working shape (DeepSeek path, same gateway, same tool list)
Backend returns the call as:
{"type":"function_call","name":"spawn_agent","namespace":"multi_agent_v1","call_id":"call_00_pY2WWTZVJnhVAhsezruM0188"}
Gateway-generated call_00_… id plus the (name, namespace) pair. Codex routes it locally and the full spawn → execute → wait → close loop succeeds.
Evidence
- The outgoing request is byte-identical in structure for both models: Codex sends namespace tools as
{"type":"namespace","name":"multi_agent_v1",…}with all inner toolsstrict:false(verified via a local capture proxy). - The per-model catalog entries are identical, so this is not client-side gating.
- Behind the same
/zen/go/v1/responsesendpoint: DeepSeekdeepseek-v4.1-flashround-trips namespaces correctly;muse-spark-1.3-contributordoes not. So the difference is in the Meta/Console-Go adapter's return-path translation.
Related symptoms on the same path
- The model sometimes emits the same tool with inconsistent spellings across turns (
multi_agent_v1.spawn_agentonce, then barewait_agentwith no namespace) — both rejected by the router. - The model emitted
timeout_ms: 30000.0(float; core expects i64 → local parse error) and once an emptyargumentsstring, which then poisons conversation history and the next turn fails upstream with`arguments` must be valid JSON(HTTP 400,param: arguments). - Separately, the same backend intermittently enforces strict function-schema validation despite
strict:false('required' is required … Missing 'limit'on MCP tools carrying an optionallimitproperty) — rare (≈4/1200 requests), retry fixes it. Mentioning it here only because it is the same adapter being stricter than the contract in different ways.
Expected behavior
The Meta adapter should round-trip namespaced tool calls exactly like the other adapters: return (name, namespace) pairs (or the double-underscore flattened form) with gateway-generated call ids, instead of passing dotted names straight through to the model and back.
Environment
- Client: Codex CLI/Desktop 0.155.0 (Windows),
wire_api = "responses"againsthttps://opencode.ai/zen/go/v1 - Models:
muse-spark-1.3-contributor(broken) vsdeepseek-v4.1-flash(working) - Date observed: 2026-09-19 (failures deterministic and ongoing)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the Meta/Console Go adapter behind /zen/go/v1/responses, focusing on its return-path translation for namespaced tool calls. Compare the Muse Spark response with the working DeepSeek shape; done means namespaced calls round-trip with separate name and namespace values and gateway-generated call IDs so Codex can route them.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- ai, api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100