v0.3.29 f3d8eb6

providers.md RawHistoryFolder

zot providers

zot ships with built-in providers and a model catalog. You can select models with /model, list them with zot --list-models, and add private models in $ZOT_HOME/models.json.

Login methods

Use /login in interactive mode. Type in either provider picker to filter the list by provider ID or display name.

  • api key: stores an API key in $ZOT_HOME/auth.json when the provider uses a normal key.
  • subscription: stores OAuth credentials for subscription-backed providers.

Use /logout to remove stored credentials.

Some providers need more than a single pasted key. For those providers, /login shows setup instructions instead of opening a localhost browser form. This avoids broken browser flows in SSH, containers, and kubectl exec sessions.

Command-backed API keys

A provider can obtain its API key from a password manager or another local program. Configure this directly in $ZOT_HOME/auth.json:

{
  "openai": {
    "api_key_command": {
      "program": "op",
      "args": ["read", "op://Work/OpenAI/credential"],
      "timeout_ms": 120000
    }
  }
}

Custom provider credentials use the same object under additional_api_key_creds:

{
  "additional_api_key_creds": {
    "my-company": {
      "api_key_command": {
        "program": "secret-tool",
        "args": ["read", "my-company-api-key"]
      }
    }
  }
}

The program is started directly rather than through a shell. The timeout defaults to 120 seconds. It must write one non-empty line to stdout, with no more than 64 KiB of output. Trailing CR/LF characters are removed. Successful results stay only in process memory and are reused until zot exits.

Command-backed credentials count as logged in without being executed. zot materializes one only when selecting that provider; background model discovery skips it. /login with a normal key replaces the command, while /logout clears it. Because auth.json can cause program execution, keep it user-writable only and do not use files from untrusted sources.

Setup-instruction providers:

  • Amazon Bedrock
  • Google Vertex AI
  • Cloudflare Workers AI
  • Cloudflare AI Gateway
  • Azure OpenAI Responses

Subscription providers

These providers support subscription login:

Provider Notes
Anthropic Claude Pro/Max OAuth credentials.
OpenAI Codex ChatGPT Plus/Pro Codex subscription route. Separate from the OpenAI API-key provider.
Kimi Kimi subscription login.
xAI SuperGrok or X Premium device-code login. The browser URL is prefilled with the device code.
GitHub Copilot GitHub Copilot token flow.

OAuth tokens are stored in $ZOT_HOME/auth.json and refreshed when refresh is available.

API-key providers

These providers can use environment variables. Simple API-key providers can also be configured through /login. Providers that require extra cloud setup show instructions and should be configured with environment variables.

Provider Environment variable Stored key
Anthropic ANTHROPIC_API_KEY anthropic
OpenAI OPENAI_API_KEY openai
OpenAI Responses OPENAI_API_KEY openai-responses
Kimi KIMI_API_KEY or MOONSHOT_API_KEY kimi
Google Gemini GEMINI_API_KEY or GOOGLE_API_KEY google
DeepSeek DEEPSEEK_API_KEY deepseek
Moonshot AI MOONSHOT_API_KEY moonshotai
Moonshot AI China MOONSHOT_API_KEY moonshotai-cn
Groq GROQ_API_KEY groq
xAI XAI_API_KEY xai
Cerebras CEREBRAS_API_KEY cerebras
Together AI TOGETHER_API_KEY together
Hugging Face HF_TOKEN huggingface
OpenRouter OPENROUTER_API_KEY openrouter
Mistral MISTRAL_API_KEY mistral
ZAI ZAI_API_KEY zai
Xiaomi MiMo XIAOMI_API_KEY xiaomi
Xiaomi Token Plan Amsterdam XIAOMI_TOKEN_PLAN_AMS_API_KEY xiaomi-token-plan-ams
Xiaomi Token Plan China XIAOMI_TOKEN_PLAN_CN_API_KEY xiaomi-token-plan-cn
Xiaomi Token Plan Singapore XIAOMI_TOKEN_PLAN_SGP_API_KEY xiaomi-token-plan-sgp
MiniMax MINIMAX_API_KEY minimax
MiniMax China MINIMAX_CN_API_KEY or MINIMAX_API_KEY minimax-cn
Fireworks FIREWORKS_API_KEY fireworks
Vercel AI Gateway AI_GATEWAY_API_KEY vercel-ai-gateway
OpenCode Zen OPENCODE_API_KEY opencode
OpenCode Go OPENCODE_API_KEY opencode-go
GitHub Copilot token COPILOT_GITHUB_TOKEN or GITHUB_COPILOT_TOKEN github-copilot
Cloudflare Workers AI CLOUDFLARE_API_KEY cloudflare-workers-ai
Cloudflare AI Gateway CLOUDFLARE_API_KEY cloudflare-ai-gateway
Azure OpenAI Responses AZURE_OPENAI_API_KEY azure-openai-responses

