{"record":{"id":"0f5903890469d462","repo":"BerriAI/litellm","slug":"classifier-llm-config-is-required-when-classifier","errorCode":null,"errorMessage":"classifier_llm_config is required when classifier_type is 'llm'","messagePattern":"classifier_llm_config is required when classifier_type is 'llm'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/router_strategy/complexity_router/config.py","lineNumber":633,"sourceCode":"            if isinstance(item, str):\n                coerced[key] = item\n            elif isinstance(item, (list, tuple)):\n                coerced[key] = list(item)\n            else:\n                coerced[key] = item\n        return coerced\n\n    @field_validator(\"escalation_keywords\")\n    @classmethod\n    def _normalize_escalation_keywords(cls, value: list[str] | None) -> list[str] | None:\n        if value is None:\n            return None\n        return [stripped for keyword in value if (stripped := keyword.strip())]\n\n    @model_validator(mode=\"after\")\n    def _validate_llm_classifier_config(self) -> \"ComplexityRouterConfig\":\n        if self.classifier_type == \"llm\" and self.classifier_llm_config is None:\n            raise ValueError(\"classifier_llm_config is required when classifier_type is 'llm'\")\n        return self\n\n    @model_validator(mode=\"after\")\n    def _validate_adaptive_pools(self) -> \"ComplexityRouterConfig\":\n        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:","sourceCodeStart":615,"sourceCodeEnd":651,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/router_strategy/complexity_router/config.py#L615-L651","documentation":"Config validator on ComplexityRouterConfig: classifier_type is 'llm' but classifier_llm_config is None — an LLM classifier with no model/timeout config cannot run, so validation fails at load time.","triggerScenarios":"Thrown at litellm/router_strategy/complexity_router/config.py:633 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Set classifier_llm_config when using classifier_type='llm'."],"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"}