Como usar o Jev como quality gate de um pipeline de dados?

diagrama de um Jev quality gate decidindo o destino de um lote em um pipeline de dados
Resposta rápida

Um Jev quality gate é uma etapa do pipeline onde o lote passa por perguntas tipadas antes de virar dado no warehouse. Você monta um state com metadados e uma amostra de registros, faz Choice, Noul e Score numa única chamada e recebe decisão tipada com probabilities e confidence, sem parsing de texto. O orquestrador lê o valor, aplica o limiar e manda o lote pro warehouse, pra quarentena ou pro reprocessamento. Regra de schema continua no código determinístico: o Jev entra só onde a decisão é julgamento sobre o sentido do conteúdo

Schema bateu, not null passou, tipo de coluna certinho, e mesmo assim o lote tá errado

O campo descricao veio com "N/A", o texto tá truncado no meio da palavra, metade dos registros veio em outro idioma e a categoria não tem nada a ver com o produto

Regra de validação não pega isso, porque isso não é regra, é julgamento

E julgamento é justamente onde entra o Jev: um modelo que não escreve texto, ele responde perguntas tipadas contra um state e devolve valor tipado mais distribuição de probabilidade, que o teu código consome direto

Neste post a gente monta um quality gate de verdade: o lote chega, o gate decide entre warehouse, quarentena e reprocessamento, e o orquestrador executa sem nenhum parsing de string pelo caminho

E tem uma saída de segurança em cima disso, a revisão humana, que não é escolha do modelo e sim do teu limiar de confiança (te conto no passo 6)

Por que um modelo tipado resolve o que regra de validação não pega

Validação determinística é ótima e vai continuar existindo

Ela responde perguntas fechadas: o schema bate? a chave é única? o valor tá dentro do range? a contagem de linhas confere com o manifesto?

Isso é código, é rápido, é barato e é 100% previsível

O problema é a outra metade do trabalho

  • campo preenchido com lixo plausível ("-", "sem informação", "teste123")
  • texto truncado no meio, tipo Cabo HDMI 2.1 de alta veloci
  • idioma trocado numa fatia do lote
  • descrição que não bate com a categoria declarada
  • registro que passa em toda regra e ainda assim é obviamente inútil pra quem vai consumir

Nenhuma dessas coisas vira um CHECK constraint decente

É aqui que o Jev encaixa

Ele é o primeiro modelo da classe System One da TypeSafe AI, lançado em 15 de setembro de 2026 em acesso antecipado

O posicionamento da empresa é curioso e importante pro nosso caso: modelo feito pra máquina, não pra pessoa

Ele não gera texto token a token

Entra um state (texto ou JSON) mais perguntas tipadas, sai decisão tipada

A TypeSafe alega inteligência de nível frontier em menos de 100 milissegundos de latência e até 100x mais rápido e mais barato que modelos frontier (isso é alegação da fornecedora, então trate como alegação até medir no teu ambiente)

Curso de Jev: Sistemas Mais Inteligentes, Rápidos e Robustos
Curso Recomendado

Curso de Jev: Sistemas Mais Inteligentes, Rápidos e Robustos

Desenvolva sistemas mais inteligentes, rápidos e robustos com Jev

O que dá pra afirmar com segurança pelo desenho: quando a saída já é um valor tipado com confidence de 0 a 1, o gate vira um if no orquestrador, não um parser de JSON dentro de markdown que quebra na terça-feira 🙂

E tem três tipos de pergunta, só isso:

Primitiva Pra que serve O que volta
Choice escolher uma entre opções conhecidas, sem ordem entre elas (roteamento, classificação) a opção escolhida, com confidence de 0 a 1
Score avaliar o state contra uma rubrica que VOCÊ define valor ponderado por probabilidade entre os níveis (mínimo 2, máximo 10)
Noul afirmação verdadeiro/falso um valor entre 0 e 1

Três primitivas, e o gate inteiro cabe nelas

O que você precisa antes de plugar o Jev no pipeline

Antes do código, o checklist chato mas necessário:

1. Acesso ao modelo

A TypeSafe anunciou em 22 de setembro de 2026 a pausa temporária dos novos cadastros por excesso de demanda

Contas já criadas seguem funcionando, e a pausa ainda estava em vigor em 24 de setembro de 2026

Se você não tem conta direta, o Jev também aparece em outros lugares: na OpenRouter com os ids typesafe/jev-1.13 e typesafe/jev-latest, no AI Gateway da Vercel e no catálogo de modelos do Cloudflare Workers AI

