Skip to main content
O modo Multi-Agent transforma o /coder e o /agent em um sistema de orquestração onde o LLM despacha agents especialistas em paralelo para resolver tarefas complexas de forma mais rápida, mais barata e mais precisa. Cada agent tem sua própria expertise, suas próprias skills e — desde a atualização recente — seu próprio modelo preferido e nível de esforço.
O dispatch multi-agent é o motor; a camada Agent Squad constrói um time completo em cima dele: observabilidade de runs ao vivo (/agents), board de trabalho compartilhado (/board), mensagens agent-a-agent (/mail) e um playbook de entrega autônoma.

Ativação

O modo multi-agent é ativado por padrão. Para desativá-lo, defina:
Quando desativado, o /coder e o /agent funcionam exatamente como antes — sem nenhum impacto.

Arquitetura

O LLM orquestrador recebe um catálogo de agents no system prompt e aprende a rotear tarefas usando tags <agent_call>:
Múltiplas tags agent_call na mesma resposta resultam em execução paralela.

Dois Modos de Execução

O orquestrador possui dois mecanismos de execução, escolhendo o mais adequado por contexto:

Guia de Decisão


Agents Especialistas Embarcados

Os 12 agents embarcados implementam a interface WorkerAgent e embutem BuiltinAgentMeta, que declara os defaults de model e effort e lê overrides via variáveis de ambiente (CHATCLI_AGENT_<NAME>_MODEL / CHATCLI_AGENT_<NAME>_EFFORT).

Estratégia de Effort por Agente

Cada built-in tem um nível de esforço calibrado para o tipo de trabalho que ele faz. Isso economiza tokens em tarefas mecânicas e garante qualidade em tarefas que exigem raciocínio profundo. Model default: todos os built-ins deixam model vazio — respeitam a escolha do usuário no /switch como padrão. Isso garante que o usuário controla o custo e não é surpreendido por um built-in trocando de modelo silenciosamente.

Override via Variáveis de Ambiente

Para forçar um modelo ou nível de esforço diferente em um agent embarcado sem recompilar, defina as variáveis:
O nome do token no env var é o nome do agent em uppercase (FILE, CODER, SHELL, GIT, SEARCH, PLANNER, REVIEWER, TESTER, REFACTOR, DIAGNOSTICS, FORMATTER, DEPS).
Se o provider do modelo alvo não estiver configurado (ex.: CHATCLI_AGENT_REVIEWER_MODEL=gpt-5 mas sem OPENAI_API_KEY), o dispatcher cai graciosamente no provider/modelo ativo do usuário e loga um aviso claro. Nenhum turno quebra por falta de API key.

Os 12 Agents e Suas Skills

Acesso: Somente leitura (read, tree, search) Effort default: lowSkills:
  • batch-readScript acelerador: le N arquivos em goroutines paralelas sem chamar o LLM
  • find-pattern — Busca padrões em arquivos
  • analyze-structure — Analisa estrutura de código
  • map-deps — Mapeia dependências entre módulos
Acesso: Leitura/Escrita (write, patch, read, tree) Effort default: mediumSkills:
  • write-file — Criação de novos arquivos
  • patch-file — Modificação precisa de código existente
  • create-module — Geração de boilerplate
  • refactor — Renomeação e refatoração segura
Acesso: Execução (exec, test) Effort default: lowSkills:
  • run-testsScript acelerador: executa go test ./... -json e parseia resultados
  • build-checkScript acelerador: executa go build ./... && go vet ./...
  • lint-fix — Correção automática de lint
Acesso: Git ops (git-status, git-diff, git-log, git-changed, git-branch, exec) Effort default: lowSkills:
  • smart-commitScript acelerador: coleta status + diff para commit inteligente
  • review-changesScript acelerador: analisa alterações com changed + diff + log
  • create-branch — Criação de branches
Acesso: Somente leitura (search, tree, read) Effort default: lowSkills:
  • find-usages — Encontra usos de símbolos
  • find-definition — Encontra definições
  • find-dead-code — Detecta código morto
  • map-projectScript acelerador: mapeia projeto em paralelo (tree + interfaces + structs + funcs)
Acesso: Nenhum (sem tools — puro raciocínio LLM) Effort default: highSkills:
  • analyze-task — Análise de complexidade e riscos
  • create-plan — Criação de plano de execução
  • decompose — Decomposição de tarefas complexas
