Skip to main content
O Reasoning Backbone unifica como o ChatCLI pede “pense mais duro” de providers diferentes. Anthropic expõe extended thinking com thinking_budget em tokens; OpenAI o-series expõe reasoning effort como enum low/medium/high. O pipeline abstrai isso em SkillEffort e auto-attacha ao ctx antes de cada chamada LLM dos agents que fazem reasoning pesado.
A abstração cross-provider é pré-existente em llm/client/skill_hints.go. O que o pipeline adiciona é: política de auto-attach (auto para agents listados), session override via /thinking, e exposição em /config quality.

A abstração existente (pré-pipeline)

llm/client/skill_hints.go:
Providers leem do ctx via client.EffortFromContext(ctx) dentro de seus SendPrompt, traduzem para o campo nativo, e enviam.

Auto-attach: o que o pipeline adiciona

applyAutoReasoning(ctx, cfg ReasoningConfig, agent WorkerAgent) context.Context:
EffortForBudget traduz cfg.Budget (tokens) para o tier SkillEffort mais próximo:
O default CHATCLI_QUALITY_REASONING_BUDGET=8000EffortHigh (8000 tokens de thinking na Claude, reasoning.effort=high na OpenAI).

Três modos

Effort hint é attached apenas para agents em AutoAgents. Agents mecânicos (formatter, shell) não pagam pelo thinking mais caro.

Prioridade de resolução

Para uma chamada LLM dentro de um worker, o effort hint é resolvido nesta ordem (último ganha):
1

Skill frontmatter

Se o turn ativou uma skill com effort: high, esse hint já está no ctx antes do dispatcher.
2

Agent default

PlannerAgent tem effort="high" embutido; dispatcher attacha via WithEffortHint.
3

CHATCLI_QUALITY_REASONING_*

applyAutoReasoning só attacha se (1) mode não é off e (2) ctx ainda não tem effort hint.
4

/thinking session override

No chat (cli_llm.go) e no orchestrator turn (agent_mode.go), cli.applyThinkingOverride(skillEffort) ganha de tudo acima para aquele turn.
Isso significa que /thinking off pode forçar zero thinking mesmo se o agente tem default high. Útil para turns onde velocidade importa mais que qualidade.

/thinking — o slash

O override mora em cli.thinkingOverride:

Providers que suportam

Por que duas linhas Anthropic: a partir do Opus 4.7, a Anthropic descontinuou budgeted extended thinking e passou a aceitar apenas thinking:{type:"adaptive"} — enviar budget_tokens para 4.7 / 4.8 retorna HTTP 400. O ChatCLI dispatcha lendo a capability flag adaptive_thinking no catálogo, então o mesmo hint effort: high é traduzido automaticamente na shape certa por modelo. Adicionar novos modelos adaptive-only no futuro é mudança só no catálogo.
CHATCLI_QUALITY_REASONING_MODE=on com um provider que não suporta é no-op — o ctx tem o hint, o provider não usa, zero falha. Você só paga por capacidade real.

Variáveis de ambiente

Override por agent

Cada agent também tem seu próprio default via BuiltinAgentMeta:
O fluxo: dispatcher lê agent.Effort() → se não-vazio, attacha via WithEffortHint. Isso ganha do applyAutoReasoning (ver passo 2 da priority).

Interação com effort hints de skills

Skills podem declarar effort no frontmatter:
Quando a skill é ativada (auto ou via /skill), skillEffortHint é setado e propagado. A ordem fica:
Skills e reasoning backbone são ortogonais e compostos. Skill diz “a task toda precisa de effort alto”; quality diz “estes agents específicos sempre pensam”; o usuário pode sobrescrever com /thinking.

Observabilidade

/config quality mostra o estado:
Nos logs de worker, cada call LLM com effort ativo aparece como:

Custo

Thinking tokens são cobrados separadamente na Anthropic (output-priced). Budget de 8000 tokens adiciona ~$0.12/call com Sonnet. Reasoning effort na OpenAI também aumenta output tokens.
Estratégia de budget recomendada:

Troubleshooting

  1. Check /config quality — confirme CHATCLI_QUALITY_REASONING_MODE != off
  2. Check CHATCLI_QUALITY_REASONING_AUTO_AGENTS inclui o agent que está rodando
  3. Check logs do provider — thinking_budget deve aparecer no request body
  4. Para Anthropic via OAuth: precisa de beta header interleaved-thinking-2025-05-14 (já ativo em claude_client.go:46)
Correto! /thinking on vale para o próximo turn apenas, depois o flag se mantém mas pode ser limpo com /thinking auto ou /thinking off. Cada /thinking substitui o anterior.
O budget default (8000) é calibrado para Sonnet. Para Opus ou GPT-5, considere baixar: CHATCLI_QUALITY_REASONING_BUDGET=4000. Ou use mode=off e dispare manualmente com /thinking só quando faz diferença.

Leia também

Multi-Agent Orchestration

Como os effort hints fluem do dispatcher para workers paralelos.

Skills and Registry

Como skills declaram effort: no frontmatter.

OpenAI Responses API

Documentação oficial do reasoning.effort.

Anthropic Extended Thinking

Documentação oficial do thinking_budget.