Jev left stealth on 15 September 2026 behind one endpoint, POST /v1/systemone. I looked at it four days later, mostly at the wire. You send a state and a map of typed questions keyed by your own ids, and you get probabilities back. The model does not write text, so there is no free-form answer to parse.

Seven weeks later there are two wires. Three servers answer on /v1/decisions, and they expect two incompatible request bodies. To check where things stand I went back through the primary sources, counted the decision models OpenRouter lists and read OpenAI's DecisionRequest schema.

Jev, examined
The September report on Jev: what it does, what outsiders measured, and where its confidence numbers hold up.

Where it started

The System One request

The System One contract is small. state holds the evidence, as a string, a JSON object or an array. questions is a map, keyed by strings you choose, and the keys never reach the model. Each question names its kind: noul for a yes or no, choice for a pick from up to 255 options, score for a position on 2 to 10 ordered levels. One pass reads the state and answers all of them.

The idea is older than Jev: encoders, rerankers and grammar-constrained decoding have done parts of it for years. What other projects copied was the request shape, a state plus a map of named questions. OpenRouter lists Jev as a model, and open models now answer the same wire through llama.cpp and vLLM at /v1/systemone.

Divergence

Two request shapes

TypeSafe's family kept that shape. OpenAI's swaps the map for an array and the state for an input. A yes or no is noul in one and predicate in the other. The evidence field is state or input. Probabilities are an object keyed by option on one side and an array of {value, probability} on the other.

Both refuse unknown fields. OpenAI's DecisionRequest sets additionalProperties: false, and so does the vllm-sr runtime's request object. A body that one accepts, the other refuses.

DiagramTwo wire families

Array: input plus ordered questions

Keyed: state plus a map of questions

TypeSafe /v1/systemone

llama.cpp and vLLM /v1/systemone

vllm-sr runtime /v1/decisions

OpenRouter /api/alpha/decisions

Workers AI run path

OpenAI /v1/decisions

vLLM /v1/decisions

openai SDKs in five languages

/v1/decisions, two incompatible bodies

Who serves which shape today. The keyed family reads a state and a map of named questions. OpenAI's family reads an input and an ordered array.
TableSix wires, two shapes
WireShapeQuestion kindsMediaStatusWho serves it
OpenAI /v1/decisionsinput plus questions arraypredicate, choice, score, refusalimages in input and in instructions; no audio, video or filesGA 22 October 2026OpenAI
vLLM /v1/decisionsinput plus questions arraypredicate, choice, scorenone yet; images in an open pull requestv0.33.0rc3, no final releasevLLM
vllm-sr runtimestate plus keyed mapnoul, choice, score, box, track, set, spanimages, videomain only, no tagged releasevllm-srun
TypeSafe /v1/systemonestate plus keyed mapnoul, choice, score, boximages as assetslive, info version 0.2.0TypeSafe
OpenRouter /api/alpha/decisionsstate plus keyed mapnoul, choice, score, box on Jevimages; audio, video and files on some modelsalpha, shape may changeOpenRouter, 34 models
Workers AI run pathstate plus keyed mapnoul, choice, scoreimages; audio and video on Clef-OmniliveCloudflare
Status as of 4 November 2026. "No final release" means a tagged release does not carry the code yet.
Note

A gateway that serves /v1/decisions has to choose one body. Guessing the wire from each request body would make the same path behave differently for requests that look alike.

The superset

vllm-sr extends System One

The vllm-sr runtime merged on 3 October, and its first OpenAPI document defined POST /v1/decisions as "a strict superset of System One". Next to noul, choice and score it declares box, track, set and span, where a model says it supports them, and the response grows spans, sets, thresholds and span_heads beside the ordinary answers.

That runtime also answers on /v1/systemone with the same request body. When a question fails, /v1/decisions puts the error in that answer and /v1/systemone fails the whole request with question_failed. Contract 3.2.0 arrived on 20 October. Vela 3.0, announced on 26 October, is six open models from a 0.3B vision encoder to a 27B model, and its d3-based sizes reached main on 3 November.

