Como encadear várias perguntas do Jev (Noul, Choice e Score) em uma sequência de decisões

Pra encadear perguntas no Jev, você desenha a árvore de decisão antes do código, declara todas as perguntas (Noul, Choice e Score) no mapa questions e manda tudo numa chamada só (speculative fan-out). Depois percorre as respostas no seu código, na ordem da árvore, lendo só o ramo que se aplica. Em cada etapa existe uma condição de parada: no Noul é a própria probabilidade P(sim), no Choice e no Score é o campo confidence. Se uma etapa intermediária vier incerta, o encadeamento para ali e o caso vai para uma pessoa ou um LLM mais lento
Fala aí, beleza? Decisão de verdade quase nunca é uma pergunta só
É uma pergunta que puxa outra, que puxa outra, e se a primeira sair torta todo o resto desanda junto 😛
O Jev é o modelo da TypeSafe AI, apresentado em 15 de setembro de 2026 e aberto para todos desde 21 de setembro de 2026
Ele recebe o estado de um programa e devolve uma decisão tipada, com a probabilidade de cada opção
Neste post eu te mostro como compor Noul, Choice e Score em etapas dependentes: qual vem primeiro, quando parar e o que fazer quando uma etapa do meio volta incerta
Se liga num detalhe importante: o encadeamento é desenhado no SEU código, a partir das respostas da API
Pelo que está na documentação, não existe um recurso pra usar a resposta de uma pergunta como entrada de outra dentro da mesma chamada, então quem amarra as etapas é você
O que você precisa antes de montar a sequência
A API tem um endpoint único: POST https://api.typesafe.ai/v1/systemone
Ele recebe três campos:
state: o estado do programa, em texto ou JSONmodel: um alias de modelo, comojev-latestquestions: um mapa de perguntas nomeadas