O Planner é o agent que mais se beneficia de extended thinking — não tem tools, todo o valor vem da qualidade da decomposição.
Acesso: Somente leitura (read, search, tree) Effort default: highSkills:
  • review-file — Analisa arquivo para bugs, code smells, violações SOLID e issues de segurança
  • diff-reviewScript acelerador: revisa alterações staged via git-diff e git-changed
  • scan-lintScript acelerador: executa go vet e staticcheck e categoriza issues
Acesso: Leitura/Escrita/Execução (read, write, patch, exec, test, search, tree) Effort default: mediumSkills:
  • generate-tests — Geração de testes abrangentes para funções e pacotes (LLM-driven)
  • run-coverageScript acelerador: executa go test -coverprofile e parseia cobertura por função
  • find-untestedScript acelerador: encontra funções exportadas sem testes correspondentes
  • generate-table-test — Geração de table-driven tests idiomáticos em Go
Acesso: Leitura/Escrita (read, write, patch, search, tree) Effort default: highSkills:
  • rename-symbolScript acelerador: renomeia símbolo em todos os .go, ignorando strings e comentários
  • extract-interface — Extrai interface a partir dos métodos de um tipo concreto
  • move-function — Move função entre pacotes ajustando imports
  • inline-variable — Substitui variável pelo seu valor em todos os pontos de uso
Acesso: Leitura/Execução (read, search, tree, exec) Effort default: highSkills:
  • analyze-error — Parseia mensagens de erro e stack traces mapeando para localizações no código
  • check-depsScript acelerador: executa go mod tidy, go mod verify e verifica saúde das dependências
  • bisect-bug — Guia investigação para encontrar o commit que introduziu um bug
  • profile-bottleneck — Executa benchmarks ou pprof e analisa hotspots de performance
Acesso: Escrita/Execução (read, patch, exec, tree) Effort default: lowSkills:
  • format-codeScript acelerador: executa gofmt -w (ou goimports -w) nos arquivos Go
  • fix-importsScript acelerador: executa goimports para organizar imports
  • normalize-style — Aplica convenções de naming e estilo consistentes (LLM-driven)
Acesso: Leitura/Execução (read, exec, search, tree) Effort default: lowSkills:
  • audit-depsScript acelerador: executa go mod verify e govulncheck para auditoria
  • update-depsScript acelerador: lista dependências desatualizadas com atualizações disponíveis (dry-run)
  • why-depScript acelerador: explica por que uma dependência existe via go mod why e go mod graph
  • find-outdated — Encontra todas as dependências com versões mais novas disponíveis

Catálogo Visível ao Orquestrador

O catálogo que o LLM orquestrador recebe no system prompt (via registry.CatalogString()) agora inclui o perfil de LLM de cada agent quando ele declara preferências não-default. Isso ajuda o LLM a tomar decisões informadas — por exemplo, preferir planner para decomposição profunda e formatter para trabalho mecânico barato. Exemplo do que o orquestrador vê:
O perfil só aparece quando há hint — se Effort() e Model() retornam string vazia, nenhuma linha é adicionada (evita ruído no prompt).

Agents Customizados como Workers

Agents personas definidos em ~/.chatcli/agents/ são automaticamente carregados como workers no sistema de orquestração ao iniciar o /coder ou /agent. O LLM pode despachá-los via <agent_call> com o mesmo ReAct loop, leitura paralela e recuperação de erros dos agents embarcados.

Paridade Total com Skills

Agents customizados agora têm os mesmos campos de preferência que skills:
Quando despachado, o dispatcher roda pelo Model Router e garante que este agent rode em claude-opus-4-6 com effort=high — mesmo que o usuário esteja em Sonnet. Quando o worker termina, o próximo turno do usuário volta ao modelo original.

Como Funciona

1

Escaneamento

Ao iniciar o modo multi-agent, o sistema escaneia ~/.chatcli/agents/ (global) e ./.agent/agents/ (projeto).
2

Criação do CustomAgent

Para cada agent encontrado, cria um CustomAgent que implementa a interface WorkerAgent. Model() e Effort() vêm direto do frontmatter.
3

Mapeamento de Tools

