{"record":{"id":"f04c85a3bee0b5ae","repo":"microsoft/graphrag","slug":"at-least-one-of-requests-per-period-or-tokens-per","errorCode":null,"errorMessage":"At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit.","messagePattern":"At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py","lineNumber":45,"sourceCode":"    requests_per_period: int | None = Field(\n        default=None,\n        description=\"The maximum number of requests allowed per period. (default: None, no limit).\",\n    )\n\n    tokens_per_period: int | None = Field(\n        default=None,\n        description=\"The maximum number of tokens allowed per period. (default: None, no limit).\",\n    )\n\n    def _validate_sliding_window_config(self) -> None:\n        \"\"\"Validate Sliding Window rate limit configuration.\"\"\"\n        if self.period_in_seconds is not None and self.period_in_seconds <= 0:\n            msg = \"period_in_seconds must be a positive integer for Sliding Window rate limit.\"\n            raise ValueError(msg)\n\n        if not self.requests_per_period and not self.tokens_per_period:\n            msg = \"At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit.\"\n            raise ValueError(msg)\n\n        if self.requests_per_period is not None and self.requests_per_period <= 0:\n            msg = \"requests_per_period must be a positive integer for Sliding Window rate limit.\"\n            raise ValueError(msg)\n\n        if self.tokens_per_period is not None and self.tokens_per_period <= 0:\n            msg = \"tokens_per_period must be a positive integer for Sliding Window rate limit.\"\n            raise ValueError(msg)\n\n    @model_validator(mode=\"after\")\n    def _validate_model(self):\n        \"\"\"Validate the rate limit configuration based on its type.\"\"\"\n        if self.type == RateLimitType.SlidingWindow:\n            self._validate_sliding_window_config()\n        return self\n","sourceCodeStart":27,"sourceCodeEnd":61,"githubUrl":"https://github.com/microsoft/graphrag/blob/f40e9a26ce62ba0b3fef8837d24aafdcc6e6c704/packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py#L27-L61","documentation":"Sliding Window rate limiting needs something to limit: RateLimitConfig validation demands at least one of requests_per_period or tokens_per_period. A config with neither makes the limiter a no-op, which is rejected.","triggerScenarios":"RateLimitConfig(type=RateLimitType.SlidingWindow, period_in_seconds=60) with both requests_per_period and tokens_per_period omitted/None.","commonSituations":"Enabling rate_limit in settings.yaml but only setting the period; assuming a default limit exists; YAML indentation putting the limit keys under the wrong block.","solutions":["Add requests_per_period (e.g. 100) or tokens_per_period (e.g. 1000000) to the rate_limit block","Check YAML indentation so the keys land under rate_limit and are actually parsed"],"exampleFix":"# before\nrate_limit:\n  type: sliding_window\n  period_in_seconds: 60\n# after\nrate_limit:\n  type: sliding_window\n  period_in_seconds: 60\n  requests_per_period: 100","handlingStrategy":"validation","validationCode":"rl = cfg.get(\"rate_limit\") or {}\nif rl.get(\"type\") == \"sliding_window\" and not (rl.get(\"requests_per_period\") or rl.get(\"tokens_per_period\")):\n    raise ValueError(\"set requests_per_period or tokens_per_period\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat the rate_limit block as all-or-nothing in config templates","Lint YAML blocks for required sibling keys"],"tags":["rate-limit","config-validation","required-field"],"backgroundTag":"missing-required-config-field","analyzedSha":"f40e9a26ce62ba0b3fef8837d24aafdcc6e6c704","analyzedAt":"2026-08-27T11:16:29.677Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}