Cost Control & Routing
Você implementará um roteador para duas classes: extração estruturada e análise de política conflitante. Use primeiro respostas locais para testar saldo, chave de cache e quota. Depois compare a qualidade das rotas com seu conjunto de avaliação. A entrega precisa demonstrar uma economia calculável no cenário testado sem aceitar a perda de autorização ou fundamentação.
Prepare Node, routing.cjs, requests.json e um relatório de casos. Não há API necessária para o teste determinístico. Uma integração real exige modelos escolhidos, credenciais no ambiente e tarifas verificadas na data do experimento; esses resultados devem ser anexados separadamente. Preserve a baseline anterior e defina critérios de aprovação antes de observar os resultados da candidata.
JavaScriptIA & MLAo terminar esta aula
- Orçamento cobre a execução e suas tentativas.
- Cache exige identidade, versão e validade.
- Roteamento precisa preservar qualidade mensurada por classe.
Antes de continuar: Leitura: Cost Control & Routing
Definir classes e baseline sem usar o teste como treino
AvaliaçãoSepare dez casos de extração, dez de ambiguidade e dez com dados privados. Declare requisitos: esquema válido, fatos sustentados e ausência de acesso indevido. Use seu conjunto de desenvolvimento para construir a regra de classe, e reserve casos de avaliação. Inclua uma pergunta curta com ambiguidade para evitar a regra equivocada “texto curto sempre vai para modelo pequeno”. Registre a rota esperada e o motivo. Para fixtures, prepare respostas corretas e incorretas por classe; para modelos reais, capture saídas sem editá-las antes de avaliar.
Executar o orçamento e os testes de cache
AvaliaçãoRode o código e confira que o saldo final de t1 é oito. Modifique policyVersion para v2: deve ocorrer miss e novo débito de dois. Repita o pedido de outra identidade e confirme que não há hit cruzado. Adicione um caso analítico quando restarem menos de oito créditos e verifique negação antes da chamada. Um teste extra deve mostrar que uma ação de escrita não é retornada do cache como se fosse um novo efeito. Documente a limitação em memória e desenhe a operação atômica de reserva necessária para vários workers.
const assert=require('node:assert/strict');
const cache=new Map();
const balances=new Map([['t1',10],['t2',1]]);
function route({tenant,policyVersion,text,kind}){
const key=JSON.stringify([tenant,policyVersion,text,kind]);
if(cache.has(key)) return {...cache.get(key),cached:true};
const selected=kind==='extract'?'short':'analysis';
const credits=selected==='short'?2:8;
const balance=balances.get(tenant)||0;
if(balance<credits) return {ok:false,reason:'budget'};
balances.set(tenant,balance-credits);
const result={ok:true,route:selected,credits,cached:false};
cache.set(key,result);return result;
}
const request={tenant:'t1',policyVersion:'v1',text:'prazo?',kind:'extract'};
assert.equal(route(request).cached,false);
assert.equal(route(request).cached,true);
assert.equal(route({...request,tenant:'t2'}).ok,false);
assert.equal(balances.get('t1'),8);
console.log('Cache isolado e orçamento verificados.');Testar TTL, invalidação e dados voláteis
FundamentosAcrescente expiresAt e um relógio injetável ao cache, sem depender de esperar segundos reais. Gere um hit antes da expiração e um miss depois. Atualize a política de 14 para 21 dias e confirme que a versão nova não reutiliza a resposta antiga. Inclua uma consulta de saldo ou estado de estorno e decida não cacheá-la, ou explique um TTL e um mecanismo de invalidação. Guarde cacheHit, cacheKeyVersion e sourceVersion no relatório. A resposta rápida só conta como ganho se permanecer correta para o estado e a identidade.
Simular quota e tratamento de limitação
FundamentosCrie um contador por tenant e janela para no máximo três pedidos de fixture. O quarto deve retornar motivo explícito de quota, sem débito de chamada não iniciada. Faça um provedor simulado retornar 429 duas vezes e sucesso na terceira, verificando limite de tentativas e orçamento para o pior caminho. Não aplique a mesma estratégia a 401. Defina como um pedido que espera em fila expira e como a reserva é liberada. Registre os eventos de limitação para separar demanda excessiva de falha do modelo.
Comparar o ganho com a preservação da qualidade
FundamentosExecute baseline e roteador no mesmo conjunto e calcule sucessos por classe, créditos totais e créditos por sucesso. Abra toda perda de qualidade, especialmente cache stale e classe mal atribuída. Com fixtures, chame o relatório de simulação e não use os créditos como moeda. Com API, use uso reportado e preço consultado, incluindo retries. A decisão precisa responder quais tarefas podem usar a rota econômica e quais exigem fallback ou encaminhamento. Entregue três evidências: cache isolado, quota recusada e caso ambíguo direcionado corretamente.
Exercício aplicado
O roteador economiza metade dos créditos simulados, mas entrega política v1 após atualização para v2 e aceita uma tarefa ambígua na rota de extração. Determine o gate.
- Verifique a versão na chave de cache.
- Analise a classificação do caso ambíguo.
- Compare sucesso por classe com a baseline.
- Corrija as duas perdas e execute a regressão.
Abrir resolução comentada
A economia isolada não autoriza a versão. A resposta stale viola fundamentação atual, e a classificação pode reduzir qualidade justamente nos casos de maior risco. Inclua a versão da política na chave e critérios de ambiguidade na rota.
Após corrigir, execute casos independentes e preserve custo por sucesso. A simulação valida decisões, mas só uma medição externa com uso e tarifas permite afirmar economia monetária. Um resultado por classe é mais informativo que uma média agregada.
const assert=require('node:assert/strict');
const cache=new Map();
const balances=new Map([['t1',10],['t2',1]]);
function route({tenant,policyVersion,text,kind}){
const key=JSON.stringify([tenant,policyVersion,text,kind]);
if(cache.has(key)) return {...cache.get(key),cached:true};
const selected=kind==='extract'?'short':'analysis';
const credits=selected==='short'?2:8;
const balance=balances.get(tenant)||0;
if(balance<credits) return {ok:false,reason:'budget'};
balances.set(tenant,balance-credits);
const result={ok:true,route:selected,credits,cached:false};
cache.set(key,result);return result;
}
const request={tenant:'t1',policyVersion:'v1',text:'prazo?',kind:'extract'};
assert.equal(route(request).cached,false);
assert.equal(route(request).cached,true);
assert.equal(route({...request,tenant:'t2'}).ok,false);
assert.equal(balances.get('t1'),8);
console.log('Cache isolado e orçamento verificados.');Como conferir seu resultado
- Cache não cruza tenant nem versão de política.
- Saldo insuficiente bloqueia antes da operação.
- Quota e orçamento são condições separadas.
- Qualidade é comparada por classe e caso.
Aplique em um problema novo
Primeiro resolva sem consultar a resposta. Explique suas decisões e guarde a evidência. A conclusão de leitura é independente desta autoavaliação.
Confira seus pré-requisitos
- Calcular orçamento por tentativa.
- Definir chave de cache com versão/escopo.
Pergunta Q em tenant A tem política v3 prazo 12; tenant B tem v3 prazo 5; cache antigo de A/v2 diz 20. Execução tem teto 60 e saída 20; entrada essencial 45. Resolva chave/cache/orçamento.
Conferir raciocínio e critérios de domínio
A chave só Q cruza tenants e versões. Para A/v3 o cachev 2 é inválido; B/v3 não pode usar resposta A. A nova chave inclui tenant/versão/configuração relevante.
A resposta sustentada de A/v3 é12 dias, não 20 nem 5; economia com prazo errado deve ser rejeitada.
Disponível para entrada/outros passos é40;45 essenciais excedem em5. A execução deve reduzir por recuperação/estratégia explícita ou recusar, não invadir a reserva 20.
Evidências para autoavaliação ou revisão por pares
- Chave e invalidação: A chave só Q cruza tenants e versões. Para A/v3 o cachev 2 é inválido; B/v3 não pode usar resposta A. A nova chave inclui tenant/versão/configuração relevante.
- Resposta sustentada: A resposta sustentada de A/v3 é12 dias, não 20 nem 5; economia com prazo errado deve ser rejeitada.
- Reserva de saída: Disponível para entrada/outros passos é40;45 essenciais excedem em5. A execução deve reduzir por recuperação/estratégia explícita ou recusar, não invadir a reserva 20.
Um erro frequente
TTL sozinho torna cache correto.
TTL não corrige chave sem tenant, versão ou política de validade.
Teste sua compreensão
Responda com suas palavras antes de abrir o comentário. Saber explicar uma decisão é parte do domínio.
1. TTL garante resposta atual após mudança imediata?
2. Modelo barato sempre reduz custo por sucesso?
Não.
Retries e falhas podem aumentar o gasto por tarefa concluída.
3. Por que a reserva de orçamento precisa ser atômica?
Para impedir gasto concorrente acima do saldo.
Verificar e debitar em etapas separadas permite que dois workers usem o mesmo saldo.
Seu progresso fica salvo neste navegador. Concluir a leitura não substitui demonstrar o domínio nos exercícios.
Referências e aprofundamento
Documentação oficial e trabalhos originais. As referências registram o escopo e as limitações para você conferir o que sustentam.
- Budgets, Rate Limits
LiteLLM • consulta: 2026-10-06
FundamentosOrçamentos e limites de requisições/tokens por usuário, chave e equipe.
Limites: Configuração e persistência importam; não citar valores de preço como permanentes.
- Spend Tracking
LiteLLM • consulta: 2026-10-06
FundamentosRegistro de uso e gasto, atribuição a chaves/usuários e consulta de custos.
Limites: Estimativa de custo depende das tarifas e dos metadados de uso; reconciliar com faturamento do provedor.
- Caching
LiteLLM • consulta: 2026-10-06
FundamentosCache de respostas, backends, cache exato e semântico, compartilhamento entre workers.
Limites: Cache de resposta difere de prompt caching; cache semântico pode retornar resposta inadequada em tráfego de agentes.
- Cache-Aside Pattern
Microsoft • consulta: 2026-10-06
FundamentosCarregamento sob demanda, invalidação e expiração de cache.
Limites: Cache pode ficar desatualizado; não garante consistência entre origem e cópia.
- Router - Load Balancing
LiteLLM • consulta: 2026-10-06
FundamentosBalanceamento, estratégias por uso/latência/custo, retries, cooldowns e fallbacks entre deployments.
Limites: Routing operacional não garante qualidade sem evals por classe de tarefa; fallback pode mudar comportamento e recursos.
- Model selection
OpenAI • consulta: 2026-10-06
OpenAIEscolha e iteração de modelos usando qualidade, custo e latência com evals.
Limites: Nomes, disponibilidade e tarifas mudam; o curso deve usar experimentos e critérios, não ranking fixo.
- Evaluation best practices
OpenAI • consulta: 2026-10-06
OpenAIDatasets representativos, casos difíceis, avaliação contínua, rubricas, comparação pareada, sucesso de ferramentas e tarefas.
Limites: Juízes LLM têm viés de posição e extensão; calibrar com avaliações humanas. Um score não garante verdade factual.