2. SDK ou HTTP puro

A TypeSafe publica SDK oficial pra Python (que exige Python 3.10 ou superior) e pra JavaScript/TypeScript

O cliente oficial lê a chave da variável de ambiente TYPESAFE_API_KEY e chama jev-latest por padrão

Se preferir bater direto no HTTP, o endpoint da API System One é POST https://api.typesafe.ai/v1/systemone

export TYPESAFE_API_KEY="sua-chave-aqui"

3. Um orquestrador que já quebra o job em lotes

Airflow, Dagster, Prefect, cron com script, tanto faz

O gate é uma task a mais entre "lote pronto" e "carrega no warehouse", e ele precisa conseguir fazer um POST e ler a resposta

4. Consciência do contexto

O Jev 1.13 tem 32.000 tokens de contexto

Isso não é detalhe, é restrição de projeto: entra amostra, não entra o lote inteiro

Se o teu volume é grande de verdade e você quer opinião do modelo sobre cada pedaço, o caminho é outro desenho, aquele de map-reduce com Jev em volumes grandes, e não enfiar tudo num state só

Sobre custo, o preço publicado é US$ 0,042 por 1 milhão de tokens de entrada, com tokens de saída a US$ 0

Ou seja, o que pesa na conta é o tamanho do state que você manda, o que reforça a mesma ideia: amostra enxuta

Passo a passo: montando o quality gate

  1. Defina a decisão ANTES de escrever qualquer pergunta

Esse passo parece burocracia e é o mais importante

O gate não existe pra "avaliar qualidade", ele existe pra escolher um caminho

Saída do gate O que o orquestrador faz
warehouse segue o load normal
quarentena grava o lote num bucket separado e abre alerta, sem carregar
reprocessamento dispara de novo a extração na origem, mesma janela

Repara que são três rotas, e só três: é exatamente esse o conjunto de opções que o modelo vai escolher na Choice

A revisão humana NÃO é uma quarta opção do Choice, ela é saída de segurança do teu código: quando a confiança da escolha vem baixa, o orquestrador ignora a rota sugerida e manda o lote pra uma fila de análise (o passo 6 mostra isso)

Só depois de fechar essa tabela é que você escreve as perguntas

O erro comum deste passo: criar um gate que devolve "nota de qualidade de 0 a 10" e ninguém sabe o que fazer com 6,4

  1. Monte o state: metadados calculados por você + amostra

O state aceita objeto ou array JSON, com contexto, exemplos e informações que ajudam o modelo a responder

Repare numa coisa: a contagem de linhas vem do SEU código, não de um pedido ao modelo

import random

def montar_state(lote, meta, tamanho_amostra=25):
    amostra = random.sample(lote, min(tamanho_amostra, len(lote)))
    return {
        "origem": meta["origem"],
        "janela": meta["janela"],                 # calculado pelo pipeline
        "linhas_no_lote": len(lote),              # contado em Python, nao pelo modelo
        "colunas_esperadas": meta["schema"],
        "amostra_de_registros": amostra,
    }

O erro comum deste passo: despejar o lote inteiro no state achando que mais dado é mais acurácia

A própria documentação de jaggedness avisa que a acurácia cai conforme o state se enche de conteúdo não relacionado à decisão

State inchado é state pior, e ainda por cima mais caro

  1. Escreva as perguntas tipadas

Uma Choice pra rota, Nouls pras afirmações binárias, Scores pro que é gradiente

PERGUNTAS = {
    # Choice: as tres rotas do gate, sem ordem entre elas
    "rota": {
        "tipo": "choice",
        "pergunta": "Considerando os metadados e a amostra, qual destino este lote deve ter?",
        "opcoes": ["warehouse", "quarentena", "reprocessamento"],
    },
    # Nouls: afirmacoes verdadeiro/falso
    "campos_criticos_reais": {
        "tipo": "noul",
        "afirmacao": "Os campos criticos da amostra estao preenchidos com valor real, "
                     "e nao com placeholders como 'N/A', '-', 'teste' ou string vazia",
    },
    "encoding_ok": {
        "tipo": "noul",
        "afirmacao": "O texto da amostra esta com encoding consistente, sem caracteres "
                     "corrompidos do tipo 'ç' ou '\\ufffd'",
    },
    "coerente_com_schema": {
        "tipo": "noul",
        "afirmacao": "O conteudo de cada campo da amostra corresponde ao significado "
                     "declarado para aquela coluna no schema",
    },
    # Score: rubrica com niveis que VOCE define
    "utilidade_das_descricoes": {
        "tipo": "score",
        "pergunta": "Quao utilizavel esta o campo de descricao da amostra?",
        "niveis": [
            "inutilizavel: vazio, truncado ou sem sentido na maioria dos registros",
            "ruim: muitos registros genericos ou incompletos",
            "aceitavel: descreve o item, com falhas pontuais",
            "bom: descritivo, completo e coerente com a categoria",
        ],
    },
}

