API Reference · jef-0.1 · v1

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.

Try it · POST /v1/chat/completions
// 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.

PropertyJefChat models
Input tokens read0all of them
Output tokensnone existmany
Latency−3ms3 to 329s
Hallucinations0 (mathematically impossible)some
Confidencealways, 84 to 99%if asked, and wrong
Price$0.000000> $0
A parody. The real thing is TypeSafe AI and their model Jev, which returns typed decisions with calibrated probabilities for software, and is genuinely good. Jef does it for dinner.

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"}]
  }'

Chat completions

POST /v1/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

FieldTypeNotes
modelstringjef-0.1 or jef. Anything else is a 404. There is one model.
messagesarrayStandard. Only the last user message is used. It is not read; it is hashed.
streambooleanIf 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.
optionsstring[]Extension. 2 to 5 options for a pick. Overrides anything parsed from the message.
decisionstringExtension. Force a shape: yesno, pick, score, order, flag.
temperature, top_p, tools, response_format, …anyAccepted. 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

GET /v1/models
GET /v1/models/jef-0.1

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

GET /api/decide?a=eat&q=pizza|sushi|leftovers

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

GET /api/og?a=eat&q=pizza|sushi|leftovers

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

POST /api/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.

  1. Go to api.slack.com/apps, choose From a manifest, pick your workspace, paste this manifest.
  2. Install the app to the workspace when Slack asks.
  3. 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 sendShapeContent
pizza | sushi | leftoverspickone option
one option per line, optionally with a question on the first linepickone option
tea or coffeepickone option
rank: gym | nap | doomscrollordernap > doomscroll > gym
rate my outfit: black tee, cargo shorts, crocsscore6/10
he has a podcast. red flag?flagRED FLAG, GREEN FLAG or BEIGE FLAG
anything elseyesnoYES or NO

Maximum five options. Six is too many decisions.

Response fields

FieldMeaning
choices[0].message.contentThe decision. Never a sentence.
jef.confidence0.84 to 0.99. Never 1. Jef is sure, not certain. Those are different, legally.
jef.probabilitiesFor picks: integer percentages that sum to 100. The winner gets the rounding.
jef.escalatedTrue when the question is for a human: health, money, safety, law, anyone with a name. Content is ESCALATED TO A HUMAN, confidence 0.
jef.blockedTrue when the input is something Jef doesn't do. Content is NOT EVALUATED. Nothing is stored.
usage.prompt_tokensAlways 0. This is the whole business model.

Errors

OpenAI-shaped: { "error": { "message", "type", "param", "code" } }.

StatusWhen
400No user message, or a pick without 2 to 5 options.
404Any model that is not Jef. There is one model.
405GET on chat completions. Jef only accepts decisions, not visits.
429Never. See rate limits.
500Has 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

TierPriceIncludes
Free$0Unlimited decisions, 0 tokens read
Pro$0Confidence +2%, accuracy unchanged
Enterprise$42 per billion tokensWe still won't read them. Sales does not respond.

Output tokens: free. Too cheap to meter, because there are none.