> ## Documentation Index
> Fetch the complete documentation index at: https://chatcli.edilsonfreitas.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Mixture-of-Agents (MoA)

> Vários modelos propõem uma resposta em paralelo e um agregador sintetiza a melhor — o /moa do ChatCLI, baseado em Wang et al. (arXiv:2406.04692).

O **Mixture-of-Agents (MoA)** roda o mesmo prompt em **vários modelos em paralelo** (os *proponentes*) e então usa um **agregador** para sintetizar uma única resposta de alta qualidade a partir de todas as propostas. A técnica é baseada em [Wang et al., arXiv:2406.04692](https://arxiv.org/abs/2406.04692).

<Info>
  MoA é **distinto** da [Orquestração Multi-Agent](/pt/features/multi-agent-orchestration): lá o eixo é **agents especialistas** (planner, reviewer…) despachados em paralelo dentro de uma tarefa. Aqui o eixo é a **diversidade de modelos/provedores** respondendo à mesma pergunta. Acionado pelo comando `/moa`.
</Info>

***

## Como funciona

```text theme={"system"}
/moa <prompt>
     │
     ├─ proponente 1 (openai:gpt-5)        ┐
     ├─ proponente 2 (claudeai:opus-4-8)   ├─ em paralelo, mesmo prompt
     ├─ proponente 3 (googleai:gemini-2.5) ┘
     │
     ▼
  agregador (provider/modelo ativo, ou CHATCLI_MOA_AGGREGATOR)
     │
     ▼
  resposta única sintetizada
```

1. **Briefing compartilhado** — o mesmo system prompt estruturado de um turno de chat (contextos anexados via `/context attach`, memória do workspace, skills, retrieval por turno) é montado **uma vez por rodada** e entregue a todos os participantes.
2. **Proposta paralela** — cada proponente recebe o mesmo prompt e o mesmo briefing, concorrentemente, podendo puxar knowledge, CCR e memória (read-only) antes de responder.
3. **Tolerância a falhas** — erros de um proponente são tolerados; o MoA segue desde que **pelo menos um** tenha respondido. Só falha se o agregador em si falhar.
4. **Agregação** — o agregador recebe um prompt de síntese com todas as propostas, **mais o mesmo briefing e as mesmas tools**, e produz **uma** resposta correta e coesa (sem mencionar que houve agregação).

Um timeout de **5 minutos** envolve toda a rodada. Ao final, o ChatCLI mostra quais proponentes contribuíram (✓/✗) e renderiza a resposta final.

***

## Briefing e tools do painel

Cada participante do painel — proponentes **e** agregador — é tão capaz quanto um turno normal de conversa: recebe o briefing completo da sessão e três exceções de tools **estritamente read-only**, executadas em um loop limitado (até 4 rodadas de tool por participante), tanto via tool-use nativo quanto via XML para provedores sem suporte nativo:

| Tool        | O que faz                                                                                                                   | Quando é oferecida                                                                        |
| ----------- | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `knowledge` | Busca nas [bases de conhecimento](/pt/features/knowledge-base) anexadas à sessão (search/get/toc)                           | Mesmo gate da exceção do chat: habilitada + base anexada                                  |
| `recall`    | Expande markers `<<ccr:KEY>>` da [compressão de contexto](/pt/features/context-compression) de volta ao original            | Só quando a camada de compressão está ativa **e** o histórico realmente carrega um marker |
| `memory`    | Recupera a [memória de longo prazo](/pt/features/bootstrap-memory) do usuário (perfil, fatos duráveis, preferências, notas) | `CHATCLI_MEMORY_MODE` diferente de `off`                                                  |

Quando alguma tool está ativa, a linha de status da rodada informa: `Ferramentas de especialista ativas neste painel: knowledge, recall, memory`.

<Note>
  **Read-only por construção.** O acesso à memória é limitado ao subcomando `recall` pelo próprio executor — as formas mutantes (`remember`, `profile`, `forget`) são inalcançáveis a partir de um turno do painel, mesmo que um modelo tente contrabandeá-las nos argumentos. `ask_user` e `graphview` ficam de fora de propósito: os participantes rodam em paralelo e desassistidos. Nenhum tool de execução, arquivo ou busca — a mesma regra do chat.
</Note>

***

## Configuração

| Variável                 | Descrição                                                                                                                       |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------- |
| `CHATCLI_MOA_MODELS`     | Opcional. Proponentes em CSV `provider:model`. **Sem ela, `/moa` e `@moa` usam os provedores configurados** (ordenados, cap 4). |
| `CHATCLI_MOA_AGGREGATOR` | Opcional. Modelo agregador (`provider:model`). Default: o provider/modelo ativo da sessão.                                      |

```bash theme={"system"}
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"   # opcional
```

<Info>
  **Autenticação:** funciona com OAuth, não só API key — quando um proponente/agregador coincide com o provider ativo da sessão, o MoA **reusa o client da sessão**, honrando o token OAuth (preferido sobre API key quando logado) ou tokens encaminhados (modo server/gateway). Nomes de provider são resolvidos de forma case-insensitive (`openai` → `OPENAI`). O comando `/moa` e o tool `@moa` compartilham a mesma resolução e os mesmos defaults.
</Info>

<Tip>
  Use provedores **diferentes** como proponentes para maximizar a diversidade — é daí que vem o ganho de qualidade do MoA. O agregador costuma render mais sendo um modelo forte (Opus, GPT-5).
</Tip>

***

## Uso

```text theme={"system"}
> /moa explique os trade-offs entre WAL e snapshotting num scheduler durável
  Rodando Mixture-of-Agents com 3 modelos…
    ✓ openai:gpt-5
    ✓ claudeai:claude-opus-4-8
    ✓ googleai:gemini-2.5-pro

  <resposta única sintetizada, renderizada em Markdown>
```

Qualquer provedor configurado pode participar como proponente ou agregador. Veja [Provedores Suportados](/pt/reference/supported-models).

***

## Tool `@moa` (para o agente)

Além do comando `/moa`, há o **tool `@moa`**, que o agente pode invocar dentro de um fluxo agent/coder para consultar vários modelos e sintetizar a melhor resposta:

```text theme={"system"}
<tool_call name="@moa" args='{"cmd":"ask","args":{"prompt":"Projete um rate limiter para 1M rps"}}' />
<tool_call name="@moa" args='{"cmd":"list"}' />
```

* `ask {prompt, models?, aggregator?}` — `models` opcional (ex. `["openai","anthropic:claude-opus-4-8"]`); default é um conjunto dos provedores configurados. `aggregator` default é o modelo da sessão.
* `list` — provedores disponíveis para participar.

Os membros do `@moa` recebem o histórico da conversa do fluxo agent e **as mesmas tools read-only do painel** (knowledge, recall, memory) — o briefing de chat não é remontado, pois o contexto do agente já está no histórico.

Degrada com elegância: um único proponente bem-sucedido é retornado direto; se o agregador estiver indisponível, retorna o melhor candidato em vez de falhar.

***

## Veja também

* [Orquestração Multi-Agent](/pt/features/multi-agent-orchestration) — agents especialistas em paralelo (eixo diferente)
* [Variáveis de Ambiente → Mixture-of-Agents](/pt/reference/environment-variables#mixture-of-agents-moa)
