antonio leandro

claude, na prática

Extended thinking

tutorial · 03 · contexto · Anthropic ·

a tese

o raciocínio do modelo virou um parâmetro de requisição: budget_tokens é um alvo, não um teto, e a própria anthropic já o aposentou em favor de deixar o modelo decidir quanto pensar

o que fica

  1. O budget_tokens é um alvo, não um limite rígido: o modelo pode parar de raciocinar bem antes de esgotá-lo, e quem impõe o teto real da saída continua sendo o max_tokens.
  2. Tokens de thinking são cobrados como output e contam para o max_tokens do turno, então o orçamento precisa sobrar espaço para a resposta final — daí a regra de budget_tokens menor que max_tokens.
  3. Mudar o valor do budget entre requisições invalida cache breakpoints, porque o número é renderizado dentro do prompt; escolha um orçamento e segure ele pela vida da conversa em cache.
  4. Budgets acima de 32 mil tokens produzem requisições longas o bastante para bater em timeout e limite de conexão aberta, e a recomendação passa a ser batch processing.
  5. Aceitar um header não é o mesmo que obedecê-lo: o header de interleaved thinking é aceito em qualquer modelo e silenciosamente ignorado onde não há suporte.
  6. Migrar para adaptive thinking muda comportamento, não só sintaxe: com budget fixo o modelo pensa em toda requisição, e no modo adaptativo ele pode pular o raciocínio em entradas fáceis.

o problema

Um modelo que raciocina antes de responder gasta duas coisas que o produto sente: tokens, que são cobrados como output, e tempo, que o usuário espera olhando a tela. Enquanto o raciocínio é uma caixa preta do provedor, quem constrói em cima dele não consegue prometer nada — nem custo por chamada, nem latência de cauda. Uma pergunta trivial e uma prova de teoria dos números caem no mesmo endpoint e saem com contas radicalmente diferentes.

O inverso também quebra. Cortar o raciocínio por padrão para ficar barato entrega resposta rasa justamente nas tarefas em que ele importa. E a dificuldade não é uma propriedade do deployment, é uma propriedade de cada requisição: o mesmo agente que responde “qual o status do build” também precisa desenrolar um traceback de trinta frames. O controle, se existir, tem que ser por chamada.

a ideia

O modo manual de extended thinking expõe esse controle como um campo do corpo da requisição. Você manda thinking: {type: "enabled", budget_tokens: N} e o modelo raciocina contra esse orçamento antes de começar a resposta final. É orçamento de obra, não cronômetro: o modelo pode gastar menos que o combinado e frequentemente gasta, mas ninguém garante que ele pare exatamente ali. O corte duro continua sendo o max_tokens.

A justificativa que a documentação dá para o modo manual é honesta e estreita: ele serve quando a carga de trabalho exige latência previsível ou controle preciso do custo de raciocínio. Não é uma alavanca de qualidade, é uma alavanca de previsibilidade.

como funciona

{
  "model": "claude-sonnet-4-6",
  "max_tokens": 16000,
  "thinking": { "type": "enabled", "budget_tokens": 10000 }
}

As regras do orçamento são três. O mínimo é 1.024 tokens e a API rejeita valores menores. O budget precisa ser menor que max_tokens, porque os tokens de thinking contam para o mesmo limite do turno. E, como consequência disso, o modo manual não combina com cache pre-warming, que depende de max_tokens: 0.

A exceção é o interleaved thinking, em que o modelo pensa entre chamadas de ferramenta dentro de um mesmo turno de assistant. Ali o budget_tokens pode passar do max_tokens, porque o orçamento cobre todos os blocos de thinking do turno. Habilitar isso no modo manual exige o header beta interleaved-thinking-2025-05-14 no Opus 4.5, no Sonnet 4.5 e nos modelos Claude 4 anteriores.

Para calibrar: tarefa simples começa perto do mínimo e sobe aos poucos; tarefa complexa começa em 16.000 ou mais e desce até o ponto em que latência e qualidade se encontram. O retorno é decrescente e o tamanho da queda depende da tarefa. Acima de 32 mil tokens de thinking, a orientação é ir para batch processing, porque a requisição fica longa demais para timeouts e limites de conexão aberta.

A medição vem do campo usage.output_tokens_details.thinking_tokens, que separa quanto do output cobrado foi raciocínio interno. Em streaming, esse detalhamento só aparece no message_delta final. Uma restrição estrutural fecha o pacote: no modo manual, o turno final de assistant precisa começar com um bloco de thinking.

o que isso custou

O controle é aproximado. Um orçamento que é alvo e não teto não dá garantia de custo por requisição — dá uma faixa. Quem precisa de limite real ainda depende do max_tokens.

O preço mais caro é a interação com prompt caching. O valor do budget é renderizado dentro do prompt, então mudá-lo entre requisições invalida breakpoints: breakpoints de mensagem sempre erram, e se os de tool e system prompt erram também depende de onde o modelo renderiza a configuração. A documentação mostra o efeito num experimento — a terceira requisição, com o budget subindo de 4.000 para 8.000, recria 1.370 tokens de cache em vez de lê-los. Na prática, ajustar orçamento dinamicamente por dificuldade e manter cache quente são objetivos que brigam.

O interleaved thinking chega fragmentado. O Sonnet 4.6 ainda aceita o header no modo manual, mas depreciado; o Opus 4.6 não tem interleaving nenhum no modo manual; o Haiku 4.5 não suporta o recurso. Pior: o header é aceito em qualquer modelo, na API da Anthropic e nas plataformas parceiras, e ignorado onde não funciona. Você não recebe erro, recebe silêncio.

E o modo manual pensa sempre. Com budget fixo, toda requisição paga raciocínio, inclusive as que não precisavam.

onde isso aparece hoje

Esse último ponto é o que matou o recurso. Nos modelos 4.6, budget_tokens está depreciado — as requisições ainda passam. Do 4.7 em diante, incluindo Opus 5, Sonnet 5, Fable 5.1 e Mythos 5, type: "enabled" retorna 400. O Mythos Preview aceita os dois modos; o Sonnet 4.5, o Opus 4.5, o Haiku 4.5 e os Claude 4 anteriores só aceitam o manual, e ali não há o que migrar.

A migração é pequena no papel: tira o budget_tokens, põe thinking: {type: "adaptive"} e move a profundidade para output_config: {effort: ...}, cujo padrão é high. O que muda é a semântica — quem decide se e quanto pensar passa a ser o modelo, e em effort baixo ele pode não pensar nada numa entrada fácil. O header beta pode sair junto, porque o modo adaptativo interleava sozinho. A preservação de blocos de thinking também mudou de lado no caminho: Opus 4.5 e os modelos 4.6 ou superiores mantêm os blocos dos turnos anteriores no contexto e os cobram como input, enquanto Sonnet 4.5, Haiku 4.5 e anteriores os descartavam.

lido na íntegra por pipeline de llm, revisado por antonio leandro antes de publicar ·