lia / demandas / jev@igorconsultor

> claude escreve.
> jev decide.

O modelo da chamada ao Jev que uso na Lia, minha agente de WhatsApp, para classificar a mensagem do cliente antes de qualquer resposta em texto.

01 · o que é

O Jev é um modelo da TypeSafe AI que não gera texto. Ele recebe um contexto (state) e perguntas com formato fechado (questions), e devolve a resposta, a probabilidade de cada opção e a confiança.

noulsim ou não choiceuma entre N opções scorenota

02 · como acessar

ondeOpenRouter (o console da TypeSafe está fechado a novos usuários) endpointPOST https://openrouter.ai/api/alpha/decisions modelotypesafe/jev-1.13 chavea mesma do OpenRouter, em variável de ambiente

O endpoint é outro, diferente do de chat completions. O Jev também não aparece na listagem GET /api/v1/models, porque está em beta. A página do modelo é openrouter.ai/typesafe/jev-1.13.

Fixe a versão (jev-1.13). O apelido ~typesafe/jev-latest muda de modelo sem aviso.

03 · a chamada

jev.ts
const JEV_URL = "https://openrouter.ai/api/alpha/decisions";
const LIMIAR = 0.6;

// As opções e o critério de cada uma. Troque pelo que a sua operação precisa decidir.
const CRITERIOS = {
  pedido: "Relata problema, erro, algo que não funciona, ou pede alteração, novidade, relatório ou ajuste no sistema.",
  status: "Pergunta como está, o andamento ou a situação de algo que já pediu antes.",
  outro:  "Cumprimento, agradecimento, resposta curta a uma pergunta anterior, conversa geral ou assunto comercial (preço, reunião, contrato).",
};

export async function classificar(texto, apiKey) {
  const res = await fetch(JEV_URL, {
    method: "POST",
    headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" },
    body: JSON.stringify({
      model: "typesafe/jev-1.13",
      state: { mensagem_do_cliente: texto },
      questions: {
        classe: {
          type: "choice",
          instructions: "Classifique a mensagem de um cliente enviada ao suporte técnico de um sistema.",
          criteria: CRITERIOS,
        },
      },
    }),
    signal: AbortSignal.timeout(5000),
  });
  if (!res.ok) throw new Error(`jev http ${res.status}`);

  const { choice, confidence } = (await res.json()).answers.classe;

  // Na dúvida, "outro": abaixo do limiar, nenhuma ação automática.
  return confidence < LIMIAR ? "outro" : choice;
}

Fallback. Na Lia, se o Jev falhar (erro HTTP, tempo esgotado ou resposta fora do formato), a mensagem segue para o classificador antigo. O atendimento não depende do Jev estar no ar.

O limiar de 0,6. Nos meus testes, as mensagens ambíguas ficaram entre 0,52 e 0,69 de confiança, e as claras em 0,79 ou mais. Calibre o seu com mensagens da sua operação.

04 · o que medi

casos30, escritos por mim (teste sintético) jev30 de 30 gpt-4.1-mini29 de 30 (leu "ok, aguardo" como pergunta de andamento) tempo mediano488 ms × 678 ms 1ª chamada2 perguntas, 384 tokens de entrada, US$ 0,000016

Medição de 22/09/2026. Mensagem real de cliente ainda não entrou na conta.

05 · 3 usos junto com o claude

  1. porteiroO Jev decide se a mensagem precisa de resposta escrita. Só então o Claude é chamado.
  2. trava de confiançaAbaixo do limiar, a decisão vai para uma pessoa.
  3. revisorAntes do envio, o Jev dá nota (score) ao texto do Claude contra os seus critérios. Nota baixa, o texto é refeito.

São ideias de aplicação. Na Lia, hoje, está em produção a trava na forma do limiar: abaixo de 0,6, nenhum chamado é aberto.

06 · documentação

Tutorial do Jev no OpenRouter
Documentação da TypeSafe AI