{"record":{"id":"e8c4bff6471b4d58","repo":"BerriAI/litellm","slug":"keyword-tier-rules-must-be-non-empty-when-semantic","errorCode":null,"errorMessage":"keyword_tier_rules must be non-empty when semantic_keyword_matching is enabled","messagePattern":"keyword_tier_rules must be non-empty when semantic_keyword_matching is enabled","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/router_strategy/complexity_router/config.py","lineNumber":656,"sourceCode":"        if not self.adaptive:\n            return self\n        normalized = {tier: (models if isinstance(models, list) else [models]) for tier, models in self.tiers.items()}\n        if not any(normalized.values()):\n            raise ValueError(\"adaptive=True requires at least one non-empty tier pool\")\n        empty: Final = [tier for tier, models in normalized.items() if not models]\n        if empty:\n            raise ValueError(f\"adaptive=True tier pools must be non-empty; empty tiers: {empty}\")\n        self.tiers = normalized\n        return self\n\n    @model_validator(mode=\"after\")\n    def _validate_semantic_matching(self) -> \"ComplexityRouterConfig\":\n        if not self.semantic_keyword_matching:\n            return self\n        if not self.embedding_model:\n            raise ValueError(\"embedding_model is required when semantic_keyword_matching is enabled\")\n        if not self.keyword_tier_rules:\n            raise ValueError(\"keyword_tier_rules must be non-empty when semantic_keyword_matching is enabled\")\n        return self\n\n    @model_validator(mode=\"after\")\n    def _validate_tier_labels(self) -> \"ComplexityRouterConfig\":\n        if not self.tier_labels:\n            return self\n        blank: Final = tuple(sorted(tier.value for tier, label in self.tier_labels.items() if not label.strip()))\n        if blank:\n            raise ValueError(f\"tier_labels values must be non-empty; blank labels for tiers: {', '.join(blank)}\")\n        shadowed: Final = tuple(\n            sorted(\n                f\"{tier.value} -> {label.strip()}\"\n                for tier, label in self.tier_labels.items()\n                if label.strip().upper() in ComplexityTier.__members__ and label.strip().upper() != tier.value\n            )\n        )\n        if shadowed:\n            raise ValueError(","sourceCodeStart":638,"sourceCodeEnd":674,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/router_strategy/complexity_router/config.py#L638-L674","documentation":"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.","triggerScenarios":"Thrown at litellm/router_strategy/complexity_router/config.py:656 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide non-empty keyword_tier_rules when semantic_keyword_matching is enabled."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8","analyzedAt":"2026-08-18T11:44:31.656Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}