Skip to main content
Mixture-of-Agents (MoA) runs the same prompt across several models in parallel (the proposers) and then uses an aggregator to synthesize a single high-quality answer from all proposals. The technique is based on Wang et al., arXiv:2406.04692.
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

/moa <prompt>

     ├─ proposer 1 (openai:gpt-5)        ┐
     ├─ proposer 2 (claudeai:opus-4-8)   ├─ in parallel, same prompt
     ├─ proposer 3 (googleai:gemini-2.5) ┘


  aggregator (active provider/model, or CHATCLI_MOA_AGGREGATOR)


  single synthesized answer
  1. Parallel proposal — each proposer receives the same prompt, concurrently.
  2. 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.
  3. Aggregation — the aggregator gets a synthesis prompt with all proposals and produces one correct, cohesive answer (without mentioning that aggregation happened).
A 5-minute timeout wraps the whole round. At the end, ChatCLI shows which proposers contributed (✓/✗) and renders the final answer.

Configuration

VariableDescription
CHATCLI_MOA_MODELSOptional. Proposers as CSV provider:model. Without it, /moa and @moa use the configured providers (sorted, capped at 4).
CHATCLI_MOA_AGGREGATOROptional. Aggregator model (provider:model). Default: the session’s active provider/model.
export CHATCLI_MOA_MODELS="openai:gpt-5,claudeai:claude-opus-4-8,googleai:gemini-2.5-pro"
export CHATCLI_MOA_AGGREGATOR="claudeai:claude-opus-4-8"   # optional
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 (openaiOPENAI). The /moa command and the @moa tool share the same resolution and defaults.
Use different providers as proposers to maximize diversity — that’s where MoA’s quality gain comes from. The aggregator usually performs best as a strong model (Opus, GPT-5).

Usage

> /moa explain the trade-offs between WAL and snapshotting in a durable scheduler
  Running Mixture-of-Agents with 3 models…
    ✓ openai:gpt-5
    ✓ claudeai:claude-opus-4-8
    ✓ googleai:gemini-2.5-pro

  <single synthesized answer, rendered as Markdown>
Any configured provider can participate as a proposer or aggregator. See Supported Models.

@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:
<tool_call name="@moa" args='{"cmd":"ask","args":{"prompt":"Design a rate limiter for 1M rps"}}' />
<tool_call name="@moa" args='{"cmd":"list"}' />
  • ask {prompt, models?, aggregator?}models optional (e.g. ["openai","anthropic:claude-opus-4-8"]); defaults to a set of configured providers. aggregator defaults to the session model.
  • list — providers available to participate.
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