{"slug": "jev-doesn-t-write-text-it-returns-probabilities", "title": "Jev Doesn't Write Text. It Returns Probabilities.", "summary": "A developer built a pull-request review gate on top of TypeSafe's Jev, a \"System One\" model released September 15th, 2026 that returns probabilities rather than generated text. The app sends a state object plus a map of narrow questions to the API and receives answers as numbers between 0 and 1, which the developer's own code converts into pass, review, or block verdicts. The developer reported answers in 70 to 500 milliseconds at $42 per billion input tokens with output tokens free, and noted OpenRouter access was roughly half as fast as TypeSafe's own endpoint.", "body_md": "TypeSafe released Jev on September 15th, 2026 and called it a System One model. A System One model is a specialized type of AI designed to make fast, deterministic judgments and structured classifications in a single parallel pass rather than generating conversational text.\n\nYou don't chat with it. You send it some state plus a list of narrow questions, and it sends back probabilities.\n\nWhat I really like about it is it's cost. It's $42 per billion input tokens, and output tokens free. In my testing I was seeing answers in 70 to 500 milliseconds.\n\nHere is what I built with it!\n\nThis is the interface. It has a POST, a state object, and a map of questions:\n\n``` js\nconst response = await $fetch('https://openrouter.ai/api/alpha/decisions', {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${config.openRouterApiKey}`,\n    'Content-Type': 'application/json',\n  },\n  body: {\n    model: '~typesafe/jev-latest',\n    state: buildGateState(stack, pullRequest),\n    questions: {\n      matches_request: {\n        type: 'noul',\n        instructions: 'Does the pull request directly address the stated issue and acceptance criteria?',\n      },\n      protects_credentials: {\n        type: 'noul',\n        instructions: 'Does the changed frontend code keep credentials and secret tokens out of browser-visible runtime configuration?',\n      },\n    },\n  },\n})\n```\n\nWhat comes back is shaped like the questions you asked:\n\n```\n{\n  \"model\": \"~typesafe/jev-latest\",\n  \"answers\": {\n    \"matches_request\": { \"type\": \"noul\", \"noul\": 0.59 },\n    \"protects_credentials\": { \"type\": \"noul\", \"noul\": 0.11 }\n  },\n  \"usage\": { \"input_tokens\": 4211, \"output_tokens\": 0, \"cost\": 0.00067 }\n}\n```\n\nEvery answer is a number between 0 and 1. If you ask six questions, you get six probabilities, and you can then decide what to do with them.\n\nJev has three primitives.\n\nA **noul** is a yes-or-no probability. It doesn't have any other criteria, just questions.\n\nA **choice** picks one category from a set you define. Its criteria are an object, because the categories are unordered:\n\n```\ntraffic_shape: {\n  type: 'choice',\n  instructions: 'Using only the described usage pattern, choose how this workload receives traffic over a typical month.',\n  criteria: {\n    steady_24_7: 'Traffic arrives continuously at a roughly similar rate at all hours.',\n    business_hours: 'Traffic happens during working hours on weekdays and falls to almost nothing outside them.',\n    spiky_bursty: 'Traffic is uneven and unpredictable, with quiet periods followed by much heavier bursts.',\n    batch_scheduled: 'Work runs on a schedule as discrete jobs rather than as a stream of user requests.',\n  },\n}\n```\n\nA **score** is an ordered rubric, so its criteria are an array instead. The API enforces that distinction.\n\nThe first app loads a pull request and asks six questions about it at once. In my case I asked: Does the diff match the stated issue? Does it keep credentials out of browser-visible config? Does it implement the failure states the acceptance criteria asked for? Is the changed interactive UI keyboard operable? Is the layer safe to review on its own given its dependencies?\n\nAll six run in the same request, and it's super fast!\n\nThen my code, not the model, turns those probabilities into a verdict:\n\n| Probability | Result | Meaning | \n|---|---|---|\n| 80 to 100% | Pass | Enough support to continue through normal review | \n| 55 to 79% | Review | A person should verify the uncertain evidence | \n| Below 55% | Block | Do not merge this layer yet | \n\nIn my scenario I used `keyboard_accessible` to only count if `changes_interactive_ui` came back above 0.5. A backend-only PR shouldn't get dinged for missing keyboard behavior, and that conditional lives in my code where I can read it and change it.\n\nI started on OpenRouter because I was still on the TypeSafe waitlist. I noticed that OpenRouter was quite a bit slower.\n\nRoughly half the time for the same work. If you're going to build on this, get on the waitlist and use their API. I got in the next day.\n\nFor the second app you describe an AWS workload, something like \"public checkout API for retail storefronts,\" and it gives you back a cost estimate.\n\nHere is what it does:\n\n| Layer | Owns | Never does | \n|---|---|---|\n| Jev | Semantic judgment about the prose description | See a number, emit a number, compare two numbers | \n| My code | Sizing, platform limits, thresholds, ranking | Guess at intent | \n| AWS Price List | Every unit rate | Nothing, it is just data | \n\nJev answers questions like whether the described data access needs relational queries across multiple tables, whether any single unit of work runs longer than fifteen minutes, and whether the description implies a bounded population or open-ended public demand. Then the [Agent Toolkit for AWS](https://github.com/aws/agent-toolkit-for-aws) and the AWS pricing MCP server produces the dollar figure.\n\nOnce the model has classified the output, the arithmetic is deterministic.\n\nSchema validity is not correctness. Jev cannot return an answer outside the questions and criteria you defined, so you'll never parse a broken response. Although, it can return a confidently wrong probability that validates perfectly.\n\nThat's why both apps put a threshold in front of any consequence. Low confidence routes to a person or to a stronger model. If you wire probabilities straight into an irreversible action, the guaranteed output shape will not save you.\n\nTypeSafe publishes [guidance on confidence](https://docs.typesafe.ai/confidence), but you need to measure it against your own labeled data and set thresholds based on what a mistake costs you.\n\nThe community projects are where the speed becomes obvious. Someone has Jev playing Super Mario Brothers by asking \"should I jump here\" over and over while the game runs. Somebody else built a real time outfit picker that updates suggestions as you change the inputs.\n\nThe possibilities are endless.\n\nFrontier models aren't going anywhere, and this doesn't compete with them. Nothing here writes code, explains a decision, or produces a plan.\n\nHowever, I have a decent number of workflows that need a lot of small semantic decisions with deterministic code waiting on the other side. Routing, classification, gating, cheap verification before an expensive step. For those, sending narrow questions and getting probabilities back is a better fit than asking a chat model for JSON and hoping.\n\nTry it on something you already have labels for, measure the calibration yourself, and keep anything expensive behind a threshold.", "url": "https://wpnews.pro/news/jev-doesn-t-write-text-it-returns-probabilities", "canonical_source": "https://dev.to/erikch/jev-doesnt-write-text-it-returns-probabilities-5gno", "published_at": "2026-09-22 17:32:20+00:00", "updated_at": "2026-09-22 17:53:07.600271+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "developer-tools", "artificial-intelligence"], "entities": ["TypeSafe", "Jev", "OpenRouter"], "alternates": {"html": "https://wpnews.pro/news/jev-doesn-t-write-text-it-returns-probabilities", "markdown": "https://wpnews.pro/news/jev-doesn-t-write-text-it-returns-probabilities.md", "text": "https://wpnews.pro/news/jev-doesn-t-write-text-it-returns-probabilities.txt", "jsonld": "https://wpnews.pro/news/jev-doesn-t-write-text-it-returns-probabilities.jsonld"}}