Example:

export OPENROUTER_API_KEY=...
zot --provider openrouter

Local llama.cpp router

The llama.cpp provider connects to a multi-model router and is separate from the ollama provider. Ollama normally uses http://localhost:11434; entering that URL for llama.cpp management produces a 404 because Ollama does not implement the router endpoints.

Install a current llama.cpp build. On macOS:

brew install llama.cpp
# use `brew upgrade llama.cpp` for an existing installation

Start llama-server without --model, -m, or -hf. Those flags select one model and disable the router behavior zot expects.

mkdir -p ~/llama-models

llama-server \
  --models-dir ~/llama-models \
  --no-models-autoload \
  --jinja \
  --host 127.0.0.1 \
  --port 8080 \
  -ngl 999 \
  -c 32768

This configuration discovers GGUF files below ~/llama-models, leaves model loading under explicit user control, enables chat templates, requests GPU offload, and sets a 32K context. Tune the GPU layers and context size for the available memory.

Check the management API before opening zot:

curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/models

/models must return JSON with a data array. A 404 indicates the wrong URL, an older server build, or single-model mode.

To save the connection, run /login, choose api key, and select llama.cpp. Enter http://127.0.0.1:8080, without /v1, followed by an optional bearer key. zot validates the URL and stores both values in $ZOT_HOME/auth.json. Environment variables override the saved connection:

export LLAMA_BASE_URL=http://127.0.0.1:8080
export LLAMA_API_KEY=optional-secret

If a key is configured, start the router with the same --api-key value. A server bound only to 127.0.0.1 normally does not need authentication.

After login, /llama becomes visible. It shows model state, searches Hugging Face for GGUF repositories, offers available quantizations, reports download and load progress, and explicitly loads or unloads models. Press d on a router-downloaded cache model to ask the router to remove it after confirmation. Models discovered through --models-dir or a preset are not removable through the router API and must be deleted from their configured source. Some llama.cpp versions retain shared Hugging Face repository artifacts such as mmproj files after removing the selected GGUF; remove that repository's cache directory manually if those artifacts are no longer needed. HF_TOKEN raises Hugging Face API limits and may be required for repository metadata. For gated files, approve access first and provide the authorized token to the llama-server process because the router performs the download.

Opening /model refreshes the router and displays its loaded models under provider llama.cpp. Unloaded models cannot handle inference and therefore remain exclusive to /llama until loaded. Inference is sent to the router's derived /v1 endpoint.

Ollama downloads are stored in Ollama's internal layout and do not automatically become llama.cpp models. Obtain a GGUF copy through /llama or place GGUF files under ~/llama-models, then restart the router after adding files manually.

Cloud providers

Amazon Bedrock

Bedrock is configured with AWS credentials, not a generic zot API-key entry. Use one of these credential sources:

# AWS profile
export AWS_PROFILE=your-profile

# IAM access keys
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=... # only for temporary credentials

# Bedrock API key bearer token
export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-...

# Region
export AWS_REGION=us-east-1

ECS task roles, IRSA, and other AWS SDK credential-chain sources are also supported.

Example:

AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-... AWS_REGION=us-east-1 \
  zot --provider amazon-bedrock --model anthropic.claude-sonnet-4-5-20250929-v1:0

Some Bedrock models require regional inference-profile IDs for on-demand throughput, such as us. or eu. prefixed model IDs. zot rewrites known families automatically where possible. Claude Opus 5 uses global.anthropic.claude-opus-5; zot maps the bare foundation-model ID to that global profile and supports its adaptive thinking levels. Explicit profile IDs and ARNs are left unchanged.

Google Vertex AI

Vertex can use a Google API key when available:

export GOOGLE_CLOUD_API_KEY=...
zot --provider google-vertex

For service-account or application-default credentials, set the standard Google environment variables used by your deployment.

Cloudflare AI Gateway

Cloudflare AI Gateway needs a Cloudflare token plus account and gateway IDs:

export CLOUDFLARE_API_KEY=...
export CLOUDFLARE_ACCOUNT_ID=...
export CLOUDFLARE_GATEWAY_ID=...
zot --provider cloudflare-ai-gateway

