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

ServerBase URL from inside the containersNote
Ollamahttp://host.docker.internal:11434/v1The shipped preset. Pull a 24–32B instruct model with a 32k+ window.
llama.cpp serverhttp://host.docker.internal:8080/v1Start it with a chat template that supports tool calls.
vLLMhttp://host.docker.internal:8000/v1Enable the tool-call parser for your model family.
LM Studiohttp://host.docker.internal:1234/v1Turn the local server on in LM Studio.
Paid endpointthe provider’s URLAny 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:

Enginehost.docker.internalHost’s LAN IP
rootless Podman (default)worksfails (loops back to the container)
rootless Dockerfails (no route back to the host)works
rootful Docker / Docker Desktopworksworks

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

  1. Open Settings → Models & Providers. Add a provider: a label, the base URL, the key if the endpoint needs one.
  2. Press Test. It makes a real one-token completion, so a green result means the endpoint answered, not just that the URL resolved.
  3. 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.