/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.
/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:/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:Guia de Decisão
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.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.Mapeamento de Tools
tools do frontmatter YAML define quais comandos o agent pode usar.Carregamento de Skills
Registro no Catálogo
Dispatcher aplica hints
<agent_call>, antes do worker começar, o dispatcher consulta ResolveModelRouting (para model) e atacha WithEffortHint no ctx (para effort).Mapeamento de Tools
O campotools do YAML frontmatter mapeia ferramentas estilo Claude Code para subcomandos do @coder:
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.6. Fallback gracioso
UserMessage com texto legível. Nota: fallback-unavailable ou fallback-build-failed.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:
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.
Navegação de Contexto pelos Workers
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_*.txtno workspace da sessão, e o prompt do worker o ensina a ler esses arquivos comread(usandostart/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,SessionouKnowledgeno frontmattertoolsganham 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.
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.Retoma via agent_call
agent_call para a próxima fase.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
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
@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: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)
Usuário envia a query
LLM orquestrador despacha agents paralelos
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).Resultados agregados
Orquestrador despacha PlannerAgent
effort=high (extended thinking) — mesmo que o usuário esteja em Sonnet, o Planner pensa mais profundamente nesta fase.Despacha CoderAgent
effort=medium e FileLock nos arquivos sendo escritos).Despacha ShellAgent para testes
effort=low, mecânico).Recuperação de erros (se necessário)
tool_call para diagnóstico e fix rápido.Validação final
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:
<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.