O campo tools do frontmatter YAML define quais comandos o agent pode usar.
4

Carregamento de Skills

Skills associadas são carregadas e incluídas no system prompt do worker.
5

Registro no Catálogo

O agent aparece no catálogo do orquestrador (com perfil de LLM se declarado) e pode ser despachado.
6

Dispatcher aplica hints

A cada <agent_call>, antes do worker começar, o dispatcher consulta ResolveModelRouting (para model) e atacha WithEffortHint no ctx (para effort).

Mapeamento de Tools

O campo tools do YAML frontmatter mapeia ferramentas estilo Claude Code para subcomandos do @coder:

Regras de Proteção

Os 12 nomes de agents embarcados (file, coder, shell, git, search, planner, reviewer, tester, refactor, diagnostics, formatter, deps) são protegidos e não podem ser sobrescritos por agents customizados.
  • Sem tools = read-only: Agents sem campo tools recebem automaticamente read, search, tree e são marcados como read-only.
  • Duplicatas ignoradas: Se dois agents tiverem o mesmo nome, apenas o primeiro é registrado.

Model Router — Roteamento Inteligente de Modelos

Quando um agent declara model:, o dispatcher usa llm/client.ResolveModelRouting para escolher o cliente correto. Este resolver é a mesma função usada pelas skills — garantindo comportamento consistente em ambos os fluxos.

Pipeline de Resolução

O resolver tenta os seguintes sinais, em ordem:
1

1. API cache do provider ativo

Se o modelo alvo aparece na lista de modelos descobertos pelo provider atual (via endpoint /models), usa o provider do usuário e só troca o model. Isto cobre modelos reais que o catálogo estático não conhece ainda. Nota: api-cached.
2

2. Catálogo no provider do usuário

Se catalog.Resolve(userProvider, hint) bate (match exato, alias ou prefixo), swap de model no mesmo provider. Nota: catalog-same-provider.
3

3. Catálogo em qualquer provider conhecido

Se o modelo existe no catálogo de outro provider e este provider está em GetAvailableProviders() (tem API key configurada), swap cross-provider. Nota: catalog-cross-provider.
4

4. Heurística de família

claude-*/sonnet/opus/haiku → CLAUDEAI, gpt-*/chatgpt-*/o1/o3/o4 → OPENAI, gemini-* → GOOGLEAI, grok-* → XAI, glm-* → ZAI, minimax* → MINIMAX, kimi-*/moonshot-* → MOONSHOT, llama*/mistral*/qwen*/deepseek* → OLLAMA. Cobre modelos futuros que ainda não entraram no catálogo. Nota: family-same-provider ou family-cross-provider.
5

5. Otimista

Modelo totalmente desconhecido? Passa para o provider do usuário e deixa a API decidir. Se o factory do provider aceitar, roda; se rejeitar, cai no fallback. Nota: optimistic-user-provider.
6

6. Fallback gracioso

Se o provider alvo não está disponível (sem API key) ou o factory falhou, usa o cliente do usuário e preenche UserMessage com texto legível. Nota: fallback-unavailable ou fallback-build-failed.

Garantias

  • cli.Client, cli.Provider, cli.Model nunca são mutados. Swaps são escopo de turno.
  • OAuth é verificado implicitamente: provider só entra em GetAvailableProviders() se auth.ResolveAuth retornou algum credential (API key, OAuth token ou GitHub token). OAuth-only users são tratados igual API-key users.
  • Cross-provider sem API key não quebra: fallback gracioso com mensagem visível ao usuário.
  • Logs estruturados: cada decisão do resolver emite log com note, from_provider, to_provider, from_model, to_model.

Mapeamento de Effort para Providers

O hint effort: é propagado via context.WithValue e lido pelos providers dentro de SendPrompt. Cada provider faz sua própria conversão: Modelos sem suporte recebem o request sem o campo (ignorado silenciosamente). A tabela de mapeamento:

Skills: Scripts vs Descritivas

Cada agent possui dois tipos de skills:
Sequências pré-definidas de comandos que bypassam o LLM para operações mecânicas e repetitivas, executando diretamente no engine:

Skills V2 (Pacotes)

Skills V2 são diretórios contendo:
  • SKILL.md — Conteúdo principal com frontmatter
  • Subskills (.md) — Documentos de conhecimento adicional
  • scripts/ — Scripts executáveis registrados automaticamente no worker