None of it is in a release yet: the latest vllm-sr tag is v0.4.0 from 27 September, which predates the runtime, and vllm-srun 0.2.0 is not on PyPI. To use the extra question kinds today you build from main.

TypeSafe changed its contract without changing the version. Its live document still says info version 0.2.0, but it now has box questions and image assets that were not there in September. If you depend on it, pin the document by hash, not by version.

The other family

OpenAI's Decisions API, and vLLM

OpenAI put its Decisions API into beta on 6 October and made it generally available on 22 October, at POST /v1/decisions. The schema allows one model ("Only gpt-6-luna is supported."). input is a string or an ordered array of messages, function calls and outputs, custom tool calls and outputs. questions takes 1 to 400 entries. A question is a predicate, a choice with 2 to 255 {value, description} options, or a score with 2 to 10 {label, description} levels. Answers carry probability, probabilities, confidence, or refusal for a question the model declined. It also takes safety_identifier, prompt_cache_key and prompt_cache_options.

JSONThe keyed body
{
  "model": "jev-1.13.0",
  "state": { "text": "DB latency over 1200 ms since the migration. Webhooks are dropping." },
  "questions": {
    "is_outage": { "type": "noul", "instructions": "Is this a production outage?" },
    "team": {
      "type": "choice",
      "instructions": "Which team should triage this?",
      "criteria": { "database": "Storage, pools, query latency", "networking": "Ingress, webhooks, TLS" }
    }
  }
}
The System One shape, trimmed from the request in the Jev report.
JSONThe array body
{
  "model": "gpt-6-luna",
  "input": "DB latency over 1200 ms since the migration. Webhooks are dropping.",
  "questions": [
    { "type": "predicate", "name": "is_outage",
      "instructions": "Is this a production outage?" },
    { "type": "choice", "name": "team",
      "instructions": "Which team should triage this?",
      "choices": [
        { "value": "database", "description": "Storage, pools, query latency" },
        { "value": "networking", "description": "Ingress, webhooks, TLS" }
      ] }
  ]
}
OpenAI's shape. Field names are from its published schema; the values are mine.

vLLM then adopted it, after a public discussion. RFC #59365 opened on 30 September proposing a first-class /v1/decisions with /v1/systemone as a compatibility layer. It was rewritten on 7 October to stop proposing its own endpoint design and point at OpenAI's format instead. #59299 landed /v1/systemone in the API server on 8 October. #60465 landed the OpenAI wire at /v1/decisions on 13 October. v0.32.0 shipped on 18 October with only the first, and v0.33.0rc3 on 2 November ships both.

vLLM is the only engine here that serves both wires, on two paths. llama.cpp serves the keyed one.

Decisions guide
The Decisions guide, with the request shape, the question kinds and the media it accepts.

Multi-modality

Media support by wire

Counting OpenRouter's models API today, 34 models advertise /api/alpha/decisions, and two more sit only under /api/alpha/extractions.1 Of the 34, 22 accept text and images, 10 accept text only, one adds files, and one, Cloudflare's Clef-Omni, adds audio and video. All 34 list an output price of zero, so the cost is in the input tokens.

OpenAI accepts images as input_image parts, in the input and inside a question's instructions, as a data URL or an HTTPS URL. It takes no audio, no video and no files. vLLM is text only today, with images in open pull request #60745. TypeSafe takes images as assets behind a header it calls the Danger Zone. The vllm-sr runtime takes images and videos in MP4, WebM, QuickTime and Matroska, and will put a box or a track on a video, but it carries no audio. On Workers AI, Clef takes images, and Clef-Omni takes up to four images, four audio clips of 300 seconds and two videos of 60 seconds.

Audio shows up on two surfaces only, OpenRouter's alpha path and Clef-Omni. The two wires with the most backing, OpenAI's and the vllm-sr runtime, both leave it out.

DiagramHow the wires moved, Jev to now
20 Sep27 Sep04 Oct11 Oct18 Oct25 Oct01 NovJev goes live RFC 59365 opens OpenInference decision spans Runtime merged Decisions beta RFC drops its own design System One wire merged Clef-Omni adds audio and video OpenAI wire merged in PR 60465 v0.32.0 ships System One only Contract 3.2.0 Decisions GA v0.33.0rc3 ships both Vela 3.0 d3 sizes on main TypeSafevLLMvllm-srOpenAIOthers
Dated from the launch on 15 September to this week. Media entries are the ones with a public date; several wires gained kinds without one.

