O que significa cada campo
O pedido define as perguntas e o formato esperado. A resposta contém um resultado para cada pergunta. Estes são os campos JSON usados no exemplo.
Pedido
model- O identificador do modelo. O exemplo fixa Jev 1.13 para tornar a versão explícita.
state- O texto ou os dados estruturados a avaliar, como uma mensagem de apoio.
questions- Um objeto cujas chaves são os nomes das perguntas. As mesmas chaves aparecem depois em answers.
<question_id>- Um nome como action ou urgency; a resposta usa o mesmo nome.
type- Formato de resposta: choice escolhe uma opção, score avalia numa escala ordenada e noul responde a uma pergunta de sim ou não.
instructions- A decisão concreta que o modelo deve tomar.
criteria- As opções permitidas em Choice, os níveis ordenados de Score ou o significado de false e true em Noul.
Resposta
answers- Um resultado por pergunta, com o mesmo nome.
choice- A opção escolhida, aquela com maior probabilidade.
probabilities- A probabilidade de cada opção; os valores somam 1.
confidence- Um grau de confiança calculado a partir da distribuição de probabilidades, diferente da probabilidade da opção escolhida.
score- Uma posição ponderada pelas probabilidades numa escala ordenada; pode ficar entre dois níveis.
legend- A correspondência entre as posições numéricas de Score e as descrições dos níveis que definiste.
noul- Um valor entre 0 (não) e 1 (sim) para uma pergunta binária.
O mesmo contexto, três perguntas independentes: Choice, Score e Probability. Cada execução usa uma tentativa diária. Uma resposta no formato certo pode estar errada. Teste casos representativos e defina limiares de encaminhamento adequados à sua aplicação.
LangChain · PythonIntegrar o Jev ao harness de um agente LangChain
O harness coordena as chamadas ao modelo e às ferramentas. Num ponto de decisão, o Jev lê uma mensagem, uma chamada de ferramenta proposta ou o estado do agente e devolve uma resposta tipada. Seu código define o próximo passo; as tarefas abertas continuam com o modelo de chat.
ModelRouterMiddlewarebefore_agent → wrap_model_callClassifique a última mensagem antes da execução, escolha um modelo e mantenha essa escolha durante a tarefa. A opção, as probabilidades e a confiança continuam disponíveis no estado do agente.
AutoModeMiddlewarewrap_tool_callVerifique uma chamada de ferramenta antes de executá-la. Se o Jev identificar risco ou falta de autorização, o middleware bloqueia a chamada e devolve um ToolMessage de erro. Ele não pede aprovação humana.
TypeSafeClassifierChoice · Score · NoulVocê também pode criar pontos de verificação: passe mensagens ou o estado do agente ao TypeSafeClassifier em um middleware próprio e use Choice, Score ou Noul para decidir o fluxo ou solicitar revisão.
LangChain · Python · ModelRouterMiddleware
# pip install "langchain-typesafe[experimental]" langchain-openai
# Set TYPESAFE_API_KEY and OPENAI_API_KEY on your server.
from langchain.agents import create_agent
from langchain_typesafe.experimental.middleware import (
ModelChoice, ModelRouterMiddleware,
)
router = ModelRouterMiddleware(
choices={
"fast": ModelChoice(
model="openai:gpt-5.6-terra",
criteria="Simple lookups and extraction.",
),
"powerful": ModelChoice(
model="openai:gpt-6-astra",
criteria="Complex reasoning and high-stakes decisions.",
),
},
instructions="Choose the least costly model that can do the task safely.",
)
agent = create_agent("openai:gpt-5.6-terra", middleware=[router])
result = agent.invoke({"messages": [{"role": "user", "content": "Summarize this log."}]})
print(result["model_route"].choice)
TypeScript no servidor
TypeScript · fetch// Run on your server. Keep the API key out of browser code.
const apiKey = process.env.OPENROUTER_API_KEY;
if (!apiKey) throw new Error("Set OPENROUTER_API_KEY");
const response = await fetch("https://openrouter.ai/api/alpha/decisions", {
method: "POST",
headers: {
Authorization: "Bearer " + apiKey,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "typesafe/jev-1.13",
state: {input: "A customer reports a duplicate charge."},
questions: {
team: {
type: "choice",
instructions: "Which team should handle this?",
criteria: {
billing: "Payments and refunds",
technical: "Bugs and integrations"
}
},
urgency: {
type: "score",
instructions: "How urgent is the issue?",
criteria: ["Can wait", "Needs attention today", "Immediate action"]
},
escalate: {
type: "noul",
instructions: "Should a human review this first?",
criteria: {false: "No review needed", true: "Review before acting"}
}
}
})
});
if (!response.ok) throw new Error("Decision request failed");
const {answers} = await response.json();
console.log(answers.team.choice, answers.urgency.score, answers.escalate.noul);