O worker pode ler subskills com o comando read e executar scripts com exec durante sua operação autônoma.
Workers não ficam cegos às superfícies de contexto da sessão — eles navegam conteúdo truncado e comprimido do mesmo jeito que o orquestrador:
  • Recall sobre compressão: outputs grandes de tools dentro do loop do worker são comprimidos reversivelmente (CCR). Todo worker carrega a tool universal recall_output, então qualquer marcador <<ccr:KEY>> que ele encontrar pode ser expandido de volta ao conteúdo original.
  • Truncagem recuperável: resultados acima do limite inline são salvos em arquivos result_*.txt no workspace da sessão, e o prompt do worker o ensina a ler esses arquivos com read (usando start/end) em vez de adivinhar. O output final do worker segue o mesmo contrato — ao exceder o orçamento de ~30 KB, o texto completo é persistido e a referência viaja de volta ao orquestrador.
  • Recall proativo: cada task despachada é confrontada com a memória persistente e as sessões salvas; blocos [MEMORY AUTO-RECALL] / [SESSION RECALL] relevantes são injetados automaticamente no contexto inicial do worker.
  • Context tools opt-in: personas que declaram Memory, Session ou Knowledge no frontmatter tools ganham tools read-only de busca/leitura sobre essas camadas — veja Agents Customizáveis.
  • Microcompact no loop: runs longos de worker compactam progressivamente tool results antigos (com CCR, recuperável), o mesmo mecanismo do orquestrador.
  • Prompt especialista preservado: em modo native function-calling o prompt especialista do agent — incluindo personas customizadas — é mantido, aposentando apenas a sintaxe XML de tools.
Os resultados do squad injetados de volta no histórico do orquestrador são envelhecidos pelo mesmo motor de microcompact, então um dispatch grande de múltiplos workers não fica mais incompactável na janela de contexto.

Estratégia de Recuperação de Erros

Quando um agent_call falha, o orquestrador segue um protocolo de recuperação inteligente:
1

Diagnóstico via tool_call

Usa tool_call direto para ler arquivos relevantes e entender o erro (já tem o contexto).
2

Fix via tool_call

Patches, correções de arquivo e retentativas são mais rápidos e seguros via tool_call.
3

Retoma via agent_call

Após fix aplicado e verificado, retoma usando agent_call para a próxima fase.
Regra chave: Recuperação de erros = tool_call (rápido, preciso). Novas fases de trabalho = agent_call (paralelo, escalável).

Configuração

Exemplo de .env


Segurança Anti-Race

O sistema implementa múltiplas camadas de proteção contra condições de corrida:

FileLockManager

Mutex per-filepath (caminhos absolutos normalizados). Operações de escrita adquirem lock; leituras não bloqueiam.

Histórico Isolado

Cada worker mantém seu próprio []models.Message, sem compartilhamento.

LLM Clients Independentes

Cada worker cria sua própria instância de LLM client via factory pattern. Com o Model Router, cada worker pode ter cliente de provider diferente.

Engine Stateless

Cada worker instância seu próprio engine.Engine fresh.

Context Tree

O contexto pai pode cancelar todos os workers via context.WithCancel. Effort hints são anexados a este ctx.

Policy Enforcement

Workers respeitam integralmente o coder_policy.json (allow/deny/ask). Ações com policy “ask” pausam o spinner e exibem um prompt de segurança serializado para o usuário.

Governança de Segurança no Modo Paralelo

Os workers paralelos respeitam todas as regras do arquivo coder_policy.json (global e local). Isso significa que ações como write, patch, exec passam pela mesma verificação de policies que o modo sequencial.

Comportamento por Tipo de Regra

As tool calls dos workers chegam ao motor de policy na mesma forma canônica @coder <subcomando> do modo sequencial, então regras escritas uma vez valem em todo lugar. O /policy mode auto também cobre workers (“ask” auto-aprova), com operações safety-immune ainda pedindo confirmação. Tools puramente in-process — squad mail, recall_output e as tools read-only de Memory/Session/Knowledge — não têm efeito em filesystem, shell ou rede e pulam o check de policy.

Serialização de Prompts

