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.
HTTP proxy
Set one global proxy for zot-managed HTTP and HTTPS traffic with the http_proxy key in $ZOT_HOME/config.json:
{
"http_proxy": "http://127.0.0.1:7890"
}
zot applies this setting at startup. Existing HTTP_PROXY, HTTPS_PROXY, http_proxy, and https_proxy environment variables take precedence for their corresponding protocol. Standard NO_PROXY and no_proxy bypass lists remain effective. Restart zot after changing the setting.
config.json is not a credential store. If the proxy URL contains a username or password, prefer setting the proxy environment variables in a protected shell or service configuration rather than saving those credentials in config.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.
GitHub Copilot model availability
The built-in Copilot catalog excludes retired models and utility-only models
that are not selectable for chat. The default is claude-sonnet-5.
Availability still depends on your plan and organization policies. At startup,
zot queries Copilot's authenticated /models endpoint in the background and
filters the runtime catalog using picker visibility, policy state, and tool-call
support. Individual accounts with no eligible picker entries can fall back to
explicitly enabled model policies; other account types cannot. zot never enables
policies automatically.
Account availability stays in memory, not the shared model cache. Until discovery
succeeds, the static catalog remains visible; failed refreshes retain the previous
snapshot. Command-backed credentials are not executed for background discovery.
Restart zot after changing accounts to refresh the snapshot. This filter is a
selection aid, not an authorization boundary. The website displays the public
catalog, not any individual account's availability.
Claude uses the Anthropic Messages API with Copilot Bearer authentication, without
Claude Code identity injection. GPT, Grok, and MAI use Responses. Gemini and Kimi
use Chat Completions without reasoning_effort; their reasoning is managed by the
endpoint. All three routes send user/agent initiator metadata and image-request
headers where appropriate.
As of September 8, 2026, the catalog includes 27 public chat models: Claude
Fable 5/5.1, Haiku 4.5, Opus 4.7/4.8/4.8 Fast/5, Sonnet 5, Gemini
3.5/3.6/3.7/3.8 Flash, GPT-5 mini, GPT-5.3-Codex, GPT-5.4/5.4 mini/5.5,
GPT-5.6 Luna/Sol/Terra, GPT-6 Astra, Grok 4.5/4.6, Kimi K2.7 Code/K3,
and MAI-Code-1-Flash/1.1-Flash. MAI-Code-1-Flash uses the public picker ID
mai-code-1-flash-picker and is scheduled to retire on September 10, 2026.
Internal search, execution, and compaction models are not chat choices.
GPT-5.4 nano is excluded because GitHub offers it in the Codex VS Code
extension, not Copilot Chat. New entries use Copilot-specific limits and token
prices from models.dev; these are not a quote for your
subscription bill. Existing zero-priced entries do not imply unlimited free use.
Claude Fable models have different data-retention terms: Anthropic retains
prompts and outputs by default for safety classifiers. Eligible enterprises
can request a time-limited zero-data-retention exception from GitHub; enabling
a model does not itself grant that exception. Review
GitHub's model availability and data-retention notes
before using Fable with sensitive data.
Sonnet 4.6 is also excluded from the general catalog: GitHub retired it on
September 1, 2026, except for individual annual Copilot Pro and Pro+ subscribers.
Eligible subscribers can add it through $ZOT_HOME/models.json.
See GitHub's model retirement history and plan exceptions.
GPT-6 Astra
Select gpt-6-astra with provider openai, openai-responses,
openai-codex, or github-copilot, for example:
zot --provider github-copilot --model gpt-6-astra
Astra uses the Responses API and supports low, medium, high, xhigh,
and max reasoning. OpenAI API-key and Codex subscription entries use the
272,000-token short-context tier by default; the Copilot entry uses a
1,050,000-token context window. All entries include the 128,000-token output
limit and standard token prices, including the higher rates for prompts above
272,000 tokens. Subscription access depends on your
plan, rollout, and organization policy; catalog availability does not grant access.
See the OpenAI model specifications
and GitHub Copilot availability.
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 |
| Gondola |
GONDOLA_API_KEY |
gondola |
| 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 |
When Gondola credentials are available, zot refreshes its public text-model
catalog in the background and adds the discovered models to /model.
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 reasoning 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:
- Explicit CLI key, such as
--api-key.
- Provider-specific environment variables (including derived custom-provider
variables such as
MY_COMPANY_API_KEY).
$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## HTTP proxy
8
9Set one global proxy for zot-managed HTTP and HTTPS traffic with the `http_proxy` key in `$ZOT_HOME/config.json`:
10
11```json
12{
13 "http_proxy": "http://127.0.0.1:7890"
14}
15```
16
17zot applies this setting at startup. Existing `HTTP_PROXY`, `HTTPS_PROXY`, `http_proxy`, and `https_proxy` environment variables take precedence for their corresponding protocol. Standard `NO_PROXY` and `no_proxy` bypass lists remain effective. Restart zot after changing the setting.
18
19`config.json` is not a credential store. If the proxy URL contains a username or password, prefer setting the proxy environment variables in a protected shell or service configuration rather than saving those credentials in `config.json`.
20
21## Login methods
22
23Use `/login` in interactive mode. Type in either provider picker to filter the list by provider ID or display name.
24
25- `api key`: stores an API key in `$ZOT_HOME/auth.json` when the provider uses a normal key.
26- `subscription`: stores OAuth credentials for subscription-backed providers.
27
28Use `/logout` to remove stored credentials.
29
30Some providers need more than a single pasted key. For those providers,
31`/login` shows setup instructions instead of opening a localhost browser form.
32This avoids broken browser flows in SSH, containers, and `kubectl exec`
33sessions.
34
35### Command-backed API keys
36
37A provider can obtain its API key from a password manager or another local program. Configure this directly in `$ZOT_HOME/auth.json`:
38
39```json
40{
41 "openai": {
42 "api_key_command": {
43 "program": "op",
44 "args": ["read", "op://Work/OpenAI/credential"],
45 "timeout_ms": 120000
46 }
47 }
48}
49```
50
51Custom provider credentials use the same object under `additional_api_key_creds`:
52
53```json
54{
55 "additional_api_key_creds": {
56 "my-company": {
57 "api_key_command": {
58 "program": "secret-tool",
59 "args": ["read", "my-company-api-key"]
60 }
61 }
62 }
63}
64```
65
66The 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.
67
68Command-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.
69
70Setup-instruction providers:
71
72- Amazon Bedrock
73- Google Vertex AI
74- Cloudflare Workers AI
75- Cloudflare AI Gateway
76- Azure OpenAI Responses
77
78## Subscription providers
79
80These providers support subscription login:
81
82| Provider | Notes |
83| --- | --- |
84| Anthropic | Claude Pro/Max OAuth credentials. |
85| OpenAI Codex | ChatGPT Plus/Pro Codex subscription route. Separate from the OpenAI API-key provider. |
86| Kimi | Kimi subscription login. |
87| xAI | SuperGrok or X Premium device-code login. The browser URL is prefilled with the device code. |
88| GitHub Copilot | GitHub Copilot token flow. |
89
90OAuth tokens are stored in `$ZOT_HOME/auth.json` and refreshed when refresh is
91available.
92
93## GitHub Copilot model availability
94
95The built-in Copilot catalog excludes retired models and utility-only models
96that are not selectable for chat. The default is `claude-sonnet-5`.
97Availability still depends on your plan and organization policies. At startup,
98zot queries Copilot's authenticated `/models` endpoint in the background and
99filters the runtime catalog using picker visibility, policy state, and tool-call
100support. Individual accounts with no eligible picker entries can fall back to
101explicitly enabled model policies; other account types cannot. zot never enables
102policies automatically.
103
104Account availability stays in memory, not the shared model cache. Until discovery
105succeeds, the static catalog remains visible; failed refreshes retain the previous
106snapshot. Command-backed credentials are not executed for background discovery.
107Restart zot after changing accounts to refresh the snapshot. This filter is a
108selection aid, not an authorization boundary. The website displays the public
109catalog, not any individual account's availability.
110
111Claude uses the Anthropic Messages API with Copilot Bearer authentication, without
112Claude Code identity injection. GPT, Grok, and MAI use Responses. Gemini and Kimi
113use Chat Completions without `reasoning_effort`; their reasoning is managed by the
114endpoint. All three routes send user/agent initiator metadata and image-request
115headers where appropriate.
116
117As of September 8, 2026, the catalog includes 27 public chat models: Claude
118Fable 5/5.1, Haiku 4.5, Opus 4.7/4.8/4.8 Fast/5, Sonnet 5, Gemini
1193.5/3.6/3.7/3.8 Flash, GPT-5 mini, GPT-5.3-Codex, GPT-5.4/5.4 mini/5.5,
120GPT-5.6 Luna/Sol/Terra, GPT-6 Astra, Grok 4.5/4.6, Kimi K2.7 Code/K3,
121and MAI-Code-1-Flash/1.1-Flash. MAI-Code-1-Flash uses the public picker ID
122`mai-code-1-flash-picker` and is scheduled to retire on September 10, 2026.
123
124Internal search, execution, and compaction models are not chat choices.
125GPT-5.4 nano is excluded because GitHub offers it in the Codex VS Code
126extension, not Copilot Chat. New entries use Copilot-specific limits and token
127prices from [models.dev](https://models.dev); these are not a quote for your
128subscription bill. Existing zero-priced entries do not imply unlimited free use.
129
130Claude Fable models have different data-retention terms: Anthropic retains
131prompts and outputs by default for safety classifiers. Eligible enterprises
132can request a time-limited zero-data-retention exception from GitHub; enabling
133a model does not itself grant that exception. Review
134[GitHub's model availability and data-retention notes](https://docs.github.com/en/copilot/reference/ai-models/supported-models)
135before using Fable with sensitive data.
136
137Sonnet 4.6 is also excluded from the general catalog: GitHub retired it on
138September 1, 2026, except for individual annual Copilot Pro and Pro+ subscribers.
139Eligible subscribers can add it through `$ZOT_HOME/models.json`.
140See [GitHub's model retirement history and plan exceptions](https://docs.github.com/en/copilot/reference/ai-models/supported-models#model-retirement-history).
141
142## GPT-6 Astra
143
144Select `gpt-6-astra` with provider `openai`, `openai-responses`,
145`openai-codex`, or `github-copilot`, for example:
146
147```bash
148zot --provider github-copilot --model gpt-6-astra
149```
150
151Astra uses the Responses API and supports `low`, `medium`, `high`, `xhigh`,
152and `max` reasoning. OpenAI API-key and Codex subscription entries use the
153272,000-token short-context tier by default; the Copilot entry uses a
1541,050,000-token context window. All entries include the 128,000-token output
155limit and standard token prices, including the higher rates for prompts above
156272,000 tokens. Subscription access depends on your
157plan, rollout, and organization policy; catalog availability does not grant access.
158See the [OpenAI model specifications](https://developers.openai.com/api/docs/models/gpt-6-astra)
159and [GitHub Copilot availability](https://github.blog/changelog/2026-09-04-gpt-6-astra-is-generally-available-in-github-copilot/).
160
161## API-key providers
162
163These providers can use environment variables. Simple API-key providers can
164also be configured through `/login`. Providers that require extra cloud setup
165show instructions and should be configured with environment variables.
166
167| Provider | Environment variable | Stored key |
168| --- | --- | --- |
169| Anthropic | `ANTHROPIC_API_KEY` | `anthropic` |
170| OpenAI | `OPENAI_API_KEY` | `openai` |
171| OpenAI Responses | `OPENAI_API_KEY` | `openai-responses` |
172| Kimi | `KIMI_API_KEY` or `MOONSHOT_API_KEY` | `kimi` |
173| Google Gemini | `GEMINI_API_KEY` or `GOOGLE_API_KEY` | `google` |
174| DeepSeek | `DEEPSEEK_API_KEY` | `deepseek` |
175| Moonshot AI | `MOONSHOT_API_KEY` | `moonshotai` |
176| Moonshot AI China | `MOONSHOT_API_KEY` | `moonshotai-cn` |
177| Groq | `GROQ_API_KEY` | `groq` |
178| xAI | `XAI_API_KEY` | `xai` |
179| Cerebras | `CEREBRAS_API_KEY` | `cerebras` |
180| Together AI | `TOGETHER_API_KEY` | `together` |
181| Hugging Face | `HF_TOKEN` | `huggingface` |
182| OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
183| Gondola | `GONDOLA_API_KEY` | `gondola` |
184| Mistral | `MISTRAL_API_KEY` | `mistral` |
185| ZAI | `ZAI_API_KEY` | `zai` |
186| Xiaomi MiMo | `XIAOMI_API_KEY` | `xiaomi` |
187| Xiaomi Token Plan Amsterdam | `XIAOMI_TOKEN_PLAN_AMS_API_KEY` | `xiaomi-token-plan-ams` |
188| Xiaomi Token Plan China | `XIAOMI_TOKEN_PLAN_CN_API_KEY` | `xiaomi-token-plan-cn` |
189| Xiaomi Token Plan Singapore | `XIAOMI_TOKEN_PLAN_SGP_API_KEY` | `xiaomi-token-plan-sgp` |
190| MiniMax | `MINIMAX_API_KEY` | `minimax` |
191| MiniMax China | `MINIMAX_CN_API_KEY` or `MINIMAX_API_KEY` | `minimax-cn` |
192| Fireworks | `FIREWORKS_API_KEY` | `fireworks` |
193| Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
194| OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
195| OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
196| GitHub Copilot token | `COPILOT_GITHUB_TOKEN` or `GITHUB_COPILOT_TOKEN` | `github-copilot` |
197| Cloudflare Workers AI | `CLOUDFLARE_API_KEY` | `cloudflare-workers-ai` |
198| Cloudflare AI Gateway | `CLOUDFLARE_API_KEY` | `cloudflare-ai-gateway` |
199| Azure OpenAI Responses | `AZURE_OPENAI_API_KEY` | `azure-openai-responses` |
200
201When Gondola credentials are available, zot refreshes its public text-model
202catalog in the background and adds the discovered models to `/model`.
203
204Example:
205
206```bash
207export OPENROUTER_API_KEY=...
208zot --provider openrouter
209```
210
211## Local llama.cpp router
212
213The `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.
214
215Install a current llama.cpp build. On macOS:
216
217```bash
218brew install llama.cpp
219# use `brew upgrade llama.cpp` for an existing installation
220```
221
222Start `llama-server` without `--model`, `-m`, or `-hf`. Those flags select one model and disable the router behavior zot expects.
223
224```bash
225mkdir -p ~/llama-models
226
227llama-server \
228 --models-dir ~/llama-models \
229 --no-models-autoload \
230 --jinja \
231 --host 127.0.0.1 \
232 --port 8080 \
233 -ngl 999 \
234 -c 32768
235```
236
237This 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.
238
239Check the management API before opening zot:
240
241```bash
242curl http://127.0.0.1:8080/health
243curl http://127.0.0.1:8080/models
244```
245
246`/models` must return JSON with a `data` array. A 404 indicates the wrong URL, an older server build, or single-model mode.
247
248To 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:
249
250```bash
251export LLAMA_BASE_URL=http://127.0.0.1:8080
252export LLAMA_API_KEY=optional-secret
253```
254
255If 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.
256
257After 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.
258
259Opening `/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.
260
261Ollama 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.
262
263## Cloud providers
264
265### Amazon Bedrock
266
267Bedrock is configured with AWS credentials, not a generic zot API-key entry.
268Use one of these credential sources:
269
270```bash
271# AWS profile
272export AWS_PROFILE=your-profile
273
274# IAM access keys
275export AWS_ACCESS_KEY_ID=AKIA...
276export AWS_SECRET_ACCESS_KEY=...
277export AWS_SESSION_TOKEN=... # only for temporary credentials
278
279# Bedrock API key bearer token
280export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-...
281
282# Region
283export AWS_REGION=us-east-1
284```
285
286ECS task roles, IRSA, and other AWS SDK credential-chain sources are also
287supported.
288
289Example:
290
291```bash
292AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-... AWS_REGION=us-east-1 \
293 zot --provider amazon-bedrock --model anthropic.claude-sonnet-4-5-20250929-v1:0
294```
295
296Some Bedrock models require regional inference-profile IDs for on-demand
297throughput, such as `us.` or `eu.` prefixed model IDs. zot rewrites known
298families automatically where possible. Claude Opus 5 uses
299`global.anthropic.claude-opus-5`; zot maps the bare foundation-model ID to that
300global profile and supports its adaptive reasoning levels. Explicit profile IDs
301and ARNs are left unchanged.
302
303### Google Vertex AI
304
305Vertex can use a Google API key when available:
306
307```bash
308export GOOGLE_CLOUD_API_KEY=...
309zot --provider google-vertex
310```
311
312For service-account or application-default credentials, set the standard
313Google environment variables used by your deployment.
314
315### Cloudflare AI Gateway
316
317Cloudflare AI Gateway needs a Cloudflare token plus account and gateway IDs:
318
319```bash
320export CLOUDFLARE_API_KEY=...
321export CLOUDFLARE_ACCOUNT_ID=...
322export CLOUDFLARE_GATEWAY_ID=...
323zot --provider cloudflare-ai-gateway
324```
325
326### Cloudflare Workers AI
327
328Workers AI needs a Cloudflare token and account ID:
329
330```bash
331export CLOUDFLARE_API_KEY=...
332export CLOUDFLARE_ACCOUNT_ID=...
333zot --provider cloudflare-workers-ai
334```
335
336### Azure OpenAI Responses
337
338```bash
339export AZURE_OPENAI_API_KEY=...
340export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
341export AZURE_OPENAI_API_VERSION=v1 # optional, v1 is the default
342zot --provider azure-openai-responses
343```
344
345The provider uses Azure's Responses API. If deployment names differ from zot
346model IDs, map them without changing the catalog:
347
348```bash
349export AZURE_OPENAI_DEPLOYMENT_NAME_MAP='gpt-5.6-luna=luna-preview,gpt-5.6-sol=sol-preview'
350```
351
352## Auth file
353
354Credentials are stored in `$ZOT_HOME/auth.json` with user-only permissions
355when zot creates the file.
356
357Example:
358
359```json
360{
361 "anthropic": { "api_key": "sk-ant-..." },
362 "openai": { "api_key": "sk-..." },
363 "google": { "api_key": "..." },
364 "additional_api_key_creds": {
365 "openrouter": { "api_key": "..." },
366 "mistral": { "api_key": "..." }
367 }
368}
369```
370
371The top-level keys are used for providers with dedicated credential fields.
372Other API-key providers are stored under `additional_api_key_creds`. Prefer
373`/login` so zot writes the correct schema.
374
375## Custom providers and models
376
377Use `$ZOT_HOME/models.json` for private models, deployment aliases, local
378servers, or OpenAI-compatible gateways that are not in the built-in catalog.
379User entries override built-in entries with the same provider and model ID, and
380adding a `models.json` no longer hides the built-in catalog: your entries are
381merged on top of the baked-in and live-discovered models.
382
383A top-level provider key that is not a built-in id defines a custom provider.
384Give it a provider-level `baseUrl` and an `api` wire format (`openai` for
385OpenAI-compatible Chat Completions, the default, `openai-responses` for the
386OpenAI Responses API, or `anthropic` for the Anthropic Messages API). A
387model-level `baseUrl` overrides the provider-level one for that model, and an
388unknown `api` value falls back to `openai` with a warning.
389
390```json
391{
392 "providers": {
393 "my-company": {
394 "baseUrl": "https://llm.mycompany.com/v1",
395 "api": "openai",
396 "models": [
397 { "id": "company-llm-v2", "name": "Company LLM v2" }
398 ]
399 }
400 }
401}
402```
403
404Custom providers are first-class: they appear in `--list-models`, `/model`, and
405`/login`. `models.json` never stores secrets. Supply the key through `/login`,
406`--api-key`, or a derived environment variable in upper snake case, so
407`my-company` reads `MY_COMPANY_API_KEY`. Because many self-hosted gateways do
408not expose a model-list endpoint, custom provider keys are accepted and stored
409without a verification probe; an invalid key surfaces on the first model call.
410
411To retrieve this custom provider's key from a password manager, add a matching
412entry to `$ZOT_HOME/auth.json`:
413
414```json
415{
416 "additional_api_key_creds": {
417 "my-company": {
418 "api_key_command": {
419 "program": "op",
420 "args": ["read", "op://Work/OpenAI/credential"],
421 "timeout_ms": 120000
422 }
423 }
424 }
425}
426```
427
428The provider IDs in `models.json` and `auth.json` must match. Then select the
429custom model directly:
430
431```sh
432zot --provider my-company --model company-llm-v2
433```
434
435## Credential resolution
436
437For each request, zot checks credentials in this order:
438
4391. Explicit CLI key, such as `--api-key`.
4402. Provider-specific environment variables (including derived custom-provider
441 variables such as `MY_COMPANY_API_KEY`).
4423. `$ZOT_HOME/auth.json`, including custom provider keys saved by `/login`.
443
444`models.json` itself never stores credentials; it only describes models and
445their endpoints.
446
447Bedrock then uses the AWS SDK credential chain for the actual request.