Hvad betyder hvert felt
Anmodningen definerer spørgsmålene og svarformaterne. Svaret returnerer et resultat for hver enkelt. Her er JSON-felterne brugt i eksemplet.
Anmodningsfelter
model- Model-id. Eksemplet låser modelversionen til Jev 1.13, så versionen er tydelig angivet.
state- Den tekst eller de strukturerede data, der skal vurderes, f.eks. en supportbesked.
questions- Et sæt navngivne beslutninger. De samme navne bruges under answers i svaret.
<question_id>- Et navn som action eller urgency; svaret bruger samme navn.
type- Svarformatet: choice vælger en mulighed, score vurderer på en ordnet skala, og noul besvarer et ja/nej-spørgsmål.
instructions- Den konkrete vurdering, du ønsker, at modellen skal foretage.
criteria- De mulige Choice-svar, ordnede Score-niveauer eller betydningen af false og true for Noul.
Svarfelter
answers- Et resultat pr. spørgsmål, returneret under samme navn.
choice- Den valgte nøgle i choice: muligheden med den højeste sandsynlighed.
probabilities- Sandsynligheden for hver valgmulighed; disse værdier summer til 1.
confidence- En separat konfidensværdi beregnet ud fra sandsynlighedsfordelingen; det er ikke den valgte muligheds sandsynlighed.
score- En position på den ordnede skala vægtet efter sandsynlighed; den kan ligge mellem to niveauer.
legend- Sammenhængen mellem de numeriske Score-positioner og beskrivelserne af dine niveauer.
noul- Et tal fra 0 (nej) til 1 (ja) for et ja/nej-spørgsmål.
Én fælles kontekst, tre uafhængige spørgsmål: Choice, Score og Probability. Hver kørsel bruger ét af dagens forsøg. Et korrekt udformet svar kan stadig være forkert. Test repræsentative cases, og indstil routingtærskler for din egen arbejdsgang.
LangChain · PythonBrug Jev i en LangChain-agentharness
En harness styrer agentens modelkald og værktøjer. Når der skal træffes en beslutning, læser Jev en besked, et planlagt værktøjskald eller agentens tilstand og returnerer et typesikkert svar. Din kode bestemmer næste skridt; åbne opgaver bliver hos chatmodellen.
ModelRouterMiddlewarebefore_agent → wrap_model_callKlassificér den seneste brugerbesked før kørslen, vælg en model, og behold valget under hele kørslen. Valg, sandsynligheder og konfidens kan stadig læses i agentens tilstand.
AutoModeMiddlewarewrap_tool_callKontrollér et udvalgt værktøjskald, før det udføres. Hvis Jev vurderer, at kaldet er risikabelt eller mangler tilladelse, blokerer middleware kaldet og returnerer en ToolMessage med fejl. Den beder ikke et menneske om godkendelse.
TypeSafeClassifierChoice · Score · NoulDu kan også tilføje egne kontrolpunkter: send agentens beskeder eller tilstand til TypeSafeClassifier fra din egen middleware, og brug Choice, Score eller Noul til at styre forløbet eller sende usikre tilfælde til gennemgang.
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);