vibecli-mistralrs runs models inside the VibeCLI daemon via mistral.rs — no Ollama, no sidecar, no second process. It appears in VibeCoder’s toolbar dropdown as Core. It is the other local option alongside Ollama: Ollama is a separate server you install and manage, this one is the daemon you are already running.
Weights are pulled from Hugging Face on first use and cached; inference is in-process.
Availability
The backend is compiled in, not installed at runtime, so whether it exists depends on how your vibecli was built:
| Build | In-process mistral.rs |
|---|---|
| macOS (any official build) | On — Metal acceleration is the expected configuration |
| Linux / Windows official builds | On — CPU, --features vibe-mistralrs at build time (release.yml) |
| Built from source | cargo build --release -p vibecli --features vibe-mistralrs |
No bundled chat model — downloaded at daemon startup instead
As of 2026-09-18, no desktop installer (macOS, Windows, Linux) ships a chat model inside the package. scripts/fetch-model-assets.{ps1,sh} still stages the embedding model used for semantic index (sentence-transformers/all-MiniLM-L6-v2) into each shell’s tauri.*.conf.json resources, but the chat model was dropped to keep the .pkg/.dmg/.msi size down.
Instead, the daemon calls Backend::warm_default_model() (vibecli-cli/src/inference/backend.rs, implemented in mistralrs.rs) once at startup (serve.rs), which downloads recommended_default_model() via the ordinary hf-hub path in the background — the same download get_or_load would otherwise trigger lazily on the first chat request. Net effect: a blank machine with no Ollama and no API keys still needs one network connection the first time the app runs, but pays that latency during startup rather than on the user’s first message, and every later launch finds the model already cached.
Cargo features cannot be conditioned on target OS, so vibecli/vibecli-cli/build.rs computes the union and emits a single cfg(mistralrs_enabled). Accelerator variants (mistralrs-cuda, mistralrs-metal, mistralrs-flash-attn) are selected in vibe-infer.
Check what your binary has:
curl -s localhost:7878/health | jq '.mistralrs_recommended_default'
A value means the backend is present. No daemon, no answer — see Daemon startup.
Configure VibeCody
There is no API key. Authentication is the daemon’s own bearer token, read from ~/.vibecli/daemon.token on every request — so a daemon restart, which rotates that token, needs no reconfiguration.
vibecli --provider vibecli-mistralrs
In VibeCoder it appears in the toolbar model dropdown with no key configured. Both vibecli-mistralrs and vibecli_mistralrs are accepted as the provider id.
Config file (~/.vibecli/config.toml) — only needed to point at a non-default daemon:
[vibecli_mistralrs]
enabled = true
model = "Qwen/Qwen2.5-Coder-1.5B-Instruct"
api_url = "http://localhost:7878" # optional, default shown
The provider speaks the Ollama HTTP wire format against the daemon but pins the backend by sending X-VibeCLI-Backend: mistralrs, which outranks the daemon default and any per-model pin. Backend selection precedence is header → body field → per-model pin → daemon default.
Gated weights and HF_TOKEN
The Llama models are gated on Hugging Face — loading one without an accepted licence returns 401. VibeCody handles this rather than letting you discover it at first token:
/healthreportsmistralrs_recommended_default, which ismeta-llama/Llama-3.1-8B-InstructwhenHF_TOKENis set andQwen/Qwen2.5-Coder-1.5B-Instruct(Apache-2.0, ungated) when it is not.- VibeCoder reads that field on launch and swaps its picker default in place, so it never pre-selects a model that would 401.
Set the token the encrypted way — it is a credential, so it does not belong in config.toml:
vibecli set-key huggingface "hf_..."
The daemon hydrates HF_TOKEN from the ProfileStore at startup, so downstream libraries see it without a shell export.
Model Selection
Sub-1.5B models (SmolLM2-360M, Llama-3.2-1B, the Qwen2.5 0.5B pair) were dropped from the picker 2026-09-18: hallucination rate on open-ended questions is too high below ~1.5B params.
General-purpose entries refreshed 2026-09-23 from Qwen2.5 to Qwen3 — each id was checked against the Hugging Face API (exists, ungated) and against the loader registry of the pinned mistral.rs revision, which supports Qwen3ForCausalLM. Coder slots stay on Qwen2.5-Coder: Qwen3-Coder ships MoE-only (30B-A3B and up), too large for a zero-config local pick.
| Model | Size | Notes |
|---|---|---|
Qwen/Qwen2.5-Coder-1.5B-Instruct |
1.5B | Ungated, code-specific — the default when HF_TOKEN is absent. Smallest size with usable general-answer quality |
meta-llama/Llama-3.1-8B-Instruct |
8B | Gated — the default when HF_TOKEN is present |
Qwen/Qwen2.5-Coder-7B-Instruct |
7B | Ungated Qwen coder model |
Qwen/Qwen3-8B |
8B | Ungated Qwen general-purpose model |
Qwen/Qwen3-4B-Instruct-2507 |
4B | General-purpose, mid-size — 256k native context |
Qwen/Qwen3-1.7B |
1.7B | General-purpose, edge-friendly |
microsoft/Phi-4-mini-instruct |
3.8B | Small general model |
meta-llama/Llama-3.2-3B-Instruct |
3B | Gated |
Override from the CLI:
vibecli --provider vibecli-mistralrs --model Qwen/Qwen2.5-Coder-1.5B-Instruct
Any model mistral.rs can load works — the list above is what the picker offers, not an allow-list.
Best For
- Fully offline work — no network once weights are cached
- One less moving part — no Ollama install or sidecar to keep running
- Apple Silicon — Metal acceleration is on by default in macOS builds
Verify Connection
vibecli --provider vibecli-mistralrs -c "Write a Python async web scraper"
The daemon starts downloading the default model’s weights on its own at startup, so by the time you run this the download may already be complete; if the daemon just started, the first response will still be slow while that finishes.
Troubleshooting
Provider missing from the picker
The binary was built without the backend. Check /health as above; rebuild with --features vibe-mistralrs on Linux/Windows.
401 from Hugging Face
A gated model without a token. Either accept the licence and vibecli set-key huggingface, or switch to Qwen/Qwen2.5-Coder-1.5B-Instruct. The daemon substitutes the ungated fallback and says so when it can.
401 from the daemon
~/.vibecli/daemon.token is missing or stale. The token rotates on every daemon start; the provider re-reads the file per request, so this usually means the daemon is not running rather than that the token is wrong.
Out of memory on load
Drop to a smaller model — Qwen/Qwen2.5-Coder-1.5B-Instruct (the zero-config default) or Qwen/Qwen3-1.7B. Model size is the dominant term; a 7B at fp16 wants roughly 14 GB before cache.