Ý nghĩa của từng trường
Yêu cầu xác định các câu hỏi và định dạng trả lời. Phản hồi trả về một kết quả cho từng câu hỏi. Dưới đây là các trường JSON được dùng trong ví dụ.
Các trường yêu cầu
model- ID mô hình. Ví dụ này cố định phiên bản Jev 1.13 để phiên bản được sử dụng luôn rõ ràng.
state- Văn bản hoặc dữ liệu có cấu trúc cần đánh giá, chẳng hạn như tin nhắn gửi tới bộ phận hỗ trợ.
questions- Danh sách các quyết định được đặt tên. Những tên này cũng xuất hiện trong trường answers của phản hồi.
<question_id>- Tên như action hoặc urgency; câu trả lời sẽ dùng đúng tên đó.
type- Định dạng câu trả lời: choice chọn một phương án, score đánh giá theo thang mức có thứ tự, còn noul xử lý câu hỏi có/không.
instructions- Nội dung đánh giá cụ thể mà bạn yêu cầu mô hình thực hiện.
criteria- Các phương án Choice được phép, các mức Score theo thứ tự hoặc ý nghĩa của false và true trong Noul.
Trường phản hồi
answers- Một kết quả cho mỗi câu hỏi, được trả về dưới cùng một tên.
choice- Khóa phương án do choice chọn: phương án có xác suất cao nhất.
probabilities- Xác suất của từng phương án; tổng các giá trị này bằng 1.
confidence- Giá trị độ tin cậy riêng được tính từ phân bố xác suất; đây không phải xác suất của phương án được chọn.
score- Vị trí trên thang có thứ tự được tính theo xác suất; có thể nằm giữa hai mức.
legend- Ánh xạ vị trí số của Score về phần mô tả các mức do bạn xác định.
noul- Một số từ 0 (không) đến 1 (có) cho câu hỏi có/không.
Một ngữ cảnh chung, ba câu hỏi độc lập: Choice, Score và Probability. Mỗi lần chạy sẽ dùng một lượt trong hạn mức hằng ngày. Một câu trả lời được định dạng đúng vẫn có thể sai. Kiểm tra các trường hợp đại diện và đặt ngưỡng định tuyến cho quy trình làm việc của riêng bạn.
LangChain · PythonĐưa Jev vào harness của agent LangChain
Harness điều phối các lần gọi mô hình và công cụ. Tại điểm cần quyết định, Jev đọc tin nhắn, lệnh gọi công cụ sắp chạy hoặc trạng thái agent rồi trả về kết quả có kiểu xác định. Mã của bạn quyết định bước tiếp theo; các việc mở vẫn do mô hình hội thoại xử lý.
ModelRouterMiddlewarebefore_agent → wrap_model_callPhân loại tin nhắn mới nhất của người dùng trước khi chạy để chọn mô hình, rồi giữ lựa chọn đó trong suốt lượt chạy. Kết quả chọn, xác suất và độ tin cậy vẫn có trong trạng thái agent.
AutoModeMiddlewarewrap_tool_callKiểm tra lệnh gọi công cụ được chỉ định trước khi thực thi. Nếu Jev nhận thấy rủi ro hoặc thiếu quyền, middleware sẽ chặn lệnh và trả về ToolMessage báo lỗi. Nó không tự xin phê duyệt của con người.
TypeSafeClassifierChoice · Score · NoulBạn cũng có thể thêm điểm kiểm tra riêng bằng middleware tùy chỉnh: gửi tin nhắn hoặc trạng thái agent cho TypeSafeClassifier, dùng Choice, Score hoặc Noul để rẽ nhánh trong mã hay chuyển trường hợp chưa chắc chắn cho người kiểm tra.
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 phía máy chủ
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);