Just use Less · v0.5 · Apache-2.0

One JuL to
rule them all.

Typed decisions from any model. Good out of the box. Autotuned on your labels when you want more.

Local by default: 0 tokens generated · 0 bytes sent · no key.

JuL

1

Plug in anything.

Run a model, or route to a server. Same Choice / Noul / Score calls, same response, whatever answers.

Hugging FaceKev modelsStrands DeciderJevK5 · Quyet · spark-s1Decision 3.0LayaEncoders · ONNX OllamaOpenAIMistralJevClefyour fine-tune

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

Pipeline

From a text to a decision · pick one option per step, or keep the default

Your model, your hardware, your way out.

Runs on what?
Model familyexamplesMLXApple SiliconPyTorchNVIDIA GPU · CPUONNXCPU · LambdaAPIno weightsautotunejul 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 a model

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.

Terminal

Illustrative output.

dropin.py

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 →

Latest

Since 0.5

Lately.

  • Autotune on decision models. fast and accurate learn your task too.
  • Bench against the cloud. jul bench puts 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=1 sends metrics and events to your OpenTelemetry collector, local and remote deciders alike. Off by default. How →

Full changelog →

Install

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.

No terminal handy? Let an agent do it.

Showcases

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.