RefinerAgent é um worker pure-reasoning (zero tool access) que opera apenas sobre texto, e pode ser invocado diretamente pelo orquestrador ou automaticamente pelo RefineHook como post-processamento.
Self-Refine é opt-in. Com
CHATCLI_QUALITY_REFINE_ENABLED=false (default), o RefineHook não é adicionado ao pipeline e zero overhead é introduzido.Protocolo do RefinerAgent
O modelo recebe TASK + DRAFT e emite dois blocos XML-ish:- Output APENAS os dois blocos — nada antes, nada depois.
- Se o draft já está excelente,
<revised>repete verbatim e<critique>diz “no material issues”. - Nunca inventa novos requisitos fora da TASK.
- Mantém o mesmo formato do draft (código → código, prosa → prosa).
Fluxo do RefineHook
Multi-pass loop
Para cada pass até
MaxPasses:- Dispatch
workers.AgentCall{Agent: refiner, Task: RefineDirective + "Task: ...\n\nDraft: ..."} - Recebe
res.Outputcom o conteúdo de<revised> - Se
convergedRefine(currentDraft, res.Output, EpsilonChars)→ break
Convergência
convergedRefine é um check barato que detecta quando duas revisões consecutivas são “praticamente iguais”:
EpsilonChars=50 (default), o loop para quando duas passadas diferem por menos de 50 caracteres — sinal claro de estabilização. Isso evita gastar tokens iterando em um output que o modelo já considera pronto.
Exclude lists (anti-recursão e agents mecânicos)
O defaultExcludeAgents:
| Agente | Razão |
|---|---|
| formatter | Output mecânico (arquivo formatado), refinar não agrega |
| deps | Output é interpretação determinística de go list, npm ls, etc. |
| refiner | Anti-recursão: refinar a saída do refiner criaria loop infinito |
| verifier | Mesma razão — verifier já entrega output polido |
/refine — session toggle
Em vez de editar env vars e reiniciar, use o slash:
cli.qualityOverrides.Refine como *bool:
nil→ defer ao/config quality&true→ força on&false→ força off
AgentMode.Run() constrói seu qualityConfig.
Variáveis de ambiente
| Env var | Default | O que faz |
|---|---|---|
CHATCLI_QUALITY_REFINE_ENABLED | false | Master switch |
CHATCLI_QUALITY_REFINE_MAX_PASSES | 1 | Hard cap de passes (recomendo 1-2) |
CHATCLI_QUALITY_REFINE_MIN_BYTES | 200 | Não refina outputs menores |
CHATCLI_QUALITY_REFINE_EPSILON | 50 | Threshold de convergência em chars |
CHATCLI_QUALITY_REFINE_EXCLUDE | formatter,deps,refiner,verifier | CSV de agents que NÃO são refinados |
Override do refiner agent
ORefinerAgent tem defaults de model="" e effort="medium". Override:
Exemplo: refine em resposta de documentação
- Draft (CoderAgent output)
- Critique
- Revised
Invocação direta pelo orquestrador
Além do hook automático, o orquestrador pode chamar o refiner via<agent_call>:
- Você quer refinar uma saída específica sem ligar o hook global.
- A tarefa em si é “melhorar este texto”.
- Chains complexas: coder escreve → reviewer analisa → refiner poliaça a análise antes de entregar.
Custo e latência
| Config | Calls LLM extras por turn | Latência típica |
|---|---|---|
MaxPasses=1 (default) | +1 | 1-3s com Haiku, 3-8s com Sonnet |
MaxPasses=2 | +1 a +2 (converge pode parar em 1) | até 2x |
MaxPasses=3+ | Raramente converge → gasto | Evitar |
Leia também
#6 CoVe
Chain-of-Verification complementa refine com checagem factual.
#3 Reflexion
Se refine flagga low-quality em múltiplos turns, Reflexion persiste a lição.
ReviewerAgent
Agent pré-pipeline que faz code review. Refiner é complementar: um analisa, o outro reescreve.
Configuração
Todos os CHATCLI_QUALITY_REFINE_* num lugar só.