Rubrica de Score precisa de no mínimo 2 níveis e a API aceita até 10

O erro comum deste passo: pedir pro modelo contar

Nada de "quantos registros estão vazios?" ou "a data do lote é posterior à do lote anterior?"

A própria TypeSafe documenta que o Jev 1.13 não conta de forma confiável, lê datas como texto e não tem precisão numérica

Contagem e comparação de data são trabalho do teu código, ponto

  1. Mande tudo numa chamada só

Todas as perguntas de uma requisição são avaliadas em paralelo e em isolamento contra o mesmo state

No cookbook oficial de perguntas paralelas, agrupar 13 perguntas sobre o mesmo artigo numa única chamada saiu 12,2x mais barato e 10,0x mais rápido, sem mudança nas respostas

Faz sentido: você paga o state uma vez, não sete vezes

state = montar_state(lote, meta)
resposta = chamar_jev(state, PERGUNTAS)  # POST https://api.typesafe.ai/v1/systemone

O erro comum deste passo: escrever uma rubrica que referencia a resposta de outra pergunta

Coisa tipo "se o encoding estiver ok, então avalie…"

Não funciona, porque as perguntas são isoladas: uma não vê a resposta da outra

Se existe dependência, ela vive no teu if, depois que as respostas chegam

  1. Leia a resposta

A resposta traz o identificador do modelo, um objeto answers com uma resposta por pergunta e usage com input_tokens e output_tokens

Respostas de Choice e Score incluem probabilities (a distribuição entre opções ou níveis) e confidence, que colapsa a distribuição num número de 0 a 1 pra você aplicar um limiar sem precisar fazer a conta

print(resposta["model"])
print(resposta["usage"]["input_tokens"], resposta["usage"]["output_tokens"])

rota = resposta["answers"]["rota"]
confianca = rota["confidence"]          # 0 a 1
distribuicao = rota["probabilities"]    # distribuicao entre as tres opcoes

Guarda probabilities no log sempre

É ele que depois te mostra a diferença entre "warehouse com folga" e "warehouse por pouquinho"

O erro comum deste passo: jogar fora a distribuição e salvar só a decisão

Aí quando o gate erra você não tem como calibrar nada

  1. Aplique o limiar no orquestrador

A documentação da TypeSafe traz um padrão pronto pra isso, o confidence-gated routing: abaixo do limiar vai pra revisão humana, acima segue pro handler automático (o exemplo da doc usa confidence < 0.8)

HANDLERS = {
    "warehouse": carregar_no_warehouse,
    "quarentena": mover_para_quarentena,
    "reprocessamento": reagendar_extracao,
}

def aplicar_gate(lote_id, opcao, confianca, limiar=0.8):
    if confianca < limiar:
        return enfileirar_revisao_humana(lote_id, opcao, confianca)
    handler = HANDLERS.get(opcao)
    return handler(lote_id)

Repara que não tem json.loads, não tem regex, não tem "extrai o que veio depois dos dois pontos"

A saída já é tipada, então ela encaixa direto no orquestrador

O erro comum deste passo: chutar o limiar e nunca mais olhar pra ele

O limiar bom vem dos teus dados, e no fim do post eu falo de como levantar isso sem risco

  1. Trate o 429

Os rate limits da TypeSafe são medidos em tokens por segundo e requisições por minuto, e uma requisição acima de qualquer um dos limites recebe 429 Too Many Requests

A doc avisa também que esses limites podem mudar sem aviso, então trate 429 como evento normal do dia a dia, não como incidente

import time

def com_retry(fn, tentativas=4):
    espera = 1.0
    for i in range(tentativas):
        resp = fn()
        if resp.status_code != 429:
            return resp
        if i == tentativas - 1:
            break
        time.sleep(espera)
        espera *= 2
    return None  # gate indisponivel: cai no fallback

