Como adotar o Jev em um projeto que já existe sem reescrever tudo?

Adotar o Jev num sistema que já roda em produção não precisa virar reescrita. O Jev é o modelo de decisão tipada da TypeSafe AI, da categoria System One: recebe um estado e perguntas tipadas e devolve decisões estruturadas que o código consome direto. O plano aqui é incremental: escolhe UMA etapa do pipeline, traduz ela para uma das três primitivas (Noul, Choice ou Score), roda em sombra sem afetar o fluxo, compara com a decisão atual e só depois promove por fatia de tráfego. Com saída não cobrada e US$ 0,042 por 1 milhão de tokens de entrada, a fase de comparação sai barata
Trocar a peça que toma decisão dentro de um sistema em produção é o tipo de coisa que dá frio na barriga
Ninguém quer virar a chave num domingo e descobrir na segunda que a triagem parou de funcionar
O Jev é o primeiro modelo da classe que a TypeSafe AI chama de System One: você manda um estado e perguntas tipadas, ele devolve decisões estruturadas que o software consome direto, sem etapa de parsing nem de validação
E é justamente por ser tipado que dá pra encaixar ele numa etapa só, rodando em paralelo com o que já existe, sem tocar no resto do pipeline
A ideia deste post é essa: um plano de adoção incremental, etapa por etapa, com sombra antes de promoção
O que você precisa antes de começar
Primeiro o aviso chato, mas importante: o Jev foi lançado em early access e o acesso continua por waitlist, com devs sendo liberados aos poucos
Ou seja, não é disponibilidade geral ainda
Então o item zero da lista é ter o acesso liberado mesmo, senão o plano todo fica no papel
Com o acesso na mão, o resto é bem "next, next e finish":
- SDK Python, que pede Python 3.10 ou superior
- ou o SDK JavaScript/TypeScript, se o seu backend for Node
- a variável de ambiente
TYPESAFE_API_KEY, que o cliente do SDK lê por padrão - logs da decisão atual e um lugar pra gravar o resultado das duas decisões lado a lado
Instalação do SDK Python:
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
pip install typesafe-sdk
# ou, se tu usa uv
uv add typesafe-sdk
Instalação do SDK JS/TS:
npm install @typesafe-ai/sdk
Com a TYPESAFE_API_KEY configurada, o cliente já sobe apontando pro alias jev-latest por padrão
E a agent skill oficial, vale a pena?
Vale, se tu escreve código com um agente do lado
A TypeSafe publica uma agent skill oficial que dá ao agente o contexto da API: os três tipos de pergunta, os padrões arquiteturais e boas práticas pra estruturar avaliações
No Claude Code, a instalação é assim:
claude plugin marketplace add typesafe-ai/skills
claude plugin install typesafe@typesafe-ai
Em outros agentes de código:
npx skills add typesafe-ai/skills --skill typesafe-ai
E aí tu seleciona o agente na listinha
Se tu já tem costume de usar agente pra mexer em código legado sem quebrar tudo, esse contexto extra ajuda bastante na hora de desenhar as perguntas tipadas
Passo a passo do plano de adoção incremental
A regra que guia tudo aqui é simples: o Jev entra observando, não mandando
- Escolha UMA etapa do pipeline
Nada de "vou colocar IA no sistema"
Escolhe uma decisão binária ou uma classificação que JÁ existe hoje e que tem resultado observável depois (aprovou e deu certo? roteou pro time certo? o ticket voltou?)
Se tu não consegue dizer se a decisão foi boa ou ruim depois, não dá pra comparar nada
O erro comum deste passo: escolher a etapa mais complexa do sistema porque é a que mais dói. Começa pela que tem sinal de resultado mais limpo, não pela que dói mais
- Traduza essa etapa para uma das três primitivas tipadas
Tudo que se pergunta ao Jev é uma de três coisas:
| Primitiva | O que é | O que volta |
|---|---|---|
| Noul | afirmação sim/não | a probabilidade de ser verdadeira |
| Choice | mapa de opções nomeadas | a probabilidade de cada opção, mais a de maior pontuação |
| Score | array ordenado de 2 a 10 descrições de nível | uma posição, que pode cair entre níveis |
A escolha muda o formato da resposta, então ela muda o código que consome
Triagem sim/não é Noul, roteamento entre filas é Choice, prioridade em faixas é Score
O erro comum deste passo: tentar espremer uma classificação de 6 categorias dentro de um Noul e depois encadear vários Nouls na mão. Se é escolha entre opções nomeadas, é Choice
- Monte o estado dentro do orçamento de contexto
A janela é de 64k tokens por requisição, com 32k disponíveis pro estado mais a pergunta mais longa
Então o estado não é "joga o registro inteiro do banco lá dentro"
É um recorte: só os campos que um humano olharia pra tomar aquela decisão específica
O erro comum deste payment: serializar o objeto completo "por garantia". Contexto irrelevante não é neutro, ele atrapalha (a própria TypeSafe lista "estado grande com detalhe irrelevante" como ponto fraco do modelo)
- Instale o SDK e fixe a versão do modelo
O alias jev-latest é o padrão do SDK e é estável, mas em produção vale saber exatamente com quem tu tá falando
A versão atual é jev-1.13.0
Existe também o jev-preview, que avança quando tem build de preview, e IDs versionados são aceitos na API
Pra fase de comparação, fixar o ID versionado é mais honesto: tu compara a decisão atual contra UM modelo, não contra um alvo que mudou no meio do caminho
O erro comum deste passo: rodar semanas de sombra no alias e depois não saber qual build gerou cada linha do log
- Rode em sombra
Agora a parte boa: chama o Jev com o mesmo estado da decisão real, mas a saída dele NÃO afeta o fluxo
Ela só vai pro log
A latência publicada pela TypeSafe é de 70 a 500 ms ponta a ponta, o que faz a chamada caber bem como tarefa lateral, fora do caminho crítico da requisição
# pseudo: a decisão real continua mandando
decisao_atual = pipeline.decidir(pedido)
# o Jev roda em paralelo, sem poder de veto
try:
estado = montar_estado(pedido) # recorte enxuto, dentro do orçamento
resposta_jev = perguntar_ao_jev(estado) # veja o quickstart oficial pra assinatura
log_sombra.gravar(
id=pedido.id,
decisao_atual=decisao_atual,
decisao_jev=resposta_jev,
modelo="jev-1.13.0",
)
except Exception as e:
log_sombra.gravar_falha(pedido.id, str(e))
return decisao_atual
Repara no try/except abraçando tudo
Modo sombra que derruba a requisição quando a API pisca deixa de ser sombra e vira dependência, beleza? 🙂
O erro comum deste passo: deixar a chamada do Jev dentro do fluxo síncrono sem proteção e transformar um experimento em incidente
- Registre as duas decisões lado a lado, com a probabilidade
Não grava só "bateu" ou "não bateu"
Grava a decisão atual, a decisão do Jev e a probabilidade devolvida
É essa probabilidade que vai virar o limiar depois
O Jev é treinado com um método chamado RLCD (Reinforcement Learning for Calibrated Decisions), que otimiza probabilidades contra resultados, então a probabilidade é informação de verdade, não enfeite
O erro comum deste passo: comparar só o acerto agregado. O interessante mora nas divergências, e tu precisa conseguir abrir caso a caso
- Calibre o limiar de confiança nos SEUS dados
Aqui não tem número mágico pra copiar de post nenhum
A documentação da TypeSafe é explícita: limiares de confiança são específicos de cada caso de uso e devem ser testados nos dados do próprio cliente
Então tu pega o log da sombra e pergunta: acima de que probabilidade a decisão do Jev bateu com o resultado observado de forma consistente?
Esse vira o teu limiar. O que fica abaixo dele continua indo pro caminho antigo
O erro comum deste passo: pegar um valor genérico da internet e chamar de calibração
- Defina a regra de promoção e o fallback
Antes de ligar qualquer coisa, escreve em uma frase: "o Jev assume quando X"
E escreve também o caminho de volta: acima do limiar decide, abaixo do limiar cai pro processo antigo, erro de API cai pro processo antigo
O fallback tem que ser o código que já roda hoje, não um plano B novo que ninguém testou
O erro comum deste passo: promover por empolgação, sem regra escrita. Aí não dá pra reverter com critério, só na base do achismo
- Ligue para uma fatia do tráfego
Um percentual pequeno primeiro, com o log lado a lado continuando ativo
Essa lógica de validar em paralelo antes de entregar o volante é a mesma que vale pra testar um modelo novo no seu projeto antes de adotar de vez
Só depois que a fatia se comporta é que a etapa inteira passa pro Jev
O erro comum deste passo: desligar o log de comparação no dia da promoção. Mantém ele rodando mais um tempo, é o teu sensor
Que etapas do seu sistema são boas candidatas para começar
As candidatas naturais são as decisões chatas e repetitivas que hoje vivem em if aninhado ou na cabeça de alguém:
- triagem e roteamento: esse pedido vai pra fila de análise manual ou segue direto? (Noul ou Choice)
- checagem de elegibilidade: o cliente atende aos critérios descritos? (Noul)
- classificação de ticket: qual categoria dentre as N que tu já usa hoje? (Choice)
- priorização por nível: urgência em faixas, usando um Score com 2 a 10 descrições de nível ordenadas
Repara no padrão: todas têm um conjunto FECHADO de saídas possíveis
E isso conversa direto com uma característica do modelo: o Jev só pode responder com uma opção que você forneceu, então não existe etapa de validar uma resposta inventada
E onde NÃO começar?
A TypeSafe publica uma página de jaggedness específica da versão 1.13, listando onde o modelo falha
É leitura obrigatória antes de escolher a etapa, e olha que legal: um fornecedor documentando os pontos fracos do próprio modelo não é exatamente comum 😀
Os pontos listados lá:
- leitura literal da pergunta
- contagem e números
- comparação de datas (datas são lidas como texto)
- indireção
- estado grande com detalhe irrelevante
- conteúdo adversarial no estado
- instruções contraditórias
- invariantes estruturais entre respostas
- ausência total de geração de texto
Traduzindo pro teu roadmap: não começa por aquela regra que conta ocorrências, nem por aquela que decide com base em "faz mais de 90 dias que"
Essas duas caem em cima de contagem e de comparação de datas, os dois itens da lista
Começa pelo julgamento qualitativo com opções fechadas, que é onde o modelo joga em casa
Se tu ainda tá na dúvida entre mexer num sistema grande que já existe ou montar algo separado pra estudar a ferramenta antes, este vídeo do canal trata justamente da escolha entre pequenos projetos e um projeto grande:
Problemas comuns na fase de comparação (e como prevenir)
A fase de sombra é onde aparecem as surpresas. Se liga nas quatro mais frequentes:
Divergência alta demais entre o Jev e o processo atual
Sintoma: as duas decisões discordam num volume que não faz sentido nenhum, e nas divergências tu olha e pensa "mas era óbvio"
Causa provável: pergunta ambígua. A leitura literal da pergunta está na lista oficial de falhas da 1.13, então o modelo responde exatamente o que tu escreveu, não o que tu quis dizer
Prevenção: reescreve a afirmação do Noul ou os nomes das opções do Choice de forma que uma pessoa de fora do time leia e chegue na mesma interpretação. Sem implícito, sem jargão interno
Volume de chamadas explodindo
Sintoma: uma decisão virou seis perguntas, e aí cada item do pipeline dispara seis requisições
Causa: perguntas sobre o MESMO estado sendo mandadas uma por uma
Prevenção: existe um cookbook oficial de perguntas paralelas exatamente pra isso, agrupando várias perguntas sobre um mesmo estado em uma única chamada em vez de N chamadas separadas
Como a cobrança é por token de entrada, mandar o mesmo estado seis vezes é pagar seis vezes pelo mesmo contexto
O estado estourando o orçamento de contexto
Sintoma: requisições falhando ou qualidade caindo conforme o registro cresce
Causa: contexto irrelevante grudado no estado (histórico completo, campos de auditoria, metadados que ninguém lê)
Prevenção: lembra do teto, 64k por requisição com 32k pro estado mais a pergunta mais longa, e trata o recorte do estado como parte do design, não como detalhe de implementação
Tome cuidado com um clássico: aquele campo de "observações" que alguém usa como diário e sozinho come metade do orçamento
Esperar texto livre de volta
Sintoma: o time tenta encaixar o Jev onde precisava de uma explicação escrita pro usuário e não sai nada
Causa: expectativa errada mesmo. A saída fica restrita às opções tipadas que tu forneceu, e ausência total de geração de texto está lá na página de jaggedness
Prevenção: separa as responsabilidades no desenho. Decisão tipada é com o Jev, redação de texto é com outra peça do sistema
Próximo passo
O ciclo inteiro cabe em três palavras: sombra, comparação, promoção por fatia
Nenhuma dessas etapas pede reescrita, e nenhuma delas tira o processo atual do ar num único movimento
E tem um detalhe que deixa a fase paralela bem confortável de manter no ar: o preço publicado é de US$ 0,042 por 1 milhão de tokens de entrada, com tokens de saída não cobrados
Rodar em sombra significa exatamente pagar entrada sem interferir em nada, então dá pra deixar comparando por bastante tempo antes de decidir qualquer coisa
Mas tudo isso depende do acesso, que ainda é por waitlist no early access
Então o próximo passo concreto é duplo: entra na waitlist e, enquanto o acesso não sai, abre o teu pipeline e marca a primeira etapa candidata
Decisão com saídas fechadas, resultado observável, sem contagem e sem comparação de data
Quando a chave virar, tu já tem o desenho pronto e é só ligar a sombra 🙂
até o próximo post!
Perguntas frequentes
Dá pra testar o Jev sem entrar na waitlist da TypeSafe?
Não. O Jev está em early access desde 15/09/2026 e o acesso continua por waitlist, com desenvolvedores sendo liberados aos poucos. Não existe disponibilidade geral confirmada até 18/09/2026, então o acesso liberado é pré-requisito pra qualquer etapa do plano de adoção.
Qual a diferença entre usar jev-latest e fixar a versão jev-1.13.0 em produção?
jev-latest é o alias estável e padrão do SDK, então ele pode apontar pra uma versão diferente no futuro. jev-1.13.0 é a versão atual fixada por ID, e IDs versionados também são aceitos na API. Pra fase de comparação em sombra, fixar o ID versionado evita comparar sua decisão atual contra um alvo que mudou no meio do caminho.
O Jev cobra pelos tokens de saída da resposta?
Não. O preço publicado do Jev é de US$ 0,042 por 1 milhão de tokens de entrada, e os tokens de saída não são cobrados. Isso pesa na conta de custo de rodar em sombra, já que o volume de chamadas paralelas não engorda o preço pela resposta.
Quanto tempo uma chamada ao Jev adiciona ao pipeline?
A latência publicada pela TypeSafe, ponta a ponta, é de 70 a 500 ms por chamada. É esse número que sustenta rodar o Jev como tarefa lateral em sombra, fora do caminho crítico da requisição, sem travar a resposta que já existe.
O Jev pode inventar uma resposta que eu não coloquei nas opções?
Não. A saída do Jev fica restrita às opções tipadas fornecidas na requisição, seja num Noul, num Choice ou num Score. Como não existe geração livre de texto, também não existe etapa de validar se a resposta inventou algo fora do que foi passado.
Dá pra perguntar várias coisas sobre o mesmo pedido numa chamada só?
Sim. A TypeSafe publica um cookbook oficial de ‘Parallel questions’ que agrupa várias perguntas sobre um mesmo estado numa única chamada, em vez de disparar N chamadas separadas pro mesmo pedido. Isso ajuda bastante quando o pipeline precisa de mais de uma decisão sobre o mesmo estado montado.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares

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.

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.

Jev vale a pena? Veredito honesto sobre decisões tipadas em vez de texto
Jev vale a pena? Veja o veredito honesto sobre o modelo System One da TypeSafe AI: decisões tipadas, preço e quando não usar.
