1
Plug in anything.
Run a model, or route to a server. Same Choice / Noul / Score
calls, same response, whatever answers.
2
Great by default.
No model to pick, no prompt to write, no layer to choose. jul setup downloads a model
picked and calibrated for typed questions: probabilities you can threshold on.
model="accurate" # default · 4B · 2.6 GB model="fast" # 2B · 1.4 GB
3
Autotune the rest.
Give it labeled examples: a small head is trained in seconds, kept only if it beats the default on examples it never saw. The model is untouched, calls stay as fast.
jul autotune tickets \ --questions questions.yaml \ --labeled labeled.jsonl
From a text to a decision · pick one option per step, or keep the default
Your model, your hardware, your way out.
| Model familyexamples | MLXApple Silicon | PyTorchNVIDIA GPU · CPU | ONNXCPU · Lambda | APIno weights | autotune | jul pack |
|---|---|---|---|---|---|---|
| Built-inaccurate (4B), fast (2B) | ||||||
| Embedding LLMsWeMM, F2LLM, Qwen3-Embedding, Harrier | ||||||
| Any decoderMiniCPM, any instruct model | ||||||
| Encoderse5, BERT, XLM-R, jul-decision-e5-small | ||||||
| Decision modelsKev format, jul-decision-minicpm5-2b | ||||||
| Strands Deciderconverted once, then a decision model | ||||||
| Letter-readout modelsJevK5, plumb-4b, Quyet, spark-s1, Decision 3.0 (d3-edge, d3-lite) | ||||||
| Contrastive headsCLM-8B | ||||||
| Embeddings APIsOllama, OpenAI, Mistral, Voyage | ||||||
| Layaits own runtime |
■ yes · □ partly (built-in: accurate packs, fast does not; ONNX: decoders the exporter supports) · ? not measured yet · — no. ONNX runs a model exported by jul.backends.onnx_export.
amber = what you get without choosing anything. Every model, backend and provider →
Choose your model · AG News, Banking77, Emotion · 300 examples
Accuracy · ZERO-SHOT
85.7%
Latency · P50
55ms
Memory · 4-bit
2.6GB
0 tokens generated · 0 bytes sent · no key · $0 per call.
Already on Jev? Change one import.
- from typesafe_sdk import TypeSafeClient, Choice + from jul import TypeSafeClient, Choice client = TypeSafeClient() # the default model, local team = Choice(instructions="Which team should handle this?", criteria={"billing": "payments, refunds", "technical": "bugs, errors"}) r = client.system_one(state={"ticket": "I was charged twice"}, questions={"team": team}) r.choices["team"].probabilities # {"billing": 0.88, ...} # labels? one call, the next ones use the head client.autotune("tickets", {"team": team}, labeled)
Measure
Pit models against each other on your own rows: local ones, Jev, Ollama, a Kev server. One verdict: the fastest that is as good as the best.
jul bench test.jsonl --models fast,accurate,typesafe
Escalate
Answer locally, send only the unsure questions to a bigger decider. Each answer says which tier gave it.
jul serve --escalate-to typesafe
how →
Ship
An HTTP server that speaks the Jev protocol, or a bundle of your questions and their models for a Lambda.
jul serve · jul pack · deploy →
Since 0.5
Lately.
- Autotune on decision models.
fastandaccuratelearn your task too. - Bench against the cloud.
jul benchputs Jev, Ollama, Clef or any System One URL next to your local models. - Cascades, measured.
--escalate-to: accuracy of the pair and share of questions sent out. - A new
fast. A decision model trained on human-written decisions. - Other open decision models. Strands Decider checkpoints, and JevK5, plumb-4b, Quyet, spark-s1 and Decision 3.0 read at their option letters, as their own runtimes read them. How →
- No silent cut. A text longer than the model reads is logged and counted in
usage.truncated_tokens;on_long="error"refuses it. Limits → - Telemetry, opt-in.
JUL_ENABLE_TELEMETRY=1sends metrics and events to your OpenTelemetry collector, local and remote deciders alike. Off by default. How →
Two lines · on PyPI
Up in one coffee.
$ pip install jul $ jul setup
Picks the backend (MLX on Apple Silicon, PyTorch elsewhere), downloads the model once, runs one real decision.
Install jul (https://pypi.org/project/jul/), a local library that answers typed questions with a small local model, and check that it works on this machine. 1. Create a virtualenv with Python >= 3.10. 2. In that venv: pip install jul then jul setup jul setup picks the backend (MLX on Apple Silicon, else PyTorch), installs it, downloads the default model once and runs one test decision. 3. Then run: jul ask choice "Which team should handle this ticket?" -o billing:"payments, invoices" -o technical:"bugs, errors" --state "I was charged twice" and show me the JSON. Do not use sudo and do not install anything outside the venv. If a step fails, show me the error and what you suggest before trying something else. At the end, tell me in two lines: the backend, the latency per decision, and the answer to the ticket.
By Jérôme Guyon · jul-showcases
Seen in the wild.
- A form that branches itself. No
if/then. - Mute the noise. The OTP stays, the flash sale goes.
- Fast mode or full model? Decided before the prompt is sent.
- 50,000 support tickets on a Mac, $0.
- An on-device browser agent that books a train.
- Re-rank by intent. Deep engineering up, clickbait down.
JuL, Just use Less. A headless decision runtime. Apache-2.0.
Credits bdauzats ........ author jlestel ......... contributor JeromeGuyon ..... contributor
github.com/usejul/jul · pip install jul · weights on Hugging Face · Not affiliated with TypeSafe AI or Jev.