Quando múltiplos workers precisam de aprovação simultaneamente, os prompts são serializados via mutex — apenas um prompt é exibido por vez. Após a resposta do usuário, o próximo worker na fila recebe seu prompt. Isso evita:
  • Sobreposição visual de prompts no terminal
  • Conflito de leitura no stdin
  • Spinner renderizando sobre o prompt de segurança

Prompt com Contexto do Agent

O prompt de segurança no modo paralelo exibe informações contextuais sobre qual agent está solicitando a ação:
Isso permite que o usuário tome decisões informadas sobre cada ação, sabendo exatamente qual agent está pedindo e por que.

Respeito ao Provider/Modelo do Usuário

Os workers paralelos utilizam, por padrão, o provider e modelo ativos no momento do despacho. Se o usuário trocar de provider via /switch, os próximos despachos de agents usarão o novo provider corretamente. Exceção: agents (built-in ou custom) que declaram model: e/ou effort: podem usar um client diferente para aquele turno específico, resolvido pelo Model Router. cli.Client continua apontando para a escolha do usuário — a troca é escopo de worker.

Fluxo de Execução (Exemplo)

1

Usuário envia a query

“refatore o módulo coder, separe read e write”
2

LLM orquestrador despacha agents paralelos

3

Dispatcher cria goroutines com clients resolvidos

FileAgent roda em effort=low (modelo do usuário), SearchAgent idem. Ambos em paralelo, cada um com seu LLM client e mini ReAct loop isolado (dentro do limite maxWorkers).
4

Resultados agregados

Feedback é enviado para o orquestrador.
5

Orquestrador despacha PlannerAgent

Para decompor a refatoração. Planner roda com effort=high (extended thinking) — mesmo que o usuário esteja em Sonnet, o Planner pensa mais profundamente nesta fase.
6

Despacha CoderAgent

Para a refatoração (com effort=medium e FileLock nos arquivos sendo escritos).
7

Despacha ShellAgent para testes

Executa testes após a escrita (effort=low, mecânico).
8

Recuperação de erros (se necessário)

Se testes falharem, usa tool_call para diagnóstico e fix rápido.
9

Validação final

Orquestrador valida resultado final e reporta ao usuário.

Maximização de Paralelismo

O sistema de prompts do ChatCLI instrui explicitamente a IA a maximizar paralelismo em todos os níveis:
  1. tool_call: Operações independentes (ler 3 arquivos, buscar + ler) devem ser emitidas em uma ÚNICA resposta, não em turnos separados.
  2. agent_call: Para 3+ tarefas independentes, preferir agent_call que roda em goroutines paralelas.
  3. Per-turn anchor: A cada turno do ReAct loop, um lembrete reforça a necessidade de paralelismo.
Exemplo correto (3 leituras em UMA resposta):
Exemplo incorreto (3 turnos para operações independentes):

Compatibilidade

  • CHATCLI_AGENT_PARALLEL_MODE=false: tudo funciona exatamente como antes
  • Tags <tool_call> continuam funcionando mesmo com parallel mode ativo
  • Nenhuma assinatura de função existente foi alterada (apenas adições)
  • O package cli/agent/workers/ é completamente isolado e não impacta funcionalidades existentes
  • Agents antigos sem model:/effort: continuam funcionando sem nenhuma mudança
  • Servers gRPC mais antigos que não carregam os campos novos de AgentInfo retornam zero values — o client os trata como “inherit”
  • Operator e CRDs não precisam de mudanças: agents são carregados pela persona.Loader dentro do pod, via ConfigMap mounts

Quando usar Multi-Agent vs Subagent Delegation

Multi-Agent (<agent_call>) e Subagent Delegation (delegate_subagent) não são alternativas — resolvem problemas diferentes e podem coexistir num mesmo turno: Use <agent_call> quando há vários tipos de trabalho independentes (ler arquivos + rodar testes + revisar diff). Use delegate_subagent quando há uma análise concentrada sobre um payload grande (resumir /metrics, encontrar agulha no log).

Próximos passos

Agentes customizáveis

Crie suas próprias personas com model:/effort: por agent.

Subagent Delegation

Delegação focada para uma análise concentrada num payload grande.

Agent Progress UI

Display em tempo real de cada worker durante execução paralela.

Plugins agênticos

Catálogo completo de plugins disponíveis para os agents.