Como validar as decisões do Jev antes de colocar em produção?

Validar o Jev é medir duas coisas ao mesmo tempo: se a decisão bate com a resposta certa e se o número de confiança significa alguma coisa. O caminho é montar um conjunto de casos reais já resolvidos, rodar pela API, guardar resposta, probabilities e confidence, comparar com os rótulos e plotar confiança contra acurácia por faixa. Depois você define limiar por ação (cada erro custa diferente), mede estabilidade repetindo a mesma rubrica no mesmo caso e fixa o ID versionado em vez de jev-latest. Benchmark público ajuda, mas quem decide é o seu conjunto rotulado
Colocar decisão automatizada em produção sem validar é entregar o processo da sua empresa pra uma caixinha que ninguém abriu
E com o Jev a conversa muda de figura, porque ele não é um LLM que cospe texto
Ele é o primeiro System One Model da TypeSafe AI: recebe estado não estruturado e devolve decisão tipada com probabilidades, em vez de string
Ou seja, tem DOIS números pra validar, não um
O primeiro é o óbvio: ele acertou? O segundo é o que quase todo mundo esquece: quando ele diz que está 0,9 confiante, ele acerta mesmo nessa mesma proporção das vezes?
Se o segundo número mente, todo o seu roteamento automático vira loteria, mesmo com acurácia bonita no papel
Bora montar essa validação direito? 🙂
O que você precisa antes de começar a validação
Primeiro o acesso
O Jev está em acesso antecipado por lista de espera desde 15/09/2026, sem data anunciada de disponibilidade geral
Fora da waitlist, ele aparece em provedores terceiros: Vercel AI Gateway (no AI SDK 7, pela experimental evaluate API, chamando o modelo typesafe-ai/jev), Cloudflare (página de modelo typesafe/jev) e OpenRouter (typesafe/jev-1.13)
Depois o básico técnico:
- Chave de API na variável de ambiente
TYPESAFE_API_KEY - SDK Python oficial, que pede Python >= 3.10 e instala com
pip install "typesafe-sdk>=0.5.7"usando--extra-index-url https://pypi.typesafe.ai/ - Ou chamada direta em
POST https://api.typesafe.ai/v1/systemone, com headerAuthorization: Bearer <API_KEY>eContent-Type: application/json
Se você trabalha dentro do Claude Code, a TypeSafe mantém uma agent skill oficial: claude plugin marketplace add typesafe-ai/skills, depois claude plugin install typesafe@typesafe-ai, e você invoca com /typesafe:typesafe-ai (a instalação é local ao projeto por padrão, com -g pra global)
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
Agora o pré-requisito que ninguém tem pronto na gaveta
Você precisa de um conjunto de casos reais com a resposta correta conhecida
Sem isso não existe validação, existe achismo com terminal aberto 😛
E um detalhe de tamanho: o OpenRouter lista a janela de contexto do Jev 1.13 em 32.000 tokens, então o estado que você manda precisa caber aí
Passo a passo para validar as decisões do Jev
- Escolha a primitiva certa e escreva a pergunta literal
A API tem três tipos de pergunta: Choice (uma opção de um conjunto), Score (nível dentro de uma escala ordenada e descritiva) e Noul (sim/não, que retorna a probabilidade de a resposta ser sim)
Escolher errado aqui contamina tudo que vem depois, porque você vai medir a pergunta errada com precisão cirúrgica
O erro comum deste passo: escrever a pergunta que você PRETENDIA fazer, não a que está escrita. A própria página de limitações conhecidas do jev-1.13 avisa que o modelo é literal, ele responde exatamente o que está na pergunta
Esse cuidado é o mesmo de escrever uma spec antes de implementar: ambiguidade na frase vira defeito silencioso lá na frente
- Monte o conjunto rotulado a partir de casos reais
Pega histórico de verdade: tickets já resolvidos, sinistros já julgados, posts já moderados
E inclui os casos difíceis, os que fizeram alguém da operação parar e pensar
O erro comum deste passo: montar um conjunto só com caso fácil. Aí a acurácia sai redonda, todo mundo bate palma, e a produção estoura na primeira semana com o caso ambíguo que nunca entrou na amostra
- Rode o lote e guarde tudo
Resposta, probabilities e confidence, caso a caso
Respostas de Choice e Score trazem a propriedade probabilities (distribuição que soma 1) e um confidence entre 0 e 1 derivado dessa distribuição
Respostas de Noul NÃO trazem confidence, elas trazem a probabilidade de a resposta ser sim, que é coisa diferente
curl -X POST https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d @caso-001.json
O erro comum deste passo: salvar só a decisão final e descartar a distribuição. Sem probabilities guardado, você não tem como refazer análise de limiar depois sem rodar o lote inteiro de novo
- Meça acurácia contra os rótulos
Aqui é o feijão com arroz: quantos casos bateram com a resposta conhecida
Mede também por classe, não só o total. Um modelo que acerta bastante no geral pode estar errando quase tudo na classe rara, que normalmente é justo a classe cara
O erro comum deste passo: olhar a média e parar. Média esconde exatamente o subgrupo que vai te machucar
- Plote confiança contra acurácia por faixa
Esse é o passo que separa validação de verdade de teatro
A documentação orienta isso direto: pegue um conjunto de entradas cujas respostas você conhece, rode e veja onde confiança e acurácia divergem
Na prática, você pega os resultados de Choice e Score (que são os que trazem confidence), agrupa por faixa e calcula a acurácia dentro de cada uma
Noul fica fora desse balde, porque ali o que volta é a probabilidade de a resposta ser sim, não um confidence
from collections import defaultdict
# cada item vem de uma resposta de Choice ou Score: {"esperado": ..., "resposta": ..., "confidence": 0.0 a 1.0}
baldes = defaultdict(lambda: {"n": 0, "acertos": 0, "soma_conf": 0.0})
for r in resultados:
nivel = min(int(r["confidence"] * 10), 9) # 0.0-0.1, 0.1-0.2 ...
b = baldes.setdefault(nivel, {"n": 0, "acertos": 0, "soma_conf": 0.0})
b["n"] += 1
b["soma_conf"] += r["confidence"]
b["acertos"] += int(r["resposta"] == r["esperado"])
print("faixa | casos | conf_media | acuracia")
for nivel in sorted(baldes):
b = baldes.get(nivel)
conf_media = b["soma_conf"] / b["n"]
acuracia = b["acertos"] / b["n"]
print(f"{nivel/10:.1f} | {b['n']:5d} | {conf_media:.2f} | {acuracia:.2f}")
O que você quer ver: a coluna de confiança média e a de acurácia andando juntas
Se na faixa 0,9 a acurácia dá 0,6, o número de confiança não serve pra decidir nada
O erro comum deste passo: faixa com 4 casos dentro. Balde vazio não mede calibração, mede ruído. Se não tiver volume, junta faixas
- Meça estabilidade repetindo a mesma rubrica no mesmo caso
Os cookbooks oficiais de autoconsistência fazem exatamente isso: o de nouls roda uma rubrica de 14 perguntas sobre um sinistro de seguro 15 vezes, e o de choices roda uma rubrica de moderação sobre um post 15 vezes, usando um campo uid novo a cada chamada
Você repete e olha a dispersão: a decisão se manteve? a confiança oscilou quanto?
O erro comum deste passo: rodar uma vez só, ver o resultado bonito e concluir que está resolvido. Decisão instável entre execuções é um problema que só aparece quando você repete
- Defina os limiares POR AÇÃO, não um número único
A documentação é clara nisso: o threshold sai dos seus exemplos rotulados combinados com o custo do erro e o custo da revisão humana
Cada ação é barrada num nível diferente conforme a consequência
Arquivar um ticket errado é chato. Cancelar uma cobrança errada é caro. Mesmo modelo, mesma confiança, limiares diferentes
O erro comum deste passo: escolher um 0.8 redondo porque parece um bom número. Não é metodologia, é estética
- Fixe o ID versionado e confira os modelos da conta
Os exemplos dos docs usam jev-latest, que também é o padrão do SDK
Só que jev-latest é alias, e ele muda quando sai release novo
Se você calibrou limiar contra uma versão, fixa o ID versionado (ex: jev-1.13.0)
curl https://api.typesafe.ai/v1/models \
-H "Authorization: Bearer $TYPESAFE_API_KEY"
Esse GET /v1/models lista os nomes aceitos pela sua conta
O erro comum deste passo: deixar o alias em produção depois de calibrar. Um dia o comportamento muda sozinho e você vai procurar bug no seu código por três dias… 🙃
Por que calibração importa tanto quanto acurácia
Vamos com dois modelos imaginários, ambos com a MESMA acurácia
O modelo A distribui a confiança direitinho: quando ele diz 0,95, ele acerta quase sempre; quando diz 0,55, ele erra bastante
O modelo B responde 0,97 em TUDO, acertando ou errando
Mesma acurácia, comportamento em produção completamente diferente
Com o modelo A você automatiza a faixa alta e manda a faixa baixa pro humano, e ganha tempo de verdade
Com o modelo B você não tem onde cortar. Ou revisa tudo, ou automatiza tudo e come todo o erro de olhos fechados
É por isso que existe o padrão documentado de roteamento por confiança: faixa alta age automaticamente, faixa média confirma ou sinaliza pra revisão, faixa baixa vai pra humano, pede esclarecimento ou cai em outro sistema, como um modelo de raciocínio mais caro
Esse padrão SÓ funciona se o número de confiança for honesto
A TypeSafe diz ter treinado o Jev com um método próprio chamado RLCD, de Reinforcement Learning for Calibrated Decisions, que otimiza justamente pra que as probabilidades acompanhem a taxa real de acerto
É uma promessa de treino, e é uma promessa interessante
Mas promessa de treino não é medição no SEU domínio, com os SEUS casos, com a SUA pergunta literal
O trabalho de calibrar continua sendo seu
Sinais de que a validação está enganando você
Sintoma: acurácia alta e confiança colada no teto em todo caso
Causa: conjunto fácil demais, sem os casos ambíguos da operação real
Prevenção: monte o conjunto puxando os casos que geraram discussão interna, retrabalho ou reclamação. Se todo mundo do time concorda na hora, aquele caso não está testando nada
Sintoma: o mesmo caso dá resposta diferente entre execuções
Causa: pergunta ambígua, rubrica mal delimitada ou estado incompleto
Prevenção: rode a mesma rubrica várias vezes sobre o mesmo caso antes de olhar acurácia, no espírito dos cookbooks oficiais. Instabilidade primeiro, métrica depois
Sintoma: erra feio em pergunta com número ou com data
Causa: está na página de limitações conhecidas do jev-1.13. O modelo é fraco em precisão numérica (não peça pra interpolar valores entre níveis de Score) e lê datas como texto, o que torna comparação, distância e janela de datas pouco confiáveis
Prevenção: faça a conta fora do modelo e pergunte só o julgamento. Data e aritmética são trabalho de código, não de decisão
Sintoma: você desenhou a pergunta B assumindo a resposta da pergunta A
Causa: perguntas enviadas na mesma requisição são avaliadas de forma independente e em paralelo. Toda pergunta vê o mesmo estado, e o resultado de uma primitiva não vira contexto oculto de outra
Prevenção: cada pergunta precisa se sustentar sozinha com o estado que foi enviado. Se existe dependência de verdade, ela é orquestração no seu código, em duas chamadas
Sintoma: o limiar que funcionava começou a se comportar diferente sem ninguém mexer
Causa: jev-latest avançou de versão
Prevenção: ID versionado fixo em produção, e revalidação do conjunto rotulado antes de subir versão nova. É a mesma disciplina de testar integrações antes de ir pra produção: você congela o que está validado e reexecuta a bateria quando algo muda embaixo
O que os benchmarks públicos mostram (e o que eles não provam)
A TypeSafe mantém um dashboard público de workflow evals em evals.typesafe.ai
Na consulta de 20/09/2026, os números eram estes, sobre 711 casos em quatro tarefas:
| Modelo | Concordância | Custo por caso | Tempo por caso |
|---|---|---|---|
| Jev | 67,8% | US$ 0,0004 | 0,4 s |
| GPT-5.6 Sol | 74,1% | US$ 0,0836 | 23,3 s |
| Claude Opus 5 | 73,1% | US$ 0,1761 | 37,8 s |
A diferença de custo e tempo é gritante, e é o argumento central da TypeSafe: nas próprias workflow evals eles divulgam até 193,6x mais rápido e 444,6x mais barato que LLMs
O OpenRouter fala em respostas de 70 a 500 ms de ponta a ponta, e lista o preço em US$ 0,042 por milhão de tokens de entrada e US$ 0 por milhão de tokens de saída
Agora a parte que quase não aparece nos posts empolgados sobre o assunto
Esse benchmark é operado pela própria TypeSafe
E os rótulos de referência são a média das respostas de GPT-6 Astra e Claude Fable 5.1, ambos em high thinking
Traduzindo: a métrica é concordância com referência de modelo, não correção verificada por humanos
Isso não invalida o número, mas muda o que ele significa. Concordar com outros dois modelos e estar certo no seu domínio são coisas diferentes
Esses números também valem pra aquela consulta: não dá pra afirmar como o ranking se comporta quando entram modelos novos no dashboard
Por isso a conclusão da seção é sempre a mesma: o conjunto rotulado que decide é o seu
Conclusão
Validar o Jev não é rodar dez casos e olhar se pareceu esperto
É medir acurácia e calibração juntas, definir limiar por ação conforme o custo do erro, e fixar a versão do modelo que você calibrou
Seu próximo passo é bem concreto: separa de 50 a algumas centenas de casos reais que a sua operação JÁ resolveu, transforma a regra atual em perguntas Choice, Score ou Noul, roda o lote e compara com os rótulos
Só depois desse gráfico de confiança contra acurácia é que faz sentido ligar qualquer automação
E lembrando do estado atual: o modelo segue em acesso antecipado por lista de espera desde 15/09/2026, sem data anunciada de disponibilidade geral, com os provedores terceiros como caminho alternativo
System One Model é coisa nova, tem pouca estrada rodada, e é exatamente por isso que a sua bateria de testes vale mais que qualquer benchmark de terceiro
Bora medir antes de confiar?
Até o próximo post! =)
Perguntas frequentes
Como saber se o limiar de confiança do Jev está certo antes de ir pra produção?
Não existe um número mágico, a documentação orienta calibrar o limiar a partir de exemplos rotulados e do custo de cada erro. Ações mais caras exigem confiança mais alta pra agir automático. É por isso que o padrão de roteamento tem três faixas: confiança alta age direto, média confirma ou sinaliza pra revisão, e baixa vai pra humano ou pra outro sistema.
O Jev serve pra comparar datas ou fazer conta numérica no meio da decisão?
Não, e a própria TypeSafe deixa isso documentado na página de limitações conhecidas do jev-1.13. O modelo lê data como texto, então distância entre datas e janela de tempo saem pouco confiáveis. Ele também é fraco em precisão numérica e não interpola valor entre níveis de Score, então esse tipo de cálculo precisa ficar de fora da pergunta.
Por que fixar a versão jev-1.13.0 em vez de deixar em jev-latest depois de calibrar?
Porque jev-latest é um alias e ele muda de modelo quando sai um release novo. Se você calibrou limiares de confiança contra uma versão específica e o alias troca de modelo por baixo do capô, sua calibração para de valer sem aviso. A documentação recomenda travar o ID versionado justo por isso, e o GET /v1/models lista os nomes que a sua conta aceita.
Repetir a mesma pergunta várias vezes pro Jev serve pra alguma coisa na validação?
Serve pra medir estabilidade, não pra medir acurácia. Os cookbooks oficiais de autoconsistência fazem isso: o de nouls roda uma rubrica de 14 perguntas sobre um sinistro de seguro 15 vezes, e o de choices roda uma rubrica de moderação sobre um post 15 vezes, trocando o campo uid a cada chamada. Se as respostas oscilarem demais entre as rodadas, é sinal de que a pergunta ou a rubrica precisa ficar mais precisa.
O que é o RLCD que a TypeSafe usa pra treinar o Jev?
RLCD é o método próprio de calibração com que a TypeSafe diz ter treinado o Jev, sigla pra Reinforcement Learning for Calibrated Decisions. A ideia é otimizar pra que as probabilidades devolvidas acompanhem a taxa real de acerto, não só a decisão final. Só que isso é promessa de treino: quem mede se a confiança bate com a acurácia no seu domínio, com os seus casos e a sua pergunta, continua sendo você.
Mandar várias perguntas numa chamada só ao Jev muda o resultado de cada uma?
Não, cada pergunta enviada na mesma requisição é avaliada de forma independente e em paralelo. Todas veem o mesmo estado de entrada, mas o resultado de uma primitiva não vira contexto oculto pra outra. Isso ajuda na hora de validar, porque você pode testar Choice, Score e Noul no mesmo lote sem se preocupar com uma pergunta contaminando a outra.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares

Como montar um workflow de automação combinando decisões do Jev em código
Aprenda a montar um workflow com Jev: decisões tipadas encadeadas em código, alta confiança agindo sozinha e casos incertos escalando para revisão.

Para quem o Jev serve (e para quem não serve)?
Jev serve pra roteamento, scoring e guardrails em IA, não pra texto ou código. Veja pra quem o Jev serve e quando evitar.

Jev decide, LLM escreve: como dividir os papéis dentro de um agente de IA
Jev é o modelo que decide, não escreve: entenda como dividir papéis entre Jev e LLM dentro de um agente de IA e quando usar cada um.
