Jev — modelo de decisão
MarkdownO modelo de decisão Jev da TypeSafe responde a perguntas tipadas sobre texto ou JSON: escolha de uma opção, avaliação numa escala ou «sim/não» com probabilidades. Não é um chat nem um gerador de texto.
Guia completo
https://api.ailoot.ai/v1/systemonecurl https://api.ailoot.ai/v1/systemone \
-H "Authorization: Bearer $AILOOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "Socorro! Os meus pagamentos de saída estão a falhar há 3 dias.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Isto transmite urgência?"
}
}
}' import json, os, urllib.request
body = {
"model": "jev-latest",
"state": "Socorro! Os meus pagamentos de saída estão a falhar há 3 dias.",
"questions": {
"is_urgent": {"type": "noul", "instructions": "Isto transmite urgência?"},
},
}
req = urllib.request.Request(
"https://api.ailoot.ai/v1/systemone",
data=json.dumps(body).encode(),
headers={"Authorization": "Bearer " + os.environ["AILOOT_API_KEY"],
"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=60) as resp:
result = json.load(resp)
print(result["answers"]["is_urgent"]["noul"]) # 0.95const resp = await fetch("https://api.ailoot.ai/v1/systemone", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AILOOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "jev-latest",
state: "Socorro! Os meus pagamentos de saída estão a falhar há 3 dias.",
questions: {
is_urgent: { type: "noul", instructions: "Isto transmite urgência?" },
},
}),
});
const result = await resp.json();
if (!resp.ok) throw new Error(`${resp.status} ${JSON.stringify(result)}`);
console.log(result.answers.is_urgent.noul); // 0.95{
"model": "jev-1.13.0",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.95
}
},
"usage": { "input_tokens": 296, "output_tokens": 20 }
}Jev é um modelo de decisão da classe System One da TypeSafe. Não escreve texto nem mantém conversas: envia-lhe um estado (state) — texto ou JSON — e um conjunto de perguntas, e recebe valores tipados com probabilidades. O código pode usá-los diretamente para escolher ramos, ordenar e encaminhar, sem analisar texto livre.
Todas as perguntas de um pedido são avaliadas em paralelo e de forma independente, com base no mesmo state. Segundo a TypeSafe, acrescentar perguntas quase não altera o tempo de resposta, e as perguntas não interferem entre si.
| Aspeto | Descrição breve |
|---|---|
| Modelo | jev-latest — alias da versão estável mais recente do Jev; ficha no catálogo |
| Método | POST /v1/systemone. Não é um chat: os formatos OpenAI, Anthropic e Gemini não são adequados para o Jev. A resposta chega integralmente, num único JSON |
| O que aceita | Apenas texto: uma cadeia de caracteres, um objeto JSON ou um array de textos. Converta primeiro as imagens, o áudio e o vídeo em texto |
| Contexto | 64K tokens por pedido — state e todas as perguntas em conjunto; state e a pergunta mais longa — até 32K |
| Idioma | Segundo a TypeSafe, o modelo é mais preciso em inglês; aceita outros idiomas, mas com menor precisão — teste-o com os seus dados |
| Preço | Entrada a $0.084 por 1 milhão de tokens, saída gratuita |
Pedido
Autorização
- Authorizationheaderobrigatório
Chave Ailoot no formato
Bearer sk-….
Corpo do pedido
- modelstringobrigatório
jev-latest. - statestring | object | arrayobrigatório
O que avaliar: uma cadeia de texto ou JSON — um pedido de um cliente, um registo da base de dados, uma conversa ou o estado atual da sua aplicação. Um objeto com nomes de campos claros costuma ser mais cómodo do que uma única cadeia de caracteres.
- questionsobjectobrigatório
Perguntas. Escolhe as chaves e recebe as respostas com as mesmas chaves; a chave não influencia a resposta — a pergunta propriamente dita é definida em
instructions. - questions.*.typestringobrigatório
noul,choiceouscore— ver abaixo. - questions.*.instructionsstring | object | arrayobrigatório
A pergunta propriamente dita. Pode enviar uma pergunta longa com dados num objeto: a pergunta num campo e os dados noutros; refira os campos pelo nome entre acentos graves.
- questions.*.criteriaobject | array
Opções de resposta específicas de cada tipo: descrições de «sim» e «não» em noul (opcionais), um dicionário de opções em choice, uma lista ordenada de níveis em score.
Tipos de perguntas
| Tipo | O que pergunta | O que devolve |
|---|---|---|
noul | Se uma afirmação é verdadeira: sim ou não | noul — probabilidade de «sim» de 0 a 1 |
choice | Qual das opções indicadas é adequada | choice, probabilities, confidence |
score | Em que nível da sua escala se encontra state | score, legend, probabilities, confidence |
Pode combinar tipos no mesmo pedido.
noul — sim ou não
O campo criteria é opcional: pode descrever o significado de «sim» (true) e «não» (false). A resposta noul — número de 0 (não) a 1 (sim).
"is_urgent": {
"type": "noul",
"instructions": "Isto transmite urgência?",
"criteria": {
"true": "Urgência temporal explícita",
"false": "Nenhuma urgência expressa"
}
}"is_urgent": {
"type": "noul",
"noul": 0.95
}choice — escolha de uma opção
criteria — dicionário «opção → descrição»; se não precisar de descrição, indique null. Até 255 opções. Na resposta, choice — a opção mais provável, probabilities — a probabilidade de cada opção (a soma é 1), confidence — a confiança de 0 a 1.
"department": {
"type": "choice",
"instructions": "Que equipa deve tratar disto?",
"criteria": {
"billing": "Pagamentos, faturação, reembolsos",
"technical": "Erros, indisponibilidades, integrações",
"sales": "Preços, passagens para planos superiores, novos clientes"
}
}"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.12, "sales": 0.0 },
"confidence": 0.81
}score — avaliação numa escala
criteria — níveis do mais baixo ao mais alto, no máximo 10 (a TypeSafe recomenda pelo menos dois). Na resposta, score — valor ponderado pelas probabilidades dos níveis (pode situar-se entre níveis), legend — número e descrição do nível, probabilities e confidence. Segundo a TypeSafe, score é adequado para comparar com um limiar, mas não para obter um número exato entre níveis.
"frustration": {
"type": "score",
"instructions": "Qual é o nível de frustração do cliente?",
"criteria": ["Calmo", "Frustrado", "Muito zangado"]
}"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Calmo", "1": "Frustrado", "2": "Muito zangado" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}Resposta
- modelstring
Versão do modelo que respondeu. O alias jev-latest passa para novas versões ao longo do tempo: se ajustou os limiares
confidencepara uma versão específica, acompanhe este campo. - answersobject
Uma resposta por pergunta, com as mesmas chaves. Cada resposta tem
type; em choice e score, tem tambémconfidence. - usageobject
input_tokenseoutput_tokens. Apenas os tokens de entrada são cobrados.
Várias perguntas num único pedido
Envie todas as perguntas sobre o mesmo state num único pedido: são avaliadas em paralelo e state é transmitido uma única vez. Segundo a TypeSafe, no seu exemplo com 13 perguntas, um pedido conjunto foi 12,2 vezes mais barato e 10 vezes mais rápido do que 13 pedidos separados enviados sequencialmente, com as mesmas respostas.
É melhor dividir um julgamento complexo em perguntas simples e combinar as respostas no código: por exemplo, em vez de «avalia esta candidatura», obtenha avaliações separadas do mercado, da viabilidade e das diferenças face à concorrência. Assim, os pesos são alterados no código e não no texto da pergunta.
{
"model": "jev-latest",
"state": "Socorro! Os meus pagamentos de saída estão a falhar há 3 dias.",
"questions": {
"department": {
"type": "choice",
"instructions": "Que equipa deve tratar disto?",
"criteria": {
"billing": "Pagamentos, faturação, reembolsos",
"technical": "Erros, indisponibilidades, integrações",
"sales": "Preços, passagens para planos superiores, novos clientes"
}
},
"frustration": {
"type": "score",
"instructions": "Qual é o nível de frustração do cliente?",
"criteria": ["Calmo", "Frustrado", "Muito zangado"]
},
"is_urgent": {
"type": "noul",
"instructions": "Isto transmite urgência?"
}
}
}Quando é adequado
- Encaminhamento. Enviar um pedido de apoio para o departamento certo e um pedido para o processador certo: código simples, um modelo grande ou uma pessoa.
- Ordenação e prioridade. Urgência, tom, risco — numa escala, com limiares no código.
- Moderação e verificações. Verificar se uma mensagem viola as regras, se a fonte confirma uma citação ou se um documento contém a resposta a uma pergunta — antes de o texto seguir para a etapa seguinte.
- Pontuação e classificação. Avaliar documentos, candidatos ou excertos encontrados segundo os seus critérios e decidir no código o que segue para a etapa seguinte.
- Em vez de um frágil «devolve JSON». Uma chamada que devolve valores tipados por construção, em vez de texto que tem de ser analisado.
Quando não é adequado
- Chat, respostas ao utilizador, geração de texto ou código. O Jev não escreve texto — para isso existem os modelos de texto.
- Modelo para Claude Code, Cursor e outros agentes. Não pode substituir o modelo de um agente por jev-latest: o agente precisa de um modelo que escreva texto e chame ferramentas. O Jev pode ser chamado a partir do código que o agente escreve para si.
- Aritmética, contagem, comparação de datas. Segundo a TypeSafe, é mais fiável fazer estas operações no código e perguntar ao modelo apenas a parte semântica — por exemplo, extrair partes de uma data através de choice.
- Imagens, áudio e vídeo. O modelo aceita apenas texto — converta estes dados em texto antecipadamente.
Preço
Apenas os tokens de entrada são cobrados — campo usage.input_tokens da resposta: $0.084 por 1 milhão. Os tokens de saída são gratuitos.
O pedido do exemplo desta página (296 tokens de entrada) custa menos de $0.0001.
Antes do pedido, o Ailoot reserva o valor no saldo e, após a resposta, debita uma única vez pelo consumo efetivo — como funciona.
Limites
| Aspeto | Limite |
|---|---|
| Pedido completo: state e todas as perguntas | 64K tokens |
| state e a pergunta mais longa em conjunto | 32K tokens |
| Opções num único choice | até 255 |
| Níveis num único score | de 2 a 10 |
| Entrada | apenas texto: cadeia de caracteres, objeto JSON ou array de textos |
Limites do modelo — segundo a TypeSafe. Os limites da sua chave e do seu saldo aplicam-se como a qualquer modelo Ailoot: Erros e limites.
Erros
Os erros chegam no formato geral da API Ailoot: código, texto claro e Request ID. Os mais frequentes neste método são:
| Código | Quando | O que fazer |
|---|---|---|
400 invalid_request | O corpo não passou a validação: falta state, model ou questions, type desconhecido, mais de 255 opções em choice ou mais de 10 níveis em score | Corrija o pedido de acordo com o texto do erro: sem alterações, voltará a falhar |
400 context_length_exceeded | state e as perguntas, em conjunto, excedem o limite do modelo | Filtre state no código, deixando apenas o que é necessário para as perguntas |
401 invalid_api_key | A chave está em falta ou é inválida | Envie a chave no cabeçalho Authorization |
402 insufficient_balance | O saldo disponível não é suficiente para a reserva | Carregue o saldo |
404 model_not_found, unsupported_endpoint | ID incorreto ou modelo chamado através do método errado, por exemplo, /v1/chat/completions | Chame jev-latest apenas através de POST /v1/systemone |
429 rate_limit_exceeded | Demasiados pedidos | Aguarde o número de segundos indicado no cabeçalho Retry-After e tente novamente |
503 model_overloaded, model_unavailable | O modelo está temporariamente sobrecarregado ou indisponível | Se X-Should-Retry: true — tente novamente após o número de segundos de Retry-After; se false — consulte primeiro o Request ID no histórico |
504 model_timeout | O modelo não respondeu a tempo | Não volte a enviar o pedido antes de consultar o Request ID no histórico |
A lista completa de códigos está na página Erros e limites.