Configuration Options
Every supported key, grouped as in config.yaml. Defaults marked "none" mean the field can be omitted.
| Field | Description | Required / Default |
|---|---|---|
server.listen | HTTP listen address | Yes |
server.max_concurrency | Max concurrent /v1/* requests | 1024 |
devin.base_url | Devin Connect service base URL | Yes (config.example.yaml uses https://server.codeium.com) |
devin.accounts | Upstream account pool entries {name, token, credentials_file, api_key, priority, max_rpm} — at least one credential source per entry; empty list = legal empty pool | No — /v1 returns unavailable until an account exists |
devin.model | Devin chat model UID (e.g. swe-2-max) | Yes |
devin.aliases | Client model name → upstream UID map (swe-2: swe-2-max); match order exact → case-insensitive → "*" catch-all; aliases appear in /v1/models with alias_of | none |
devin.client_name/client_version/client_os | Client identity sent in upstream metadata | chisel / 3000.2.17 / mac |
devin.proxy | Upstream proxy URL (http(s)://, socks5(h)://); empty = direct / env vars | none |
devin.force_http1 | Per-request TCP connections to upstream (avoids HTTP/2 stream serialization) | true |
devin.max_rpm | Message rate limit to upstream (msgs/min, token bucket); <=0 unlimited — the 429 cooldown latch applies either way | 0 (unlimited; config.example.yaml ships 80) |
devin.gate_max_hold_seconds | Max seconds a request may queue outside the latch for its next send window before fast-fail 429 + Retry-After | 30 |
devin.gate_drip_interval_seconds | Probe release interval inside a latch — paces upstream arrivals and unlatch detection while limited | 8 |
devin.gate_default_latch_seconds | Fallback latch duration when upstream resource_exhausted doesn't declare a reset time | 60 |
devin.gate_window_offset_seconds | Estimated position of the upstream minute-bucket boundary inside the local minute | 0 |
devin.gate_window_guard_seconds | Dead zone on both sides of the estimated bucket boundary — requests inside it sleep until the next window | 2 |
devin.gate_bg_max_hold_seconds | Queued-wait budget for bg-class tokens inside the gate — unattended batch traffic can afford to wait | 120 |
devin.gate_bg_reserve_margin | Fixed safety margin (requests) in the bg admission reserve formula — the last slots stay unreachable to bg so fg always has headroom | 4 |
devin.warm_prefix_* | Prefix-replay warming family — replays retained session prefixes on a cadence to renew the upstream prompt cache across long subagent waits; key list in config.example.yaml | warm_prefix_enabled: false |
devin.session_affinity_ttl_seconds | Sliding TTL for session→lane bindings (renewed on every hit) | 3600 |
devin.quota_low_threshold_percent | Weekly-quota percent below which a lane is demoted behind healthy lanes for new sessions (bound sessions unaffected) | 15 |
devin.no_progress_timeout_seconds | No-progress watchdog once content has started flowing — upstream can compute tool-call arguments silently for 15–25 min sending only heartbeats, so this must stay well above that | 2700 |
devin.pre_event_no_progress_timeout_seconds | No-progress watchdog before the first decodable event; total pre-event silence is separately hard-capped at 180s (from first send, cumulative across stream reopens) — raising this can't extend that cap | 600 |
debug.enabled | Record per-request debug payload into devin-2api.db in the state dir | false (config.example.yaml ships true) |
debug.retention_days | Days to keep per-request debug records; <=0 disables time-based cleanup | 14 |
debug.max_total_mb | Total debug payload cap (MB); evicts oldest request groups first | 1024 |
debug.payload_hours | Hours before large stage payloads are stripped, keeping meta/error evidence | 24 |
debug.keep_error_dirs | Newest N failed request groups protected from size eviction | 32 |
debug.errors_only | Keep debug payloads only for failed or suspect requests — clean completions drop their payload at finish; panel key debug_log_errors_only, hot-changeable | false |
debug.quota_interval_minutes | Quota snapshot interval into the quota_samples table; <=0 disables | 5 |
debug.pprof_listen | Separate listen address for the pprof/fgprof profiling endpoints (e.g. 127.0.0.1:6060); unauthenticated — loopback only | empty (disabled) |
dashboard.password | /web admin password; empty = no login required | none |