Domine o Jev e coloque decisões de IA dentro do seu sistema
Você vai aprender a usar o Jev, o System One Model da TypeSafe AI, pra automatizar decisões com resposta tipada e confiança medida, sem depender de chat nem de alguém revisando cada passo. Entre na lista de espera para garantir a condição de lançamento!
Pra chamar, tu tem três caminhos: o SDK Python (pip install typesafe-sdk, com Python 3.10 ou superior), o SDK JavaScript (@typesafe-ai/sdk) ou um HTTP POST puro, sem SDK nenhum
A referência completa está na documentação da TypeSafe
E você precisa conhecer os três tipos de pergunta, porque escolher o tipo certo pra cada etapa é metade do trabalho:
| Tipo | O que responde | Limite | O que volta |
|---|---|---|---|
| Noul | sim ou não | uma afirmação | P(sim) entre 0 e 1, sem campo confidence |
| Choice | uma entre N opções | até 255 opções | probabilities e confidence (0 a 1) |
| Score | escala ordenada | de 2 a 10 níveis | probabilities e confidence (0 a 1) |
Passo a passo para encadear Noul, Choice e Score
Bora ver na prática? Vou usar o exemplo que a própria documentação dá: triagem de tickets de suporte 🙂
- Desenhe a árvore de decisão no papel
Por que começar pelo papel? Porque a ordem das perguntas define TUDO o que vem depois: quais etapas dependem de quais e quais só importam em certos ramos
Na triagem de tickets, primeiro vem a categoria (Choice) e a severidade (Score) só faz sentido se a categoria for bug
# Árvore da triagem (estrutura sua, não é sintaxe da API)
arvore = {
"categoria": { # Choice, sempre lida
"bug": "severidade", # Score, só no ramo bug
"duvida_de_uso": None, # fim do fluxo
"cobranca": None, # fim do fluxo
"outro": None, # fim do fluxo
}
}
O erro comum deste passo: abrir o editor e sair escrevendo pergunta sem a ordem definida
Aí você descobre no meio do caminho que uma etapa depende de outra que ainda nem existe…
- Escreva as perguntas nomeadas no mapa
questions
Cada nó da árvore vira uma entrada nomeada no mapa, com o tipo que casa com a pergunta: sim/não é Noul, escolher uma categoria é Choice, medir intensidade é Score
No Choice, a documentação recomenda incluir uma opção tipo "outro" ou "nenhuma das anteriores" quando a lista pode não cobrir todos os casos
questions = {
# Choice: bug, dúvida de uso, cobrança, outro
"categoria": ..., # declaração conforme a documentação
# Score: níveis de severidade (de 2 a 10 níveis)
"severidade": ..., # declaração conforme a documentação
}
payload = {
"state": texto_do_ticket,
"model": "jev-latest",
"questions": questions,
}
O erro comum deste passo: lista de Choice que não cobre todos os casos
Sem a opção "outro", o modelo é empurrado a escolher alguma categoria que não serve, e essa resposta errada contamina todas as etapas seguintes
- Envie tudo numa chamada só (speculative fan-out)
Aqui mora o pulo do gato 😀
O padrão se chama speculative fan-out: você manda numa única chamada todas as perguntas que PODEM ser necessárias, inclusive as que só importam em alguns ramos, e deixa o código decidir depois quais respostas usar
Por que isso compensa? As perguntas de uma requisição são avaliadas em paralelo, então adicionar pergunta pouco muda o tempo de resposta
Uma pergunta especulativa ignorada custa alguns tokens, e uma segunda ida e volta custa uma requisição inteira
# Uma chamada só, com categoria E severidade juntas
# chamar_jev é a sua função de chamada (SDK ou HTTP POST)
resposta = chamar_jev(payload)
O erro comum deste passo: fazer uma chamada por etapa, esperando a categoria voltar pra só então perguntar a severidade
É o jeito mais intuitivo de pensar (pergunta, espera, pergunta de novo), mas é justamente o que o fan-out evita
- Percorra as respostas no código, na ordem da árvore
Agora as respostas estão todas na mão, e é o seu código que anda pela árvore: lê a primeira etapa e usa a resposta dela pra decidir qual é a próxima a ler
# Supondo que você já extraiu as respostas num dicionário por nome
# (o formato exato do retorno está na documentação)
cat = respostas["categoria"]
opcao = max(cat["probabilities"], key=cat["probabilities"].get)
proxima = arvore["categoria"].get(opcao)
if proxima == "severidade":
sev = respostas["severidade"]
# segue o fluxo de bug
else:
# ramo sem severidade: a resposta de severidade é ignorada
pass
O erro comum deste passo: ler respostas de ramos que não se aplicam
A severidade veio na resposta porque foi pedida de forma especulativa, mas se o ticket é dúvida de uso ela não significa nada, e usar esse valor vira bug silencioso
- Defina as condições de parada de cada etapa
Cada etapa precisa de um critério de "posso seguir ou paro aqui?"
E o sinal de incerteza muda conforme o tipo:
- Noul: não tem campo confidence, a própria probabilidade P(sim), entre 0 e 1, já é o sinal de incerteza
- Choice e Score: usam o campo
confidence, um número de 0 a 1 que resume a distribuição emprobabilities
# Limites por ação: VOCÊ define, de acordo com o custo de errar
LIMITES = {
"categoria": ...,
"severidade": ...,
}
def etapa_confiavel(nome, resp):
return resp["confidence"] >= LIMITES[nome]
O erro comum deste passo: procurar confidence na resposta do Noul (não existe) ou usar um threshold único pra tudo
A documentação é clara: o threshold é definido por ação, de acordo com o custo de errar
Errar a categoria de um ticket custa uma coisa, disparar uma ação irreversível custa outra bem diferente 🙂
- Trate a etapa intermediária que volta com probabilidade baixa
Esse é o ponto que mais derruba sequência de decisão
Se uma etapa do meio vem incerta, o encadeamento PARA ali, e o caso vai pra uma pessoa ou pra um LLM mais lento, como sugere a documentação
if not etapa_confiavel("categoria", cat):
encaminhar_para_revisao(ticket, etapa="categoria", resposta=cat)
return # não segue pra severidade
E o que confidence baixa quer dizer? Segundo a documentação:
- No Choice: costuma indicar que nenhuma opção se destaca
- No Score: costuma indicar níveis ambíguos ou multidimensionais, ou falta de informação no estado
Ou seja, confidence baixa recorrente é um recado pra você revisar o desenho: as opções do Choice se sobrepõem? Os níveis do Score misturam duas dimensões? O state que você manda tem informação suficiente?
Vale registrar esses encaminhamentos, e se quiser ir além tem um post aqui sobre como monitorar as decisões em produção
O erro comum deste passo: seguir pra etapa seguinte como se a resposta incerta fosse certa
É o clássico efeito dominó: a severidade de um ticket que talvez nem seja bug não vale nada, por mais confiante que ela pareça
Exemplos de sequências de decisão com o Jev
Os desenhos abaixo são ilustrações de ESTRUTURA, pra tu enxergar o padrão, não resultados testados
Triagem de tickets: Choice e depois Score
É o exemplo base da documentação
- Categoria (Choice, com opção "outro") e severidade (Score) vão juntas na mesma chamada
- O código lê a categoria primeiro e, se a confidence ficar abaixo do limite, para e encaminha
- Se for bug e a categoria estiver confiável, lê a severidade, que tem o próprio limite
- Em qualquer outra categoria, a severidade é descartada
Filtro com Noul e depois Choice
Aqui o fluxo começa com um portão de sim/não, tipo "este ticket é spam?"
- O Noul e o Choice de categoria vão juntos na mesma chamada (fan-out de novo)
- Se P(sim) do Noul está claramente alta ou claramente baixa, o código decide o ramo
- Se P(sim) fica no meio do caminho, a etapa é incerta: para e encaminha
- Só quando o filtro diz "não é spam" com segurança o código passa a ler a categoria
Quando a sequência vira o seu dia a dia
Se a mesma sequência roda o tempo todo e em volume alto, pode surgir a dúvida entre seguir com o Jev ou treinar seu próprio classificador, e aí vale comparar os dois caminhos com calma
Vídeo: tomando decisões como dev
Pra começar do zero no assunto de decisão, este vídeo do canal fala sobre tomar suas próprias decisões como dev
Próximo passo: monte sua primeira sequência
Recapitulando o desenho:
- Ordem definida no papel antes do código
- Todas as perguntas numa chamada só, com speculative fan-out
- Respostas lidas no seu código, seguindo a árvore e ignorando ramos que não se aplicam
- Condição de parada por etapa: P(sim) no Noul,
confidenceno Choice e no Score - Threshold por ação, conforme o custo de errar
- Etapa incerta interrompe o fluxo e vai pra uma pessoa ou um LLM mais lento
Do lado do custo, a TypeSafe cobra US$ 0,042 por milhão de tokens de entrada, com saída gratuita, e informa tempo de resposta de ponta a ponta entre 70 ms e 500 ms, dependendo da tarefa
Por isso a pergunta especulativa a mais quase não pesa na conta, e a ida e volta extra é que dói
Agora é contigo: pega um fluxo real do teu projeto, desenha a árvore e transforma ela num mapa questions
Faça o teste! 😀
Até o próximo post!
Perguntas frequentes
Como saber quando parar de encadear perguntas e mandar o caso pra um humano?
A documentação da TypeSafe sugere definir um threshold de confidence por ação: acima dele o código decide sozinho, abaixo dele o caso vai pra uma pessoa ou pra um LLM mais lento. Esse threshold não é fixo, ele muda de acordo com o custo de errar naquela ação específica. Numa triagem de bug crítico, por exemplo, o threshold pra agir automático tende a ser mais alto do que numa dúvida de uso simples
Por que a resposta de Noul não vem com confidence, se Choice e Score vêm?
Porque no Noul a própria probabilidade já carrega o sinal de incerteza: uma resposta em 0,52 já mostra que o modelo tá em cima do muro, sem precisar de um campo extra. Choice e Score, por outro lado, trazem probabilities (a distribuição entre as opções) e confidence (um número de 0 a 1 que resume essa distribuição), porque ali existem várias opções ou níveis pra comparar
Compensa mandar uma pergunta especulativa que talvez nem seja usada na sequência?
Compensa sim, segundo o padrão speculative fan-out da própria TypeSafe. As perguntas de uma requisição são avaliadas em paralelo, então adicionar mais uma pergunta pouco muda o tempo de resposta. Uma pergunta especulativa ignorada custa só alguns tokens, enquanto uma segunda ida e volta pra API custa uma requisição inteira
Dá pra usar a resposta de uma pergunta como entrada de outra dentro da mesma chamada ao Jev?
Pelo que está na documentação, não existe esse recurso dentro de uma única chamada. Quem lê a resposta da primeira etapa e decide qual pergunta considerar em seguida é o seu próprio código, depois que a resposta da API já voltou
Quanto custa em tokens encadear várias perguntas numa chamada só ao Jev?
O preço do Jev é de US$ 0,042 por milhão de tokens de entrada, e a saída é gratuita. Como o custo pesa só na entrada, empilhar perguntas especulativas no mesmo state sai barato, principalmente comparado a fazer uma requisição nova pra cada etapa
Quanto tempo demora uma chamada ao Jev com Noul, Choice e Score juntos?
A TypeSafe informa um tempo de resposta de ponta a ponta entre 70 ms e 500 ms, dependendo da tarefa. Como as perguntas de uma mesma requisição são avaliadas em paralelo, encadear várias delas numa chamada só tende a ficar dentro dessa mesma faixa, em vez de somar o tempo de cada pergunta separada
Formações
Formação Claude Code
Domine Claude Code do absoluto zero até o avançado
- 120 aulas
- 4 projetos
- 9h 45min
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.

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.

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.
