microsoft/graphrag · error · ValueError
At least one of requests_per_period or tokens_per_period mus
Error message
At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit.
What it means
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.
Source
Thrown at packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py:45
requests_per_period: int | None = Field(
default=None,
description="The maximum number of requests allowed per period. (default: None, no limit).",
)
tokens_per_period: int | None = Field(
default=None,
description="The maximum number of tokens allowed per period. (default: None, no limit).",
)
def _validate_sliding_window_config(self) -> None:
"""Validate Sliding Window rate limit configuration."""
if self.period_in_seconds is not None and self.period_in_seconds <= 0:
msg = "period_in_seconds must be a positive integer for Sliding Window rate limit."
raise ValueError(msg)
if not self.requests_per_period and not self.tokens_per_period:
msg = "At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit."
raise ValueError(msg)
if self.requests_per_period is not None and self.requests_per_period <= 0:
msg = "requests_per_period must be a positive integer for Sliding Window rate limit."
raise ValueError(msg)
if self.tokens_per_period is not None and self.tokens_per_period <= 0:
msg = "tokens_per_period must be a positive integer for Sliding Window rate limit."
raise ValueError(msg)
@model_validator(mode="after")
def _validate_model(self):
"""Validate the rate limit configuration based on its type."""
if self.type == RateLimitType.SlidingWindow:
self._validate_sliding_window_config()
return self
View on GitHub (pinned to f40e9a26ce)
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
Example fix
# before rate_limit: type: sliding_window period_in_seconds: 60 # after rate_limit: type: sliding_window period_in_seconds: 60 requests_per_period: 100
Defensive patterns
Strategy: validation
Validate before calling
rl = cfg.get("rate_limit") or {}
if rl.get("type") == "sliding_window" and not (rl.get("requests_per_period") or rl.get("tokens_per_period")):
raise ValueError("set requests_per_period or tokens_per_period") Prevention
- Treat the rate_limit block as all-or-nothing in config templates
- Lint YAML blocks for required sibling keys
When it happens
Trigger: RateLimitConfig(type=RateLimitType.SlidingWindow, period_in_seconds=60) with both requests_per_period and tokens_per_period omitted/None.
Common situations: 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.
Related errors
- period_in_seconds must be a positive integer for Sliding Win
- requests_per_period must be a positive integer for Sliding W
- tokens_per_period must be a positive integer for Sliding Win
- model_id must be specified for LiteLLM tokenizer.
- encoding_name must be specified for TikToken tokenizer.
AI-assisted analysis of microsoft/graphrag@f40e9a26ce (2026-08-27).
Data as JSON: /api/errors/f04c85a3bee0b5ae.
Report an issue: GitHub.