/api/chat), not the OpenAI-compatible
/v1 endpoint. Three modes are supported:
| Mode | What it uses |
|---|---|
| Cloud + Local | A reachable Ollama host, serving local models and (if signed in) :cloud models |
| Cloud only | https://ollama.com directly, no local daemon |
| Local only | A reachable Ollama host, local models only |
ollama-cloud provider id, see
Ollama Cloud. Use ollama-cloud/<model> refs when
you want cloud routing kept separate from a local ollama provider.
The canonical config key is baseUrl. baseURL is also accepted for
OpenAI-SDK-style examples, but new config should use baseUrl.
Auth rules
Local and LAN hosts
Local and LAN hosts
.local, and bare-hostname Ollama URLs do not need a real bearer token. OpenClaw uses the ollama-local marker for these.Remote and Ollama Cloud hosts
Remote and Ollama Cloud hosts
https://ollama.com require a real credential: OLLAMA_API_KEY, an auth profile, or the provider’s apiKey. For direct hosted use, prefer the ollama-cloud provider.Custom provider ids
Custom provider ids
api: "ollama" follows the same rules. For example, an ollama-remote provider pointed at a private LAN host can use apiKey: "ollama-local"; sub-agents resolve that marker through the Ollama provider hook instead of treating it as a missing credential. agents.defaults.memorySearch.provider can also point at a custom provider id so embeddings use that Ollama endpoint.Auth profiles
Auth profiles
auth-profiles.json stores the credential for a provider id; put endpoint settings (baseUrl, api, models, headers, timeouts) in models.providers.<id>. Older flat files such as { "ollama-windows": { "apiKey": "ollama-local" } } are not a runtime format; openclaw doctor --fix rewrites them into a canonical ollama-windows:default API-key profile with a backup. A baseUrl value in that legacy file is noise and should move to provider config.Memory embedding scope
Memory embedding scope
- A provider-level key is sent only to that provider’s host.
agents.*.memorySearch.remote.apiKeyis sent only to its remote embedding host.- A pure
OLLAMA_API_KEYenv value is treated as the Ollama Cloud convention and is not sent to local/self-hosted hosts by default.
Getting started
- Onboarding (recommended)
- Manual setup
Select a model
Cloud only prompts for OLLAMA_API_KEY and suggests hosted cloud defaults. Cloud + Local and Local only prompt for an Ollama base URL, discover available models, and auto-pull the selected local model if missing. An installed :latest tag such as gemma4:latest is shown once instead of duplicating gemma4. Cloud + Local also checks whether the host is signed in for cloud access.--custom-base-url and --custom-model-id are optional; omitting them uses the local default host and the gemma4 suggested model.Cloud models through a local host
Cloud + Local routes both local and :cloud models through one reachable
Ollama host — this is Ollama’s hybrid flow and the mode to pick during setup
when you want both.
OpenClaw prompts for the base URL, discovers local models, and checks
ollama signin status. When signed in, it suggests hosted defaults
(kimi-k2.5:cloud, minimax-m2.7:cloud, glm-5.1:cloud, glm-5.2:cloud). If
not signed in, setup stays local-only until you run ollama signin.
For cloud-only access without a local daemon, use openclaw onboard --auth-choice ollama-cloud and see Ollama Cloud — that path does not need ollama signin or a running server:
openclaw onboard is populated live from
https://ollama.com/api/tags, capped at 500 entries, so the picker reflects
the current hosted catalog. If ollama.com is unreachable or returns no
models at setup time, OpenClaw falls back to its hardcoded suggested list so
onboarding still completes.
Model discovery (implicit provider)
WhenOLLAMA_API_KEY (or an auth profile) is set and neither
models.providers.ollama nor another custom provider with api: "ollama" is
defined, OpenClaw discovers models from http://127.0.0.1:11434:
| Behavior | Detail |
|---|---|
| Catalog query | /api/tags |
| Capability detection | Best-effort /api/show reads contextWindow, num_ctx Modelfile parameters, and capabilities (vision/tools/thinking) |
| Vision models | A vision capability from /api/show marks the model image-capable (input: ["text", "image"]) |
| Reasoning detection | Uses the thinking capability from /api/show when available; falls back to a name heuristic (r1, reason, reasoning, think) when Ollama omits capabilities. glm-5.2:cloud and deepseek-v4-flash|pro:cloud are always treated as reasoning regardless of reported capabilities. |
| Token limits | maxTokens defaults to OpenClaw’s Ollama max-token cap |
| Costs | All costs are 0 |
models.providers.ollama with an explicit models array, or a
custom provider with api: "ollama" and a non-loopback baseUrl, disables
auto-discovery; models must then be defined manually (see
Configuration). A models.providers.ollama entry pointed at
hosted https://ollama.com also skips discovery, since Ollama Cloud models
are provider-managed. Loopback custom providers such as
http://127.0.0.2:11434 still count as local and keep auto-discovery.
You can use a full ref such as ollama/<pulled-model>:latest without a
hand-written models.json entry; OpenClaw resolves it live. For signed-in
hosts, selecting an unlisted ollama/<model>:cloud ref validates that exact
model with /api/show and adds it to the runtime catalog only if Ollama
confirms metadata — typos still fail as unknown models.
Smoke tests
For a narrow text probe that skips the full agent tool surface:--file with an image for a lean vision-model probe (accepts PNG/JPEG/WebP;
non-image files are rejected before Ollama is called — use
openclaw infer audio transcribe for audio):
/model ollama/<model> is an exact user choice: if the
configured baseUrl is unreachable, the next reply fails with the provider
error instead of silently falling back to another configured model.
Isolated cron jobs add one local safety check before starting the agent turn:
if the selected model resolves to a local/private-network/.local Ollama
provider and /api/tags is unreachable, OpenClaw records that run as
skipped with the model in the error text. This endpoint check is cached for
5 minutes per host, so repeated cron jobs against a stopped daemon do not all
launch failing requests.
Live verification:
OPENCLAW_LIVE_OLLAMA_EMBEDDINGS=1 since a
cloud key may not authorize /api/embed):
Node-local inference
Agents can delegate a short task to an Ollama model on a paired desktop or server node. The prompt and response cross the existing authenticated Gateway/node connection; the request runs on the node’s own loopback Ollama endpoint (http://127.0.0.1:11434).
Connect the node host
ollama.models and ollama.chat, check openclaw nodes pending again.Use it from an agent
node_inference tool. Agents call
action: "discover" first, then action: "run" with a node and model from
that result (run can omit the node when exactly one capable node is
connected). For example: “Discover the Ollama models on my nodes, then use
the fastest loaded model to summarize this text.”/api/tags, checks /api/show capabilities, and uses
/api/ps when available to rank already-loaded models first. It returns only
local models Ollama reports as chat-capable (completion capability) —
Ollama Cloud rows and embedding-only models are excluded. Each run disables
model thinking and defaults output to 512 tokens (hard cap 8192) unless the
tool call requests a different maxTokens; some models (for example GPT-OSS)
do not support disabling thinking and may still emit reasoning tokens.
To keep Ollama running on a node without exposing it to agents:
openclaw node restart, or stop/rerun openclaw node run
for a foreground session). The node stops advertising ollama.models and
ollama.chat; Ollama itself and the Gateway’s Ollama provider are unaffected.
Set the value back to true and restart to re-enable; a changed command
surface may need openclaw nodes pending approval again after reconnect.
Verify the node commands directly, without an agent turn:
--invoke-timeout bounds how long the node has to run the command;
--timeout bounds the overall Gateway call and should be larger.
Node-local inference always uses the node’s own loopback endpoint — it does
not reuse a configured remote/cloud models.providers.ollama.baseUrl. The
node commands are available by default on macOS, Linux, and Windows node
hosts and remain subject to normal node pairing/command policy.
Vision and image description
The bundled Ollama plugin registers Ollama as an image-capable media-understanding provider, so OpenClaw can route explicit image-description requests and configured image-model defaults through local or hosted Ollama vision models.--model must be a full <provider/model> ref; when set, infer image describe tries that model first instead of skipping description for models
that already support native vision. If the call fails, OpenClaw can continue
through agents.defaults.imageModel.fallbacks; file/URL preparation errors
fail before fallback is attempted. Use infer image describe for OpenClaw’s
image-understanding flow and configured imageModel; use infer model run --file for a raw multimodal probe with a custom prompt.
To make Ollama the default image-understanding provider for inbound media:
ollama/<model> ref. A bare imageModel ref such as
qwen2.5vl:7b normalizes to ollama/qwen2.5vl:7b only when that exact model
is listed under models.providers.ollama.models with
input: ["text", "image"] and no other configured image provider exposes the
same bare id; otherwise use the provider prefix explicitly.
Slow local vision models can need a longer image-understanding timeout than
cloud models, and can crash on constrained hardware if Ollama tries to
allocate the model’s full advertised vision context. Set a capability
timeout and cap num_ctx:
image tool. models.providers.ollama.timeoutSeconds still controls the
underlying Ollama HTTP request guard for normal model calls.
Live verification:
models.providers.ollama.models manually, mark vision models
explicitly:
/api/show’s vision
capability.
Configuration
- Basic (implicit discovery)
- Explicit (manual models)
- Custom base URL
Common recipes
Replace model IDs with exact names fromollama list or
openclaw models list --provider ollama.
Local model with auto-discovery
Local model with auto-discovery
models.providers.ollama block unless you need manual models.LAN Ollama host with manual models
LAN Ollama host with manual models
contextWindow is OpenClaw’s context budget; params.num_ctx is sent to
Ollama. Keep them aligned when hardware cannot run the model’s full
advertised context.Ollama Cloud only
Ollama Cloud only
ollama-cloud provider id instead of this shape, see
Ollama Cloud.Cloud plus local through a signed-in daemon
Cloud plus local through a signed-in daemon
Multiple Ollama hosts
Multiple Ollama hosts
ollama/ prefix) before calling Ollama, so ollama-large/qwen3.5:27b
reaches Ollama as qwen3.5:27b.Lean local model profile
Lean local model profile
compat.supportsTools: false only when the model or server reliably
fails on tool schemas — it trades agent capability for stability.
localModelLean removes heavyweight browser, cron, message, media-generation,
voice, and PDF tools from the direct agent surface unless explicitly required,
and puts larger catalogs behind Tool Search. It does not change Ollama’s
runtime context or thinking mode. Pair it with params.num_ctx and
params.thinking: false for small Qwen-style thinking models that loop or
spend their budget on hidden reasoning.Model selection
ollama-spark/qwen3:32b, OpenClaw strips that prefix before
calling Ollama, sending qwen3:32b.
For slow local models, prefer provider-scoped tuning before raising the whole
agent runtime timeout:
timeoutSeconds covers the model HTTP request: connection setup, headers,
body streaming, and the total guarded-fetch abort. params.keep_alive is
forwarded as top-level keep_alive on native /api/chat requests; set it per
model when first-turn load time is the bottleneck.
Quick verification
127.0.0.1 with the baseUrl host. If curl
works but OpenClaw does not, check whether the Gateway runs on a different
machine, container, or service account.
Ollama Web Search
OpenClaw bundles Ollama Web Search as aweb_search provider.
| Property | Detail |
|---|---|
| Host | models.providers.ollama.baseUrl when set, otherwise http://127.0.0.1:11434; https://ollama.com uses the hosted API directly |
| Auth | Key-free for a signed-in local host; OLLAMA_API_KEY or configured provider auth for direct https://ollama.com search or auth-protected hosts |
| Requirement | Local/self-hosted hosts must be running and signed in with ollama signin; direct hosted search needs baseUrl: "https://ollama.com" plus a real API key |
openclaw onboard or openclaw configure --section web, or set:
/api/experimental/web_search
proxy, then falls back to the hosted /api/web_search path on the same host; a
signed-in local daemon normally answers through the local proxy. Direct
https://ollama.com calls always use the hosted /api/web_search endpoint.
Advanced configuration
Legacy OpenAI-compatible mode
Legacy OpenAI-compatible mode
api: "openai-completions" explicitly for a proxy behind
/v1/chat/completions:params: { streaming: false } on the model.OpenClaw injects options.num_ctx by default in this mode so Ollama does
not silently fall back to a 4096-token context. If your proxy rejects
unknown options fields, disable it:Context windows
Context windows
/api/show
reports, including larger PARAMETER num_ctx values from custom
Modelfiles; otherwise it falls back to OpenClaw’s default Ollama context
window.Provider-level contextWindow, contextTokens, and maxTokens set
defaults for every model under that provider and can be overridden per
model. contextWindow is OpenClaw’s own prompt/compaction budget. Native
/api/chat requests leave options.num_ctx unset unless you set
params.num_ctx explicitly, so Ollama applies its own model,
OLLAMA_CONTEXT_LENGTH, or VRAM-based default; invalid, zero, negative,
or non-finite params.num_ctx values are ignored. If an older config used
only contextWindow/maxTokens to force native request context, run
openclaw doctor --fix to copy those into params.num_ctx. The
OpenAI-compatible adapter still injects options.num_ctx by default from
the configured params.num_ctx or contextWindow; disable with
injectNumCtxForOpenAICompat: false if the upstream rejects options.Native model entries also accept common Ollama runtime options under
params, forwarded as native /api/chat options: num_keep, seed,
num_predict, top_k, top_p, min_p, typical_p, repeat_last_n,
temperature, repeat_penalty, presence_penalty, frequency_penalty,
stop, num_batch, num_gpu, main_gpu, use_mmap, and num_thread.
A few keys (format, keep_alive, truncate, shift) are forwarded as
top-level request fields instead of nested options. OpenClaw only
forwards these Ollama request keys, so runtime-only params such as
streaming are never sent to Ollama. Use params.think (or
params.thinking) to set top-level think; false disables API-level
thinking for Qwen-style thinking models.agents.defaults.models["ollama/<model>"].params.num_ctx also
works; the explicit provider model entry wins if both are set.Thinking control
Thinking control
think, not
options.think. Auto-discovered models whose /api/show reports a
thinking capability expose /think low, /think medium, /think high,
and /think max; non-thinking models expose only /think off.params.think/params.thinking can disable or force API
thinking for a specific model. OpenClaw preserves that explicit config
when the active run only has the implicit off default; a non-off
runtime command such as /think medium still overrides it. A truthy
thinking request is never sent to a model explicitly marked
reasoning: false; a think: false request is always sent regardless.Reasoning models
Reasoning models
deepseek-r1, reasoning, reason, or think are treated
as reasoning-capable by default — no extra config needed:Model costs
Model costs
0 for both
auto-discovered and manually defined models.Memory embeddings
Memory embeddings
/api/embed, and batches multiple memory chunks into
one input request when possible.When proxy.enabled=true, embedding requests to the exact host-local
loopback origin derived from the configured baseUrl use OpenClaw’s
guarded direct path instead of the managed forward proxy. The configured
hostname must itself be localhost or a loopback IP literal — DNS names
that merely resolve to loopback still use the managed proxy path. LAN,
tailnet, private-network, and public Ollama hosts always stay on the
managed proxy path, and redirects to another host/port do not inherit
trust. proxy.loopbackMode: "proxy" routes loopback traffic through the
proxy anyway; proxy.loopbackMode: "block" denies it before connecting —
see Managed proxy.| Property | Value |
|---|---|
| Default model | nomic-embed-text |
| Auto-pull | Yes, if not present locally |
| Default inline concurrency | 1 (other providers default higher; raise with nonBatchConcurrency if the host can take it) |
nomic-embed-text, qwen3-embedding, and
mxbai-embed-large. Document batches stay raw, so existing indexes need
no format migration.Streaming configuration
Streaming configuration
/api/chat) by default, which supports
streaming and tool calling together — no special config needed.For native requests, thinking control is forwarded directly: /think off
and openclaw agent --thinking off send top-level think: false unless
an explicit params.think/params.thinking is configured; /think low|medium|high send the matching effort string; /think max maps to
Ollama’s highest effort, think: "high".Troubleshooting
WSL2 crash loop (repeated reboots)
WSL2 crash loop (repeated reboots)
ollama.service systemd unit with Restart=always. If that service
autostarts and loads a GPU-backed model during WSL2 boot, Ollama can pin
host memory while loading; Hyper-V memory reclaim cannot always reclaim
those pages, so Windows can terminate the WSL2 VM, systemd restarts
Ollama, and the loop repeats.Evidence: repeated WSL2 reboots/terminations, high CPU in app.slice or
ollama.service right after WSL2 startup, and SIGTERM from systemd rather
than the Linux OOM killer.OpenClaw logs a startup warning when it detects WSL2, ollama.service
enabled with Restart=always, and visible CUDA markers.Mitigation:%USERPROFILE%\.wslconfig, then run
wsl --shutdown:Ollama not detected
Ollama not detected
OLLAMA_API_KEY (or an auth profile) is set,
and models.providers.ollama is not defined explicitly:No models available
No models available
models.providers.ollama:Connection refused
Connection refused
Remote host works with curl but not OpenClaw
Remote host works with curl but not OpenClaw
baseUrlpoints atlocalhost, but the Gateway runs in Docker or on another host.- The URL uses
/v1, selecting OpenAI-compatible behavior instead of native Ollama. - The remote host needs firewall or LAN binding changes.
- The model is on your laptop’s daemon but not the remote one.
Model outputs tool JSON as text
Model outputs tool JSON as text
compat.supportsTools: false on that model entry and retest.Kimi or GLM returns garbled symbols
Kimi or GLM returns garbled symbols
Cloud + Local or Cloud only, then try a fresh
session and a fallback model:Cold local model times out
Cold local model times out
timeoutSeconds also
extends the guarded connect timeout for this provider.Large-context model is too slow or runs out of memory
Large-context model is too slow or runs out of memory
params.num_ctx is set. Cap both OpenClaw’s budget and Ollama’s request
context for predictable first-token latency:contextWindow if OpenClaw sends too much prompt. Lower
params.num_ctx if Ollama’s runtime context is too large for the machine.
Lower maxTokens if generation runs too long.Related
Ollama Cloud
ollama-cloud provider.