{"record":{"id":"28491ec903be543d","repo":"microsoft/graphrag","slug":"tokens-per-period-must-be-a-positive-integer-for-s","errorCode":null,"errorMessage":"tokens_per_period must be a positive integer for Sliding Window rate limit.","messagePattern":"tokens_per_period must be a positive integer 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":53,"sourceCode":"    )\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":35,"sourceCodeEnd":61,"githubUrl":"https://github.com/microsoft/graphrag/blob/f40e9a26ce62ba0b3fef8837d24aafdcc6e6c704/packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py#L35-L61","documentation":"When tokens_per_period is provided for the Sliding Window limiter, it must be > 0. Zero or negative token budgets are invalid and rejected by RateLimitConfig validation.","triggerScenarios":"RateLimitConfig(type=RateLimitType.SlidingWindow, tokens_per_period=0) or a negative value in settings.","commonSituations":"Placeholder 0 intended to disable token limiting (omit the field instead); mis-tuned TPM copied from a quota table with 0 for tiers without a token limit.","solutions":["Set tokens_per_period to a positive integer matching your quota (e.g. 120000)","If you only want request limiting, omit tokens_per_period and set requests_per_period"],"exampleFix":"# before\nRateLimitConfig(type=\"sliding_window\", tokens_per_period=0, requests_per_period=10)\n# after\nRateLimitConfig(type=\"sliding_window\", requests_per_period=10, period_in_seconds=60)","handlingStrategy":"validation","validationCode":"tpp = rl.get(\"tokens_per_period\")\nif tpp is not None and tpp <= 0:\n    raise ValueError(\"tokens_per_period must be > 0\")","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Copy TPM/RPM quotas from the provider portal as positive integers","Omit rather than zero-out limits you don't want"],"tags":["rate-limit","config-validation","positive-value"],"backgroundTag":"invalid-config-value","analyzedSha":"f40e9a26ce62ba0b3fef8837d24aafdcc6e6c704","analyzedAt":"2026-08-27T11:16:29.677Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}