本页尚未翻译;您正在阅读葡萄牙语原文。
ADR 0224 — O raciocínio é contado no stream e abortado no limite, e o custo é estimado e reconciliado
Status
Accepted. 2026-10-22 (AT-589, EP-026, decisões do dono). Tema: llm.
Complementa, sem editá-lo, o 0223 e usa a
coluna price_implicit do 0188.
Contexto
O 0223 só limita quem respeita o campo
reasoning.max_tokens. O deepseek/deepseek-v4.1-flash ignora todo campo de limite
(8192 de raciocínio em 8192), e foi para ele que a AT-589 nasceu: abortar a conexão no
stream é a única forma de limitá-lo. Medição paga de 22/10 (OpenRouter): todo chunk de
raciocínio traz delta.reasoning (texto); caracteres/4 aproxima os tokens (3,9 no
deepseek, 3,8 no qwen); abortar cobra só o que já foi gerado (~521 de 529 tokens). Mas a
resposta abortada NÃO traz usage nem finish_reason, e o custo real só aparece em
GET /api/v1/generation?id= uns 5 minutos depois (antes, 404).
Decisão
- O provider OpenAI-compatível conta
delta.reasoning(caracteres/4) quando o modelo temreasoning_budget, e ao passar do limite aborta a conexão e emite o chunktruncatedcommotivo: "raciocinio"(o truncamento pormax_tokensnão tem motivo). Modelo sem orçamento não conta nem aborta. - Gasto da chamada abortada = ESTIMATIVA NA HORA: tokens de saída = caracteres/4 (de
raciocínio e texto), de entrada pelo estimador (ou caracteres/4 se não houver), ao
preço do catálogo, com
price_implicite a novatoken_usage.custo_a_reconciliar. - RECONCILIAÇÃO:
ReconciliarCustoEstimadoUseCaseroda porsetIntervalno próprio processo da api (o mesmo mecanismo dos projetores; sem fila nova, sem Redis), a cadaCUSTO_RECONCILIACAO_INTERVAL_MS(5 min;0desliga). Só olha linhas marcadas das últimas 24 h, e troca pelototal_costdo/generationapenas com 200; a linha trocada guarda a estimativa emcatalog_cost_micros. Qualquer outra resposta deixa a linha para a próxima passada; após 24 h a estimativa fica definitiva. - A migração 0075 cria a coluna e põe
reasoning_budget2048 nodeepseek/deepseek-v4.1-flash(openrouter), no molde da 0074.
Consequências
- O contrato do provider ganha
truncated.motivoeusage.abortadoPeloRaciocinio(aditivos); o metering ganha a coluna. - Limites declarados: o
spentMicrosde budget e área NÃO é corrigido pela reconciliação (a estimativa já o incrementou; a diferença é de centavos); a chave usada é a do owner do workspace; várias instâncias da api reconciliam em paralelo sem dano (a troca só atua em linha ainda marcada); tool calls parciais do stream abortado são descartadas.