Auth rules
Local and LAN hosts
Loopback, private-network, `.local`, and bare-hostname Ollama URLs do not need a real bearer token. Apus uses the `ollama-local` marker for these.
Remote and Ollama Cloud hosts
Public remote hosts and `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
A custom provider with `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. `memory.search.provider` can also point at a custom provider id so embeddings use that Ollama endpoint.
Auth profiles
SQLite auth stores hold the credential for a provider id; put endpoint settings (`baseUrl`, `api`, models, headers, timeouts) in `models.providers.<id>`. Older flat `auth-profiles.json` files such as `{ "ollama-windows": { "apiKey": "ollama-local" } }` are not a runtime format; `apus doctor --fix` imports them into SQLite as 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
Bearer auth for Ollama memory embeddings is scoped to the host it was declared for:
- A provider-level key is sent only to that provider's host.
- `memory.search.remote.apiKey` and per-agent overrides are sent only to their remote embedding host.
- A pure `OLLAMA_API_KEY` env value is treated as the Ollama Cloud convention and is not sent to local/self-hosted hosts by default.
Getting started
Onboarding (recommended)
Run onboarding
```bash
apus onboard
```
Select **Ollama**, then pick a mode: **Cloud + Local** or **Local only**. For hosted models without a local Ollama host, choose **Ollama Cloud** instead.
On a fresh guided setup, Apus first checks the default or configured
Ollama host. Automatic discovery considers only models already loaded in
memory, as reported by `/api/ps`, with tool support and at least 16K of
context confirmed by `/api/show`. An eligible model installed on disk but
not loaded is not an automatic candidate. The selected route still needs
a real completion before Apus saves it; discovery never pulls or
loads an idle model.
To use an installed but idle model in desktop Model Setup, choose
**Choose connection** on the Ollama card, then **Local only**. This
explicit setup path can prepare an eligible installed model for the live
check without requiring it to be loaded already.
Select a model
`Cloud + Local` and `Local only` prompt for an Ollama base URL and inspect installed models; an `ollama.com` URL is rejected there because hosted access belongs to **Ollama Cloud**. If no tools-capable model is found, setup can ask permission to pull a recommended model. 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.
Verify
```bash
apus models list --provider ollama
```
Non-interactive:
```bash
apus onboard --non-interactive --accept-risk --skip-health \
--auth-choice ollama \
--custom-base-url "http://ollama-host:11434" \
--custom-model-id "qwen3.5:27b"
```
`--custom-base-url` and `--custom-model-id` are optional; omitting them uses the local default host and the `gemma4` suggested model.
A local model advertised as embedding-only cannot be selected as the chat
default. Setup reports an error and leaves the existing configuration intact;
reset preflight also rejects an explicitly selected embedding-only model or
an inventory advertised as entirely embedding-only. Models that support both
completion and embeddings remain eligible.
Manual setup
Install and start Ollama
Get it from [ollama.com/download](https://ollama.com/download), then pull a model:
```bash
ollama pull gemma4
```
For hybrid cloud access, run `ollama signin` on the same host.
Set a credential
For a local or LAN host, any value works:
```bash
export OLLAMA_API_KEY="ollama-local"
```
For `https://ollama.com`, use the real key instead:
```bash
export OLLAMA_API_KEY="your-real-key"
```
Or in config: `apus config set models.providers.ollama.apiKey "OLLAMA_API_KEY"`.
Select the model
```bash
apus models list
apus models set ollama/gemma4
```
Or in config:
```json5
{
agents: {
defaults: {
model: { primary: "ollama/gemma4" },
},
},
}
```
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.
Apus prompts for the base URL, discovers local models, and checks
ollama signin status. When signed in, it suggests hosted defaults
(minimax-m2.7:cloud, minimax-m3:cloud, kimi-k3: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 apus onboard --auth-choice ollama-cloud and see Ollama Cloud — that path does not need ollama signin or a running server:
apus onboard --auth-choice ollama-cloud
apus models set ollama-cloud/minimax-m2.7:cloud
The Ollama Cloud model list comes from live https://ollama.com/api/tags
discovery with your key, so the picker reflects the current hosted catalog.
Without a usable key, Apus shows its bundled Ollama Cloud catalog.