Connect a model
The driver model
Disco does not bundle a language model. It needs one that speaks the OpenAI chat-completions API and can emit tool calls.
What it has to do
The driver plans, calls tools and writes. A model that cannot emit a structured tool call cannot drive the agent loop, however well it chats. Everything else is keyless by default: search (DuckDuckGo), extraction (local fetch), embeddings and reranking (bundled ONNX encoders), text to speech (bundled Kokoro).
Good options
| Server | Base URL from inside the containers | Note |
|---|---|---|
| Ollama | http://host.docker.internal:11434/v1 | The shipped preset. Pull a 24–32B instruct model with a 32k+ window. |
| llama.cpp server | http://host.docker.internal:8080/v1 | Start it with a chat template that supports tool calls. |
| vLLM | http://host.docker.internal:8000/v1 | Enable the tool-call parser for your model family. |
| LM Studio | http://host.docker.internal:1234/v1 | Turn the local server on in LM Studio. |
| Paid endpoint | the provider’s URL | Any OpenAI-compatible API; the key is stored encrypted in Settings. |
Reaching a server on the host machine
Inside the containers, the host is not localhost, and the address that works depends on the engine:
| Engine | host.docker.internal | Host’s LAN IP |
|---|---|---|
| rootless Podman (default) | works | fails (loops back to the container) |
| rootless Docker | fails (no route back to the host) | works |
| rootful Docker / Docker Desktop | works | works |
On rootless Docker replace the host with your LAN IP (hostname -I | awk '{print $1}') and make sure the model server binds 0.0.0.0, not 127.0.0.1.
Add it in Settings
- Open Settings → Models & Providers. Add a provider: a label, the base URL, the key if the endpoint needs one.
- Press Test. It makes a real one-token completion, so a green result means the endpoint answered, not just that the URL resolved.
- Enable the model you want to drive the loop and make it the default driver.
A headless server can do the same three steps over the app-server API on port 8800; the reference has the exact calls.
Prove it
podman compose exec agent-server disco-verify --quick
Four checks, each PASS / FAIL / SKIP with the provider’s verbatim error: the driver is configured, the endpoint completes text, the model emits a tool call, and (without --quick) the full grounded research pipeline returns a cited answer. Tool-calling is the gate. If it fails, pick a different model before trusting it with a task.
Optional providers
Search can use SearXNG, Tavily or Brave; extraction Crawl4AI or Firecrawl; encoders a remote endpoint; TTS any OpenAI-compatible speech API; image generation ComfyUI or an OpenAI-compatible image API. Keys are read from encrypted Settings first, then from environment variables such as DISCO_OPENROUTER_API_KEY, TAVILY_API_KEY or BRAVE_API_KEY.
Reference: docs/self-host.md in the repository is the complete, versioned version of this guide. When the two disagree, the repository is right.