The open question

Is there a universal endpoint?

I found no shared specification, working group or cross-vendor compatibility suite. OpenInference's decision spans, last changed on 1 October, list both typesafe and openai as known decision.system values.

OpenRouter, Workers AI, vLLM and llama.cpp take the keyed shape. OpenAI and vLLM's /v1/decisions take the array. Whichever shape most clients already send will probably become the default.

I expect OpenAI's to win. It is generally available with a published schema, decisions.create is in the Python, JavaScript, Go, Java and Ruby SDKs, and vLLM gives it a second implementation you can run on your own hardware. Anyone already using an OpenAI SDK can call it without new code.

OpenRouter pulls the other way. Its /api/alpha/decisions serves the keyed System One shape under a different path name, and 34 decision models answer through it, including OpenAI's own gpt-6-luna-decisions2 and Microsoft's Decision-1, which has no wire of its own. If most decision traffic reaches models through OpenRouter, the keyed shape could become the default anyway.

Two developments would settle it. If OpenRouter moves its decision models off alpha onto a stable endpoint in the keyed shape, that shape gets the larger catalogue behind a stable contract, and I would expect it to win. If the vllm-sr runtime switches its body to OpenAI's shape, the clash on /v1/decisions ends and OpenAI's shape has that path to itself.

Self-hosting

Running decision models yourself

Serve two paths. The keyed path is what engines speak today, and llama.cpp and vLLM both have it. The array path is what OpenAI SDK clients speak. An adapter between them is a small amount of code, and it means you do not have to bet on one.

Pin what you deploy. v0.33.0rc3 is a release candidate, the vllm-sr runtime has no tagged release, and OpenRouter now lists typesafe/jev-1.14 beside jev-1.13 and a jev-latest alias that moves on release. A threshold tuned on one version means nothing on the next until you measure it again.

Size the batch for your media. On llama.cpp, -b and -ub have to hold the whole state plus its media in one pass. A short voice note costs a few hundred tokens and a screen recording a few thousand, so latency and memory follow the media, not the question count. Measure your own clips before you set expectations.

If you proxy these wires, size requests by decoded media tokens. Sizing by the base64 length of the payload overestimates audio by about 100 times, and a gateway that does it rejects audio requests that would have run in a fraction of a second.

Neither wire tells you whether an answer is right. Check calibration on your own data, as the Jev report did.

Sources

What this leans on

  1. TypeSafe AI, Models, API reference and the live OpenAPI document.
  2. OpenAI, Decisions guide, API reference: create decision and the API changelog.
  3. openai/openai-openapi, read 4 November 2026, and openai/openai-python resources/decisions.py.
  4. vLLM: PR #60465, PR #59299, RFC #59365, PR #60745, releases v0.33.0rc3 and v0.32.0.
  5. vllm-sr: runtime openapi.yaml, runtime reference, PR #4481, PR #5275, PR #5704 and releases.
  6. OpenRouter, alpha Decisions API, System One API and the models API.
  7. Cloudflare Workers AI, Clef and Clef-Omni.
  8. OpenInference decision spans, last changed 1 October 2026.
  9. Jev, examined, 19 September 2026.

Disclosure

In case you were wondering

Whether agents drafted this: yes, more than one, and here is what each did. One went through the primary sources listed above and checked every date, version and count against them on 4 November 2026. Another took the research, my scribbles and snippets to write the first draft. A third checked each claim against the sources and cut the ones they did not support. I picked the question and the conclusion, and edited the result.

Footnotes

  1. Counted from OpenRouter's models API on 4 November 2026. The default listing returned 455 models and the fuller one 696. Of those, 34 list /api/alpha/decisions and two more list only /api/alpha/extractions. ↩

  2. This comes from the model listing. I have not sent a request to watch what OpenRouter does to the body between its front door and the provider. ↩