██╗ ██╗
██║ ██║
██║██╗ ██╗██║
██ ██║██║ ██║██║
╚█████╔╝╚██████╔╝███████╗
╚════╝ ╚═════╝ ╚══════╝
JUSTE UN LLM · v0.1 · APACHE-2.0
Decisions, not chat.
On your machine.
Ask a typed question, get a calibrated probability per option. A 4B model read once, stopped one step before its first word: no API, no tokens generated, no data leaving the box. Same calls as Jev's SDK: change one import.
It has nothing to say, and it says it in 55 milliseconds._
YOUR MACHINE VS JEV'S API · JEV'S OWN BENCHMARK
ACCURACY · ZERO-SHOT
85.7%
LATENCY · P50
55ms
MEMORY · 4-BIT
2.6GB
0 tokens generated · 0 bytes sent · no key · $0 per call. Jev: every text goes to an API.
JEV BENCH · 300 EXAMPLES
Ahead of Jev.
HOW IT ANSWERS
Read the mind, skip the mouth.
STATE "I was charged twice"
│
┌──────────────┴──────────────┐
│ WeMM-4B 4-bit (your laptop) │
│ layers 1 → 31, then stop. │
└──────────────┬──────────────┘
│ hidden state
▼
cosine(state, option) ◄── options
│ (encoded once,
▼ cached)
softmax(cos / τ)
│
▼
billing ████████████████ 0.88
technical ██ 0.11
sales ▏ 0.01
- The state and each option pass through the same prompt. The answer is the option whose hidden vector sits closest.
- Everything that does not depend on the state (prompt prefix, option vectors, center) is computed once. A call only pays for its own tokens.
- The forward pass stops at the last layer it reads. No decoding loop, no sampling, no JSON to repair.
- A temperature fitted on dev sets turns cosines into probabilities you can threshold on.
WHY LOCAL
Small model. Short answer. Your box.
- Private by construction. Tickets, emails, medical notes: the text never leaves the process.
- Latency you can loop over. 55 ms is cheap enough for every row, every request, every keystroke.
- No meter running. No API key, no rate limit, no invoice. Ten thousand calls cost electricity.
- Runs anywhere. MLX on Apple Silicon, PyTorch on CUDA, CPU or MPS.
- Your model. Swap the backbone, register your own with one command, fine-tune the head on your data.
ALREADY ON JEV?
Change one import.
- from typesafe_sdk import TypeSafeClient, Choice, Noul, Score + from jul import TypeSafeClient, Choice, Noul, Score client = TypeSafeClient(model="wemm-4b-4bit") r = client.system_one( state={"ticket": "I was charged twice this month."}, questions={ "team": Choice( instructions="Which team should handle this?", criteria={"billing": "payments, refunds", "technical": "bugs, errors", "sales": "pricing, plans"}), "is_bug": Noul(instructions="Is it a bug report?"), }, ) r.choices["team"].choice # "billing" r.choices["team"].probabilities # {"billing": 0.88, ...}
Same imports, same calls, same response shapes. Arguments that only mean something remotely are accepted and ignored.
ZERO-SHOT · JEV'S PUBLISHED BENCHMARK · 300 EXAMPLES
Jev's own benchmark, beaten by 12 points.
| jul wemm-4b ² | 0.95 | 0.88 | 0.80 | 0.877 | 0.112 | 78 ms | 4.5 GB |
|---|---|---|---|---|---|---|---|
| jul wemm-9b ² | 0.97 | 0.84 | 0.78 | 0.863 | 0.114 | 138 ms | 9.0 GB |
| jul wemm-4b-4bit ² | 0.90 | 0.87 | 0.80 | 0.857 | 0.084 | 55 ms | 2.6 GB |
| jul f2llm-4b ² | 0.89 | 0.82 | 0.81 | 0.840 | 0.090 | 46 ms | 3.0 GB |
| jul f2llm-1.7b ² | 0.91 | 0.67 | 0.87 | 0.817 | 0.082 | 24 ms | 1.0 GB |
| jul minicpm5-2b-decision ¹ | 0.91 | 0.79 | 0.69 | 0.796 | 0.133 | 217 ms | 1.3 GB |
| Jev (published) | 0.91 | 0.87 | 0.48 | 0.753 | 0.156 | 246 ms | hosted |
| jul harrier-0.6b ² | 0.72 | 0.52 | 0.76 | 0.667 | 0.144 | 13 ms | 0.31 GB |
| jul minicpm5-2b | 0.80 | 0.59 | 0.46 | 0.617 | 0.113 | 64 ms | 2.7 GB |
| GLiNER2.5 (published) | 0.70 | 0.61 | 0.44 | 0.583 | 0.101 | 128 ms | — |
Click a column to sort. Highlighted: the best value in each column.
- ² Embedding LLMs (Tencent, CodeFuse-AI, Microsoft), read by jul like any other model:
jul models add. Better calibrated than Jev, all six. - Banking77 and Emotion are in MTEB, which embedding models train on. AG News is not: there, wemm-9b scores 0.97 against 0.91.
- ¹ Trained on these three tasks' training splits. On six sources neither model trained on, Jev leads: 0.857 against 0.721.
- With 1,000 labeled examples, wemm-4b-4bit reaches 0.897 and 0.94 on Banking77. Harrier-0.6B passes Jev in 0.31 GB at 13 ms.
- 100 rows per dataset: ±5 points per cell, ±3 on the mean. If a bag of words solves your task, use it: we measured that too.
TWO LINES · ON PYPI
Up in one coffee.
C:\> pip install jul
C:\> jul setup
backend ....... mlx (Apple Silicon)
model ......... wemm-4b-4bit, 2.6 GB, downloaded once
check ......... 1 decision OK
jul setup picks the backend (MLX on Apple Silicon, PyTorch elsewhere), installs it if missing, downloads the model once and runs one real decision.
No terminal handy? Let an agent do it →
OR FROM A PROMPT
Let a big LLM install the small one.
Paste this into Claude Code, Codex, or any agent that has a shell.
Install jul (https://pypi.org/project/jul/), a local library that answers typed questions with a 4B 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 WeMM-Embedding-4B (2.6 GB, 4-bit) 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. JuL picks the next question from the answers so far. No
if/then. - Re-rank by intent. One
Scoreper item: deep engineering up, clickbait down. - Mute the noise. One
Noulper notification: the OTP stays, the flash sale goes. - Fast mode or full model? A prompt's difficulty, decided before it is sent.
- Millions of tickets. 50,000 real support tickets in 668 s on a Mac, 82.9% accuracy, $0.
- Autotune, measured. 82.0% → 96.5% after a 6-second head, throughput unchanged.
- An on-device browser agent. JuL picks each action, the Apple Foundation Model types, and it books a train on SNCF Connect.
Seven small demos, each one an idea from jevable.com, run locally through from jul import TypeSafeClient.
JuL, Juste un LLM. A headless decision runtime for local models. 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.
C:\JUL> exit_
Game of Life. Also runs locally.