Jev Recipe / ベンダー比較
Jev vs OpenAI Decision API(Luna):型付き決定 API の正面比較
OpenAI が DevDay で Jev 対抗として GPT-6 Luna ベースの Decision API を発表しました。契約の違いを比較します。事前定義された回答セット vs Choice/Score/Noul の 3 プリミティブ、150ms vs 約95ms、非公開 vs 公開の価格設定、そして2つの信頼度スコアにそれぞれどれだけの信頼を置けるか。
決定 API を選ぶ前の 6 つのチェック
{
"routing": {
"type": "choice",
"instructions": "Which queue should this ticket go to?",
"criteria": {
"billing": "Payment, invoice or refund issue",
"technical": "Product malfunction or bug",
"sales": "Buying or upgrade question",
"abuse": "Safety or abuse report"
}
},
"needs_safety_escalation": {
"type": "noul",
"instructions": "Does this ticket require a safety escalation regardless of queue?"
},
"urgency": {
"type": "score",
"instructions": "Rate how urgent a human reply is, 1 (routine) to 5 (business-stopping)"
}
}決定 API 契約の比較:Jev 型付きプリミティブ vs OpenAI Decision API(Luna)
コード対照:OpenAI decisions エンドポイント vs Jev 型付き呼び出し
import os
import requests
# Limited-preview shape (announced 2026-09-29). Verify against the
# current reference at broad rollout - preview APIs move.
resp = requests.post(
"https://api.openai.com/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}"},
json={
"model": "gpt-6-luna",
"context": "Ticket: my invoice shows the same charge twice...",
"question": "Which queue should this ticket go to?",
"answers": ["billing", "technical", "sales", "abuse"],
},
timeout=5,
)
resp.raise_for_status()
decision = resp.json() # -> {"answer": "billing", "confidence": 0.91}
# One flat answer set per call: no per-option criteria, no second
# question sharing the call, no ordered score primitive.import requests
JEV_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate"
AUTO_ROUTE_CONFIDENCE = 0.85
QUESTIONS = {
"routing": {
"type": "choice",
"instructions": "Which queue should this ticket go to?",
"criteria": {
"billing": "Payment, invoice or refund issue",
"technical": "Product malfunction or bug",
"sales": "Buying or upgrade question",
"abuse": "Safety or abuse report",
},
},
"needs_safety_escalation": {
"type": "noul",
"instructions": "Does this ticket require a safety escalation regardless of queue?",
},
"urgency": {
"type": "score",
"instructions": "Rate how urgent a human reply is, 1 (routine) to 5 (business-stopping)",
},
}
resp = requests.post(
JEV_ENDPOINT,
json={"state": {"ticket": "..."}, "questions": QUESTIONS},
timeout=5,
)
resp.raise_for_status()
data = resp.json()
route = data["routing"] # criteria-checked answer + calibrated confidence
if (
route["confidence"] >= AUTO_ROUTE_CONFIDENCE
and not data["needs_safety_escalation"]["answer"]
):
lane = f"auto:{route['answer']}" # ~70-100ms, input tokens only
else:
lane = "review" # 0.60-0.85 band or safety flagconst resp = await fetch("https://api.openai.com/v1/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-6-luna",
context: "Ticket: my invoice shows the same charge twice...",
question: "Which queue should this ticket go to?",
answers: ["billing", "technical", "sales", "abuse"],
}),
});
// Limited-preview shape (announced 2026-09-29) - verify at broad rollout.
const decision = (await resp.json()) as {
answer: string;
confidence: number;
};const JEV_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate";
const AUTO_ROUTE_CONFIDENCE = 0.85;
const QUESTIONS = {
routing: {
type: "choice",
instructions: "Which queue should this ticket go to?",
criteria: {
billing: "Payment, invoice or refund issue",
technical: "Product malfunction or bug",
sales: "Buying or upgrade question",
abuse: "Safety or abuse report",
},
},
needs_safety_escalation: {
type: "noul",
instructions:
"Does this ticket require a safety escalation regardless of queue?",
},
urgency: {
type: "score",
instructions:
"Rate how urgent a human reply is, 1 (routine) to 5 (business-stopping)",
},
} as const;
const resp = await fetch(JEV_ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ state: { ticket: "..." }, questions: QUESTIONS }),
});
const data = await resp.json();
const lane =
data.routing.confidence >= AUTO_ROUTE_CONFIDENCE &&
!data.needs_safety_escalation.answer
? `auto:${data.routing.answer}`
: "review";Jev vs OpenAI Decision API よくある質問
OpenAI の Decision API とは何ですか?
2026-09-29 の OpenAI DevDay で発表された非チャット系エンドポイントです。GPT-6 ファミリーで最小・最安のモデル Luna の上に構築されています。質問・事前定義された回答セット・コンテキストを送ると、約 150ms で回答セットの中から 1 つの回答と信頼度スコアを返します。公開は limited preview で「数日中」の広域提供が予告されており、呼び出し単価は発表時点で未公開です。The New Stack は TypeSafe の Jev への対抗と報じています。
Decision API と Jev は同じものですか?
同じカテゴリですが、契約が異なります。どちらも非生成型で、コンテキスト + 質問 + 固定の回答セットを入力すると 1 つの回答と信頼度が返ります。違いは契約の深さです。Jev は選択肢ごとに criteria を持たせた Choice(ポリシーがレビュー可能なコードに残る)、順序付き判断をカバーする Score、複数質問の 1 呼び出し共有、RLCD 較正済みの確率、公開された入力課金のみの価格($0.042/M)、OpenJev エコシステムによるセルフホスト経路を備えます。Luna の対抗点はよりシンプルなリクエスト形状、今日から使える画像コンテキスト、OpenAI ファーストパーティ統合です——引き換えにプレビュー段階の価格と較正の透明性を持ちます。
今すぐ本番環境で使うならどちらを選ぶべきですか?
Luna が limited preview の間は Jev が既定値です。一般提供済みで、しきい値は較正済み、価格は公開済み、移行もアダプタ関数 1 つで済みます。Luna を先に見るべきは 3 つのケースです。スタックが OpenAI 前提、判断に画像コンテキストが必要、単一ベンダーの請求が価格透明性より重要。どちらを選ぶ場合でも、信頼度だけでの自動実行の前に、自分のワークロードから約 100 件のラベル付きサンプルを両ゲートに通してください。
両方を 1 本のパイプラインで使えますか?
使えます。パターンも既に文書化されています。コード内の 1 つの決定インターフェースの背後に両方を隠蔽し、信頼度ゲート付きフォールバックチェーンにルーティングを任せます。Jev ゲートを常設の第一通過に、画像コンテキストが助けになる判断を Luna に、そして同じ 0.60〜0.85 のレビュー帯がどちらのベンダーの低信頼出力も受け止めます。ベンダー交換のコストはリライトではなくアダプタになります。
Jev vs Luna ベンチマークガイドとの違いは何ですか?
このページはプロダクトと API の契約を比較します。リクエスト形状、プリミティブ、レイテンシ、価格、較正、デプロイです。Jev vs Luna ベンチマークガイドは実測タスク結果を比較します。505 サンプルのサードパーティ評価で、Jev が約 $0.01 対 $0.06 のコストで 382/505 を取り、Luna が勝ったケースも含まれています。両方読んでください。契約は何を構築できるかを、ベンチマークは構築したときに何を期待すべきかを教えます。
プレビュー契約が変わったらコードはどうなりますか?
OpenAI は「広域提供時に詳細を公表する」としているので、リクエストとレスポンスのフィールドは動くと想定してください。だからこそ Luna 呼び出しは 1 つのアダプタ関数の中に収め、アプリケーション層からは直接見えないようにします。Jev の evaluate エンドポイントは公開以来、一般提供で変更なしです。どちらにしても約 100 件の評価セットは手元に残してください。ゲートを交換して再検証するのは四半期ではなく 1 午後の作業です。