anomalyco / anomalyco/opencode

[Zen] Meta backend (Console Go) returns namespaced tool calls with dotted names, breaking Codex subagents (multi_agent_v1)

Open
#49,915 1 comment 0 reactions 0 assignees View on GitHub

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 tools strict: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/responses endpoint: DeepSeek deepseek-v4.1-flash round-trips namespaces correctly; muse-spark-1.3-contributor does 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_agent once, then bare wait_agent with no namespace) — both rejected by the router.
  • The model emitted timeout_ms: 30000.0 (float; core expects i64 → local parse error) and once an empty arguments string, 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 optional limit property) — 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" against https://opencode.ai/zen/go/v1
  • Models: muse-spark-1.3-contributor (broken) vs deepseek-v4.1-flash (working)
  • Date observed: 2026-09-19 (failures deterministic and ongoing)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.