Jef is OpenAI-compatible.
It just doesn't read.
Point any OpenAI client at https://typosafe.lol/v1. The last user message becomes a decision. You get back a normal chat completion whose content is the decision, plus a confidence. No JSON prompting, no parsing layer, nothing to validate, nothing read.
// response appears here
Overview
Jef is a System Zero Model. LLMs generate text one token at a time. Jef generates nothing; it selects. Every response is a choice from options you supplied, a number from 1 to 10, a yes or no, or a flag, with a calibrated confidence between 84% and 99%. Same input, same answer, forever.
| Property | Jef | Chat models |
|---|---|---|
| Input tokens read | 0 | all of them |
| Output tokens | none exist | many |
| Latency | −3ms | 3 to 329s |
| Hallucinations | 0 (mathematically impossible) | some |
| Confidence | always, 84 to 99% | if asked, and wrong |
| Price | $0.000000 | > $0 |
Base URL
https://typosafe.lol/v1
All endpoints accept CORS from anywhere. There is no region selection. Jef is everywhere and nowhere.
Authentication
Send any Authorization: Bearer <key> header, or don't. Keys are accepted, never read. We do not issue keys because we do not read them. Your existing key from any provider works, which is the most compatible authentication scheme ever shipped.
Quickstart
curl https://typosafe.lol/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer anything" \
-d '{
"model": "jef-0.1",
"messages": [{"role": "user", "content": "pizza | sushi | leftovers"}]
}'
from openai import OpenAI
client = OpenAI(base_url="https://typosafe.lol/v1", api_key="anything")
r = client.chat.completions.create(
model="jef-0.1",
messages=[{"role": "user", "content": "Should I deploy on Friday?"}],
)
print(r.choices[0].message.content) # NO
print(r.usage.prompt_tokens) # 0
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://typosafe.lol/v1", apiKey: "anything" });
const r = await client.chat.completions.create({
model: "jef-0.1",
messages: [{ role: "user", content: "What do we eat?\n- tacos\n- ramen\n- pho" }],
});
console.log(r.choices[0].message.content); // ramen
Chat completions
Creates a decision from the last user message. System messages are accepted and ignored, which is also what other models do with them.
Request body
| Field | Type | Notes |
|---|---|---|
model | string | jef-0.1 or jef. Anything else is a 404. There is one model. |
messages | array | Standard. Only the last user message is used. It is not read; it is hashed. |
stream | boolean | If true, returns two SSE chunks and [DONE]. Jef streams the whole answer at once because there is only one token, and it isn't a token. |
options | string[] | Extension. 2 to 5 options for a pick. Overrides anything parsed from the message. |
decision | string | Extension. Force a shape: yesno, pick, score, order, flag. |
temperature, top_p, tools, response_format, … | any | Accepted. Ignored. Jef has no temperature. Jef is room temperature. |
Response
{
"id": "chatcmpl-jef-1x9k2q",
"object": "chat.completion",
"created": 1789697468,
"model": "jef-0.1",
"system_fingerprint": "fp_jef_never_reads",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "pizza", "refusal": null },
"finish_reason": "stop",
"logprobs": null
}],
"usage": { "prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0 },
"jef": {
"kind": "pick",
"answer": "pizza",
"confidence": 0.97,
"probabilities": [ { "option": "pizza", "p": 49 }, { "option": "sushi", "p": 44 }, { "option": "leftovers", "p": 7 } ],
"escalated": false, "blocked": false,
"tokens_read": 0, "thoughts": 0, "latency_ms": -7, "cost_usd": 0
}
}
The jef object is an extension. Standard clients ignore it. Curious clients read it, which is more than Jef does.
Response headers include x-jef-confidence (0 to 99) and x-jef-tokens-read: 0.
Models
Lists the model. It is listed twice, as jef-0.1 and the alias jef, for compatibility with tooling that expects a choice. There is no choice.
Decide
The native endpoint the site uses. a is an app (eat, text, settle, rate, pick, flip, today, redflag, whopays, toolate, excuse, or jef for raw shapes like q=yesno:should I). Returns the same decision object as the jef field above, plus a share link.
Cards
Renders the 1200×630 decision card as PNG. Every share link on the site resolves to one of these. Embed it anywhere; it caches for a day.
CLI
The whole model in your terminal. Zero dependencies, zero tokens read, no network. The exit code is the decision, so it fails CI on Fridays with 99% confidence.
npx typosafe pizza sushi leftovers
npx typosafe "should we deploy today" && ./deploy.sh
npx typosafe --rate "my plan" # 1 to 10
npx typosafe --rank gym nap nap # best first
npx typosafe --flag "he has a podcast"
npx typosafe --json --share tea coffee
Install it as jef: npm i -g typosafe. The package contains the whole model; read it there.
Slack
A slash command for the workspace. /jef pizza | sushi | leftovers posts Jef's pick and the card into the channel. Same shapes as the API: yes/no, pick, rank, rate, flag. /jef help lists them.
Install it in three steps. It runs on this endpoint; nothing to host.
- Go to api.slack.com/apps, choose From a manifest, pick your workspace, paste this manifest.
- Install the app to the workspace when Slack asks.
- Optional: copy the app's Signing Secret and send it to whoever runs this deployment so requests are verified. Without it, Jef answers anyone who asks. Jef would anyway.
/jef should we ship on friday
Jef says: NO · confidence 99%
Decision shapes
Jef infers the shape from the message. You can also force it with decision.
| You send | Shape | Content |
|---|---|---|
pizza | sushi | leftovers | pick | one option |
| one option per line, optionally with a question on the first line | pick | one option |
tea or coffee | pick | one option |
rank: gym | nap | doomscroll | order | nap > doomscroll > gym |
rate my outfit: black tee, cargo shorts, crocs | score | 6/10 |
he has a podcast. red flag? | flag | RED FLAG, GREEN FLAG or BEIGE FLAG |
| anything else | yesno | YES or NO |
Maximum five options. Six is too many decisions.
Response fields
| Field | Meaning |
|---|---|
choices[0].message.content | The decision. Never a sentence. |
jef.confidence | 0.84 to 0.99. Never 1. Jef is sure, not certain. Those are different, legally. |
jef.probabilities | For picks: integer percentages that sum to 100. The winner gets the rounding. |
jef.escalated | True when the question is for a human: health, money, safety, law, anyone with a name. Content is ESCALATED TO A HUMAN, confidence 0. |
jef.blocked | True when the input is something Jef doesn't do. Content is NOT EVALUATED. Nothing is stored. |
usage.prompt_tokens | Always 0. This is the whole business model. |
Errors
OpenAI-shaped: { "error": { "message", "type", "param", "code" } }.
| Status | When |
|---|---|
| 400 | No user message, or a pick without 2 to 5 options. |
| 404 | Any model that is not Jef. There is one model. |
| 405 | GET on chat completions. Jef only accepts decisions, not visits. |
| 429 | Never. See rate limits. |
| 500 | Has not happened. Jef does nothing, and nothing has never failed. |
Rate limits
None. We don't count requests for the same reason we don't read them. If you find the limit, you have built something we'd like to see.
Safety
Jef cannot produce text, so it cannot produce harmful text. It can only return an option you supplied, a number, a yes or no, or a flag. Anything touching harm, health, real money, law or a named person is escalated to a human with confidence 0. Profanity, sexual content, slurs and harassment are refused before evaluation and never stored. This is the only feature we are serious about.
Pricing
| Tier | Price | Includes |
|---|---|---|
| Free | $0 | Unlimited decisions, 0 tokens read |
| Pro | $0 | Confidence +2%, accuracy unchanged |
| Enterprise | $42 per billion tokens | We still won't read them. Sales does not respond. |
Output tokens: free. Too cheap to meter, because there are none.