Arti setiap bidang
Permintaan menentukan pertanyaan dan format jawaban. Respons mengembalikan satu hasil untuk setiap pertanyaan. Berikut bidang JSON yang digunakan dalam contoh.
Bidang permintaan
model- ID model. Contoh ini menetapkan versi Jev 1.13 agar versi yang digunakan selalu jelas.
state- Teks atau data terstruktur yang akan dievaluasi, misalnya pesan kepada tim dukungan.
questions- Kumpulan keputusan yang diberi nama. Nama yang sama digunakan dalam bidang answers pada respons.
<question_id>- Nama seperti action atau urgency; jawaban memakai nama yang sama.
type- Format jawaban: choice memilih satu opsi, score menilai pada skala berurutan, dan noul mengevaluasi pertanyaan ya/tidak.
instructions- Penilaian spesifik yang ingin Anda minta dari model.
criteria- Opsi Choice yang diizinkan, tingkat Score yang berurutan, atau arti false dan true untuk Noul.
Bidang respons
answers- Satu hasil per pertanyaan, dikembalikan dengan nama yang sama.
choice- Kunci opsi yang dipilih oleh choice: opsi dengan probabilitas tertinggi.
probabilities- Probabilitas untuk setiap opsi; seluruh nilainya berjumlah 1.
confidence- Nilai keyakinan tersendiri yang dihitung dari distribusi probabilitas; ini bukanlah probabilitas pilihan yang dipilih.
score- Posisi pada skala berurutan yang dibobot menurut probabilitas; nilainya bisa berada di antara dua tingkat.
legend- Pemetaan posisi angka Score kembali ke deskripsi tingkat yang Anda tentukan.
noul- Angka dari 0 (tidak) hingga 1 (ya) untuk pertanyaan ya/tidak.
Satu konteks yang sama, tiga pertanyaan terpisah: Choice, Score, dan Probability. Setiap kali menjalankan contoh, jatah harian berkurang satu. Jawaban dengan format yang benar masih bisa salah. Uji kasus yang representatif dan tetapkan ambang routing yang sesuai dengan alur kerja Anda.
LangChain · PythonMemasukkan Jev ke harness agen LangChain
Harness mengatur pemanggilan model dan alat. Pada titik keputusan, Jev membaca pesan, rencana pemanggilan alat, atau status agen lalu mengembalikan jawaban bertipe. Kode Anda menentukan langkah berikutnya; tugas terbuka tetap ditangani model percakapan.
ModelRouterMiddlewarebefore_agent → wrap_model_callKlasifikasikan pesan pengguna terbaru sebelum proses dimulai, pilih model, lalu gunakan pilihan itu selama proses berjalan. Pilihan, probabilitas, dan tingkat keyakinannya tetap tersedia dalam status agen.
AutoModeMiddlewarewrap_tool_callPeriksa pemanggilan alat tertentu sebelum dijalankan. Jika Jev menilai tindakan berisiko atau tidak cukup berwenang, middleware memblokirnya dan mengembalikan ToolMessage berisi kesalahan. Middleware ini tidak meminta persetujuan manusia.
TypeSafeClassifierChoice · Score · NoulAnda juga bisa menambahkan pemeriksaan sendiri: kirim pesan atau status agen ke TypeSafeClassifier lewat middleware kustom, lalu gunakan Choice, Score, atau Noul untuk mengatur alur kode atau meminta peninjauan.
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 sisi server
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);