Vad varje fält betyder
Förfrågan definierar frågorna och svarsformaten. Svaret returnerar ett resultat för var och en. Här är JSON-fälten som används i exemplet.
Begäran fält
model- Modell-ID. Exemplet låser versionen till Jev 1.13 så att modellversionen är explicit.
state- Text eller strukturerade data som ska bedömas, till exempel ett meddelande till kundsupport.
questions- En uppsättning namngivna beslut. Samma namn används under answers i svaret.
<question_id>- Ett namn som action eller urgency; svaret använder samma namn.
type- Svarsformatet: choice väljer ett alternativ, score bedömer på en ordnad skala och noul besvarar en ja/nej-fråga.
instructions- Den specifika bedömning du vill att modellen ska göra.
criteria- Tillåtna Choice-alternativ, ordnade Score-nivåer eller betydelsen av false och true för Noul.
Svarsfält
answers- Ett resultat per fråga, returneras under samma namn.
choice- Den valda nyckeln i choice: alternativet med högst sannolikhet.
probabilities- Sannolikheten för varje valalternativ; dessa värden summerar till 1.
confidence- Ett separat konfidensvärde beräknat från sannolikhetsfördelningen; det är inte det valda alternativets sannolikhet.
score- En position på en ordnad skala, viktad efter sannolikhet; den kan hamna mellan två nivåer.
legend- Kopplingen mellan numeriska Score-positioner och beskrivningarna av de nivåer du angav.
noul- Ett tal från 0 (nej) till 1 (ja) för en ja/nej-fråga.
Samma kontext, tre oberoende frågor: Choice, Score och Probability. Varje körning använder ett av dagens försök. Ett svar med korrekt format kan fortfarande vara fel. Testa representativa fall och ange routingtrösklar som passar ditt arbetsflöde.
LangChain · PythonAnvänd Jev i en LangChain-agentharness
En harness styr agentens modellanrop och verktyg. Vid en beslutspunkt läser Jev ett meddelande, ett planerat verktygsanrop eller agentens tillstånd och ger ett typat svar. Din kod avgör nästa steg; öppna uppgifter stannar hos chattmodellen.
ModelRouterMiddlewarebefore_agent → wrap_model_callKlassificera det senaste användarmeddelandet före körningen, välj modell och behåll valet under körningen. Valet, sannolikheterna och konfidensen finns kvar i agentens tillstånd.
AutoModeMiddlewarewrap_tool_callGranska ett valt verktygsanrop innan det körs. Om Jev bedömer att det är riskfyllt eller saknar behörighet blockerar middleware anropet och returnerar ett ToolMessage med felmeddelande. Det begär inte mänskligt godkännande.
TypeSafeClassifierChoice · Score · NoulLägg till egna kontrollpunkter med anpassad middleware: skicka agentens meddelanden eller tillstånd till TypeSafeClassifier och använd Choice, Score eller Noul för att styra koden eller skicka osäkra fall till granskning.
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 på serversidan
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);