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

  1. 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.