Hva hvert felt betyr
Forespørselen definerer spørsmålene og svarformatene. Svaret gir et resultat for hver enkelt. Her er JSON-feltene brukt i eksemplet.
Forespørselsfelt
model- Modell-ID. Eksemplet låser modellversjonen til Jev 1.13, slik at versjonen er tydelig angitt.
state- Tekst eller strukturerte data som skal vurderes, for eksempel en melding til kundestøtte.
questions- Et sett med navngitte avgjørelser. De samme navnene brukes under answers i svaret.
<question_id>- Et navn som action eller urgency; svaret bruker det samme navnet.
type- Svarformatet: choice velger et alternativ, score vurderer på en ordnet skala, og noul vurderer et ja/nei-spørsmål.
instructions- Den spesifikke vurderingen du vil at modellen skal ta.
criteria- Tillatte Choice-alternativer, ordnede Score-nivåer eller betydningen av false og true for Noul.
Svarfelt
answers- Ett resultat per spørsmål, returnert under samme navn.
choice- Den valgte nøkkelen i choice: alternativet med høyest sannsynlighet.
probabilities- Sannsynligheten for hvert valgalternativ; disse verdiene summerer til 1.
confidence- En egen konfidensverdi beregnet fra sannsynlighetsfordelingen; det er ikke det valgte alternativets sannsynlighet.
score- En posisjon på en ordnet skala vektet etter sannsynlighet; den kan ligge mellom to nivåer.
legend- Koblingen mellom numeriske Score-posisjoner og beskrivelsene av nivåene du definerte.
noul- Et tall fra 0 (nei) til 1 (ja) for et ja/nei-spørsmål.
Samme kontekst, tre uavhengige spørsmål: Choice, Score og Probability. Hver kjøring bruker ett av dagens forsøk. Et riktig utformet svar kan fortsatt være feil. Test representative tilfeller og sett rutingterskler for din egen arbeidsflyt.
LangChain · PythonBruk Jev i en LangChain-agentharness
En harness styrer agentens modellkall og verktøy. Når en beslutning trengs, leser Jev en melding, et planlagt verktøykall eller agentens tilstand og returnerer et typet svar. Koden din bestemmer neste steg; åpne oppgaver blir hos chatmodellen.
ModelRouterMiddlewarebefore_agent → wrap_model_callKlassifiser den siste brukermeldingen før kjøringen, velg modell og behold valget gjennom hele kjøringen. Valg, sannsynligheter og konfidens er fortsatt tilgjengelige i agenttilstanden.
AutoModeMiddlewarewrap_tool_callSjekk et valgt verktøykall før det utføres. Hvis Jev finner risiko eller manglende tillatelse, blokkerer mellomvaren kallet og returnerer en ToolMessage med feil. Den ber ikke et menneske om godkjenning.
TypeSafeClassifierChoice · Score · NoulDu kan også legge til egne kontrollpunkter: send agentmeldinger eller tilstand til TypeSafeClassifier fra egen mellomvare, og bruk Choice, Score eller Noul til å styre flyten eller sende usikre tilfeller til gjennomgang.
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å serversiden
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);