Jev recipe / vendor comparison
Jev vs OpenAI Decision API (Luna): Typed Decisions Compared
Last updated: 2026-10-08
OpenAI answered Jev with the Decision API on GPT-6 Luna — now in public beta with published input-only pricing. Compare the contracts: answer sets vs typed Choice/Score/Noul, predicate vs noul naming, $0.10 vs $0.042 per million input tokens, and what each confidence number is worth.
Six checks before you pick a decision API
{
"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)"
}
}Decision API contracts: Jev typed primitives vs OpenAI Decision API (Luna)
self-serve API key, also reachable through OpenRouter and gateway providers
anyone can call it, OpenAI expects to GA "in the coming weeks," and the beta shape and pricing can still move
multiple questions share one call
predicate (yes/no), choice (one of N), score (ordered rubric); predicate is OpenAI’s name for Jev’s Noul, and max answer/level counts are not yet documented
no text generated
also a single pass, not generation
pennies per 100k decisions
stated on the developer guide page while the main pricing page still shows no separate Decisions line. Per-decision: ~2.4x Jev’s input rate
0.85 means ~85% right, so thresholds act as accuracy contracts
a ranking signal until validated on your own labels
inline base64 data URLs only (hosted URLs and file IDs are not supported per the beta guide); OpenAI-hosted only — no self-host or on-prem path
Side-by-side code: OpenAI decisions endpoint vs the Jev typed call
import os
import requests
# Public beta since 2026-10-06: question types are predicate /
# choice / score (predicate = Jev's Noul), $0.10 per 1M input
# tokens, output free. Field shapes below are the announced shape -
# verify against the current guide before shipping; beta 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}
# Images (when you need them): inline base64 data URLs only -
# hosted image URLs and file IDs are not supported in the beta.import requests
JEV_ENDPOINT = "https://api.typesafe.ai/v1/systemone"
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["answers"]["routing"] # criteria-checked answer + calibrated confidence
if (
route["confidence"] >= AUTO_ROUTE_CONFIDENCE
and not data["answers"]["needs_safety_escalation"]["noul"]
):
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"],
}),
});
// Public beta since 2026-10-06 (predicate / choice / score; $0.10 per
// 1M input, output free) - verify field names against the current
// guide before shipping; beta APIs move.
const decision = (await resp.json()) as {
answer: string;
confidence: number;
};const JEV_ENDPOINT = "https://api.typesafe.ai/v1/systemone";
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.answers.routing.confidence >= AUTO_ROUTE_CONFIDENCE &&
!data.answers.needs_safety_escalation.noul
? `auto:${data.answers.routing.choice}`
: "review";Jev vs OpenAI Decision API FAQ
What is OpenAI's Decision API?
A non-chat endpoint built on Luna — the smallest and most affordable model in the GPT-6 family — announced in preview at OpenAI DevDay (2026-09-29) and opened to everyone as a public beta on 2026-10-06. You supply context plus questions across three primitives — predicate (yes/no), choice (one of N options), and score (ordered rubric) — and get typed answers with confidence back in about 150ms. The beta guide publishes the pricing: $0.10 per million input tokens with output free and no cache charges. OpenAI says it expects to GA "in the coming weeks." The New Stack reported the original announcement as likely a reaction to TypeSafe’s Jev.
Is the Decision API the same thing as Jev?
Same category, different contracts. Both are non-generative: context plus a question plus a fixed answer set in, one answer plus confidence out — no prose generated. Jev's contract is deeper: Choice questions carry criteria per option (the policy lives in reviewable code), Score covers ordered decisions, multiple questions share one call, probabilities are RLCD-calibrated, input-only pricing is public ($0.042/M, ~2.4x under Luna's beta rate), and the OpenJev ecosystem offers a self-hosted route. Luna counters with first-party OpenAI integration, inline-base64 image input, and published beta pricing — with calibration methodology still unpublished.
Which one should I pick for production today?
Jev remains the default while Luna is in beta: it is generally available, its thresholds are calibrated, its pricing is published on the product itself, and migration is one adapter function away. Choose Luna first if you are all-in on OpenAI, your decisions need image context, or single-vendor billing matters more than price ($0.10/M input vs Jev’s $0.042/M). Either way, run ~100 labeled examples from your own workload through both gates before automating anything on confidence alone.
Can I use both in one pipeline?
Yes, and the pattern is already documented: put both behind one decision interface in your code, then let the confidence-gated fallback chain own the routing — a Jev gate as the always-on first pass, a Luna call where image context helps, and the same 0.60–0.85 review band catching low confidence from either vendor. Vendor swaps then cost an adapter, not a rewrite.
How is this different from the Jev vs Luna benchmark guide?
This page compares the product and API contracts: request shape, primitives, latency, pricing, calibration, deployment. The Jev vs Luna benchmark guide compares measured task results — a 505-sample third-party evaluation where Jev took 382/505 at about $0.01 versus Luna's $0.06, including the event where Luna won. Read both: the contract tells you what you can build; the benchmark tells you what to expect when you build it.
What are the OpenAI Decisions API alternatives?
Four kinds, as of the beta. Jev is the contract-deepest hosted option: typed Choice/Score/Noul with per-option criteria, RLCD-calibrated confidence, and $0.042/M input (2.4x under Luna’s beta rate). Perplexity’s Decisions API is the cheapest hosted one ($0.02/M input, GA, vision input, Apache 2.0 weights). Cloudflare’s Clef and Liquid AI’s D1 are open-weight decision models you can run yourself, and the OpenJev family (Laya, Kev, SemIf, Von) covers fully local routes. The six-vendor landscape with October 2026 pricing is on our decision model API hub (/decision-model-api), and the open-source options are compared line by line in /jev-alternatives.
What happens to my code if the beta shape changes?
The beta can still move fields — OpenAI published the guide and pricing together on 2026-10-06 and expects to GA "in the coming weeks," so assume the request and response fields may shift — which is exactly why the Luna call should live inside one adapter function your application never sees past. The Jev evaluate endpoint has been generally available and unchanged since launch. Keep your ~100-example eval set handy either way: re-validating a swapped gate is an afternoon, not a quarter.