MANUAL · 11
Models & tokens.
The AI DJ can run on a small model on your own hardware or a large hosted one, and a handful of settings let you tune the station for whichever you've picked, trading richness against cost.
THE ROOT CHOICE
Which model writes the show.
Every word the DJ speaks and every track it picks comes from one language model, chosen under Admin → LLM. The default is Ollama on your own hardware (no API key, no per-token bill), but you can point the station at a hosted provider (Anthropic, OpenAI, Google and others) instead. Switching reroutes every call immediately, with no redeploy.
“On your own hardware” isn't only Ollama — there are three local paths, all keyless and all private to your box:
- Ollama — the default. One install, pull a model, done.
- locca — a first-class, one-command local model server (
locca serve <model>) built on llama.cpp. No key, a sensible host default, and the onboarding wizard can detect it for you. locca on GitHub ↗ - OpenAI-compatible — any self-hosted server that speaks the OpenAI API (llama.cpp, vLLM, LM Studio); you supply its URL.
Thinking models are handled for you: with Reasoning off the station tells a local model to skip its internal monologue, so a small model stays fast and on-task (more on that below).
Big hosted models are more capable but cost money per token; small local models are free to run but need a lighter workload to stay coherent. The settings below let you match the station to the model: run it lean for a small or metered model, or rich for a large capable one.
If you want a single recommendation, a 12B-class local model such as Gemma 4 12B is the sweet spot — serve it with locca serve gemma4, or as gemma4:12b on Ollama. It's free and private on your own box, yet capable enough to run the station's richest setting — the full conversational picker agent — without falling over. A smaller 9B-class model still works on lean settings, and a large hosted model buys you more headroom again; Gemma 4 12B is the comfortable middle that most stations should reach for first.
RUNNING LEAN
For small models & saving tokens.
If you're on a modest local model, or paying per token and want the bill low, these are the dials to turn down. None of them take the DJ off the air. They just make it do less work per moment.
With these settings in place, a small model runs the whole station comfortably: even a 9B-class local model such as Qwen3.5 9B is plenty for picking tracks and writing the DJ's lines. The lean profile keeps each request short and well-shaped, which is exactly what a smaller model needs to stay reliable. Step up one size to a 12B-class model like Gemma 4 12B and you can leave more of the rich dials on — including the picker agent — while still paying nothing per token.
- Reasoning off (Admin → LLM) — stops “thinking” models from writing a long internal monologue before they answer. The DJ writes short scripts that don't need it, and an unbounded thinking step makes every call balloon on a small model. Off is the safe default.
- Picker agent off (Admin → LLM) — swaps the conversational track-picking agent for the simpler pool picker. The agent holds a running chat history and works through tools step by step; the pool picker instead hands the model one short, pre-built shortlist and asks for a single choice. Far fewer tokens, and a much easier task for a small model to get right.
- Pause when empty on (Admin → LLM) — when nobody is listening, the DJ stops picking, talking and writing IDs entirely; the stream coasts on the fallback playlist and the DJ wakes up the moment someone tunes in. This one is a pure saving: there's no quality cost, since there's no one there to hear it.
- Concise scripts (Admin → Personas) — each persona's script length runs from one-liner through concise and extended to storyteller. Concise keeps spoken breaks to a line or two; the longer stops double or triple them. Shorter means fewer tokens out on every segment.
- Quiet frequency (Admin → Personas) — a persona's frequency sets how often it talks, IDs the station and reads the time and weather. Quiet makes all of that rarer, so there are simply fewer AI calls per hour.
- Sound FX off (Admin → Sound FX) — with the effects library disabled, the DJ is no longer shown the catalogue of stingers when it plans a segment, which trims that prompt.
RUNNING RICH
For large, capable models.
On a large hosted model the same dials go the other way: spend the capability on a station with more personality and a smarter DJ.
- Reasoning on (Admin → LLM) — let a thinking model work through its choice before answering. Worth it only on a model built for it, and on a generous token budget.
- Picker agent on (Admin → LLM) — the full conversational DJ: it remembers the session, reasons about what it has already played, and uses tools to dig through the library. Richer and more coherent, but it leans on the model being capable. You don't need a hosted model for it, though — a tool-capable 12B-class local model like Gemma 4 12B runs the agent reliably on your own hardware.
- Extended scripts (Admin → Personas) — a storytelling DJ that lingers, with longer links between tracks.
- Aggressive frequency (Admin → Personas) — a busy station: frequent IDs, time checks and weather updates.
The picker agent has a built-in safety net: if it ever fails or runs too slow, the station quietly falls back to the simple pool picker for that track, the same path you'd get with the agent switched off. Turning it off just makes that lighter path the default rather than the exception.
A SECOND, SMALLER MODEL
How the DJ knows each track's mood.
The DJ picks partly by mood — mellow mornings, brighter afternoons, a wind-down late at night. To know each track's mood it leans on the library tagger, which uses a second, much smaller embedding model — not the chat model that writes the show.
Rather than ask the chat model about every track (slow and expensive on a big library), the tagger embeds each track once, has the chat model tag a small, representative seed set, then propagates moods and energy out to everything else by similarity. That's roughly ten times fewer model calls than tagging track by track.
By default the embedding model follows your LLM provider, so there's usually nothing extra to set up — an Ollama-local station gets nomic-embed-text for free. Two things are worth knowing if you stray from that:
- Anthropic has no embedding model — if your DJ runs on Claude, point embeddings at Ollama or OpenAI instead.
- Some providers do chat only — the
deepseekand Vercel AIgatewayproviders have no embeddings endpoint at all. A DJ on one of those works fine, but the tagger can't follow it, so the console only lists embedding-capable providers in the tagger dropdown (Ollama, OpenAI, Google, OpenRouter, locca, OpenAI-compatible). If you don't see your chat provider there, that's why — pick Ollama (local and free) for the embedding step and leave the DJ where it is. - Provider vs. model — mind the difference on a router. "DeepSeek" is a provider (no embeddings), but it's also a model you can run through OpenRouter. Those aren't the same: pick the OpenRouter provider with a DeepSeek chat model and your DJ speaks via DeepSeek while embeddings go through OpenRouter's own embeddings endpoint — by default
openai/text-embedding-3-small. OpenRouter, Requesty and the like carry everything (chat and embeddings); the bare provider named after a chat-only company does not. - locca and OpenAI-compatible need a dedicated embedding server — one llama.cpp process can't serve chat and embeddings at once. With locca that's a second command,
locca embed, on its own port; the console can detect it for you. - Which one should I pick? Any embedding model at 768 dimensions or more is fine for mood similarity — favour a fast, cheap one over a big "best-in-class" model. Good baselines:
nomic-embed-text(local, free, 768-d) if you run Ollama, ortext-embedding-3-small(cloud, cheap, 1536-d) otherwise. The exact model matters far less than picking one and sticking with it — see the next note.
One catch worth internalising: the vector index is built at your embedding model's dimension, so changing the embedding model means re-embedding the whole library (Admin → Library tagger → Re-scan → "Re-embed all tracks"). Changing the chat model never needs this — but if embeddings are set to "follow the LLM," switching your DJ provider quietly changes the embedding model too. The console pins embeddings to your library's model and warns you before that happens, so the safe move is to pin an embedding provider once and leave it.
It all lives under Admin → Library tagger, and you can see the tagged library laid out in Library Observatory.
WHERE TO SET THEM
All of this lives in the console.
Every setting here is in the admin console and takes effect without a redeploy; most apply to the next thing the DJ does. The full tour of the console is in Admin & Settings; how the DJ actually picks and talks is in How the DJ Works.