/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.
Ativação
O modo multi-agent é ativado por padrão. Para desativá-lo, defina:/coder e o /agent funcionam exatamente como antes — sem nenhum impacto.Arquitetura
<agent_call>:
Dois Modos de Execução
O orquestrador possui dois mecanismos de execução, escolhendo o mais adequado por contexto:| Modo | Sintaxe | Quando Usar |
|---|---|---|
| agent_call | <agent_call agent="..." task="..." /> | Novas fases de trabalho, tarefas paralelas, leitura exploratória, refatoração multi-arquivo |
| tool_call | <tool_call name="@coder" args="..." /> | Fixes rápidos, diagnóstico de erros, patches pontuais, validação pós-agent. IMPORTANTE: múltiplos tool_calls independentes devem ser emitidos em uma ÚNICA resposta |
Guia de Decisão
| Situação | Modo |
|---|---|
| Ler múltiplos arquivos + buscar referências | agent_call (file + search em paralelo) |
| Corrigir um erro de compilação | tool_call (patch direto) |
| Escrever novo módulo + testes | agent_call (coder + shell) |
| Verificar resultado de um agent | tool_call (read/exec rápido) |
| Fix após falha de agent | tool_call (diagnóstico preciso) |
| Retomar após fix aplicado | agent_call (próxima fase) |
Agents Especialistas Embarcados
Os 12 agents embarcados implementam a interfaceWorkerAgent 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.| Agent | Effort Default | Racional |
|---|---|---|
| File | low | Batch reads, sem raciocínio necessário |
| Coder | medium | Diffs seguros precisam de algum pensamento |
| Shell | low | Execução mecânica de comandos |
| Git | low | Operações git são determinísticas |
| Search | low | Grep/tree/read mecânicos |
| Planner | high | Decomposição é onde o valor mora (pure reasoning) |
| Reviewer | high | Achar bugs sutis exige raciocínio profundo |
| Tester | medium | Gerar boilerplate + alguma semântica |
| Refactor | high | Rename/extract precisa de modelo de referências |
| Diagnostics | high | Root-cause analysis é raciocínio puro |
| Formatter | low | Tool-driven, mecânico |
| Deps | low | Interpretação de saída de ferramenta |
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:FILE, CODER, SHELL, GIT, SEARCH, PLANNER, REVIEWER, TESTER, REFACTOR, DIAGNOSTICS, FORMATTER, DEPS).
Os 12 Agents e Suas Skills
FileAgent (Leitura e Análise)
FileAgent (Leitura e Análise)
read, tree, search)
Effort default: lowSkills:batch-read— Script acelerador: le N arquivos em goroutines paralelas sem chamar o LLMfind-pattern— Busca padrões em arquivosanalyze-structure— Analisa estrutura de códigomap-deps— Mapeia dependências entre módulos
CoderAgent (Escrita e Modificação)
CoderAgent (Escrita e Modificação)
write, patch, read, tree)
Effort default: mediumSkills:write-file— Criação de novos arquivospatch-file— Modificação precisa de código existentecreate-module— Geração de boilerplaterefactor— Renomeação e refatoração segura
ShellAgent (Execução e Testes)
ShellAgent (Execução e Testes)
exec, test)
Effort default: lowSkills:run-tests— Script acelerador: executago test ./... -jsone parseia resultadosbuild-check— Script acelerador: executago build ./... && go vet ./...lint-fix— Correção automática de lint
GitAgent (Controle de Versão)
GitAgent (Controle de Versão)
git-status, git-diff, git-log, git-changed, git-branch, exec)
Effort default: lowSkills:smart-commit— Script acelerador: coleta status + diff para commit inteligentereview-changes— Script acelerador: analisa alterações com changed + diff + logcreate-branch— Criação de branches
SearchAgent (Busca no Codebase)
SearchAgent (Busca no Codebase)
search, tree, read)
Effort default: lowSkills:find-usages— Encontra usos de símbolosfind-definition— Encontra definiçõesfind-dead-code— Detecta código mortomap-project— Script acelerador: mapeia projeto em paralelo (tree + interfaces + structs + funcs)
PlannerAgent (Raciocínio Puro)
PlannerAgent (Raciocínio Puro)
highSkills:analyze-task— Análise de complexidade e riscoscreate-plan— Criação de plano de execuçãodecompose— Decomposição de tarefas complexas
ReviewerAgent (Revisão de Código e Qualidade)
ReviewerAgent (Revisão de Código e Qualidade)
read, search, tree)
Effort default: highSkills:review-file— Analisa arquivo para bugs, code smells, violações SOLID e issues de segurançadiff-review— Script acelerador: revisa alterações staged via git-diff e git-changedscan-lint— Script acelerador: executago vetestaticchecke categoriza issues
TesterAgent (Testes e Cobertura)
TesterAgent (Testes e Cobertura)
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-coverage— Script acelerador: executago test -coverprofilee parseia cobertura por funçãofind-untested— Script acelerador: encontra funções exportadas sem testes correspondentesgenerate-table-test— Geração de table-driven tests idiomáticos em Go
RefactorAgent (Transformações Estruturais)
RefactorAgent (Transformações Estruturais)
read, write, patch, search, tree)
Effort default: highSkills:rename-symbol— Script acelerador: renomeia símbolo em todos os.go, ignorando strings e comentáriosextract-interface— Extrai interface a partir dos métodos de um tipo concretomove-function— Move função entre pacotes ajustando importsinline-variable— Substitui variável pelo seu valor em todos os pontos de uso
DiagnosticsAgent (Troubleshooting e Investigação)
DiagnosticsAgent (Troubleshooting e Investigação)
read, search, tree, exec)
Effort default: highSkills:analyze-error— Parseia mensagens de erro e stack traces mapeando para localizações no códigocheck-deps— Script acelerador: executago mod tidy,go mod verifye verifica saúde das dependênciasbisect-bug— Guia investigação para encontrar o commit que introduziu um bugprofile-bottleneck— Executa benchmarks ou pprof e analisa hotspots de performance
FormatterAgent (Formatação e Estilo)
FormatterAgent (Formatação e Estilo)
read, patch, exec, tree)
Effort default: lowSkills:format-code— Script acelerador: executagofmt -w(ougoimports -w) nos arquivos Gofix-imports— Script acelerador: executagoimportspara organizar importsnormalize-style— Aplica convenções de naming e estilo consistentes (LLM-driven)
DepsAgent (Gerenciamento de Dependências)
DepsAgent (Gerenciamento de Dependências)
read, exec, search, tree)
Effort default: lowSkills:audit-deps— Script acelerador: executago mod verifyegovulncheckpara auditoriaupdate-deps— Script acelerador: lista dependências desatualizadas com atualizações disponíveis (dry-run)why-dep— Script acelerador: explica por que uma dependência existe viago mod whyego mod graphfind-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 (viaregistry.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ê:
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: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
Escaneamento
~/.chatcli/agents/ (global) e ./.agent/agents/ (projeto).Criação do CustomAgent
CustomAgent que implementa a interface WorkerAgent. Model() e Effort() vêm direto do frontmatter.Registro no Catálogo
Mapeamento de Tools
O campotools do YAML frontmatter mapeia ferramentas estilo Claude Code para subcomandos do @coder:
| Tool no YAML | Comando(s) @coder | Descrição |
|---|---|---|
Read | read | Ler conteúdo de arquivos |
Grep | search | Buscar padrões em arquivos |
Glob | tree | Listar diretórios |
Bash | exec, test, git-status, git-diff, git-log, git-changed, git-branch | Execução e operações git |
Write | write | Criar/sobrescrever arquivos |
Edit | patch | Edição precisa (search/replace) |
MultiEdit | multipatch | Edição transacional de múltiplos arquivos com rollback all-or-nothing |
Regras de Proteção
- Sem tools = read-only: Agents sem campo
toolsrecebem automaticamenteread,search,treee 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 declaramodel:, 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. API cache do provider ativo
/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. Catálogo no provider do usuário
catalog.Resolve(userProvider, hint) bate (match exato, alias ou prefixo), swap de model no mesmo provider. Nota: catalog-same-provider.3. Catálogo em qualquer provider conhecido
GetAvailableProviders() (tem API key configurada), swap cross-provider. Nota: catalog-cross-provider.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. Otimista
optimistic-user-provider.Garantias
cli.Client,cli.Provider,cli.Modelnunca são mutados. Swaps são escopo de turno.- OAuth é verificado implicitamente: provider só entra em
GetAvailableProviders()seauth.ResolveAuthretornou 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 hinteffort: é propagado via context.WithValue e lido pelos providers dentro de SendPrompt. Cada provider faz sua própria conversão:
| Provider | Effort → Campo no Request | Modelos Suportados |
|---|---|---|
| Anthropic (Claude) | thinking.budget_tokens | opus-4.x, sonnet-4.x, 3.7-sonnet |
| OpenAI Chat Completions | reasoning_effort | o1, o3, o4, gpt-5, *-reasoning |
| OpenAI Responses | reasoning.effort | o1, o3, o4, gpt-5, *-reasoning |
| Effort | Anthropic budget_tokens | OpenAI effort |
|---|---|---|
unset | (não enviado) | (não enviado) |
low | (não enviado) | low |
medium | 4096 | medium |
high | 16384 | high |
max | 32768 | high (OpenAI não tem “max”) |
Skills: Scripts vs Descritivas
Cada agent possui dois tipos de skills:- Skills Executáveis (Scripts Aceleradores)
- Skills Descritivas
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
read e executar scripts com exec durante sua operação autônoma.
Estratégia de Recuperação de Erros
Quando umagent_call falha, o orquestrador segue um protocolo de recuperação inteligente:
Diagnóstico via tool_call
tool_call direto para ler arquivos relevantes e entender o erro (já tem o contexto).Fix via tool_call
tool_call.tool_call (rápido, preciso). Novas fases de trabalho = agent_call (paralelo, escalável).Configuração
| Variável | Padrão | Descrição |
|---|---|---|
CHATCLI_AGENT_PARALLEL_MODE | true | Ativa/desativa o modo multi-agent |
CHATCLI_AGENT_MAX_WORKERS | 4 | Máximo de goroutines simultâneas |
CHATCLI_AGENT_WORKER_MAX_TURNS | 10 | Máximo de turnos por worker |
CHATCLI_AGENT_WORKER_TIMEOUT | 5m | Timeout por worker |
CHATCLI_AGENT_<NAME>_MODEL | (depende) | Override do modelo para um built-in específico (ex.: CHATCLI_AGENT_PLANNER_MODEL=claude-opus-4-6) |
CHATCLI_AGENT_<NAME>_EFFORT | (depende) | Override do effort para um built-in específico (ex.: CHATCLI_AGENT_FORMATTER_EFFORT=low) |
Exemplo de .env
Segurança Anti-Race
O sistema implementa múltiplas camadas de proteção contra condições de corrida:FileLockManager
Histórico Isolado
[]models.Message, sem compartilhamento.LLM Clients Independentes
Engine Stateless
engine.Engine fresh.Context Tree
context.WithCancel. Effort hints são anexados a este ctx.Policy Enforcement
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 arquivocoder_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
| Regra | Comportamento no Worker |
|---|---|
| allow | Ação executada automaticamente, sem interrupção |
| deny | Ação bloqueada silenciosamente; worker recebe erro [BLOCKED BY POLICY] |
| ask | Worker pausa, spinner é suspenso, e um prompt de segurança é exibido ao usuário |
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: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)
Dispatcher cria goroutines com clients resolvidos
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).Orquestrador despacha PlannerAgent
effort=high (extended thinking) — mesmo que o usuário esteja em Sonnet, o Planner pensa mais profundamente nesta fase.Recuperação de erros (se necessário)
tool_call para diagnóstico e fix rápido.Maximização de Paralelismo
O sistema de prompts do ChatCLI instrui explicitamente a IA a maximizar paralelismo em todos os níveis:- tool_call: Operações independentes (ler 3 arquivos, buscar + ler) devem ser emitidas em uma ÚNICA resposta, não em turnos separados.
- agent_call: Para 3+ tarefas independentes, preferir
agent_callque roda em goroutines paralelas. - Per-turn anchor: A cada turno do ReAct loop, um lembrete reforça a necessidade de paralelismo.
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
AgentInforetornam zero values — o client os trata como “inherit” - Operator e CRDs não precisam de mudanças: agents são carregados pela
persona.Loaderdentro 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:
| Aspecto | <agent_call> (Multi-Agent) | delegate_subagent |
|---|---|---|
| Paralelismo | Sim — várias tags numa só resposta executam em paralelo | Sequencial (uma por vez) |
| Escolha de agent | Despacha para um agent do catálogo (FileAgent, CoderAgent, ReviewerAgent, customizados…) | Loop ReAct genérico, sem persona específica |
| Roteamento por modelo/effort | Sim — cada agent pode ter model: e effort: próprios | Não — herda o cliente LLM do pai |
| Janela de contexto | Isolada por worker | Isolada por subagente |
| Indicado para | Quebrar tarefas grandes em vários subprojetos especializados rodando em paralelo | Uma análise focada que precisa consumir muitos tokens de dados brutos sem voltar todos para o pai |
<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
model:/effort: por agent.