BerriAI/litellm · error · ValueError
keyword_tier_rules must be non-empty when semantic_keyword_m
Error message
keyword_tier_rules must be non-empty when semantic_keyword_matching is enabled
What it means
Config validator on ComplexityRouterConfig: semantic_keyword_matching is enabled but keyword_tier_rules is empty, so there would be no utterances to match against; at least one rule is required.
Source
Thrown at litellm/router_strategy/complexity_router/config.py:656
if not self.adaptive:
return self
normalized = {tier: (models if isinstance(models, list) else [models]) for tier, models in self.tiers.items()}
if not any(normalized.values()):
raise ValueError("adaptive=True requires at least one non-empty tier pool")
empty: Final = [tier for tier, models in normalized.items() if not models]
if empty:
raise ValueError(f"adaptive=True tier pools must be non-empty; empty tiers: {empty}")
self.tiers = normalized
return self
@model_validator(mode="after")
def _validate_semantic_matching(self) -> "ComplexityRouterConfig":
if not self.semantic_keyword_matching:
return self
if not self.embedding_model:
raise ValueError("embedding_model is required when semantic_keyword_matching is enabled")
if not self.keyword_tier_rules:
raise ValueError("keyword_tier_rules must be non-empty when semantic_keyword_matching is enabled")
return self
@model_validator(mode="after")
def _validate_tier_labels(self) -> "ComplexityRouterConfig":
if not self.tier_labels:
return self
blank: Final = tuple(sorted(tier.value for tier, label in self.tier_labels.items() if not label.strip()))
if blank:
raise ValueError(f"tier_labels values must be non-empty; blank labels for tiers: {', '.join(blank)}")
shadowed: Final = tuple(
sorted(
f"{tier.value} -> {label.strip()}"
for tier, label in self.tier_labels.items()
if label.strip().upper() in ComplexityTier.__members__ and label.strip().upper() != tier.value
)
)
if shadowed:
raise ValueError(View on GitHub (pinned to 77b7c6c40c)
Solutions
- Provide non-empty keyword_tier_rules when semantic_keyword_matching is enabled.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at litellm/router_strategy/complexity_router/config.py:656 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/e8c4bff6471b4d58.
Report an issue: GitHub.