# Configuration reference Every setting llmgw reads from a file, with the type it takes and what it is for. **Generated from the source.** The descriptions are the comments on the fields themselves, so this cannot describe a setting that does not exist or miss one that does — and a test fails when it has drifted. Do not edit it; edit the comment and run `go generate ./...`. Where a setting takes another block, the block is listed under its own heading rather than repeated. ## Every key | Key | Type | In | |---|---|---| | `name` | `string` | [Adapter](#adapter) | | `source` | `string` | [Adapter](#adapter) | | `scale` | `float64` | [Adapter](#adapter) | | `owner` | `string` | [Adapter](#adapter) | | `enabled` | `bool` | [Admission](#admission) | | `bands` | `[]Band` | [Admission](#admission) | | `default_band` | `string` | [Admission](#admission) | | `band_header` | `string` | [Admission](#admission) | | `queue_ttl` | `time.Duration` | [Admission](#admission) | | `queue_capacity_per_band` | `int` | [Admission](#admission) | | `queue_capacity_total` | `int` | [Admission](#admission) | | `interval` | `time.Duration` | [Admission](#admission) | | `default` | `map[string]any` | [AgentSettings](#agentsettings) | | `nodes` | `map[string]map[string]any` | [AgentSettings](#agentsettings) | | `enabled` | `bool` | [Auth](#auth) | | `store` | `string` | [Auth](#auth) | | `cache_ttl` | `time.Duration` | [Auth](#auth) | | `negative_ttl` | `time.Duration` | [Auth](#auth) | | `default_rpm` | `int` | [Auth](#auth) | | `default_tpm` | `int` | [Auth](#auth) | | `signup_open` | `bool` | [Auth](#auth) | | `oidc` | `OIDC` | [Auth](#auth) | | `ldap` | `LDAP` | [Auth](#auth) | | `scim` | `SCIM` | [Auth](#auth) | | `max_key_ttl` | `time.Duration` | [Auth](#auth) | | `personal` | `Personal` | [Auth](#auth) | | `pricing` | `map[string]Price` | [Auth](#auth) | | `default_price` | `Price` | [Auth](#auth) | | `flush_interval` | `time.Duration` | [Auth](#auth) | | `batch_size` | `int` | [Auth](#auth) | | `buffer_size` | `int` | [Auth](#auth) | | `usage_retention` | `time.Duration` | [Auth](#auth) | | `max_file_bytes` | `int64` | [Batch](#batch) | | `max_lines` | `int` | [Batch](#batch) | | `concurrency` | `int` | [Batch](#batch) | | `retain_days` | `int` | [Batch](#batch) | | `max_bytes` | `int64` | [Cache](#cache) | | `max_entry_bytes` | `int64` | [Cache](#cache) | | `embedding_model` | `string` | [Cache](#cache) | | `model` | `string` | [Canary](#canary) | | `percent` | `int` | [Canary](#canary) | | `min_requests` | `int` | [Canary](#canary) | | `max_error_increase` | `float64` | [Canary](#canary) | | `max_ttft_ratio` | `float64` | [Canary](#canary) | | `tools` | `bool` | [Capabilities](#capabilities) | | `vision` | `bool` | [Capabilities](#capabilities) | | `embeddings` | `bool` | [Capabilities](#capabilities) | | `images` | `bool` | [Capabilities](#capabilities) | | `meshes` | `bool` | [Capabilities](#capabilities) | | `workflow` | `string` | [ComfyUI](#comfyui) | | `checkpoint` | `string` | [ComfyUI](#comfyui) | | `output` | `string` | [ComfyUI](#comfyui) | | `inputs` | `[]Input` | [ComfyUI](#comfyui) | | `nodes` | `[]CustomNode` | [ComfyUI](#comfyui) | | `huggingface_repo` | `string` | [ComfyUI](#comfyui) | | `environment` | `string` | [ComfyUI](#comfyui) | | `dir` | `string` | [ComfyUIConfig](#comfyuiconfig) | | `python` | `string` | [ComfyUIConfig](#comfyuiconfig) | | `interval` | `time.Duration` | [Control](#control) | | `base_backoff` | `time.Duration` | [Control](#control) | | `max_backoff` | `time.Duration` | [Control](#control) | | `unreachable_after` | `time.Duration` | [Control](#control) | | `lost_after` | `time.Duration` | [Control](#control) | | `port_range` | `[]int` | [Control](#control) | | `mgmt_interface` | `string` | [Control](#control) | | `timezone` | `string` | [Control](#control) | | `eval_dir` | `string` | [Control](#control) | | `enabled` | `bool` | [Control](#control) | | `lease_ttl` | `time.Duration` | [Control](#control) | | `repo` | `string` | [CustomNode](#customnode) | | `commit` | `string` | [CustomNode](#customnode) | | `requirements` | `[]string` | [CustomNode](#customnode) | | `build` | `[]string` | [CustomNode](#customnode) | | `id` | `string` | [Endpoint](#endpoint) | | `url` | `string` | [Endpoint](#endpoint) | | `api_key` | `string` | [Endpoint](#endpoint) | | `models` | `[]string` | [Endpoint](#endpoint) | | `engine` | `string` | [Endpoint](#endpoint) | | `workflow` | `string` | [Endpoint](#endpoint) | | `pool` | `string` | [Endpoint](#endpoint) | | `weight` | `float64` | [Endpoint](#endpoint) | | `priority` | `int` | [Endpoint](#endpoint) | | `gpu_class` | `string` | [EngineOverride](#engineoverride) | | `nodes` | `[]string` | [EngineOverride](#engineoverride) | | `labels` | `map[string]string` | [EngineOverride](#engineoverride) | | `engines` | `map[string]string` | [EngineOverride](#engineoverride) | | `suite` | `string` | [EvalGate](#evalgate) | | `min_score` | `float64` | [EvalGate](#evalgate) | | `judge` | `string` | [EvalGate](#evalgate) | | `url` | `string` | [External](#external) | | `model` | `string` | [External](#external) | | `api_key_file` | `string` | [External](#external) | | `api_key_files` | `[]ExternalKey` | [External](#external) | | `peer` | `string` | [External](#external) | | `api` | `string` | [External](#external) | | `workflow` | `string` | [External](#external) | | `output` | `string` | [External](#external) | | `file` | `string` | [ExternalKey](#externalkey) | | `weight` | `float64` | [ExternalKey](#externalkey) | | `budgets` | `[]FacilityBudget` | [Facility](#facility) | | `margin` | `float64` | [Facility](#facility) | | `gpu_watts` | `float64` | [Facility](#facility) | | `cpu_core_watts` | `float64` | [Facility](#facility) | | `node_watts` | `float64` | [Facility](#facility) | | `measured_fresh` | `time.Duration` | [Facility](#facility) | | `domain` | `string` | [FacilityBudget](#facilitybudget) | | `cap_watts` | `float64` | [FacilityBudget](#facilitybudget) | | `other_watts` | `float64` | [FacilityBudget](#facilitybudget) | | `name` | `string` | [Federation](#federation) | | `interval` | `time.Duration` | [Federation](#federation) | | `enabled` | `bool` | [FirewallSettings](#firewallsettings) | | `min_compute_capability` | `float64` | [GPUNeed](#gpuneed) | | `min_memory_gb` | `int` | [GPUNeed](#gpuneed) | | `format` | `string` | [GuardModel](#guardmodel) | | `categories` | `[]string` | [GuardModel](#guardmodel) | | `name` | `string` | [Input](#input) | | `type` | `string` | [Input](#input) | | `required` | `bool` | [Input](#input) | | `default` | `any` | [Input](#input) | | `min` | `*float64` | [Input](#input) | | `max` | `*float64` | [Input](#input) | | `choices` | `[]string` | [Input](#input) | | `max_mb` | `int` | [Input](#input) | | `doc` | `string` | [Input](#input) | | `model` | `string` | [JudgePolicy](#judgepolicy) | | `models` | `[]string` | [JudgePolicy](#judgepolicy) | | `input` | `string` | [JudgePolicy](#judgepolicy) | | `output` | `string` | [JudgePolicy](#judgepolicy) | | `categories` | `[]string` | [JudgePolicy](#judgepolicy) | | `controversial` | `string` | [JudgePolicy](#judgepolicy) | | `latency_budget` | `time.Duration` | [JudgePolicy](#judgepolicy) | | `tokenize_timeout` | `time.Duration` | [KVIndex](#kvindex) | | `min_blocks` | `int` | [KVIndex](#kvindex) | | `max_blocks` | `int` | [KVIndex](#kvindex) | | `urls` | `[]string` | [LDAP](#ldap) | | `start_tls` | `bool` | [LDAP](#ldap) | | `ca_file` | `string` | [LDAP](#ldap) | | `ca` | `string` | [LDAP](#ldap) | | `bind_dn` | `string` | [LDAP](#ldap) | | `bind_password_file` | `string` | [LDAP](#ldap) | | `base_dn` | `string` | [LDAP](#ldap) | | `group_base_dn` | `string` | [LDAP](#ldap) | | `user_filter` | `string` | [LDAP](#ldap) | | `label` | `string` | [LDAP](#ldap) | | `create_accounts` | `bool` | [LDAP](#ldap) | | `roles` | `map[string][]string` | [LDAP](#ldap) | | `memberships` | `map[string]string` | [LDAP](#ldap) | | `sync_interval` | `time.Duration` | [LDAP](#ldap) | | `timeout` | `time.Duration` | [LDAP](#ldap) | | `contact` | `string` | [Landing](#landing) | | `notice` | `string` | [Landing](#landing) | | `language` | `string` | [Landing](#landing) | | `docs_sign_in` | `bool` | [Landing](#landing) | | `id` | `string` | [License](#license) | | `name` | `string` | [License](#license) | | `url` | `string` | [License](#license) | | `notice` | `string` | [License](#license) | | `commercial` | `*bool` | [License](#license) | | `excluded_regions` | `[]string` | [License](#license) | | `revenue_cap_usd` | `int64` | [License](#license) | | `attribution` | `string` | [License](#license) | | `bin` | `string` | [LlamaCppConfig](#llamacppconfig) | | `parallel` | `int` | [LlamaCppConfig](#llamacppconfig) | | `threads` | `int` | [LlamaCppConfig](#llamacppconfig) | | `api` | `string` | [Mirror](#mirror) | | `tls` | `tlsconf.Config` | [Mirror](#mirror) | | `registry` | `string` | [Mirror](#mirror) | | `timeout` | `time.Duration` | [Mirror](#mirror) | | `update_check` | `time.Duration` | [Mirror](#mirror) | | `name` | `string` | [Model](#model) | | `aliases` | `[]string` | [Model](#model) | | `description` | `string` | [Model](#model) | | `source` | `string` | [Model](#model) | | `profiles` | `[]Profile` | [Model](#model) | | `scaling` | `Scaling` | [Model](#model) | | `class` | `string` | [Model](#model) | | `owner` | `string` | [Model](#model) | | `external` | `*External` | [Model](#model) | | `comfyui` | `*ComfyUI` | [Model](#model) | | `license` | `*License` | [Model](#model) | | `adapters` | `[]Adapter` | [Model](#model) | | `max_loaded_adapters` | `int` | [Model](#model) | | `fallbacks` | `[]string` | [Model](#model) | | `canary` | `*Canary` | [Model](#model) | | `eval` | `*EvalGate` | [Model](#model) | | `routing_profile` | `string` | [Model](#model) | | `slo` | `SLO` | [Model](#model) | | `context_length` | `int` | [Model](#model) | | `max_output` | `int` | [Model](#model) | | `capabilities` | `Capabilities` | [Model](#model) | | `query_prefix` | `string` | [Model](#model) | | `role` | `string` | [Model](#model) | | `guard` | `*GuardModel` | [Model](#model) | | `origin` | `*Origin` | [Model](#model) | | `prometheus` | `string` | [Monitoring](#monitoring) | | `window` | `time.Duration` | [Monitoring](#monitoring) | | `timeout` | `time.Duration` | [Monitoring](#monitoring) | | `issuer` | `string` | [OIDC](#oidc) | | `client_id` | `string` | [OIDC](#oidc) | | `client_secret_file` | `string` | [OIDC](#oidc) | | `redirect_url` | `string` | [OIDC](#oidc) | | `label` | `string` | [OIDC](#oidc) | | `scopes` | `[]string` | [OIDC](#oidc) | | `groups_claim` | `string` | [OIDC](#oidc) | | `create_accounts` | `bool` | [OIDC](#oidc) | | `roles` | `map[string][]string` | [OIDC](#oidc) | | `memberships` | `map[string]string` | [OIDC](#oidc) | | `no_passwords` | `bool` | [OIDC](#oidc) | | `mirror` | `string` | [Offline](#offline) | | `checksums` | `string` | [Offline](#offline) | | `evict_after_idle` | `time.Duration` | [OnDemandSettings](#ondemandsettings) | | `min_lifetime` | `time.Duration` | [OnDemandSettings](#ondemandsettings) | | `nvidia_smi` | `string` | [Options](#options) | | `ib_root` | `string` | [Options](#options) | | `prefer_nvml` | `bool` | [Options](#options) | | `skip_gpus` | `bool` | [Options](#options) | | `repo` | `string` | [Origin](#origin) | | `revision` | `string` | [Origin](#origin) | | `files` | `[]OriginFile` | [Origin](#origin) | | `previous` | `*PreviousOrigin` | [Origin](#origin) | | `path` | `string` | [OriginFile](#originfile) | | `sha256` | `string` | [OriginFile](#originfile) | | `bytes` | `int64` | [OriginFile](#originfile) | | `name` | `string` | [Pattern](#pattern) | | `regex` | `string` | [Pattern](#pattern) | | `action` | `string` | [Pattern](#pattern) | | `disabled` | `bool` | [Personal](#personal) | | `rpm` | `int` | [Personal](#personal) | | `tpm` | `int` | [Personal](#personal) | | `budget` | `float64` | [Personal](#personal) | | `period` | `string` | [Personal](#personal) | | `mode` | `string` | [Policy](#policy) | | `fail` | `string` | [Policy](#policy) | | `no_store` | `bool` | [Policy](#policy) | | `input` | `Rules` | [Policy](#policy) | | `output` | `Rules` | [Policy](#policy) | | `tools` | `Tools` | [Policy](#policy) | | `max_output_tokens` | `int` | [Policy](#policy) | | `system_prompt` | `string` | [Policy](#policy) | | `drop_client_system` | `bool` | [Policy](#policy) | | `require_capabilities` | `bool` | [Policy](#policy) | | `validate_structured` | `bool` | [Policy](#policy) | | `judge` | `*JudgePolicy` | [Policy](#policy) | | `services` | `[]Service` | [Policy](#policy) | | `stream` | `string` | [Policy](#policy) | | `enabled` | `bool` | [Prefix](#prefix) | | `max_nodes` | `int` | [Prefix](#prefix) | | `min_match` | `int` | [Prefix](#prefix) | | `ttl` | `time.Duration` | [Prefix](#prefix) | | `match_ratio` | `float64` | [Prefix](#prefix) | | `balance_abs` | `float64` | [Prefix](#prefix) | | `balance_rel` | `float64` | [Prefix](#prefix) | | `auto` | `bool` | [PresetSettings](#presetsettings) | | `source` | `string` | [PreviousOrigin](#previousorigin) | | `revision` | `string` | [PreviousOrigin](#previousorigin) | | `files` | `[]OriginFile` | [PreviousOrigin](#previousorigin) | | `name` | `string` | [Profile](#profile) | | `engine` | `string` | [Profile](#profile) | | `engine_version` | `string` | [Profile](#profile) | | `gpu_class` | `string` | [Profile](#profile) | | `source` | `string` | [Profile](#profile) | | `tp` | `int` | [Profile](#profile) | | `pp` | `int` | [Profile](#profile) | | `gpus_per_node` | `int` | [Profile](#profile) | | `nodes` | `int` | [Profile](#profile) | | `args` | `[]string` | [Profile](#profile) | | `env` | `map[string]string` | [Profile](#profile) | | `min_memory_gb` | `int` | [Profile](#profile) | | `cpu_cores` | `int` | [Profile](#profile) | | `min_disk_gb` | `int` | [Profile](#profile) | | `node_selector` | `map[string]string` | [Profile](#profile) | | `power_watts` | `float64` | [Profile](#profile) | | `keep_within` | `string` | [Profile](#profile) | | `weight` | `float64` | [Profile](#profile) | | `priority` | `int` | [Profile](#profile) | | `startup_timeout` | `time.Duration` | [Profile](#profile) | | `kv_events` | `bool` | [Profile](#profile) | | `gpu` | `*GPUNeed` | [Profile](#profile) | | `comfyui` | `*ProfileComfyUI` | [Profile](#profile) | | `workflow` | `string` | [ProfileComfyUI](#profilecomfyui) | | `checkpoint` | `string` | [ProfileComfyUI](#profilecomfyui) | | `nodes` | `[]CustomNode` | [ProfileComfyUI](#profilecomfyui) | | `activation_wait` | `time.Duration` | [Router](#router) | | `scrape_interval` | `time.Duration` | [Router](#router) | | `scrape_timeout` | `time.Duration` | [Router](#router) | | `stale_after` | `time.Duration` | [Router](#router) | | `retries` | `int` | [Router](#router) | | `cooldown` | `time.Duration` | [Router](#router) | | `failure_threshold` | `int` | [Router](#router) | | `default_profile` | `string` | [Router](#router) | | `prefix` | `Prefix` | [Router](#router) | | `kv_index` | `KVIndex` | [Router](#router) | | `session_header` | `string` | [Router](#router) | | `inject_usage` | `bool` | [Router](#router) | | `tenant_label` | `string` | [Router](#router) | | `tag_labels` | `[]string` | [Router](#router) | | `max_body_bytes` | `int64` | [Router](#router) | | `batch` | `Batch` | [Router](#router) | | `cache` | `Cache` | [Router](#router) | | `trusted_proxies` | `[]string` | [Router](#router) | | `timeouts` | `Timeouts` | [Router](#router) | | `scoring` | `Scoring` | [Router](#router) | | `admission` | `Admission` | [Router](#router) | | `pii` | `map[string]string` | [Rules](#rules) | | `injection` | `string` | [Rules](#rules) | | `deny` | `[]Pattern` | [Rules](#rules) | | `max_chars` | `int` | [Rules](#rules) | | `restore` | `bool` | [Rules](#rules) | | `token_file` | `string` | [SCIM](#scim) | | `python` | `string` | [SGLangConfig](#sglangconfig) | | `ttft_p99` | `time.Duration` | [SLO](#slo) | | `tpot_p99` | `time.Duration` | [SLO](#slo) | | `days` | `[]string` | [ScaleWindow](#scalewindow) | | `from` | `string` | [ScaleWindow](#scalewindow) | | `to` | `string` | [ScaleWindow](#scalewindow) | | `min` | `int` | [ScaleWindow](#scalewindow) | | `max` | `int` | [ScaleWindow](#scalewindow) | | `min` | `int` | [Scaling](#scaling) | | `max` | `int` | [Scaling](#scaling) | | `idle_timeout` | `time.Duration` | [Scaling](#scaling) | | `schedule` | `[]ScaleWindow` | [Scaling](#scaling) | | `prewarm` | `time.Duration` | [Scaling](#scaling) | | `target_waiting` | `float64` | [Scoring](#scoring) | | `target_inflight` | `float64` | [Scoring](#scoring) | | `kv_ceiling` | `float64` | [Scoring](#scoring) | | `session_load_factor` | `float64` | [Scoring](#scoring) | | `vault` | `secrets.Vault` | [Secrets](#secrets) | | `master_key` | `string` | [Secrets](#secrets) | | `listen` | `string` | [Server](#server) | | `admin_listen` | `string` | [Server](#server) | | `metrics_listen` | `string` | [Server](#server) | | `agent_listen` | `string` | [Server](#server) | | `auth` | `Auth` | [Server](#server) | | `threads` | `Threads` | [Server](#server) | | `landing` | `Landing` | [Server](#server) | | `agent_tls` | `tlsconf.Config` | [Server](#server) | | `max_connections` | `int` | [Server](#server) | | `admin_token_file` | `string` | [Server](#server) | | `admin_remote` | `bool` | [Server](#server) | | `debug_pprof` | `bool` | [Server](#server) | | `agent_insecure` | `bool` | [Server](#server) | | `monitoring` | `Monitoring` | [Server](#server) | | `tracing` | `obs.Tracing` | [Server](#server) | | `mirror` | `Mirror` | [Server](#server) | | `offline` | `Offline` | [Server](#server) | | `engines` | `map[string]string` | [Server](#server) | | `engine_overrides` | `[]EngineOverride` | [Server](#server) | | `backup_dir` | `string` | [Server](#server) | | `guard` | `guard.Config` | [Server](#server) | | `secrets` | `Secrets` | [Server](#server) | | `notify` | `notify.Config` | [Server](#server) | | `mail` | `mail.Config` | [Server](#server) | | `serving` | `ServingSettings` | [Server](#server) | | `firewall` | `FirewallSettings` | [Server](#server) | | `presets` | `PresetSettings` | [Server](#server) | | `on_demand` | `OnDemandSettings` | [Server](#server) | | `agents` | `AgentSettings` | [Server](#server) | | `firewall_networks` | `[]string` | [Server](#server) | | `backup_recipients` | `[]string` | [Server](#server) | | `backup_copy_to` | `[]string` | [Server](#server) | | `backup_copy_key` | `string` | [Server](#server) | | `releases` | `string` | [Server](#server) | | `router` | `Router` | [Server](#server) | | `control` | `Control` | [Server](#server) | | `models` | `[]catalog.Model` | [Server](#server) | | `facility` | `Facility` | [Server](#server) | | `federation` | `Federation` | [Server](#server) | | `endpoints` | `[]Endpoint` | [Server](#server) | | `name` | `string` | [Service](#service) | | `url` | `string` | [Service](#service) | | `header_files` | `map[string]string` | [Service](#service) | | `body` | `string` | [Service](#service) | | `blocked` | `string` | [Service](#service) | | `reason` | `string` | [Service](#service) | | `on` | `string` | [Service](#service) | | `action` | `string` | [Service](#service) | | `timeout` | `time.Duration` | [Service](#service) | | `stopped` | `bool` | [ServingSettings](#servingsettings) | | `bin` | `string` | [SimConfig](#simconfig) | | `python` | `string` | [TRTLLMConfig](#trtllmconfig) | | `store` | `string` | [Threads](#threads) | | `retain_hours` | `int` | [Threads](#threads) | | `dial` | `time.Duration` | [Timeouts](#timeouts) | | `response_header` | `time.Duration` | [Timeouts](#timeouts) | | `generation` | `time.Duration` | [Timeouts](#timeouts) | | `first_token` | `time.Duration` | [Timeouts](#timeouts) | | `idle` | `time.Duration` | [Timeouts](#timeouts) | | `total` | `time.Duration` | [Timeouts](#timeouts) | | `allow` | `[]string` | [Tools](#tools) | | `deny` | `[]string` | [Tools](#tools) | | `on_denied` | `string` | [Tools](#tools) | | `max_calls_per_turn` | `int` | [Tools](#tools) | | `validate_arguments` | `bool` | [Tools](#tools) | | `endpoint` | `string` | [Tracing](#tracing) | | `sample_ratio` | `float64` | [Tracing](#tracing) | | `bin` | `string` | [VLLMConfig](#vllmconfig) | | `launch_mode` | `string` | [VLLMConfig](#vllmconfig) | | `ray_bin` | `string` | [VLLMConfig](#vllmconfig) | | `addr` | `string` | [Vault](#vault) | | `token_file` | `string` | [Vault](#vault) | | `role_id_file` | `string` | [Vault](#vault) | | `secret_id_file` | `string` | [Vault](#vault) | | `ca_file` | `string` | [Vault](#vault) | | `namespace` | `string` | [Vault](#vault) | | `url` | `string` | [Webhook](#webhook) | | `format` | `string` | [Webhook](#webhook) | | `events` | `[]string` | [Webhook](#webhook) | | `secret_file` | `string` | [Webhook](#webhook) | | `prompt_per_1k` | `int64` | [accounting.Price](#accountingprice) | | `completion_per_1k` | `int64` | [accounting.Price](#accountingprice) | | `cached_per_1k` | `int64` | [accounting.Price](#accountingprice) | | `per_image` | `int64` | [accounting.Price](#accountingprice) | | `per_mesh` | `int64` | [accounting.Price](#accountingprice) | | `name` | `string` | [admission.Band](#admissionband) | | `priority` | `int` | [admission.Band](#admissionband) | | `saturation_ceiling` | `float64` | [admission.Band](#admissionband) | | `queue_ttl` | `time.Duration` | [admission.Band](#admissionband) | | `bands` | `[]Band` | [admission.Config](#admissionconfig) | | `default_band` | `string` | [admission.Config](#admissionconfig) | | `queue_ttl` | `time.Duration` | [admission.Config](#admissionconfig) | | `queue_capacity_per_band` | `int` | [admission.Config](#admissionconfig) | | `queue_capacity_total` | `int` | [admission.Config](#admissionconfig) | | `interval` | `time.Duration` | [admission.Config](#admissionconfig) | | `node_id` | `string` | [agent.Config](#agentconfig) | | `server` | `string` | [agent.Config](#agentconfig) | | `servers` | `[]string` | [agent.Config](#agentconfig) | | `hostname` | `string` | [agent.Config](#agentconfig) | | `mgmt_addr` | `string` | [agent.Config](#agentconfig) | | `labels` | `map[string]string` | [agent.Config](#agentconfig) | | `mgmt_interface` | `string` | [agent.Config](#agentconfig) | | `fabrics` | `[]inventory.FabricAttachment` | [agent.Config](#agentconfig) | | `heartbeat_interval` | `time.Duration` | [agent.Config](#agentconfig) | | `reconnect_base` | `time.Duration` | [agent.Config](#agentconfig) | | `reconnect_max` | `time.Duration` | [agent.Config](#agentconfig) | | `adopt_ready_timeout` | `time.Duration` | [agent.Config](#agentconfig) | | `tls` | `tlsconf.Config` | [agent.Config](#agentconfig) | | `model_dirs` | `[]string` | [agent.Config](#agentconfig) | | `engines_dir` | `string` | [agent.Config](#agentconfig) | | `weights_cache` | `string` | [agent.Config](#agentconfig) | | `discovery` | `discovery.Options` | [agent.Config](#agentconfig) | | `engines` | `engines.Config` | [agent.Config](#agentconfig) | | `supervisor` | `supervisor.Config` | [agent.Config](#agentconfig) | | `tracing` | `obs.Tracing` | [agent.Config](#agentconfig) | | `name` | `string` | [config.Band](#configband) | | `priority` | `int` | [config.Band](#configband) | | `saturation_ceiling` | `float64` | [config.Band](#configband) | | `queue_ttl` | `time.Duration` | [config.Band](#configband) | | `prompt_per_1k` | `int64` | [config.Price](#configprice) | | `completion_per_1k` | `int64` | [config.Price](#configprice) | | `cached_per_1k` | `int64` | [config.Price](#configprice) | | `per_image` | `int64` | [config.Price](#configprice) | | `per_mesh` | `int64` | [config.Price](#configprice) | | `disabled` | `[]string` | [engines.Config](#enginesconfig) | | `vllm` | `VLLMConfig` | [engines.Config](#enginesconfig) | | `sglang` | `SGLangConfig` | [engines.Config](#enginesconfig) | | `llamacpp` | `LlamaCppConfig` | [engines.Config](#enginesconfig) | | `trtllm` | `TRTLLMConfig` | [engines.Config](#enginesconfig) | | `sim` | `SimConfig` | [engines.Config](#enginesconfig) | | `comfyui` | `ComfyUIConfig` | [engines.Config](#enginesconfig) | | `enabled` | `*bool` | [guard.Config](#guardconfig) | | `default` | `[]string` | [guard.Config](#guardconfig) | | `policies` | `map[string]Policy` | [guard.Config](#guardconfig) | | `smtp` | `string` | [mail.Config](#mailconfig) | | `from` | `string` | [mail.Config](#mailconfig) | | `username` | `string` | [mail.Config](#mailconfig) | | `password_file` | `string` | [mail.Config](#mailconfig) | | `base_url` | `string` | [mail.Config](#mailconfig) | | `webhooks` | `[]Webhook` | [notify.Config](#notifyconfig) | | `host` | `string` | [notify.Config](#notifyconfig) | | `work_dir` | `string` | [supervisor.Config](#supervisorconfig) | | `log_lines` | `int` | [supervisor.Config](#supervisorconfig) | | `stop_timeout` | `time.Duration` | [supervisor.Config](#supervisorconfig) | | `health_interval` | `time.Duration` | [supervisor.Config](#supervisorconfig) | | `rendezvous_timeout` | `time.Duration` | [supervisor.Config](#supervisorconfig) | | `alive_grace` | `time.Duration` | [supervisor.Config](#supervisorconfig) | | `run_as` | `string` | [supervisor.Config](#supervisorconfig) | | `ca` | `string` | [tlsconf.Config](#tlsconfconfig) | | `cert` | `string` | [tlsconf.Config](#tlsconfconfig) | | `key` | `string` | [tlsconf.Config](#tlsconfconfig) | | `insecure` | `bool` | [tlsconf.Config](#tlsconfconfig) | ## Adapter ### `name` `string` Name is what clients ask for, like a model name. ### `source` `string` Source is the adapter: a GGUF file for llama.cpp; for vLLM a PEFT adapter directory (a mirror version ending in "/", a path on the node, or a Hugging Face repository id). Fetched by each node as the model's weights are. ### `scale` `float64` Scale is how strongly it is applied; zero takes 1. ### `owner` `string` Owner is the part of the tenancy tree the adapter belongs to — org:ID, team:ID, project:ID, user:ID or key:ID — and only callers in it see it: to anyone else it is a model that does not exist. An adapter trained on an organisation's documents carries some of what they say in its weights. Empty is every caller the model allows. ## Admission ### `enabled` `bool` Enabled turns the layer on. Off, every request goes straight through, which is the v0.2.0 behaviour. ### `bands` `[]Band` ### `default_band` `string` ### `band_header` `string` BandHeader lets a client declare its band. Until authentication lands in v1.0.0 this is trusted, so the port must not be exposed to callers who should not be able to promote themselves. ### `queue_ttl` `time.Duration` ### `queue_capacity_per_band` `int` ### `queue_capacity_total` `int` QueueCapacityTotal bounds everything queued across bands. Reached, a request is not refused while a lower band has any queued: the newest of the lowest band is turned away instead, with a 503 and Retry-After. Zero takes half of all the bands' capacities together. ### `interval` `time.Duration` ## AgentSettings ### `default` `map[string]any` Default is agent.yaml's keys for every node. ### `nodes` `map[string]map[string]any` Nodes are agent.yaml's keys for one node each, by node id, over Default. ## Auth ### `enabled` `bool` ### `store` `string` Store is the SQLite file holding keys, tenancy and usage. ### `cache_ttl` `time.Duration` CacheTTL bounds how long a revoked key keeps working, traded against a database read per key per TTL. ### `negative_ttl` `time.Duration` NegativeTTL is how long a rejected key is remembered as rejected, so a client looping with a bad key cannot become a database read per request. ### `default_rpm` `int` DefaultRPM and DefaultTPM apply to a key that no scope gives a limit to. Unlimited used to be the default, and a project created without limits is the easy path — the "default" project on this cluster still is one. The first sign of that is the bill or the outage. Zero keeps the old behaviour for anyone who wants it, but it should be a choice rather than an omission. A fallback, not a ceiling: an explicit limit at any scope wins, above or below. ### `default_tpm` `int` ### `signup_open` `bool` SignupOpen serves the signup form. Accounts it creates are pending until an operator approves them, so this is not a way in — but turning it off means accounts are made with `llmgw users create` instead. ### `oidc` `OIDC` OIDC is sign-in through an identity provider. Takes a [OIDC](#oidc) block. ### `ldap` `LDAP` LDAP is sign-in against a directory, Active Directory above all, and the accounts kept in step with it. Takes a [LDAP](#ldap) block. ### `scim` `SCIM` SCIM is account provisioning by the identity provider. Takes a [SCIM](#scim) block. ### `max_key_ttl` `time.Duration` MaxKeyTTL is how long any API key may live; a key asked for with no expiry is given this. Organizations, teams and projects can set shorter ones (llmgw keys ttl). Zero is no limit. ### `personal` `Personal` Personal is what a person may do on their own, outside any project: make personal keys and use the chat page personally, within these limits. Takes a [Personal](#personal) block. ### `pricing` `map[string]Price` Pricing is what each model costs, for budgets. A model absent from the table costs whatever DefaultPrice says, which is nothing unless set. ### `default_price` `Price` Takes a [config.Price](#configprice) block. ### `flush_interval` `time.Duration` FlushInterval and BatchSize decide when usage records are written. ### `batch_size` `int` ### `buffer_size` `int` BufferSize bounds the queue. Beyond it records are dropped rather than blocking a request: losing accounting is bad, turning a stalled database into an outage is worse. ### `usage_retention` `time.Duration` UsageRetention is how long the record of each request is kept: who sent it, which replica answered, how long it queued — what `ctl request` reads. Zero keeps it for ever. Totals, charts and budgets are read from five-minute sums kept beside the records, which are not pruned, so this bounds the table that grows by a row a request without changing any figure a page shows. At least a day when set. ## Batch ### `max_file_bytes` `int64` MaxFileBytes bounds one uploaded file; 100 MB unless set. ### `max_lines` `int` MaxLines bounds the requests in one batch; 50 000 unless set. ### `concurrency` `int` Concurrency is how many of one batch's requests are in flight at once; 4 unless set. They queue in the lowest admission band, behind every interactive request. ### `retain_days` `int` RetainDays is how long a batch's answer and error files are kept; 30 unless set. Uploaded files are kept until deleted. ## Cache ### `max_bytes` `int64` MaxBytes bounds every project's answers together; 128 MB unless set. Past it, the answers used longest ago go first. ### `max_entry_bytes` `int64` MaxEntryBytes bounds one answer; a longer one is not kept. 1 MB unless set. ### `embedding_model` `string` EmbeddingModel embeds the questions of projects that reuse answers to similar ones (llmgw keys cache --similar): an embedding model in the catalog. Unset, those projects reuse only the same request's answer. The gateway asks it on its own account, as it asks a judge. ## Canary ### `model` `string` Model is the candidate: a catalog model, usually this one at newer weights, which clients cannot name themselves. ### `percent` `int` Percent of requests go to it, 0 to 100. ### `min_requests` `int` The candidate is taken out — rolled back — when, over at least MinRequests of its own, its error rate is MaxErrorIncrease above this model's (0.05 is five points), or its mean time to the first token is MaxTTFTRatio times this model's. Zero is 50, 0.05 and 1.5. ### `max_error_increase` `float64` ### `max_ttft_ratio` `float64` ## Capabilities ### `tools` `bool` ### `vision` `bool` ### `embeddings` `bool` ### `images` `bool` Images is a model that makes pictures, asked for at /v1/images/generations. Implied by an external model whose API is ComfyUI's. ### `meshes` `bool` Meshes is a model that makes 3D models from a picture, asked for as a job at /v1/3d/generations. Implied by a ComfyUI model whose output is meshes. ## ComfyUI ### `workflow` `string` Workflow is a built-in's name (flux-schnell, the default, or flux-dev) or a JSON file on the control plane, in ComfyUI's API format. ### `checkpoint` `string` Checkpoint is the file the workflow's {{checkpoint}} names: the source's own name unless set, which a source that is a set of files must. ### `output` `string` Output is what the workflow makes: pictures (the default), asked for at /v1/images/generations; meshes, asked for as a job at /v1/3d/generations from a picture; or video, audio or files. Every kind is asked for as a job at /v1/workflows/runs too. ### `inputs` `[]Input` Inputs are what the workflow takes from a request at /v1/workflows/runs, each the placeholder of its name. ### `nodes` `[]CustomNode` Nodes are custom nodes the workflow needs, put in each replica's own custom_nodes at the commit named. ### `huggingface_repo` `string` HuggingFaceRepo is the repository a custom node loads the weights by name from (Stable Fast 3D's loader asks for stabilityai/stable-fast-3d): the replica's weights are shown to the node there, in the Hugging Face cache of the engines' user, so nothing is fetched and no token is needed when it runs. ### `environment` `string` Environment names the models that may share one ComfyUI replica: every model of an environment agrees on the custom nodes they both name, so one replica can carry all of them and ComfyUI moves between their weights itself. Empty is an environment of the model alone. ## ComfyUIConfig ### `dir` `string` Dir is ComfyUI's directory, where main.py is. Readable by the user engines run as. ### `python` `string` Python is the interpreter of its environment; Dir's .venv when unset. ## Control ### `interval` `time.Duration` Interval is how often desired and actual state are compared. ### `base_backoff` `time.Duration` BaseBackoff and MaxBackoff bound how fast a failing model is retried. ### `max_backoff` `time.Duration` ### `unreachable_after` `time.Duration` UnreachableAfter and LostAfter stage node expiry. They are deliberately far apart: a network blip must not tear down replicas that still serve, and rebuilding a multi-node replica costs tens of minutes of loading. ### `lost_after` `time.Duration` ### `port_range` `[]int` PortRange is the per-node range for engine HTTP and dist-init ports. ### `mgmt_interface` `string` MgmtInterface is the ethernet interface NCCL bootstraps over. ### `timezone` `string` Timezone is where models' scaling schedules are read, an IANA name like Europe/Istanbul; empty is the control plane's own. ### `eval_dir` `string` EvalDir is where quality suites are read from by name, for `llmgw ctl eval MODEL --suite NAME`, a model's eval gate and the console. The suites the binary carries (arithmetic, json-format) are found when it has none of the name; a suite here of the same name replaces one. ### `enabled` `bool` Enabled runs the control plane even when configuration declares no models. Without it, a deployment whose catalog lives entirely in the database cannot start: control plane mode is inferred from the config file, so an empty models block means "router only", the process refuses to start for want of anything to serve, and the models it would have loaded are never read. That is a cluster that cannot be managed at runtime because it is managed at runtime. AgentListen cannot carry this signal — it has a default, so every deployment would become a control plane. ### `lease_ttl` `time.Duration` LeaseTTL is how long this control plane's claim to be the one placing work stands without being renewed. Only meaningful with a shared store, where a second control plane can see the claim. Long enough to survive a slow query or a brief network stall, short enough that a standby takes over before anyone has finished reading the alert. Zero takes the default, 10s. ## CustomNode ### `repo` `string` Repo is the repository, https only. ### `commit` `string` Commit is the full commit the node is used at: a branch moves, and a node that changed under a model is a model that changed unasked. ### `requirements` `[]string` Requirements are the PyPI packages the node needs, by name and version range only. They are installed beside the replica, never into ComfyUI's environment: a package named here at the range named, and every other one at the version ComfyUI already runs. One named here is first on ComfyUI's path, so its range must suit ComfyUI too. ### `build` `[]string` Build are directories of the repository that are Python packages to be compiled rather than downloaded: C++ and CUDA extensions no index has (Stable Fast 3D's texture_baker and uv_unwrapper). Each is built as a wheel with ComfyUI's Python for the card the replica runs on, kept on the node for the next replica on the same kind of card, and installed beside the replica like its requirements. ## Endpoint ### `id` `string` ### `url` `string` ### `api_key` `string` APIKey is sent to the engine as a bearer token, for an engine started with one. ### `models` `[]string` ### `engine` `string` Engine names the inference engine, which decides what its metrics are called. Empty means vLLM's names. ### `workflow` `string` Workflow is the ComfyUI workflow for engine: comfyui, a built-in's name or its JSON; flux-schnell unless set. ### `pool` `string` ### `weight` `float64` ### `priority` `int` ## EngineOverride ### `gpu_class` `string` GPUClass picks nodes with a GPU of this class ("v100-32g"). ### `nodes` `[]string` Nodes picks nodes by id. ### `labels` `map[string]string` Labels picks nodes carrying all of these. ### `engines` `map[string]string` Engines are laid over the cluster's: a version, or "" for none. ## EvalGate ### `suite` `string` Suite is a suite's name in control.eval_dir, or one the binary carries (arithmetic, json-format). ### `min_score` `float64` MinScore is the score, 0 to 1, to pass at; zero is the suite's own threshold. ### `judge` `string` Judge grades the suite's rubric cases, instead of the judge it names. ## External ### `url` `string` URL is the provider's base address, without /v1: https://api.openai.com. ### `model` `string` Model is what the provider calls it; requests are rewritten to it. ### `api_key_file` `string` APIKeyFile holds the provider's key, on the control plane. A file rather than the key itself, so the key is in neither the catalog, the store nor the audit log; empty for a provider that asks for none. ### `api_key_files` `[]ExternalKey` APIKeyFiles are several keys for the provider, in place of APIKeyFile: one endpoint each (external:MODEL#1, #2…), so a key that answers 429 or 401 is passed over while its breaker is open and the request goes to another. A provider's limits are per key. ### `peer` `string` Peer names the federated llmgw cluster this model is offered by, for a model that federation added (`llmgw ctl federation add`) rather than one written by hand. Such a model is named PEER/MODEL, comes and goes with the peer's own list, and is sent only while the peer is up. ### `api` `string` API is what the provider speaks: OpenAI's, unless this says comfyui — a ComfyUI server, asked for pictures at /v1/images/generations and sent the workflow below with the request's prompt in it. Model is then the checkpoint file the workflow loads, as ComfyUI lists it. ### `workflow` `string` Workflow is the ComfyUI workflow, in its API format: a built-in's name (flux-schnell, the default, or flux-dev) or a JSON file on the control plane. ### `output` `string` Output is what it makes: pictures, or meshes (see ComfyUI.Output). ## ExternalKey ### `file` `string` File holds the key, on the control plane, as APIKeyFile does. ### `weight` `float64` Weight is its share of the requests against the others'; zero is 1. ## Facility ### `budgets` `[]FacilityBudget` Budgets are the domains with a power cap. ### `margin` `float64` Margin is the share of every cap kept free, 0.1 for ten percent. Zero keeps none, for caps already given derated. ### `gpu_watts` `float64` GPUWatts is a card's draw when it does not report its power limit: an agent without nvidia-smi's power fields, or a node that has not sent a heartbeat yet. Zero counts such a card as drawing nothing. ### `cpu_core_watts` `float64` CPUCoreWatts is the draw of a core reserved by a replica with no GPU (cpu_cores). Zero counts such replicas as drawing nothing. ### `node_watts` `float64` NodeWatts is what a node draws besides its cards and reserved cores — idle CPUs, memory, fans, disks — counted for every node in a capped domain, busy or not. ### `measured_fresh` `time.Duration` MeasuredFresh is how old a node's power reading may be and still be counted against its domains. Zero takes two minutes. ## FacilityBudget ### `domain` `string` Domain is level:name, as the nodes' labels give it: rack:r12-07, pdu:r12-07-a, row:12. ### `cap_watts` `float64` CapWatts is what the domain may draw. For a dual-fed rack it is what one feed carries alone, derated as the facility derates it (usually 80%), since that is what the rack has to survive. ### `other_watts` `float64` OtherWatts is drawn in the domain by what llmgw does not place on: switches, storage, machines outside the cluster. ## Federation ### `name` `string` Name is this cluster as a peer reads it, in the federated_from tag sent with a request to a peer set to receive tags (`ctl federation add --send-tags`). Empty is this machine's host name. ### `interval` `time.Duration` Interval is how often each peer is asked whether it is ready, timed, and what it offers. A peer that does not answer is taken out of routing until it does. Zero is 10s. ## FirewallSettings ### `enabled` `bool` Enabled keeps llmgw's internal ports — engines, node exporter, the agents' stream, the mirror, the store — to the cluster's networks on every machine. False removes llmgw's nftables table everywhere, for a site whose own firewall does that job; the rules are kept, and true puts them back. Changed in the cluster's settings, it is in force on every node and control plane within seconds. ## GPUNeed ### `min_compute_capability` `float64` MinComputeCapability is the oldest architecture that runs it: 7.5 is Turing, 8.0 Ampere (bf16, flash-attention 2), 8.9 Ada (fp8), 9.0 Hopper. ### `min_memory_gb` `int` MinMemoryGB is the card's own memory it needs. ## GuardModel ### `format` `string` Format is qwen3guard (Qwen3Guard-Gen: "Safety: Safe", "Unsafe" or "Controversial", and the categories), llamaguard3 (Meta's Llama Guard 3: "safe", or "unsafe" and the categories), shieldgemma (Google's ShieldGemma: Yes or No), or json ({"safe": false, "categories": ["..."]}). ### `categories` `[]string` Categories the model is asked about, for shieldgemma — each a policy sentence — and the names reported for llamaguard3's S1, S2, …. ## Input ### `name` `string` Name is the placeholder's, and the request's key. ### `type` `string` Type is one of text, int, float, bool, choice, image, mask, audio, video, file. The last five are files, sent as base64, a data URL, or the id of a file uploaded to /v1/files, and put in ComfyUI's input directory; the placeholder gets the name they were given there. ### `required` `bool` Required inputs must be in every request; the others take Default, or the workflow's own {{name|default}}. ### `default` `any` ### `min` `*float64` Min and Max bound a number; for text, Max bounds its length. ### `max` `*float64` ### `choices` `[]string` Choices are what a choice may be. ### `max_mb` `int` MaxMB bounds a file input; zero is the type's own bound. ### `doc` `string` Doc says what the input is for, to whoever fills it in. ## JudgePolicy ### `model` `string` Model is a catalog model with role: guard. ### `models` `[]string` Models are judges asked in turn, instead of Model: the first that answers gives the verdict. A judge on a GPU first and one on CPUs after it is the GPU's speed while it is there, and the CPUs' when it is not — busy, failed, or the node down. ### `input` `string` Input and Output are what an unsafe verdict does: flag or block. Empty does not ask the judge about that direction. ### `output` `string` ### `categories` `[]string` Categories, when set, are the only ones that count: Llama Guard's codes (S1, S10) or the names the model reports. ### `controversial` `string` Controversial is what Qwen3Guard's third verdict counts as: safe (the default) or unsafe. ### `latency_budget` `time.Duration` LatencyBudget is how long each judge is waited for before the next is asked, or, after the last, the policy's fail applies. Zero is 250ms. ## KVIndex ### `tokenize_timeout` `time.Duration` TokenizeTimeout bounds the call that turns a request into token ids, made to one of the model's replicas before the request is placed. Past it the request is routed as tier 1 would. Zero takes 250ms. ### `min_blocks` `int` MinBlocks is the fewest leading blocks a replica must hold to be preferred for them; fewer is coincidence — a chat template's opening tokens — rather than a prefix worth following. Zero takes 4, which is 64 tokens at vLLM's usual block size of 16. ### `max_blocks` `int` MaxBlocks bounds how many of a prompt's blocks are hashed and looked up. Beyond it a longer match still helps, but the difference no longer decides anything. Zero takes 4096. ## LDAP ### `urls` `[]string` URLs are the directory's servers, tried in turn: ldaps:// (636), or ldap:// (389) with StartTLS. ### `start_tls` `bool` StartTLS upgrades an ldap:// connection before anything is sent. A password never crosses a connection without TLS: ldap:// without it is refused. ### `ca_file` `string` CAFile is the authority the servers' certificates are checked against, when it is not the system's: an AD Certificate Services root. ### `ca` `string` CA is the same authority written out, PEM: kept in the cluster's settings, so no file has to be put on every control plane. Used in place of CAFile when both are set. ### `bind_dn` `string` BindDN and the file holding its password: a service account that may read users and groups. Nothing is written to the directory. ### `bind_password_file` `string` ### `base_dn` `string` BaseDN is where people are searched for, subtree included. ### `group_base_dn` `string` GroupBaseDN is where their groups are; empty is BaseDN's domain root. ### `user_filter` `string` UserFilter narrows who may sign in, ANDed with the login match: a group (memberOf=...) or an OU's people only. Empty is every enabled user object. ### `label` `string` Label is what the form says to sign in with: "Sign in with your