Skip to content
MrJev

jevchat

Turns a decision model into a chat model by asking which symbol comes next, then sampling from the returned distribution.

View on GitHub →

Hands-on review

Asks which symbol comes next and samples from the answer, turning a decision model into a text generator. It works, and it is one request per symbol.

Good for

  • Understanding what a Choice question can and cannot do, by pushing it too far
  • Six sampling strategies you can compare on one question
  • A small, readable codebase with 158 tests and no network in any of them

Watch out for

  • One API request per symbol, and the whole conversation goes out each time
  • No licence file, so nobody may reuse it
  • A toy by design: the README says so, and so do we

Tested Sep 21, 2026 at d58abd51aef6 · Python 3.12 in Docker; its 158 tests, a live reply against the real API, and a stand-in to read every request

How we reviewed this: we installed it in Docker on Python 3.12, ran its tests, asked it a question against the real API, then pointed it at a stand-in that logged every request so we could read what a reply is made of.

The idea

Jev never writes text. jevchat makes it write text anyway, by asking a different question:

Given the user’s question and the reply written so far, which symbol comes next?

The options are an alphabet plus a stop symbol; the answer’s probabilities become a distribution; the sampler draws from it, appends, and asks again. Ask it something and a sentence appears one piece at a time:

$ jevchat ask "do people need water?"
 indeed.

That is the whole trick, and it is a good demonstration of something worth internalising: a Choice question over 89 printable characters is a general text generator, if you are willing to pay for one request per character.

What a reply is made of

We pointed it at a stand-in and read the traffic. Each step sends two questions — a noul, “Is the reply already finished?”, and a choice over the alphabet — with a state that carries the task description, the question, the answer so far, and the earlier conversation:

{"task": "A correct English answer to `question` is being written out left to right.
          `answer_so_far` is exactly the text written so far, character for character;
          `conversation` is what was said earlier in the chat …"}

So the cost is one request per symbol, and the input grows as the reply does. A short answer is a handful of requests; a paragraph is hundreds. The alphabets make that trade explicit — ascii spells anything at one call per character, bigrams has 7,570 options and halves the steps, and the word lists trade spelling for vocabulary.

Six strategies sit on top: plain choice, bisect (binary search over the alphabet), buckets (for alphabets past the 255-option limit), beam, refine and an ensemble mode that averages repeated draws. --no-shuffle-criteria exists so you can see how much option order matters, which is a thoughtful thing to expose.

Engineering

158 tests, all passing, none of them touching the network — the README says only jevchat bench hits the API, and that holds. The client is a single file, the alphabets are data, the config layers defaults, a TOML file, the environment and CLI flags in that order, and api_base is configurable, which is how we captured the traffic above.

For a project created on 20 September with nine commits, the test discipline is unusual. What it does not have is a licence file: nine commits, a public repository, and no terms, which means nobody may reuse any of it. That is the one thing to fix.

Verdict

Keep it as an experiment and it is a good one. It makes the shape of the model concrete — ask a closed question, get a calibrated distribution, do something with the distribution — and it is a fun way to feel the difference between a model that picks and a model that writes.

Do not put it near a product. One request per symbol is not a pricing quirk, it is the design, and text generation is the job the other kind of model already does well. The README agrees; we are only saying it twice because the demo is charming enough to be misread.

For the real use of a Choice question, see the roundup; for the opposite experiment — a general model made to answer like this one — see OpenJev and LLM2Jev.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 21, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Games & Real-Time Demos

TypeSafe Mario

★ 458▲ 3

fhshaik/typesafe-mario

Jev picks NES controller inputs for Super Mario Bros. from emulator state, with no screenshots.

PythonReviewed

Jev experiments

★ 412▲ 3

dabit3/jev-experiments

Latency-focused demos from Nader Dabit, each app in its own directory with its own README. No licence file at the time of writing.

TypeScriptReviewed

jev-drone

★ 298▲ 9

RomanSlack/jev-drone

Camera-only quadrotor in MuJoCo with Jev making judgment calls at about 2.5 Hz.

PythonReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.