./install.sh pi sets up model providers for both Pi agents. The code lives
in lib/omp-models.sh. There is no source file under config/: model choices
are per machine, so the installer writes them at install time and merges them
into the agents' own user-owned files.
| Agent | Providers | Roles |
|---|---|---|
Oh My Pi (omp) |
~/.omp/agent/models.yml |
modelRoles in ~/.omp/agent/config.yml |
plain pi |
~/.pi/agent/models.json |
~/.pi/agent/settings.json |
Every model setup run registers a vllm-lan provider at
http://exodus:8000/v1 (OpenAI-compatible) for both agents, with the model
ukisai/Swift-1.5-Qwen3.8-27b-NVFP4 (reasoning, text and image input, 262144
context, zero cost). The endpoint needs no API key: omp gets auth: none and
pi gets a placeholder key, because pi requires a non-empty one.
For omp it also sets the roles:
modelRoles:
default: vllm-lan/ukisai/Swift-1.5-Qwen3.8-27b-NVFP4:medium
vision: vllm-lan/ukisai/Swift-1.5-Qwen3.8-27b-NVFP4:medium
plan: vllm-lan/ukisai/Swift-1.5-Qwen3.8-27b-NVFP4:xhighExisting selections of unsloth/Qwen3.8-27B-NVFP4 and
ukisai/Swift-Qwen3.8-27B-NVFP4 migrate to Swift 1.5. Custom omp roles retain
their reasoning suffixes. Use --no-models to skip model setup for both
agents on a full install.
omp has a default role (the model a session starts on) and a plan role
(the model it plans with). Each answer is either a provider omp already ships
(anthropic, openai, openai-codex, zai, google, openrouter,
cerebras and so on) or an OpenAI-compatible endpoint you describe yourself:
vLLM, Ollama, LM Studio, LiteLLM or any gateway.
The installer asks only when the default role is unset or you pass
--models-only. Since the LAN step above sets it, re-ask explicitly:
./install.sh pi --models-only # register the LAN model, then re-ask both questions
./install.sh pi --no-models # skip model setup on a full install/model inside omp changes them for a session too.
A custom endpoint lands in models.yml like this:
providers:
ollama-local:
baseUrl: http://localhost:11434/v1
api: openai-completions
apiKey: "!cat '/Users/you/.config/macols/omp-ollama-local-api-key'"
models:
- id: qwen3:32b
reasoning: true
contextWindow: 131072
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }API keys are never written into models.yml. Each one goes to
~/.config/macols/omp-<provider>-api-key with mode 600 and is referenced as
!cat '<path>', which omp resolves by running the command. A blank answer
skips the key. That suits an endpoint that needs none (the provider is then
written with auth: none) and a provider you have already authenticated with
omp /login <provider>.
A custom endpoint is recorded with zero cost, which is true for something you
host but not for a paid gateway. Edit models.yml if it bills you. Both files
are re-serialised on write, so unrelated providers, roles and settings survive
but YAML comments do not. omp makes the same trade when it saves settings.
For a non-interactive machine, supply the answers as environment variables.
OMP_MODELS_CONFIG points at a models.yml-shaped YAML or JSON file whose
providers are merged in, and the two role variables take
<provider>/<model-id> selectors:
OMP_MODELS_CONFIG=./my-providers.yml \
OMP_DEFAULT_MODEL=ollama-local/qwen3:32b \
OMP_PLAN_MODEL=zai/glm-5.2 \
./install.sh pi --models-onlySetting any of them applies exactly what they say, after the LAN step, and asks nothing. A non-interactive install without them leaves the LAN roles in place.
Model setup merges into user-owned files, so prove a change against a scratch
$HOME and run it twice:
HOME=$(mktemp -d) ./install.sh pi --models-only </dev/null
./tests/test_pi_lan_models.sh