MoA is distinct from Multi-Agent Orchestration: there the axis is specialist agents (planner, reviewer…) dispatched in parallel within a task. Here the axis is model/provider diversity answering the same question. Triggered by the
/moa command.How it works
- Shared briefing — the same structured system prompt of a chat turn (contexts attached via
/context attach, workspace memory, skills, per-turn retrieval) is assembled once per round and handed to every participant. - Parallel proposal — each proposer receives the same prompt and the same briefing, concurrently, and may pull knowledge, CCR and memory (read-only) before answering.
- Fault tolerance — a proposer’s error is tolerated; MoA proceeds as long as at least one answered. It only fails if the aggregator itself fails.
- Aggregation — the aggregator gets a synthesis prompt with all proposals, plus the same briefing and the same tools, and produces one correct, cohesive answer (without mentioning that aggregation happened).
Panel briefing and tools
Every panel participant — proposers and aggregator — is as capable as a regular conversation turn: it gets the session’s full briefing plus three strictly read-only tool exceptions, executed in a bounded loop (up to 4 tool rounds per participant), over both native tool-use and XML for providers without native support:
When any tool is active, the round’s status line reports it:
Expert tools enabled for this panel: knowledge, recall, memory.
Read-only by construction. Memory access is pinned to the
recall subcommand by the executor itself — the mutating forms (remember, profile, forget) are unreachable from a panel turn, even if a model smuggles one into the call arguments. ask_user and graphview are excluded on purpose: participants run in parallel and unattended. No exec, file or search tools, ever — the same rule chat mode enforces.Configuration
Auth: works with OAuth, not just API keys — when a proposer/aggregator matches the session’s active provider, MoA reuses the session client, honoring the OAuth token (preferred over an API key when logged in) or forwarded tokens (server/gateway mode). Provider names are resolved case-insensitively (
openai → OPENAI). The /moa command and the @moa tool share the same resolution and defaults.Usage
@moa tool (for the agent)
Besides the /moa command, there’s the @moa tool, which the agent can invoke inside an agent/coder flow to query several models and synthesize the best answer:
ask {prompt, models?, aggregator?}—modelsoptional (e.g.["openai","anthropic:claude-opus-4-8"]); defaults to a set of configured providers.aggregatordefaults to the session model.list— providers available to participate.
@moa members receive the agent flow’s conversation history and the same read-only panel tools (knowledge, recall, memory) — the chat briefing is not reassembled, since the agent’s context is already in the history.
It degrades gracefully: a single successful proposer is returned directly; if the aggregator is unavailable, the best candidate is returned instead of failing.
See also
- Multi-Agent Orchestration — parallel specialist agents (different axis)
- Environment Variables → Mixture-of-Agents