Configuration Reference¶
Complete reference for all Olla configuration options.
Default Configuration
Minimal Setup: Olla starts with sensible defaults - just runserver: host: "localhost" port: 40114 proxy: engine: "olla" load_balancer: "least-connections" discovery: model_discovery: enabled: true interval: 5m logging: level: "info" format: "json"ollaand it works!Environment Variables: A curated set of settings support
OLLA_env var overrides (e.g.,OLLA_SERVER_PORT=8080). See Environment Variables for the full list.
Configuration Structure¶
server: # HTTP server configuration
proxy: # Proxy engine settings
discovery: # Endpoint discovery
model_registry: # Model management
translators: # API translation (e.g., Anthropic ↔ OpenAI)
logging: # Logging configuration
engineering: # Debug features
Server Configuration¶
HTTP server and security settings.
Basic Settings¶
| Field | Type | Default | Description |
|---|---|---|---|
host | string | "localhost" | Network interface to bind |
port | int | 40114 | TCP port to listen on |
request_logging | bool | true | Enable request logging |
Example:
Timeouts¶
| Field | Type | Default | Description |
|---|---|---|---|
read_timeout | duration | 30s | Time to read request |
read_header_timeout | duration | 10s | Max time to read request headers. Protects against Slowloris attacks; unset defaults to 10s. |
write_timeout | duration | 0s | Response write timeout (must be 0 for streaming) |
idle_timeout | duration | 0s | Keep-alive timeout (0 = use read_timeout) |
shutdown_timeout | duration | 10s | Graceful shutdown timeout |
Example:
server:
read_timeout: 30s
read_header_timeout: 10s
write_timeout: 0s # Required for streaming
idle_timeout: 120s
shutdown_timeout: 30s
Request Limits¶
| Field | Type | Default | Description |
|---|---|---|---|
request_limits.max_body_size | int64 | 104857600 | Max request body (100MB) |
request_limits.max_header_size | int64 | 1048576 | Max header size (1MB) |
Example:
server:
request_limits:
max_body_size: 52428800 # 50MB (typical production value)
max_header_size: 524288 # 512KB
Rate Limits¶
| Field | Type | Default | Description |
|---|---|---|---|
rate_limits.global_requests_per_minute | int | 1000 | Global rate limit (0=disabled) |
rate_limits.per_ip_requests_per_minute | int | 100 | Per-IP rate limit (0=disabled) |
rate_limits.health_requests_per_minute | int | 1000 | Health endpoint limit |
rate_limits.burst_size | int | 50 | Token bucket burst size |
rate_limits.cleanup_interval | duration | 5m | Rate limiter cleanup |
rate_limits.trust_proxy_headers | bool | false | Trust X-Forwarded-For |
rate_limits.trusted_proxy_cidrs | []string | ["127.0.0.0/8","10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"] | Trusted proxy CIDRs |
Example:
server:
rate_limits:
global_requests_per_minute: 10000
per_ip_requests_per_minute: 100
health_requests_per_minute: 5000
burst_size: 50
cleanup_interval: 5m
trust_proxy_headers: true
trusted_proxy_cidrs:
- "10.0.0.0/8"
- "172.16.0.0/12"
CORS¶
Cross-Origin Resource Sharing settings. Only relevant when browser clients (OpenWebUI, custom dashboards) connect directly to Olla. Disabled by default; non-browser clients (curl, SDKs, coding agents) are unaffected regardless of this setting.
| Field | Type | Default | Description |
|---|---|---|---|
cors.enabled | bool | false | Enable CORS middleware |
cors.allowed_origins | []string | ["*"] | Permitted origins. Must be explicit URLs when allow_credentials is true |
cors.allowed_methods | []string | ["GET","POST","OPTIONS"] | Permitted HTTP methods |
cors.allowed_headers | []string | ["*"] | Permitted request headers |
cors.exposed_headers | []string | [] | Response headers exposed to browser JS. Empty = auto-expose full X-Olla-* set |
cors.allow_credentials | bool | false | Send Access-Control-Allow-Credentials: true |
cors.max_age | int | 300 | Preflight cache duration in seconds |
Credentials + wildcard origin
Setting allow_credentials: true with allowed_origins: ["*"] is forbidden by the CORS spec. Olla rejects this combination at startup with a fatal error. List explicit origins when credentials are required.
Example:
server:
cors:
enabled: true
allowed_origins:
- "http://localhost:3000"
allow_credentials: true
max_age: 600
Proxy Configuration¶
Proxy engine and request handling settings.
Basic Settings¶
| Field | Type | Default | Description |
|---|---|---|---|
engine | string | "olla" | Proxy engine (olla or sherpa; sherpa is in maintenance mode) |
profile | string | "auto" | Proxy profile (auto, streaming, standard) |
load_balancer | string | "least-connections" | Load balancer strategy (round-robin, least-connections, priority) |
Example:
Connection Settings¶
| Field | Type | Default | Description |
|---|---|---|---|
connection_timeout | duration | 60s | Backend connection timeout |
connection_keep_alive | duration | 30s | TCP keep-alive interval for backend connections |
response_timeout | duration | 15m | Response timeout |
read_timeout | duration | 10m | Read timeout |
response_header_timeout | duration | 30s | Max wait for the backend's first response header. Raise it for backends that load models on demand (e.g. Lemonade), where the first request blocks until the model is resident and the 30s default would abort the cold start. |
tls_handshake_timeout | duration | 10s | Maximum time allowed for a TLS handshake with a backend |
Example:
proxy:
connection_timeout: 45s
connection_keep_alive: 30s
response_timeout: 0s # Disable for streaming
read_timeout: 0s
response_header_timeout: 180s # allow slow on-demand model loads
tls_handshake_timeout: 10s
Retry Behaviour¶
As of v0.0.16, the retry mechanism is automatic and built-in for connection failures. When a connection error occurs (e.g., connection refused, network unreachable, timeout), Olla will automatically:
- Mark the failed endpoint as unhealthy
- Try the next available healthy endpoint
- Continue until a successful connection is made or all endpoints have been tried
- Use exponential backoff for unhealthy endpoints to prevent overwhelming them
Note: The fields max_retries and retry_backoff that may still appear in your proxy: section are deprecated struct stubs. The retry: block (with enabled, on_connection_failure, max_attempts) that appears in the shipped config.yaml as a comment template has no corresponding struct in the config schema and is silently ignored if set. Retry behaviour is automatic and built-in; none of these fields have any effect.
Streaming Settings¶
| Field | Type | Default | Description |
|---|---|---|---|
stream_buffer_size | int | 8192 | Stream buffer size (bytes) |
Example:
Profile Filtering¶
Control which inference profiles are loaded at startup. See Filter Concepts for pattern details.
| Field | Type | Default | Description |
|---|---|---|---|
profile_filter.include | []string | [] | Profiles to include (glob patterns) |
profile_filter.exclude | []string | [] | Profiles to exclude (glob patterns) |
Example:
proxy:
profile_filter:
include:
- "ollama" # Include Ollama
- "openai*" # Include all OpenAI variants
exclude:
- "*test*" # Exclude test profiles
- "*debug*" # Exclude debug profiles
Sticky Sessions¶
KV-cache affinity routing for multi-turn LLM conversations. See Sticky Sessions for a full explanation.
| Field | Type | Default | Description |
|---|---|---|---|
sticky_sessions.enabled | bool | false | Enable affinity routing (opt-in) |
sticky_sessions.idle_ttl_seconds | int | 600 | Sliding TTL in seconds; 0 = no TTL expiry |
sticky_sessions.max_sessions | uint64 | 10000 | LRU capacity; oldest entry evicted when full |
sticky_sessions.key_sources | []string | ["session_header","prefix_hash","auth_header"] | Ordered key source cascade; first match wins |
sticky_sessions.prefix_hash_bytes | int | 512 | Bytes of the messages field to hash for prefix_hash |
Environment Variable: OLLA_PROXY_STICKY_SESSIONS_ENABLED (only enabled is exposed as an env var)
Example:
proxy:
sticky_sessions:
enabled: true # opt-in
idle_ttl_seconds: 600 # 10-min sliding window
max_sessions: 10000 # LRU cap
key_sources:
- "session_header" # X-Olla-Session-ID header
- "prefix_hash" # hash of messages prefix
- "auth_header" # hash of Authorization header
# - "ip" # client IP (unreliable behind NAT)
prefix_hash_bytes: 512
Discovery Configuration¶
Endpoint discovery and health checking.
Discovery Type¶
| Field | Type | Default | Description |
|---|---|---|---|
type | string | "static" | Discovery type (only static supported) |
refresh_interval | duration | 30s | Discovery refresh interval |
Example:
Static Endpoints¶
| Field | Type | Required | Description |
|---|---|---|---|
static.endpoints[].url | string | Yes | Endpoint base URL |
static.endpoints[].name | string | Yes | Unique endpoint name |
static.endpoints[].type | string | Yes | Backend type (ollama, lm-studio, llamacpp, vllm, vllm-mlx, sglang, lemonade, litellm, lmdeploy, docker-model-runner, omlx, openai-compatible). openai is accepted as an alias for openai-compatible. |
static.endpoints[].priority | int | No | Selection priority (higher=preferred, default: 100) |
static.endpoints[].preserve_path | bool | No | Preserve base path in URL when proxying (default: false) |
static.endpoints[].health_check_url | string | No | Health check path (optional, uses profile default if not specified) |
static.endpoints[].model_url | string | No | Model discovery path (optional, uses profile default if not specified) |
static.endpoints[].check_interval | duration | No | Health check interval (default: 5s) |
static.endpoints[].check_timeout | duration | No | Health check timeout (default: 2s) |
static.endpoints[].model_filter | object | No | Model filtering for this endpoint |
static.endpoints[].auth | object | No | Outbound authentication credentials (see below) |
static.endpoints[].headers | map[string]string | No | Custom outbound headers applied on every forwarded request |
Endpoint Authentication (auth:)¶
Attaches credentials to requests forwarded from Olla to a backend. See Endpoint Authentication for the full guide.
| Field | Type | Description |
|---|---|---|
auth.type | string | bearer, api_key, or basic |
auth.token | string | Bearer token value. Sends Authorization: Bearer <token>. Mutually exclusive with token_file. |
auth.token_file | string | Path to a file containing the bearer token. |
auth.key | string | API key value. Mutually exclusive with key_file. |
auth.key_file | string | Path to a file containing the API key. |
auth.header | string | Header name for api_key type (default: X-Api-Key). |
auth.username | string | Username for basic type. Mutually exclusive with username_file. |
auth.username_file | string | Path to a file containing the username. |
auth.password | string | Password for basic type. Mutually exclusive with password_file. |
auth.password_file | string | Path to a file containing the password. |
${VAR} interpolation works on every value field. _file fields read and trim the file contents at startup. Setting both the inline field and its _file sibling is a fatal error, as is an unresolved ${VAR} with no default.
Bearer example:
discovery:
static:
endpoints:
- url: "http://gpu-server:8000"
name: "vllm-gpu"
type: "vllm"
auth:
type: bearer
token: "${VLLM_API_KEY}"
API key with custom header:
- url: "http://custom-gw:9000"
name: "custom-gw"
type: "openai-compatible"
auth:
type: api_key
key: "${CUSTOM_API_KEY}"
header: "X-Api-Key"
headers:
X-Tenant-ID: "team-a"
Custom Outbound Headers (headers:)¶
headers: is a free-form map of header names to values. All entries are copied verbatim onto every request forwarded to that endpoint. auth: and headers: can coexist; the auth: block always wins for its own credential header. ${VAR} interpolation applies to values.
- url: "http://custom-llm:9000"
name: "custom"
type: "openai-compatible"
headers:
X-Tenant-ID: "acme"
X-Request-Source: "olla"
URL Configuration¶
The health_check_url and model_url fields are optional. When not specified, Olla uses profile-specific defaults based on the endpoint type:
Profile Defaults:
| Endpoint Type | Default health_check_url | Default model_url |
|---|---|---|
ollama | / | /api/tags |
llamacpp | /health | /v1/models |
lm-studio | /v1/models | /api/v0/models |
vllm | /health | /v1/models |
sglang | /health | /v1/models |
openai-compatible (or openai) | /v1/models | /v1/models |
auto (or unknown) | / | /v1/models |
Both fields support:
-
Relative paths (recommended) - joined with the endpoint base URL:
-
Absolute URLs - used as-is for external services:
When using relative paths, any base path prefix in the endpoint URL is automatically preserved (e.g., http://localhost:8080/api/ + /v1/models = http://localhost:8080/api/v1/models).
Endpoint Model Filtering¶
Filter models at the endpoint level during discovery. See Filter Concepts for pattern syntax.
| Field | Type | Description |
|---|---|---|
model_filter.include | []string | Models to include (glob patterns) |
model_filter.exclude | []string | Models to exclude (glob patterns) |
Path Preservation¶
The preserve_path field controls how Olla handles base paths in endpoint URLs during proxying. This is particularly important for endpoints that serve multiple services or use path-based routing.
Default Behaviour (preserve_path: false) When preserve_path is false (default), Olla strips the base path from the endpoint URL before proxying:
- Endpoint URL:
http://localhost:8080/api/v1 - Request to Olla:
/v1/chat/completions - Proxied to:
http://localhost:8080/v1/chat/completions(base path/api/v1is replaced)
Path Preservation (preserve_path: true) When preserve_path is true, Olla preserves the base path:
- Endpoint URL:
http://localhost:8080/api/v1 - Request to Olla:
/v1/chat/completions - Proxied to:
http://localhost:8080/api/v1/v1/chat/completions(base path is preserved)
When to Use Path Preservation:
- APIs deployed behind path-based routers
- Services that require specific URL structures
- Multi-service endpoints using path differentiation
Docker Model Runner's shipped profile does not require preserve_path: use pathless endpoint URLs such as http://localhost:12434, and the profile forwards DMR routes such as /engines/v1/chat/completions and /anthropic/v1/messages unchanged.
Example:
discovery:
static:
endpoints:
# Minimal configuration - uses profile defaults
- url: "http://localhost:11434"
name: "local-ollama"
type: "ollama"
priority: 100
# health_check_url: "/" (default for ollama)
# model_url: "/api/tags" (default for ollama)
# Custom health check URL
- url: "http://localhost:8080"
name: "llamacpp-server"
type: "llamacpp"
priority: 90
health_check_url: "/health"
# model_url: "/v1/models" (default for llamacpp)
# Endpoint with base path - URLs are preserved
- url: "http://localhost:8080/api/"
name: "vllm-gateway"
type: "vllm"
priority: 80
# health_check_url: "/health" -> http://localhost:8080/api/health
# model_url: "/v1/models" -> http://localhost:8080/api/v1/models
# External health check on different host
- url: "http://localhost:11434"
name: "monitored-ollama"
type: "ollama"
health_check_url: "http://monitoring.local:9090/health/ollama"
# Absolute URL used as-is
# Docker Model Runner - pathless base URL, profile routes handle /engines/...
- url: "http://localhost:12434"
name: "docker-model-runner"
type: "docker-model-runner"
# Endpoint with model filtering
- url: "http://remote:11434"
name: "remote-ollama"
type: "ollama"
priority: 50
check_interval: 60s
model_filter:
include:
- "llama*" # Only Llama models
- "mistral*" # And Mistral models
Model Discovery¶
| Field | Type | Default | Description |
|---|---|---|---|
model_discovery.enabled | bool | true | Enable model discovery |
model_discovery.interval | duration | 5m | Discovery interval |
model_discovery.timeout | duration | 30s | Discovery timeout |
model_discovery.concurrent_workers | int | 5 | Parallel workers |
model_discovery.retry_attempts | int | 3 | Retry attempts |
model_discovery.retry_backoff | duration | 1s | Retry backoff |
Example:
discovery:
model_discovery:
enabled: true
interval: 10m
timeout: 30s
concurrent_workers: 10
retry_attempts: 3
retry_backoff: 1s
Model Registry Configuration¶
Model management and unification settings.
Registry Type¶
| Field | Type | Default | Description |
|---|---|---|---|
type | string | "memory" | Registry type (only memory supported) |
enable_unifier | bool | true | Enable model unification |
routing_strategy.type | string | "strict" | Model routing strategy (strict/optimistic/discovery) |
Example:
model_registry:
type: "memory"
enable_unifier: true
routing_strategy:
type: strict # Default: only route to endpoints with the model
Model Routing Strategy¶
Controls how requests are routed when models aren't available on all endpoints:
| Field | Type | Default | Description |
|---|---|---|---|
routing_strategy.type | string | "strict" | Strategy: strict, optimistic, or discovery |
routing_strategy.options.fallback_behavior | string | "compatible_only" | Fallback: compatible_only, all, or none |
routing_strategy.options.discovery_timeout | duration | 2s | Timeout for discovery refresh |
routing_strategy.options.discovery_refresh_on_miss | bool | false | Refresh discovery when model not found |
Example configurations:
# Production - strict routing
model_registry:
routing_strategy:
type: strict
# Development - optimistic with fallback
model_registry:
routing_strategy:
type: optimistic
options:
fallback_behavior: compatible_only
# Dynamic environments - discovery mode
model_registry:
routing_strategy:
type: discovery
options:
discovery_refresh_on_miss: true
discovery_timeout: 2s
Unification Settings¶
| Field | Type | Default | Description |
|---|---|---|---|
unification.enabled | bool | true | Enable unification |
unification.stale_threshold | duration | 24h | How long to retain a model after it was last seen |
unification.cleanup_interval | duration | 10m | How often to evict stale models |
unification.cache_ttl | duration | 10m | Cache TTL |
Example:
model_registry:
unification:
enabled: true
stale_threshold: 12h
cleanup_interval: 15m
cache_ttl: 10m
Custom Unification Rules¶
| Field | Type | Description |
|---|---|---|
unification.custom_rules[].platform | string | Platform to apply rules |
unification.custom_rules[].name_patterns | map | Name pattern mappings |
unification.custom_rules[].family_overrides | map | Family overrides |
Example:
model_registry:
unification:
custom_rules:
- platform: "ollama"
name_patterns:
"llama3.*": "llama3"
"mistral.*": "mistral"
family_overrides:
"llama3": "meta-llama"
Model Aliases Configuration¶
Define virtual model names that map to platform-specific model names across different backends.
Model Alias Mapping¶
| Field | Type | Default | Description |
|---|---|---|---|
model_aliases | map[string][]string | nil | Map of alias name → list of actual model names |
Each key is the virtual model name clients will use. Each value is a list of actual model names that backends may serve the model under. When a request matches an alias, Olla resolves endpoints for all listed model names and rewrites the request body to the correct name for the selected backend.
Example:
model_aliases:
my-llama:
- "llama3.1:8b" # Ollama
- llama-3.1-8b-instruct # LM Studio
- Meta-Llama-3.1-8B-Instruct.gguf # llamacpp
my-codegen:
- "qwen2.5-coder:7b" # Ollama
- qwen2.5-coder-7b-instruct # LM Studio
Note
Alias names take priority over standard model routing. If no endpoints are found for the alias, Olla falls back to standard routing using the alias name as a regular model name. See Model Aliases for details.
Routing Response Headers¶
Routing decisions are exposed via response headers:
| Header | Description |
|---|---|
X-Olla-Routing-Strategy | Strategy used (strict/optimistic/discovery) |
X-Olla-Routing-Decision | Action taken (routed/fallback/rejected) |
X-Olla-Routing-Reason | Human-readable reason for decision |
The routing strategy itself is configured under model_registry.routing_strategy. See Model Registry Configuration above.
Translators Configuration¶
API translation settings. Translators enable clients designed for one API format to work with backends that use a different format.
Anthropic Translation (v0.0.20+) Enabled by default. Still actively being improved -- please report any issues or feedback.
Anthropic Translator¶
The Anthropic translator enables Claude-compatible clients (Claude Code, OpenCode, Crush CLI) to work with OpenAI-compatible backends.
| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | true | Master switch for the Anthropic translator. When false, the /olla/anthropic/v1/* endpoints do not exist. |
passthrough_enabled | bool | true | Optimisation mode (only applies when enabled: true). When true, requests are forwarded directly to backends with native Anthropic support for zero translation overhead. When false, all requests go through the Anthropic-to-OpenAI translation pipeline regardless of backend capabilities. |
max_message_size | int | 10485760 | Maximum request body size in bytes (10MB default). |
Two-Level Control: enabled + passthrough_enabled¶
The Anthropic translator uses a two-level configuration model:
enabledis the master switch. Whenfalse, the translator is completely disabled and thepassthrough_enabledsetting has no effect. It istrueby default.passthrough_enabledis the optimisation flag. It only takes effect whenenabled: true.
When both are active, passthrough mode also requires that the backend profile declares native Anthropic support via api.anthropic_support.enabled: true. Both conditions must be true for passthrough to activate:
translators.anthropic.passthrough_enabled: true(global configuration)- Backend profile has
api.anthropic_support.enabled: true(per-backend profile)
If either condition is false, Olla falls back to translation mode automatically.
Examples¶
Enable translator with passthrough (recommended for production):
translators:
anthropic:
enabled: true
passthrough_enabled: true # Forward directly to backends with native Anthropic support
max_message_size: 10485760 # 10MB
Enable translator with translation only (useful for debugging/testing):
translators:
anthropic:
enabled: true
passthrough_enabled: false # Always translate Anthropic ↔ OpenAI format
max_message_size: 10485760
Disable translator entirely:
translators:
anthropic:
enabled: false
# passthrough_enabled has no effect when enabled=false
passthrough_enabled: true
Performance Implications¶
| Mode | Overhead | When Used |
|---|---|---|
| Passthrough | Near-zero (~0ms) | passthrough_enabled: true and backend has native Anthropic support |
| Translation | ~1-5ms per request | passthrough_enabled: false, or backend lacks native Anthropic support |
| Disabled | N/A | enabled: false -- endpoints return 404 |
Detecting the Active Mode¶
Check the X-Olla-Mode response header:
X-Olla-Mode: passthrough-- passthrough mode was used- Header absent -- translation mode was used
Inspector (Development Only)¶
Do not enable in production -- logs full request/response bodies including potentially sensitive user data.
| Field | Type | Default | Description |
|---|---|---|---|
inspector.enabled | bool | false | Enable request/response logging |
inspector.output_dir | string | "logs/inspector/anthropic" | Directory for log output |
inspector.session_header | string | "X-Session-ID" | Header for session grouping |
See Anthropic Inspector for details.
Logging Configuration¶
Application logging settings.
| Field | Type | Default | Description |
|---|---|---|---|
level | string | "info" | Log level (debug, info, warn, error) |
format | string | "json" | Log format (json or text) |
output | string | "stdout" | Output destination |
Example:
Log levels:
debug: Detailed debugging informationinfo: Normal operational messageswarn: Warning conditionserror: Error conditions only
Engineering Configuration¶
Debug and development features.
| Field | Type | Default | Description |
|---|---|---|---|
show_nerdstats | bool | false | Show memory stats on shutdown |
Example:
When enabled, displays:
- Memory allocation statistics
- Garbage collection metrics
- Goroutine counts
- Runtime information
Environment Variables¶
Only the variables listed below are recognised. They are each hand-mapped in internal/config/config.go; arbitrary OLLA_* names are not auto-derived from YAML paths. Anything you set that isn't in this list will be silently ignored.
When set, an environment variable overrides the value loaded from the YAML config.
Bootstrap and Runtime (read in main.go)¶
These control startup behaviour and are read before the YAML config is loaded.
| Variable | Default | Description |
|---|---|---|
OLLA_CONFIG_FILE | (unset) | Path to a YAML config file. CLI flags -c / --config take precedence. |
OLLA_ENABLE_PROFILER | false | When true, starts a pprof server on localhost:19841 (/debug/pprof/). Same effect as --profile. |
OLLA_SHOW_VERSION | false | When true, prints the full version banner and exits. Same effect as --version. |
OLLA_LOG_LEVEL | info | Logger level (debug, info, warn, error) for the bootstrap logger only. Active before the YAML config is parsed. Use OLLA_LOGGING_LEVEL to set the level for the runtime logger after config load. |
OLLA_PRETTY_LOGS | true | When true, renders structured logs with colour and aligned columns. Set false for plain JSON-friendly output in CI/containers. |
OLLA_FILE_OUTPUT | true | When true, also writes logs to rotating files under OLLA_LOG_DIR. |
OLLA_LOG_DIR | ./logs | Directory for rotated log files. Created on demand. |
OLLA_LOG_SIZE_MB | 1 | Maximum size of each log file before rotation, in megabytes. |
OLLA_LOG_MAX_BACKUPS | 7 | Number of rotated log files to keep. |
OLLA_LOG_MAX_AGE_DAYS | 14 | Maximum age in days for rotated log files before they're pruned. |
OLLA_THEME | default | Console theme name. Affects coloured output of the styled logger. |
Server¶
| Variable | Maps to | Notes |
|---|---|---|
OLLA_SERVER_HOST | server.host | |
OLLA_SERVER_PORT | server.port | |
OLLA_SERVER_READ_TIMEOUT | server.read_timeout | Go duration string. |
OLLA_SERVER_READ_HEADER_TIMEOUT | server.read_header_timeout | Go duration string. Guards against Slowloris; defaults to 10s. |
OLLA_SERVER_WRITE_TIMEOUT | server.write_timeout | Keep at 0s for streaming. |
OLLA_SERVER_MAX_BODY_SIZE | server.request_limits.max_body_size | Bytes. |
OLLA_SERVER_MAX_HEADER_SIZE | server.request_limits.max_header_size | Bytes. |
OLLA_SERVER_GLOBAL_RATE_LIMIT | server.rate_limits.global_requests_per_minute | |
OLLA_SERVER_PER_IP_RATE_LIMIT | server.rate_limits.per_ip_requests_per_minute | |
OLLA_SERVER_RATE_BURST_SIZE | server.rate_limits.burst_size | |
OLLA_SERVER_HEALTH_RATE_LIMIT | server.rate_limits.health_requests_per_minute | |
OLLA_SERVER_RATE_CLEANUP_INTERVAL | server.rate_limits.cleanup_interval | |
OLLA_SERVER_TRUST_PROXY_HEADERS | server.rate_limits.trust_proxy_headers | true/false. |
OLLA_SERVER_TRUSTED_PROXY_CIDRS | server.rate_limits.trusted_proxy_cidrs | Comma-separated CIDRs. |
OLLA_SERVER_CORS_ENABLED | server.cors.enabled | true/false. |
OLLA_SERVER_CORS_ALLOWED_ORIGINS | server.cors.allowed_origins | Comma-separated origin URLs. No surrounding spaces. |
OLLA_SERVER_CORS_ALLOWED_METHODS | server.cors.allowed_methods | Comma-separated HTTP methods. |
OLLA_SERVER_CORS_ALLOWED_HEADERS | server.cors.allowed_headers | Comma-separated header names. |
OLLA_SERVER_CORS_EXPOSED_HEADERS | server.cors.exposed_headers | Comma-separated header names. Empty = auto-expose X-Olla-* set. |
OLLA_SERVER_CORS_ALLOW_CREDENTIALS | server.cors.allow_credentials | true/false. Incompatible with allowed_origins: ["*"]. |
OLLA_SERVER_CORS_MAX_AGE | server.cors.max_age | Preflight cache seconds (int). |
Proxy¶
| Variable | Maps to | Notes |
|---|---|---|
OLLA_PROXY_ENGINE | proxy.engine | olla (default) or sherpa. |
OLLA_PROXY_PROFILE | proxy.profile | auto, streaming, standard. |
OLLA_PROXY_LOAD_BALANCER | proxy.load_balancer | least-connections (default), priority, round-robin. |
OLLA_PROXY_RESPONSE_TIMEOUT | proxy.response_timeout | Go duration string. |
OLLA_PROXY_READ_TIMEOUT | proxy.read_timeout | Go duration string. |
OLLA_PROXY_RESPONSE_HEADER_TIMEOUT | proxy.response_header_timeout | Go duration string. Max wait for a backend's first response header. |
OLLA_PROXY_TLS_HANDSHAKE_TIMEOUT | proxy.tls_handshake_timeout | Go duration string. Max time for a TLS handshake with a backend. |
OLLA_PROXY_CONNECTION_KEEP_ALIVE | proxy.connection_keep_alive | Go duration string. TCP keep-alive interval for backend connections. |
OLLA_PROXY_STICKY_SESSIONS_ENABLED | proxy.sticky_sessions.enabled | Only the master switch is exposed. Other sticky-session fields are YAML-only. |
Logging and Diagnostics¶
The variables below override the logging: config section and take effect after the YAML config is parsed. For the bootstrap logger (before config load), use OLLA_LOG_LEVEL and the OLLA_LOG_* file-rotation vars in the Bootstrap and Runtime table above.
| Variable | Maps to | Notes |
|---|---|---|
OLLA_LOGGING_LEVEL | logging.level | Runtime log level. Overrides logging.level in YAML. |
OLLA_LOGGING_FORMAT | logging.format | json or text. Overrides logging.format in YAML. |
OLLA_SHOW_NERD_STATS | engineering.show_nerdstats | true/false. Prints memory/GC/goroutine stats on shutdown. |
Model Registry¶
| Variable | Maps to | Notes |
|---|---|---|
OLLA_MODEL_REGISTRY_TYPE | model_registry.type | Currently only memory. |
OLLA_MODEL_UNIFIER_ENABLED | model_registry.enable_unifier | true/false. |
OLLA_MODEL_UNIFIER_CACHE_TTL | model_registry.unification.cache_ttl | Go duration string. |
Translators¶
| Variable | Maps to | Notes |
|---|---|---|
OLLA_TRANSLATORS_ANTHROPIC_ENABLED | translators.anthropic.enabled | Master switch for the Anthropic Messages API translator. |
OLLA_TRANSLATORS_ANTHROPIC_PASSTHROUGH_ENABLED | translators.anthropic.passthrough_enabled | Set false to force every request through the translation pipeline regardless of backend capability. |
OLLA_TRANSLATORS_ANTHROPIC_MAX_MESSAGE_SIZE | translators.anthropic.max_message_size | Bytes. |
Example¶
# Run on port 8080 with the Olla engine, profiling enabled, plain text logs for CI.
OLLA_SERVER_PORT=8080 \
OLLA_PROXY_ENGINE=olla \
OLLA_ENABLE_PROFILER=true \
OLLA_PRETTY_LOGS=false \
./olla
Duration Format¶
Duration values use Go duration syntax:
s- seconds (e.g.,30s)m- minutes (e.g.,5m)h- hours (e.g.,2h)ms- milliseconds (e.g.,500ms)us- microseconds (e.g.,100us)
Examples:
30s- 30 seconds5m- 5 minutes1h30m- 1 hour 30 minutes500ms- 500 milliseconds
Default Configuration¶
Complete default configuration:
server:
host: "localhost"
port: 40114
read_timeout: 30s
read_header_timeout: 10s
write_timeout: 0s
# idle_timeout: 0s # Optional (0 = use read_timeout)
shutdown_timeout: 10s
request_logging: true
request_limits:
max_body_size: 104857600 # 100MB
max_header_size: 1048576 # 1MB
rate_limits:
global_requests_per_minute: 1000
per_ip_requests_per_minute: 100
health_requests_per_minute: 1000
burst_size: 50
cleanup_interval: 5m
trust_proxy_headers: false
trusted_proxy_cidrs:
- "127.0.0.0/8"
- "10.0.0.0/8"
- "172.16.0.0/12"
- "192.168.0.0/16"
proxy:
engine: "olla"
profile: "auto"
load_balancer: "least-connections"
connection_timeout: 60s
response_timeout: 15m
read_timeout: 10m
response_header_timeout: 30s
connection_keep_alive: 30s
tls_handshake_timeout: 10s
# DEPRECATED as of v0.0.16 - retry is now automatic
# max_retries: 3
# retry_backoff: 1s
stream_buffer_size: 8192
discovery:
type: "static"
refresh_interval: 30s
model_discovery:
enabled: true
interval: 5m
timeout: 30s
concurrent_workers: 5
retry_attempts: 3
retry_backoff: 1s
static:
endpoints: []
model_registry:
type: "memory"
enable_unifier: true
routing_strategy:
type: "strict"
options:
fallback_behavior: "compatible_only"
discovery_timeout: 2s
discovery_refresh_on_miss: false
unification:
enabled: true
stale_threshold: 24h
cleanup_interval: 10m
cache_ttl: 10m
custom_rules: []
translators:
anthropic:
enabled: true
passthrough_enabled: true
max_message_size: 10485760 # 10MB
inspector:
enabled: false
output_dir: "logs/inspector/anthropic"
session_header: "X-Session-ID"
logging:
level: "info"
format: "json"
output: "stdout"
engineering:
show_nerdstats: false
Validation¶
Olla validates configuration on startup:
- Required fields are checked
- URLs must be valid
- Durations must parse correctly
- Endpoints must have unique names
- Ports must be in valid range (1-65535)
- CIDR blocks must be valid
Additionally, Olla's Validate() method catches dangerous zero or empty configuration values that would cause panics or silent failures at runtime. It runs after all config sources (file, environment overrides) have been merged, so the final state is what gets checked. The following conditions produce clear error messages at startup:
proxy.engineis emptyproxy.load_balanceris emptydiscovery.typeis emptyserver.portis zero or negative- When
model_discovery.enabledistrue:interval,concurrent_workers, ortimeoutis zero
Next Steps¶
- Configuration Examples - Common configurations
- Best Practices - Production recommendations
- Environment Variables - Override configuration