Cloudflare Workers AI

Workers AI needs a Cloudflare token and account ID:

export CLOUDFLARE_API_KEY=...
export CLOUDFLARE_ACCOUNT_ID=...
zot --provider cloudflare-workers-ai

Azure OpenAI Responses

export AZURE_OPENAI_API_KEY=...
export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
export AZURE_OPENAI_API_VERSION=v1 # optional, v1 is the default
zot --provider azure-openai-responses

The provider uses Azure's Responses API. If deployment names differ from zot model IDs, map them without changing the catalog:

export AZURE_OPENAI_DEPLOYMENT_NAME_MAP='gpt-5.6-luna=luna-preview,gpt-5.6-sol=sol-preview'

Auth file

Credentials are stored in $ZOT_HOME/auth.json with user-only permissions when zot creates the file.

Example:

{
  "anthropic": { "api_key": "sk-ant-..." },
  "openai": { "api_key": "sk-..." },
  "google": { "api_key": "..." },
  "additional_api_key_creds": {
    "openrouter": { "api_key": "..." },
    "mistral": { "api_key": "..." }
  }
}

The top-level keys are used for providers with dedicated credential fields. Other API-key providers are stored under additional_api_key_creds. Prefer /login so zot writes the correct schema.

Custom providers and models

Use $ZOT_HOME/models.json for private models, deployment aliases, local servers, or OpenAI-compatible gateways that are not in the built-in catalog. User entries override built-in entries with the same provider and model ID, and adding a models.json no longer hides the built-in catalog: your entries are merged on top of the baked-in and live-discovered models.

A top-level provider key that is not a built-in id defines a custom provider. Give it a provider-level baseUrl and an api wire format (openai for OpenAI-compatible Chat Completions, the default, openai-responses for the OpenAI Responses API, or anthropic for the Anthropic Messages API). A model-level baseUrl overrides the provider-level one for that model, and an unknown api value falls back to openai with a warning.

{
  "providers": {
    "my-company": {
      "baseUrl": "https://llm.mycompany.com/v1",
      "api": "openai",
      "models": [
        { "id": "company-llm-v2", "name": "Company LLM v2" }
      ]
    }
  }
}

Custom providers are first-class: they appear in --list-models, /model, and /login. models.json never stores secrets. Supply the key through /login, --api-key, or a derived environment variable in upper snake case, so my-company reads MY_COMPANY_API_KEY. Because many self-hosted gateways do not expose a model-list endpoint, custom provider keys are accepted and stored without a verification probe; an invalid key surfaces on the first model call.

To retrieve this custom provider's key from a password manager, add a matching entry to $ZOT_HOME/auth.json:

{
  "additional_api_key_creds": {
    "my-company": {
      "api_key_command": {
        "program": "op",
        "args": ["read", "op://Work/OpenAI/credential"],
        "timeout_ms": 120000
      }
    }
  }
}

The provider IDs in models.json and auth.json must match. Then select the custom model directly:

zot --provider my-company --model company-llm-v2

Credential resolution

For each request, zot checks credentials in this order:

  1. Explicit CLI key, such as --api-key.
  2. Provider-specific environment variables (including derived custom-provider variables such as MY_COMPANY_API_KEY).
  3. $ZOT_HOME/auth.json, including custom provider keys saved by /login.

models.json itself never stores credentials; it only describes models and their endpoints.

Bedrock then uses the AWS SDK credential chain for the actual request.

