Die Felder im Überblick
In der Anfrage legst du Fragen und Antwortformate fest. Die Antwort enthält zu jeder Frage ein Ergebnis. Hier siehst du die JSON-Felder aus dem Codebeispiel.
Anfrage
model- Die Modell-ID. Das Beispiel legt Jev 1.13 fest, damit die Version eindeutig ist.
state- Der zu bewertende Text oder strukturierte Daten, etwa eine Supportnachricht.
questions- Ein Objekt mit benannten Fragen. Die gleichen Schlüssel findest du später unter answers.
<question_id>- Ein Name wie action oder urgency; die Antwort verwendet denselben Namen.
type- Das Antwortformat: choice wählt eine Option, score bewertet auf einer geordneten Skala und noul beantwortet eine Ja/Nein-Frage.
instructions- Die konkrete Entscheidung, die das Modell treffen soll.
criteria- Erlaubte Choice-Optionen, geordnete Score-Stufen oder die Bedeutung von false und true bei Noul.
Antwort
answers- Ein Ergebnis pro Frage unter demselben Namen.
choice- Der gewählte Optionsschlüssel mit der höchsten Wahrscheinlichkeit.
probabilities- Die Wahrscheinlichkeiten aller Optionen; zusammen ergeben sie 1.
confidence- Ein Konfidenzwert, der aus der Wahrscheinlichkeitsverteilung berechnet wird. Er ist nicht identisch mit der Wahrscheinlichkeit der gewählten Option.
score- Eine nach Wahrscheinlichkeiten gewichtete Position auf der Skala; sie kann zwischen zwei Stufen liegen.
legend- Die Zuordnung der numerischen Score-Positionen zu den von dir beschriebenen Stufen.
noul- Ein Wert von 0 (nein) bis 1 (ja) für eine Ja/Nein-Frage.
Ein gemeinsamer Kontext, drei unabhängige Fragen: Choice, Score und Probability. Jeder Durchlauf zählt als ein Versuch für heute. Eine formal gültige Antwort kann falsch sein. Teste repräsentative Fälle und lege eigene Schwellen für die Weiterleitung fest.
LangChain · PythonJev in einen LangChain-Agent-Harness einbinden
Der Harness steuert Modellaufrufe und Werkzeuge. An einem Entscheidungspunkt liest Jev eine Nachricht, einen geplanten Werkzeugaufruf oder den Agentenstatus und liefert eine typisierte Antwort. Dein Code bestimmt den nächsten Schritt; offene Aufgaben bleiben beim Chatmodell.
ModelRouterMiddlewarebefore_agent → wrap_model_callDie letzte Nutzernachricht vor dem Lauf einordnen, ein Modell auswählen und diese Wahl für weitere Modellaufrufe beibehalten. Auswahl, Wahrscheinlichkeiten und Konfidenz bleiben im Agentenstatus verfügbar.
AutoModeMiddlewarewrap_tool_callEinen ausgewählten Werkzeugaufruf vor der Ausführung prüfen. Erkennt Jev ein Risiko oder eine fehlende Berechtigung, blockiert die Middleware den Aufruf und gibt eine ToolMessage mit Fehlermeldung zurück. Sie holt keine menschliche Freigabe ein.
TypeSafeClassifierChoice · Score · NoulMit eigener Middleware kannst du weitere Prüfpunkte einbauen: Agentennachrichten oder Status an TypeSafeClassifier übergeben, Choice, Score oder Noul abfragen und im Code verzweigen oder unsichere Fälle prüfen lassen.
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)
Serverseitiges TypeScript
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);