curl -fsSL https://ollaya.dev/install.sh | sh
ollaya run winnow:e4b --preset triage "Third time this year you've double-charged me. Refund it today or I'm cancelling and moving to a competitor."
intent refund ███████████████░ 0.91
is_urgent yes ███████████████░ 0.92
frustration 2.89 / 3 very angry or using stron… ██████████████░░ 0.86
refund_requested yes ████████████████ 0.99
churn_risk yes ████████████████ 0.99
Or ask your own questions: ollaya run kev --ask "Is a refund requested?" --ask "Which team?" --choice billing --choice sales < ticket.txt.
winnow:e4b is the recommended model: 0.724 accuracy on typed decisions (TypeSafe reports 0.738 for its Jev) and 113 ms for five questions on an RTX 5090. It is a 4B-class language model, so without an NVIDIA GPU start with laya: laya:multilingual answers five questions in 516 ms on a CPU. All models and their numbers: ollaya.dev/search.
A self-hosted, Jev-compatible API
What is a Jev-compatible API? An HTTP API that takes the same requests as TypeSafe's hosted
Jev (a state plus typed questions at POST /v1/systemone) and returns the same answers, so
TypeSafe's SDK and any client written for Jev work against it unchanged. Ollaya's /v1/systemone,
/v1/decisions and /v1/models are wire-identical to TypeSafe's (as typesafe-sdk 0.7.1 defines
them), served from your own machine with open models.
Migrating from Jev. Point the SDK at Ollaya and pick an open model:
export TYPESAFE_BASE_URL=http://localhost:11435
export TYPESAFE_API_KEY=local # any non-empty value
export TYPESAFE_DEFAULT_MODEL=winnow:e4b # instead of "jev-latest"
Details, including proxies and warm-up: TypeSafe compatibility.
The FAQ compares Ollaya and Ollama in more detail, measured on the same GPU.
Features
- One binary.
ollaya serveruns the daemon;ollaya run,pull,list,ps,show,rm,cp,stopandcreatework the way they do in Ollama. If the daemon isn't running, the CLI starts it. - TypeSafe-compatible.
POST /v1/systemone,/v1/decisionsandGET /v1/modelsare wire-identical to TypeSafe. The official SDK works unchanged when you setTYPESAFE_BASE_URL=http://localhost:11435. - Native API.
/api/decideadds routing information and timings./api/pullstreams NDJSON progress, and there are/api/tags,/api/show,/api/psand more. See docs/api.md. - Weights come from their authors. Ollaya publishes only small ONNX graphs, about 3 MB each.
These graphs read the original weight files (usually
model.safetensors) from the author's Hugging Face repository, pinned to a commit and verified by sha256. Models whose authors publish GGUF files (winnow,jevk5,jeb) run that file itself on llama.cpp. Ollaya never re-hosts weights. - For agents.
ollaya mcpserves the models to Claude Code, Claude Desktop, Cursor and other MCP clients (claude mcp add ollaya -- ollaya mcp, or one click in Cursor), and theollaya-decisionsskill teaches agents when and how to use them (npx skills add ollaya-dev/ollaya --skill ollaya-decisions). - Routers.
layadetects the script and language of each request, then answers withlaya:enorlaya:multilingual. - Modelfiles. You can bake a question set into your own model:
Then runFROM laya QUESTIONS ./triage.json PARAMETER precision fp32ollaya create triage -f Modelfileandollaya run triage "…". - Fast and exact.
- Hardware: ONNX Runtime on CPU, and CUDA on NVIDIA GPUs. GGUF models run on llama.cpp: CPU, ROCm/HIP on AMD GPUs, Vulkan on Windows (any vendor's GPU; an integrated one when you name it), CUDA on NVIDIA GPUs, and Metal on Apple silicon.
- Precision: ONNX uses fp16 on GPU and fp32 on CPU when available; GGUF keeps its model quantization on either device.
- Accuracy: fp32 exports give the same decision as the PyTorch reference on 100% of 2,383 questions per checkpoint.
Models
Browse them at ollaya.dev/search; every tag's accuracy, speed and memory is on
Ollaya Bench. Decoder tags ending in -fp16 (kev:4b-fp16) compute in fp16 on NVIDIA
GPUs: faster, with at least 99.5 % of their decisions the same as the base tag's. Laya's -fp32 and -fp16 tags
pin the precision. The derived files of every model are also published at
huggingface.co/ollaya-dev.
Ollama 0.40 also serves decision models, nine of them, through the same TypeSafe wire format (measured side by side). The FAQ compares the two projects.
Results
Every model in the library is measured on our own machines and published, with the raw data, on Ollaya Bench: one released runtime, each author's own weights, the same 5,880 questions for every model (Bespoke Labs' 13 public subsets and typed-decisions), and speed and memory on a GPU and a CPU.
Edition 2026.10 ran Ollaya 0.13.0 on an RTX 5090 desktop, and 0.14.0, 0.15.0, 0.17.0, 0.18.0 and 0.19.0 added what they changed:
- Score. Chance-corrected accuracy over 14 tasks, with 95 % intervals:
pplx-decider:flash73.7,jeb:27b69.1 (scored without the 5 tasks it was trained on),d3:mini68.0,d3:flash67.8 andjeb:9b66.0 (scored without the 5 tasks it was trained on). The fastest of these,jeb:9b, answers five questions in 111 ms on the RTX 5090. - Calibration. The lowest calibration errors on the public benchmark are 0.016 (
pplx-decider:flash), 0.018 (jeeves:9b) and 0.020 (jeb:9b). - Speed and memory. Five-question requests through the HTTP API take 14 ms to 1.0 s on the RTX 5090 and 314 ms to 62.0 s on its Threadripper 3960X. Every model's VRAM and RAM are on its page.
- Parity. Before a model ships, its runtime is checked question by question against the authors' code (or llama.cpp's own server, for GGUF models) on each device it runs on.
Earlier runs, the comparison with Ollama on the same GPU (on the same Nimble weights the calibration error is 0.022 on Ollaya and 0.115 on Ollama) and the Windows, CUDA and Vulkan measurements are at ollaya.dev/results.
Install
- Linux (x86_64 or arm64, glibc ≥ 2.38, e.g. Ubuntu 24.04+):
curl -fsSL https://ollaya.dev/install.sh | sh. When an NVIDIA GPU is present (driver R525+), the installer adds the CUDA runtime: CUDA 13 for R580+, CUDA 12 for older drivers. - macOS (Apple silicon): the same command.
- Windows (x64):
irm https://ollaya.dev/install.ps1 | iexin PowerShell. When an NVIDIA GPU is present (driver R527+), the installer adds the CUDA runtime, as on Linux. - Desktop app for macOS, Windows and Linux: start and stop the server, download models and run them in one window. On macOS it lives in the menu bar. Get it from ollaya.dev/download.
- Docker:
docker run -d --gpus=all -p 11435:11435 ghcr.io/ollaya-dev/ollaya:cuda(:cuda12for host drivers older than R580), orghcr.io/ollaya-dev/ollayafor CPU only.
Configuration is through environment variables: OLLAYA_HOST, OLLAYA_MODELS,
OLLAYA_KEEP_ALIVE, OLLAYA_DEVICE, OLLAYA_API_KEY and others, listed in
docs/api.md §15.
Repository
Development
cargo test --workspace
cargo build --release -p ollaya --features cuda # CUDA build (x86-64 Linux and Windows)
Tests come in three tiers, all with the same parity tolerances:
- K1, every change: the tests, and smoke parity for the families the change touches. A parity
example run with
--smokechecks only the cases listed incrates/ollaya-runner/examples/smoke/cases.txt, about 40 questions per family: every question type, refused requests, a long state and many options.cargo run --release -p ollaya-runner --example parity -- <model-dir> <goldens.jsonl> cpu --smoke - K2, every release: the full goldens on every GPU device a release ships, and on the CPU the full
set for models of 4B and under and
--smokefor larger ones. CPU goldens count only on the machine and build that made them. - K3, major releases, a llama.cpp or ONNX Runtime update, a new device or a new model: full CPU parity of the large models and the quality benchmarks. The site, this README and the reports are updated from those results.
convert/ rebuilds models. It exports them, checks parity against the PyTorch reference,
generates golden fixtures, and packages the result into registry/. See the module docstrings.
cd convert && uv sync installs it: with CUDA 13 torch on Linux and Windows, and with the CPU and
MPS build from PyPI on Apple silicon Macs, where exports and parity run on the CPU.
License
Apache-2.0. Each model keeps its own license: laya (Convai Innovations), decider (Mapika),
kev (Jared Palmer, on Qwen3.5 by the Qwen team), decision (the vLLM Semantic Router
contributors, on Qwen3.5), qwen3guard (Qwen team), gliclass (Knowledgator), von (Victor Hugo
Panisa), winnow (EldanRing, on Gemma 4 by Google DeepMind), jevk5 (alibiserikbay, on Qwen3.5), nimble
(Bespoke Labs, on Qwen3.5), pplx-decider (Perplexity, on Qwen3.5), strands-decider (Strands Agents, on Qwen3.5 and Gemma 4), jeeves (PostHog, on Qwen3.5), clef (Cloudflare, on Qwen3.5), jeb (Jason Brashear, on Qwen3.5 and Qwen3.8), cygnet (Gemma 4 by Google
DeepMind; the Cygnet recipe is MIT), snap (logitlab, on MiniCPM5 by OpenBMB; snap's prompt is MIT), decima (A. M. Madani, on mmBERT-base by JHU CLSP and multilingual-e5-small by intfloat, both MIT), largha (Phocinae, on mmBERT-small by JHU CLSP, MIT) and nli:modernbert-large are Apache-2.0, and nli:deberta-v3-large (Moritz Laurer) is MIT. arbiter's LoRA adapter and head (Codekins Pvt Ltd, Zyot Lab) are Apache-2.0; its base model, Gemma 3 4B IT by Google DeepMind, is under the Gemma Terms of Use. nimble:9b-v3's adapter (Bespoke Labs) is CC BY-NC 4.0, which does not allow commercial use; its base, Qwen3.5-9B, is Apache-2.0. d1 (Liquid AI) is under the LFM Open License v1.0: commercial use by an organization with US$10 million or more in annual revenue is not covered by it. llama.cpp, which Ollaya ships for
GGUF models, is MIT.
Ollaya is an independent project. It is not affiliated with or endorsed by Ollama or TypeSafe.