source
1# zot providers
2
3zot ships with built-in providers and a model catalog. You can select models
4with `/model`, list them with `zot --list-models`, and add private models in
5`$ZOT_HOME/models.json`.
6
7## Login methods
8
9Use `/login` in interactive mode. Type in either provider picker to filter the list by provider ID or display name.
10
11- `api key`: stores an API key in `$ZOT_HOME/auth.json` when the provider uses a normal key.
12- `subscription`: stores OAuth credentials for subscription-backed providers.
13
14Use `/logout` to remove stored credentials.
15
16Some providers need more than a single pasted key. For those providers,
17`/login` shows setup instructions instead of opening a localhost browser form.
18This avoids broken browser flows in SSH, containers, and `kubectl exec`
19sessions.
20
21### Command-backed API keys
22
23A provider can obtain its API key from a password manager or another local program. Configure this directly in `$ZOT_HOME/auth.json`:
24
25```json
26{
27  "openai": {
28    "api_key_command": {
29      "program": "op",
30      "args": ["read", "op://Work/OpenAI/credential"],
31      "timeout_ms": 120000
32    }
33  }
34}
35```
36
37Custom provider credentials use the same object under `additional_api_key_creds`:
38
39```json
40{
41  "additional_api_key_creds": {
42    "my-company": {
43      "api_key_command": {
44        "program": "secret-tool",
45        "args": ["read", "my-company-api-key"]
46      }
47    }
48  }
49}
50```
51
52The program is started directly rather than through a shell. The timeout defaults to 120 seconds. It must write one non-empty line to stdout, with no more than 64 KiB of output. Trailing CR/LF characters are removed. Successful results stay only in process memory and are reused until zot exits.
53
54Command-backed credentials count as logged in without being executed. zot materializes one only when selecting that provider; background model discovery skips it. `/login` with a normal key replaces the command, while `/logout` clears it. Because `auth.json` can cause program execution, keep it user-writable only and do not use files from untrusted sources.
55
56Setup-instruction providers:
57
58- Amazon Bedrock
59- Google Vertex AI
60- Cloudflare Workers AI
61- Cloudflare AI Gateway
62- Azure OpenAI Responses
63
64## Subscription providers
65
66These providers support subscription login:
67
68| Provider | Notes |
69| --- | --- |
70| Anthropic | Claude Pro/Max OAuth credentials. |
71| OpenAI Codex | ChatGPT Plus/Pro Codex subscription route. Separate from the OpenAI API-key provider. |
72| Kimi | Kimi subscription login. |
73| xAI | SuperGrok or X Premium device-code login. The browser URL is prefilled with the device code. |
74| GitHub Copilot | GitHub Copilot token flow. |
75
76OAuth tokens are stored in `$ZOT_HOME/auth.json` and refreshed when refresh is
77available.
78
79## API-key providers
80
81These providers can use environment variables. Simple API-key providers can
82also be configured through `/login`. Providers that require extra cloud setup
83show instructions and should be configured with environment variables.
84
85| Provider | Environment variable | Stored key |
86| --- | --- | --- |
87| Anthropic | `ANTHROPIC_API_KEY` | `anthropic` |
88| OpenAI | `OPENAI_API_KEY` | `openai` |
89| OpenAI Responses | `OPENAI_API_KEY` | `openai-responses` |
90| Kimi | `KIMI_API_KEY` or `MOONSHOT_API_KEY` | `kimi` |
91| Google Gemini | `GEMINI_API_KEY` or `GOOGLE_API_KEY` | `google` |
92| DeepSeek | `DEEPSEEK_API_KEY` | `deepseek` |
93| Moonshot AI | `MOONSHOT_API_KEY` | `moonshotai` |
94| Moonshot AI China | `MOONSHOT_API_KEY` | `moonshotai-cn` |
95| Groq | `GROQ_API_KEY` | `groq` |
96| xAI | `XAI_API_KEY` | `xai` |
97| Cerebras | `CEREBRAS_API_KEY` | `cerebras` |
98| Together AI | `TOGETHER_API_KEY` | `together` |
99| Hugging Face | `HF_TOKEN` | `huggingface` |
100| OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
101| Mistral | `MISTRAL_API_KEY` | `mistral` |
102| ZAI | `ZAI_API_KEY` | `zai` |
103| Xiaomi MiMo | `XIAOMI_API_KEY` | `xiaomi` |
104| Xiaomi Token Plan Amsterdam | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
105| Xiaomi Token Plan China | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | `xiaomi-token-plan-cn` |
106| Xiaomi Token Plan Singapore | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
107| MiniMax | `MINIMAX_API_KEY` | `minimax` |
108| MiniMax China | `MINIMAX_CN_API_KEY` or `MINIMAX_API_KEY` | `minimax-cn` |
109| Fireworks | `FIREWORKS_API_KEY` | `fireworks` |
110| Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
111| OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
112| OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
113| GitHub Copilot token | `COPILOT_GITHUB_TOKEN` or `GITHUB_COPILOT_TOKEN` | `github-copilot` |
114| Cloudflare Workers AI | `CLOUDFLARE_API_KEY` | `cloudflare-workers-ai` |
115| Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` | `cloudflare-ai-gateway` |
116| Azure OpenAI Responses | `AZURE_OPENAI_API_KEY` | `azure-openai-responses` |
117
118Example:
119
120```bash
121export OPENROUTER_API_KEY=...
122zot --provider openrouter
123```
124
125## Local llama.cpp router
126
127The `llama.cpp` provider connects to a multi-model router and is separate from the `ollama` provider. Ollama normally uses `http://localhost:11434`; entering that URL for llama.cpp management produces a 404 because Ollama does not implement the router endpoints.
128
129Install a current llama.cpp build. On macOS:
130
131```bash
132brew install llama.cpp
133# use `brew upgrade llama.cpp` for an existing installation
134```
135
136Start `llama-server` without `--model`, `-m`, or `-hf`. Those flags select one model and disable the router behavior zot expects.
137
138```bash
139mkdir -p ~/llama-models
140
141llama-server \
142  --models-dir ~/llama-models \
143  --no-models-autoload \
144  --jinja \
145  --host 127.0.0.1 \
146  --port 8080 \
147  -ngl 999 \
148  -c 32768
149```
150
151This configuration discovers GGUF files below `~/llama-models`, leaves model loading under explicit user control, enables chat templates, requests GPU offload, and sets a 32K context. Tune the GPU layers and context size for the available memory.
152
153Check the management API before opening zot:
154
155```bash
156curl http://127.0.0.1:8080/health
157curl http://127.0.0.1:8080/models
158```
159
160`/models` must return JSON with a `data` array. A 404 indicates the wrong URL, an older server build, or single-model mode.
161
162To save the connection, run `/login`, choose `api key`, and select `llama.cpp`. Enter `http://127.0.0.1:8080`, without `/v1`, followed by an optional bearer key. zot validates the URL and stores both values in `$ZOT_HOME/auth.json`. Environment variables override the saved connection:
163
164```bash
165export LLAMA_BASE_URL=http://127.0.0.1:8080
166export LLAMA_API_KEY=optional-secret
167```
168
169If a key is configured, start the router with the same `--api-key` value. A server bound only to `127.0.0.1` normally does not need authentication.
170
171After login, `/llama` becomes visible. It shows model state, searches Hugging Face for GGUF repositories, offers available quantizations, reports download and load progress, and explicitly loads or unloads models. Press `d` on a router-downloaded cache model to ask the router to remove it after confirmation. Models discovered through `--models-dir` or a preset are not removable through the router API and must be deleted from their configured source. Some llama.cpp versions retain shared Hugging Face repository artifacts such as `mmproj` files after removing the selected GGUF; remove that repository's cache directory manually if those artifacts are no longer needed. `HF_TOKEN` raises Hugging Face API limits and may be required for repository metadata. For gated files, approve access first and provide the authorized token to the `llama-server` process because the router performs the download.
172
173Opening `/model` refreshes the router and displays its loaded models under provider `llama.cpp`. Unloaded models cannot handle inference and therefore remain exclusive to `/llama` until loaded. Inference is sent to the router's derived `/v1` endpoint.
174
175Ollama downloads are stored in Ollama's internal layout and do not automatically become llama.cpp models. Obtain a GGUF copy through `/llama` or place GGUF files under `~/llama-models`, then restart the router after adding files manually.
176
177## Cloud providers
178
179### Amazon Bedrock
180
181Bedrock is configured with AWS credentials, not a generic zot API-key entry.
182Use one of these credential sources:
183
184```bash
185# AWS profile
186export AWS_PROFILE=your-profile
187
188# IAM access keys
189export AWS_ACCESS_KEY_ID=AKIA...
190export AWS_SECRET_ACCESS_KEY=...
191export AWS_SESSION_TOKEN=... # only for temporary credentials
192
193# Bedrock API key bearer token
194export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-...
195
196# Region
197export AWS_REGION=us-east-1
198```
199
200ECS task roles, IRSA, and other AWS SDK credential-chain sources are also
201supported.
202
203Example:
204
205```bash
206AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-... AWS_REGION=us-east-1 \
207  zot --provider amazon-bedrock --model anthropic.claude-sonnet-4-5-20250929-v1:0
208```
209
210Some Bedrock models require regional inference-profile IDs for on-demand
211throughput, such as `us.` or `eu.` prefixed model IDs. zot rewrites known
212families automatically where possible. Claude Opus 5 uses
213`global.anthropic.claude-opus-5`; zot maps the bare foundation-model ID to that
214global profile and supports its adaptive thinking levels. Explicit profile IDs
215and ARNs are left unchanged.
216
217### Google Vertex AI
218
219Vertex can use a Google API key when available:
220
221```bash
222export GOOGLE_CLOUD_API_KEY=...
223zot --provider google-vertex
224```
225
226For service-account or application-default credentials, set the standard
227Google environment variables used by your deployment.
228
229### Cloudflare AI Gateway
230
231Cloudflare AI Gateway needs a Cloudflare token plus account and gateway IDs:
232
233```bash
234export CLOUDFLARE_API_KEY=...
235export CLOUDFLARE_ACCOUNT_ID=...
236export CLOUDFLARE_GATEWAY_ID=...
237zot --provider cloudflare-ai-gateway
238```
239
240### Cloudflare Workers AI
241
242Workers AI needs a Cloudflare token and account ID:
243
244```bash
245export CLOUDFLARE_API_KEY=...
246export CLOUDFLARE_ACCOUNT_ID=...
247zot --provider cloudflare-workers-ai
248```
249
250### Azure OpenAI Responses
251
252```bash
253export AZURE_OPENAI_API_KEY=...
254export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
255export AZURE_OPENAI_API_VERSION=v1 # optional, v1 is the default
256zot --provider azure-openai-responses
257```
258
259The provider uses Azure's Responses API. If deployment names differ from zot
260model IDs, map them without changing the catalog:
261
262```bash
263export AZURE_OPENAI_DEPLOYMENT_NAME_MAP='gpt-5.6-luna=luna-preview,gpt-5.6-sol=sol-preview'
264```
265
266## Auth file
267
268Credentials are stored in `$ZOT_HOME/auth.json` with user-only permissions
269when zot creates the file.
270
271Example:
272
273```json
274{
275  "anthropic": { "api_key": "sk-ant-..." },
276  "openai": { "api_key": "sk-..." },
277  "google": { "api_key": "..." },
278  "additional_api_key_creds": {
279    "openrouter": { "api_key": "..." },
280    "mistral": { "api_key": "..." }
281  }
282}
283```
284
285The top-level keys are used for providers with dedicated credential fields.
286Other API-key providers are stored under `additional_api_key_creds`. Prefer
287`/login` so zot writes the correct schema.
288
289## Custom providers and models
290
291Use `$ZOT_HOME/models.json` for private models, deployment aliases, local
292servers, or OpenAI-compatible gateways that are not in the built-in catalog.
293User entries override built-in entries with the same provider and model ID, and
294adding a `models.json` no longer hides the built-in catalog: your entries are
295merged on top of the baked-in and live-discovered models.
296
297A top-level provider key that is not a built-in id defines a custom provider.
298Give it a provider-level `baseUrl` and an `api` wire format (`openai` for
299OpenAI-compatible Chat Completions, the default, `openai-responses` for the
300OpenAI Responses API, or `anthropic` for the Anthropic Messages API). A
301model-level `baseUrl` overrides the provider-level one for that model, and an
302unknown `api` value falls back to `openai` with a warning.
303
304```json
305{
306  "providers": {
307    "my-company": {
308      "baseUrl": "https://llm.mycompany.com/v1",
309      "api": "openai",
310      "models": [
311        { "id": "company-llm-v2", "name": "Company LLM v2" }
312      ]
313    }
314  }
315}
316```
317
318Custom providers are first-class: they appear in `--list-models`, `/model`, and
319`/login`. `models.json` never stores secrets. Supply the key through `/login`,
320`--api-key`, or a derived environment variable in upper snake case, so
321`my-company` reads `MY_COMPANY_API_KEY`. Because many self-hosted gateways do
322not expose a model-list endpoint, custom provider keys are accepted and stored
323without a verification probe; an invalid key surfaces on the first model call.
324
325To retrieve this custom provider's key from a password manager, add a matching
326entry to `$ZOT_HOME/auth.json`:
327
328```json
329{
330  "additional_api_key_creds": {
331    "my-company": {
332      "api_key_command": {
333        "program": "op",
334        "args": ["read", "op://Work/OpenAI/credential"],
335        "timeout_ms": 120000
336      }
337    }
338  }
339}
340```
341
342The provider IDs in `models.json` and `auth.json` must match. Then select the
343custom model directly:
344
345```sh
346zot --provider my-company --model company-llm-v2
347```
348
349## Credential resolution
350
351For each request, zot checks credentials in this order:
352
3531. Explicit CLI key, such as `--api-key`.
3542. Provider-specific environment variables (including derived custom-provider
355   variables such as `MY_COMPANY_API_KEY`).
3563. `$ZOT_HOME/auth.json`, including custom provider keys saved by `/login`.
357
358`models.json` itself never stores credentials; it only describes models and
359their endpoints.
360
361Bedrock then uses the AWS SDK credential chain for the actual request.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 476

↑↓ moveenter openesc close