{"record":{"id":"a5eff8404fc223c9","repo":"headroomlabs-ai/headroom","slug":"rate-limit-requests-per-minute-must-be-1-when-r","errorCode":null,"errorMessage":"rate_limit_requests_per_minute must be >= 1 when rate_limit_enabled=True","messagePattern":"rate_limit_requests_per_minute must be >= 1 when rate_limit_enabled=True","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/proxy/models.py","lineNumber":527,"sourceCode":"    def __post_init__(self, smart_routing: bool | None = None) -> None:\n        if self.rollout is None:\n            self.rollout = resolve_rollout()\n        # ``read_maturation`` remains a concrete, already-resolved runtime\n        # setting for programmatic/config-file callers.  The CLI composition\n        # root derives it from this same snapshot before constructing the\n        # config; rewriting it here would resolve policy a second time and\n        # break explicit non-CLI configuration.\n        if self.worker_processes < 1:\n            raise ValueError(\"worker_processes must be >= 1\")\n        if self.retry_enabled and self.retry_max_attempts < 1:\n            raise ValueError(\"retry_max_attempts must be >= 1 when retry_enabled=True\")\n        # A 0 (or negative) requests-per-minute limit divides by zero in the\n        # token-bucket wait computation (rate_limit_policy.consume_from_bucket),\n        # 500-ing every request. The CLI already guards this with IntRange(min=1);\n        # fail fast here too so the JSON/programmatic config paths can't produce a\n        # limiter that crashes at request time. Only matters when limiting is on.\n        if self.rate_limit_enabled and self.rate_limit_requests_per_minute < 1:\n            raise ValueError(\n                \"rate_limit_requests_per_minute must be >= 1 when rate_limit_enabled=True\"\n            )\n\n    @property\n    def provider_api_overrides(self) -> ProviderApiOverrides:\n        \"\"\"Return provider API URL overrides as a dedicated provider config object.\"\"\"\n        return ProviderApiOverrides(\n            anthropic=self.anthropic_api_url,\n            openai=self.openai_api_url,\n            gemini=self.gemini_api_url,\n            cloudcode=self.cloudcode_api_url,\n            vertex=self.vertex_api_url,\n        )\n","sourceCodeStart":509,"sourceCodeEnd":541,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/proxy/models.py#L509-L541","documentation":"ProxyConfig rejects rate limiting enabled with a requests-per-minute value below 1. A zero or negative limit would divide by zero in the token-bucket wait computation and cause 500s on every request, so configuration fails fast. Only configurations with rate_limit_enabled=True are affected.","triggerScenarios":"ProxyConfig(rate_limit_enabled=True, rate_limit_requests_per_minute=0) (or a negative value), typically from a JSON/programmatic config, because the CLI path already enforces a minimum.","commonSituations":"Setting an env/config flag to enable rate limiting without providing a numeric limit; generating config from templates where 0 means 'unlimited'; CLI bypass via direct config-file use.","solutions":["Set rate_limit_requests_per_minute to a positive integer such as 60.","Set rate_limit_enabled=False if no limiting is intended.","Treat 0 as invalid, not 'unlimited', when generating configs."],"exampleFix":"# before\nProxyConfig(rate_limit_enabled=True, rate_limit_requests_per_minute=0)\n\n# after\nProxyConfig(rate_limit_enabled=True, rate_limit_requests_per_minute=60)","handlingStrategy":"validation","validationCode":"def check_rate_limit(cfg):\n    if cfg.get(\"rate_limit_enabled\", False) and cfg.get(\"rate_limit_requests_per_minute\", 0) < 1:\n        raise SystemExit(\"rate_limit_requests_per_minute must be >= 1\")","typeGuard":"def valid_rate_limit(cfg) -> bool:\n    return not cfg.rate_limit_enabled or cfg.rate_limit_requests_per_minute >= 1","tryCatchPattern":"try:\n    ProxyConfig(**raw)\nexcept ValueError as e:\n    fail_config(e)","preventionTips":["Treat 0 rpm as invalid, not unlimited.","Mirror the CLI's min=1 constraint in config generators."],"tags":["config","validation","rate-limit"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}