E decide agora, com a cabeça fria, qual é o fallback quando o gate não responde

A opção conservadora é mandar o lote pra quarentena em vez de pro warehouse: dado errado no warehouse custa muito mais caro que lote parado esperando

O erro comum deste passo: fallback silencioso que libera o lote quando o gate falha

Já vi pipeline "verde" o mês inteiro assim 😛

Quatro perguntas de gate que valem a pena no seu pipeline

CSV de fornecedor:

O clássico do arquivo que muda de formato sem ninguém avisar

Aqui o Noul brilha: "a amostra segue o mesmo layout de colunas declarado no contrato de integração"

Como Noul devolve um valor entre 0 e 1, você consegue separar o "claramente ok" (perto de 1) do "tem coisa estranha" (região do meio) sem precisar inventar categoria nova

Complementa com um Score de completude da amostra, com uns 4 níveis bem descritos

Scraping:

Scraping falha de um jeito específico: a página muda e o seletor passa a capturar menu, cookie banner ou página de erro

O detalhe cruel é que isso passa em qualquer validação de schema, porque é string preenchida

Use Choice pra classificar o que a amostra parece ser: conteudo_valido, pagina_de_erro, bloqueio_antibot, layout_mudou

Cada uma dessas quatro opções dispara uma ação diferente no orquestrador, e a distribuição de probabilidade te diz se o modelo tá dividido entre duas hipóteses ou cravou uma

Payload de API de terceiro:

API de terceiro adora responder 200 com corpo degradado: campos opcionais sumindo, enum novo aparecendo, texto virando null

Noul pra "todos os campos obrigatórios da amostra vieram com valor real", Choice pra rota e Score pra riqueza do payload

Tudo na mesma chamada, contra o mesmo state

Esse é o caso mais "julgamento puro": a descrição bate com a categoria? o título corresponde ao produto? o texto foi truncado?

Score com rubrica é a ferramenta certa, porque é gradiente e não sim/não

E o desenho aqui é o mesmo de qualquer roteamento por Choice com limiar de confiança, igual quando você usa Jev pra qualificar leads no funil: muda o state e mudam as opções, a mecânica é idêntica

Onde o gate falha (e como prevenir)

A TypeSafe publica uma página de jaggedness do Jev 1.13 listando as fraquezas conhecidas do modelo

Ler isso antes de ir pra produção economiza uns bons cabelos brancos

Sintoma: o gate erra contagem ou ordem de datas

Causa: o Jev 1.13 não conta de forma confiável (caracteres, ocorrências ou itens de lista), lê datas como texto e não como quantidades ordenadas, e não tem precisão numérica

Como prevenir: toda pergunta que tem resposta exata sai do modelo e vira asserção determinística no código

Contagem de nulos, cardinalidade, janela temporal, soma de valores: tudo isso é SQL ou Python

O Jev fica com o que sobra, que é o julgamento sobre o conteúdo

Sintoma: você tenta reconstruir um número a partir do Score

Causa: os níveis de Score do Jev 1.13 são fracos em calibração numérica, e a doc é explícita em dizer que eles não devem ser usados pra reconstruir o valor exato por interpolação entre níveis

Como prevenir: trate Score como faixa, não como régua

"Nível aceitável ou acima segue" funciona

Tentar converter o Score num percentual exato de registros ruins não funciona, e pior, parece que funciona por umas semanas

Sintoma: um lote sujo passa e ninguém entende por quê

Causa: o Jev trata o state como dado, não como conteúdo hostil

Texto escrito pra direcionar a resposta (instrução injetada, enquadramento enganoso) pode mover o resultado

E adivinha o que tem dentro de um pipeline de dados? Campo livre vindo de fora 🙂

Como prevenir: isole o conteúdo de terceiro em campos próprios e bem rotulados dentro do state, nunca misturado com a tua instrução

Se o dado de origem é não confiável (scraping, formulário público, comentário de usuário), assuma isso no desenho e não deixe conteúdo de terceiro parecer instrução

Sintoma: a acurácia cai quando o lote cresce

Causa: state poluído com contexto irrelevante pra decisão

A doc avisa que a acurácia cai conforme o state se enche de conteúdo que não ajuda a responder a pergunta

Somando com os 32.000 tokens de contexto do Jev 1.13, o teto aparece rápido

Como prevenir: amostra estratificada e enxuta, com só as colunas que importam pra decisão

