SysDeck/klanker-gate/docs/reference/environment-variables.md

321 lines
21 KiB
Markdown
Executable File

# Environment Variables Reference
This reference is derived from `.env.example`, `docker-compose.yml`,
`apps/gateway/context.ts`, and the route and helper modules that parse
environment values.
## Quick reference table
| Variable | Required | Default | Description |
| ----------------------------------- | ----------- | -------------------------------------------- | -------------------------------------------------------------------- |
| `OPENAI_API_KEY` | Conditional | none | Enables the first-party OpenAI provider |
| `ANTHROPIC_API_KEY` | Conditional | none | Enables the first-party Anthropic provider |
| `AZURE_OPENAI_API_KEY` | Conditional | none | Azure OpenAI credential |
| `AZURE_OPENAI_ENDPOINT` | Conditional | none | Azure OpenAI resource endpoint |
| `AZURE_OPENAI_API_VERSION` | Conditional | none | Azure OpenAI API version |
| `AZURE_OPENAI_DEPLOYMENTS` | Conditional | none | Comma-separated Azure deployment names |
| `GEMINI_API_KEY` | Conditional | none | Enables the Gemini provider |
| `OPENROUTER_API_KEY` | Conditional | none | Enables the OpenRouter provider |
| `GROQ_API_KEY` | Conditional | none | Enables the Groq provider |
| `MISTRAL_API_KEY` | Conditional | none | Enables the Mistral provider |
| `XAI_API_KEY` | Conditional | none | Enables the xAI provider |
| `PERPLEXITY_API_KEY` | Conditional | none | Enables the Perplexity provider |
| `CEREBRAS_API_KEY` | Conditional | none | Enables the Cerebras provider |
| `NEBIUS_API_KEY` | Conditional | none | Enables the Nebius provider |
| `PARASAIL_API_KEY` | Conditional | none | Enables the Parasail provider |
| `HF_TOKEN` | Conditional | none | Enables Hugging Face access |
| `COHERE_API_KEY` | Conditional | none | Enables the Cohere provider |
| `ELEVENLABS_API_KEY` | Conditional | none | Enables ElevenLabs text-to-speech |
| `OLLAMA_BASE_URL` | Conditional | none | Base URL for Ollama |
| `OLLAMA_MODELS` | Conditional | none | Comma-separated Ollama models |
| `AWS_REGION` | Conditional | `us-east-1` | Bedrock region |
| `AWS_ACCESS_KEY_ID` | Conditional | none | Bedrock access key id |
| `AWS_SECRET_ACCESS_KEY` | Conditional | none | Bedrock secret key |
| `AWS_SESSION_TOKEN` | Conditional | none | Optional Bedrock session token |
| `BEDROCK_MODELS` | Conditional | none | Comma-separated Bedrock models |
| `VERTEX_PROJECT_ID` | Conditional | none | Vertex AI project id |
| `VERTEX_LOCATION` | Conditional | `us-central1` | Vertex AI region |
| `VERTEX_SERVICE_ACCOUNT_JSON` | Conditional | none | One-line Vertex service account JSON |
| `VERTEX_MODELS` | Conditional | `gemini-2.5-pro` | Comma-separated Vertex models |
| `OPENAI_COMPAT_BASE_URL` | Conditional | none | Enables a generic OpenAI-compatible provider |
| `OPENAI_COMPAT_API_KEY` | Conditional | none | Credential for the generic OpenAI-compatible provider |
| `OPENAI_COMPAT_DEFAULT_MODEL` | Conditional | none | Default model for the generic OpenAI-compatible provider |
| `ANTHROPIC_COMPAT_BASE_URL` | Conditional | none | Enables a generic Anthropic-compatible provider |
| `ANTHROPIC_COMPAT_API_KEY` | Conditional | none | Credential for the generic Anthropic-compatible provider |
| `ANTHROPIC_COMPAT_DEFAULT_MODEL` | Conditional | none | Default model for the generic Anthropic-compatible provider |
| `LMSTUDIO_BASE_URL` | Conditional | `http://localhost:1234/v1` | Base URL for LM Studio |
| `LMSTUDIO_API_KEY` | Conditional | none | Optional LM Studio API key |
| `LMSTUDIO_DEFAULT_MODEL` | Conditional | none | Default LM Studio model |
| `PORT` | No | `8080` | Gateway listen port |
| `LOG_LEVEL` | No | `info` | Gateway log level |
| `FROSTY_DEFAULT_PROVIDER` | No | `openai` | Default provider for bare model ids |
| `FROSTY_PG_URL` | Yes | none | Primary PostgreSQL connection string |
| `FROSTY_PG_DIRECT_URL` | Conditional | none | Session-stable PostgreSQL URL for LISTEN when a pooler sits in front |
| `FROSTY_PG_POOL_SIZE` | No | code default | Per-process PostgreSQL pool size |
| `FROSTY_PG_TABLE` | No | `frosty_vectors` | pgvector table name |
| `FROSTY_WORKERS` | No | single-process | Worker-process count |
| `FROSTY_SHARED_RATE_LIMIT` | No | `auto` | Shared rate-limit authority mode |
| `FROSTY_CONFIG_RECONCILE_MS` | No | `30000` | Config poll backstop interval in milliseconds |
| `FROSTY_ADMIN_TOKEN` | No | none | Optional bearer token for `/api/*` |
| `FROSTY_ALLOWED_HOSTS` | No | localhost, `127.0.0.1`, `::1` always allowed | Additional admin-origin allow-list hosts |
| `FROSTY_CACHE` | No | off | Cache mode: unset, `exact`, or `semantic` |
| `FROSTY_CACHE_TTL_MS` | No | code default | Cache TTL in milliseconds |
| `FROSTY_CACHE_EMBED_MODEL` | No | `text-embedding-3-small` | Embedding model for semantic cache lookups |
| `FROSTY_VECTOR_STORE` | No | none | Vector store implementation, currently `pgvector` when enabled |
| `FROSTY_MCP_ALLOW_STDIO` | No | off | Enables stdio MCP transports when combined with runtime permission |
| `FROSTY_MCP_HEALTH_INTERVAL_MS` | No | on-demand only | Periodic MCP health-check interval |
| `FROSTY_LOG_STORE` | No | `pg` | Durable log-store mode, `pg` or `off` |
| `FROSTY_LOG_STORE_MAX` | No | `5000` | Stored-log cap |
| `FROSTY_LOG_EXCLUDE_PATHS` | No | `/healthz,/metrics,/favicon.ico` | Paths excluded from the dashboard log trail |
| `FROSTY_EUR_RATE` | No | `0.92` | Operator display conversion rate from USD to EUR |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | No | off | OTLP HTTP endpoint for traces |
| `OTEL_FLUSH_INTERVAL_MS` | No | `5000` | OTEL batch flush interval |
| `FROSTY_OTEL_MODEL_CARDINALITY_CAP` | No | `11` | Distinct model-label cap for span-derived metrics |
| `FROSTY_PRICING_SYNC` | No | off | Enables periodic LiteLLM pricing sync |
| `FROSTY_PRICING_SYNC_INTERVAL_MS` | No | `86400000` | Pricing sync interval in milliseconds |
| `FROSTY_PRICING_URL` | No | LiteLLM upstream JSON URL | Source for pricing sync |
| `FROSTY_ENCRYPTION_KEY` | No | off | Opt-in config encryption key |
| `FROSTY_ENCRYPTION_KEY_OLD` | No | none | Previous encryption key used for rotation |
| `FROSTY_JSON_REPAIR` | No | off | Enables the JSON-repair plugin |
| `FROSTY_MOCKER` | No | off | Enables the mock-response plugin |
| `FROSTY_MOCKER_CONFIG` | Conditional | none | Inline JSON or file path for mocker rules |
| `FROSTY_HTTP_TIMEOUT_MS` | No | `120000` | Default provider HTTP timeout in milliseconds |
| `FROSTY_NO_PROXY` | No | none | Comma-separated proxy bypass rules |
| `FROSTY_LOG_CONTENT` | No | off | Enables request and response content capture in stored logs |
| `FROSTY_CODE_MODE` | No | `off` | Enables Code Mode surfaces and capability probing |
| `FROSTY_CODE_MODE_VFS` | No | `on` | Enables Code Mode VFS metadata surface |
## Categorized reference
### Provider credentials and provider catalogs
Variables:
- `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `OPENROUTER_API_KEY`
- `GROQ_API_KEY`, `MISTRAL_API_KEY`, `XAI_API_KEY`, `PERPLEXITY_API_KEY`,
`CEREBRAS_API_KEY`, `NEBIUS_API_KEY`, `PARASAIL_API_KEY`, `HF_TOKEN`,
`COHERE_API_KEY`, `ELEVENLABS_API_KEY`
- `OLLAMA_BASE_URL`, `OLLAMA_MODELS`
Notes:
- All are optional individually and only required when that provider is intended
to boot automatically from env.
- Model lists use comma-separated values where present.
- Secrets in this category must never be committed to version control.
- Example: `OPENAI_API_KEY=sk-...`, `OLLAMA_BASE_URL=http://localhost:11434`,
`OLLAMA_MODELS=llama3.1,codellama`.
### Azure OpenAI, Bedrock, and Vertex AI
Variables:
- Azure: `AZURE_OPENAI_API_KEY`, `AZURE_OPENAI_ENDPOINT`,
`AZURE_OPENAI_API_VERSION`, `AZURE_OPENAI_DEPLOYMENTS`
- Bedrock: `AWS_REGION`, `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`,
`AWS_SESSION_TOKEN`, `BEDROCK_MODELS`
- Vertex: `VERTEX_PROJECT_ID`, `VERTEX_LOCATION`, `VERTEX_SERVICE_ACCOUNT_JSON`,
`VERTEX_MODELS`
Notes:
- These groups are conditionally required as complete sets for their respective
providers.
- `VERTEX_SERVICE_ACCOUNT_JSON` is expected as a single-line JSON string.
- `AZURE_OPENAI_DEPLOYMENTS`, `BEDROCK_MODELS`, and `VERTEX_MODELS` are
comma-separated lists.
- All cloud credentials in this category should be treated as secrets.
### Generic compatible endpoints
Variables:
- `OPENAI_COMPAT_BASE_URL`, `OPENAI_COMPAT_API_KEY`,
`OPENAI_COMPAT_DEFAULT_MODEL`
- `ANTHROPIC_COMPAT_BASE_URL`, `ANTHROPIC_COMPAT_API_KEY`,
`ANTHROPIC_COMPAT_DEFAULT_MODEL`
- `LMSTUDIO_BASE_URL`, `LMSTUDIO_API_KEY`, `LMSTUDIO_DEFAULT_MODEL`
Notes:
- Each compatible endpoint stays off until its `*_BASE_URL` is set.
- `LMSTUDIO_BASE_URL` defaults to `http://localhost:1234/v1`.
- These variables let Frosty wrap third-party or local compatible servers as
provider accounts.
### Core gateway and PostgreSQL
Variables:
- `PORT`, `LOG_LEVEL`, `FROSTY_DEFAULT_PROVIDER`
- `FROSTY_PG_URL`, `FROSTY_PG_DIRECT_URL`, `FROSTY_PG_POOL_SIZE`,
`FROSTY_PG_TABLE`
Notes:
- `FROSTY_PG_URL` is effectively mandatory on the production path because
PostgreSQL is a hard dependency.
- `FROSTY_PG_DIRECT_URL` matters when PgBouncer is used, because LISTEN needs a
session-stable connection.
- `FROSTY_PG_TABLE` controls the pgvector table name used by the semantic cache.
- Example: `FROSTY_PG_URL=postgres://frosty:frosty@localhost:5432/frosty`.
### Worker topology and shared governance
Variables:
- `FROSTY_WORKERS`, `FROSTY_SHARED_RATE_LIMIT`, `FROSTY_CONFIG_RECONCILE_MS`
Notes:
- `FROSTY_WORKERS` values greater than 1 trigger the multi-process supervisor on
supported operating systems.
- `FROSTY_SHARED_RATE_LIMIT` accepts `auto`, `on`, or `off`.
- `FROSTY_CONFIG_RECONCILE_MS` bounds staleness when LISTEN/NOTIFY is missed.
### Admin protection and origin control
Variables:
- `FROSTY_ADMIN_TOKEN`, `FROSTY_ALLOWED_HOSTS`
Notes:
- Leaving `FROSTY_ADMIN_TOKEN` unset results in local-admin mode.
- `FROSTY_ALLOWED_HOSTS` is a comma-separated host allow-list for the admin
origin guard.
- Example: `FROSTY_ALLOWED_HOSTS=gw.example.com,admin.internal.example.com`.
### Cache and vector store
Variables:
- `FROSTY_CACHE`, `FROSTY_CACHE_TTL_MS`, `FROSTY_CACHE_EMBED_MODEL`,
`FROSTY_VECTOR_STORE`
Notes:
- `FROSTY_CACHE` is unset for off, `exact` for exact-match caching, and
`semantic` for embedding-assisted lookup.
- `FROSTY_VECTOR_STORE` is only relevant when semantic cache is on.
- `FROSTY_CACHE_EMBED_MODEL` must match a model id the configured provider can
serve.
### MCP and Code Mode
Variables:
- `FROSTY_MCP_ALLOW_STDIO`, `FROSTY_MCP_HEALTH_INTERVAL_MS`
- `FROSTY_CODE_MODE`, `FROSTY_CODE_MODE_VFS`
Notes:
- `FROSTY_MCP_ALLOW_STDIO` only takes effect when the runtime also has
`--allow-run` for the Deno binary.
- `FROSTY_CODE_MODE` defaults to `off` and remains additionally gated by the
capability probe.
- `FROSTY_CODE_MODE_VFS` controls the VFS metadata surface and defaults to `on`
in the example env.
### Logging, analytics display, and observability
Variables:
- `FROSTY_LOG_STORE`, `FROSTY_LOG_STORE_MAX`, `FROSTY_LOG_EXCLUDE_PATHS`,
`FROSTY_EUR_RATE`, `FROSTY_LOG_CONTENT`
- `OTEL_EXPORTER_OTLP_ENDPOINT`, `OTEL_FLUSH_INTERVAL_MS`,
`FROSTY_OTEL_MODEL_CARDINALITY_CAP`
Notes:
- `FROSTY_LOG_STORE=pg` keeps the durable PostgreSQL trail on; `off` disables
it.
- `FROSTY_LOG_EXCLUDE_PATHS` accepts exact paths and `/prefix/*` patterns.
- `FROSTY_LOG_CONTENT` is privacy-sensitive and off by default.
- `OTEL_EXPORTER_OTLP_ENDPOINT` turns trace export on when set.
### Pricing sync, encryption, plugins, and HTTP client tuning
Variables:
- `FROSTY_PRICING_SYNC`, `FROSTY_PRICING_SYNC_INTERVAL_MS`, `FROSTY_PRICING_URL`
- `FROSTY_ENCRYPTION_KEY`, `FROSTY_ENCRYPTION_KEY_OLD`
- `FROSTY_JSON_REPAIR`, `FROSTY_MOCKER`, `FROSTY_MOCKER_CONFIG`
- `FROSTY_HTTP_TIMEOUT_MS`, `FROSTY_NO_PROXY`
Notes:
- `FROSTY_PRICING_SYNC` is opt-in and off by default.
- `FROSTY_ENCRYPTION_KEY` enables AES-256-GCM encryption-at-rest behavior and
becomes effectively mandatory for subsequent boots once encrypted data exists.
- `FROSTY_MOCKER_CONFIG` accepts inline JSON or a file path.
- `FROSTY_NO_PROXY` is a comma-separated bypass list.
## Example configurations
### Minimal development setup
```dotenv
OPENAI_API_KEY=sk-your-key
PORT=8080
FROSTY_DEFAULT_PROVIDER=openai
FROSTY_PG_URL=postgres://frosty:frosty@localhost:5432/frosty
FROSTY_LOG_STORE=pg
```
### Docker Compose development
```dotenv
PORT=8080
OPENAI_API_KEY=sk-your-key
FROSTY_DEFAULT_PROVIDER=openai
FROSTY_PG_URL=postgres://frosty:frosty@postgres:5432/frosty
FROSTY_LOG_STORE=pg
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
```
### Production-oriented example
```dotenv
PORT=8080
OPENAI_API_KEY=sk-your-key
FROSTY_DEFAULT_PROVIDER=openai
FROSTY_PG_URL=postgres://user:pass@db.internal:5432/frosty
FROSTY_PG_DIRECT_URL=postgres://user:pass@db.internal:5432/frosty
FROSTY_ADMIN_TOKEN=replace-me
FROSTY_ALLOWED_HOSTS=gw.example.com
FROSTY_LOG_STORE=pg
FROSTY_SHARED_RATE_LIMIT=on
FROSTY_ENCRYPTION_KEY=base64-encoded-32-byte-key
```
## Security best practices
- Never commit provider keys, cloud credentials, admin tokens, or encryption
keys.
- Prefer environment injection from a secret store or deployment platform rather
than a committed `.env` file.
- Rotate `FROSTY_ADMIN_TOKEN`, provider API keys, and `FROSTY_ENCRYPTION_KEY`
according to your operational policy.
- Treat `FROSTY_LOG_CONTENT` as a privacy-sensitive switch and leave it off
unless content capture is explicitly required.
- Do not embed credentials in proxy URLs; the provider-config schema separates
proxy credentials from proxy URL fields for that reason.
## Troubleshooting
- If the gateway refuses to boot, verify `FROSTY_PG_URL` connectivity first.
PostgreSQL is a hard dependency on the production path.
- If config changes do not appear across replicas, check `FROSTY_PG_DIRECT_URL`
and `FROSTY_CONFIG_RECONCILE_MS`.
- If semantic cache lookups never hit, verify `FROSTY_CACHE=semantic`,
`FROSTY_VECTOR_STORE=pgvector`, and `FROSTY_CACHE_EMBED_MODEL` against
`GET /v1/models`.
- If admin writes are rejected cross-origin, check `FROSTY_ALLOWED_HOSTS` and
confirm the request is targeting `/api/*` from an allowed host.
- If trace export is missing, verify `OTEL_EXPORTER_OTLP_ENDPOINT` and the
observability profile services.
- If encrypted config becomes unreadable, confirm `FROSTY_ENCRYPTION_KEY` is
still present and, during rotation, that `FROSTY_ENCRYPTION_KEY_OLD` matches
the previous key.