Se o gate precisa olhar 5 campos, manda 5 campos, não os 40 da tabela

Sintoma: 429 em horário de pico

Causa: os limites são medidos em tokens por segundo e requisições por minuto, e estourar qualquer um dos dois devolve 429

Como esses limites podem mudar sem aviso, não dá pra tratar como constante

Como prevenir: retry com backoff, agrupamento de perguntas numa chamada só (menos requisições pelo mesmo trabalho) e fallback definido no código, conservador

Vídeo: pipeline de IA na prática

Pra começar do zero com pipeline montado com IA, este vídeo do canal mostra o fluxo de ponta a ponta, do desenho até o código rodando:

O próximo passo

O desenho certo desse negócio é chato de tão simples:

  • o determinístico valida o que é regra (schema, unicidade, range, contagem, data)
  • o Jev decide o que é julgamento (o conteúdo faz sentido? bate com a categoria? é lixo plausível?)
  • o orquestrador consome a saída tipada e executa, sem parsing no meio

E o próximo passo prático não é ligar o gate em produção na sexta à noite haha

Roda ele em modo sombra primeiro: o gate avalia os lotes e só loga a decisão, probabilities e confidence, sem bloquear nada

Aponta pra lotes que já foram aprovados historicamente, deixa rodando uns dias e compara

Onde o gate discordou do histórico, olha o caso na mão: às vezes o modelo errou, às vezes ele achou um problema que passou batido por meses

Com esses dados na mesa, você calibra o limiar de confidence com número real em vez de chute, e só então liga o roteamento de verdade

É mais lento pra subir e MUITO mais tranquilo pra dormir

até o próximo post!

Perguntas frequentes

O Jev consegue contar quantos registros de um lote vieram com problema?

Não, e isso está documentado pela própria TypeSafe: o Jev 1.13 não conta de forma confiável caracteres, ocorrências ou itens de lista. No quality gate, a contagem e o total do lote ficam por conta do seu código, o Jev entra só na parte de julgamento (Choice, Score, Noul) sobre a amostra.

Qual limiar de confidence usar pra mandar o lote pra revisão humana em vez de decidir sozinho?

A documentação da TypeSafe traz o padrão oficial de confidence-gated routing, com um exemplo de confidence abaixo de 0.8 indo pra revisão humana e acima disso seguindo pro handler automático. Repara que a revisão humana não é uma opção do Choice: o Choice só oferece as três rotas (warehouse, quarentena e reprocessamento), e a fila de análise entra quando a confidence dessa escolha fica abaixo do limiar aplicado no teu código. No teu gate, ajusta esse número conforme o risco de carregar um lote ruim no warehouse.

Dá pra colocar o lote de dados inteiro dentro do state do Jev?

Não é recomendado. O Jev 1.13 tem 32.000 tokens de contexto e a documentação de jaggedness avisa que a acurácia cai quando o state fica poluído com conteúdo irrelevante pra decisão. Por isso o gate usa amostra do lote, e pra volumes grandes o caminho é um desenho de map-reduce em vez de enfiar tudo numa chamada só.

O Jev pode ser enganado por texto malicioso dentro dos próprios dados que ele está avaliando?

Sim, e é um ponto que a TypeSafe deixa explícito: o Jev trata o state como dado, não como hostil, então texto escrito pra direcionar a resposta (instrução injetada, enquadramento enganoso) pode influenciar o resultado. Num quality gate isso importa porque o campo descricao do lote é justamente conteúdo não confiável entrando no state.

Quanto custa rodar esse quality gate do Jev todo dia num pipeline de dados?

O preço publicado é US$ 0,042 por 1 milhão de tokens de entrada, com tokens de saída a US$ 0. Como o custo é só de input, o que pesa na conta é o tamanho do state que você manda a cada chamada, e não a quantidade de perguntas feitas sobre ele.

Preciso de conta própria na TypeSafe pra usar o Jev no pipeline?

Depende do momento: a TypeSafe pausou novos cadastros diretos desde 22 de setembro de 2026 por excesso de demanda, mas contas já criadas continuam funcionando normalmente. Quem não tem conta direta ainda consegue acessar o Jev pela OpenRouter (typesafe/jev-1.13 ou typesafe/jev-latest), pelo AI Gateway da Vercel ou pelo catálogo do Cloudflare Workers AI.




Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Claude Code

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 120 aulas
  • 4 projetos
  • 9h 45min

Blog | Mais populares