{"record":{"id":"9d1c2b96063f5529","repo":"BerriAI/litellm","slug":"plugins-and-adaptive-true-cannot-both-be-set-adap","errorCode":null,"errorMessage":"plugins and adaptive=True cannot both be set: adaptive's bandit selection doesn't yet consume plugin-narrowed candidate pools. Disable adaptive or remove plugins.","messagePattern":"plugins and adaptive=True cannot both be set: adaptive's bandit selection doesn't yet consume plugin-narrowed candidate pools\\. Disable adaptive or remove plugins\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/router_strategy/complexity_router/config.py","lineNumber":694,"sourceCode":"                f\"and the classifier rubric ambiguous: {', '.join(shadowed)}\"\n            )\n        labeled: Final = self.labeled_tiers()\n        folded_labels: Final = tuple(label.casefold() for _, label in labeled)\n        duplicated: Final = tuple(\n            \" and \".join(tier.value for tier, label in labeled if label.casefold() == folded)\n            for position, folded in enumerate(folded_labels)\n            if folded_labels.count(folded) > 1 and folded_labels.index(folded) == position\n        )\n        if duplicated:\n            raise ValueError(\n                f\"tier_labels values must be unique across tiers; shared labels for: {'; '.join(duplicated)}\"\n            )\n        return self\n\n    @model_validator(mode=\"after\")\n    def _validate_plugins_adaptive_combo(self) -> \"ComplexityRouterConfig\":\n        if self.plugins and self.adaptive:\n            raise ValueError(\n                \"plugins and adaptive=True cannot both be set: adaptive's bandit selection doesn't yet \"\n                \"consume plugin-narrowed candidate pools. Disable adaptive or remove plugins.\"\n            )\n        return self\n\n    def tier_label(self, tier: ComplexityTier) -> str:\n        \"\"\"Operator-facing display name for a tier, falling back to its canonical name.\"\"\"\n        return self.tier_labels.get(tier, \"\").strip() or tier.value\n\n    def labeled_tiers(self) -> tuple[tuple[ComplexityTier, str], ...]:\n        \"\"\"Every tier paired with its display name, in ascending severity order.\"\"\"\n        return tuple((tier, self.tier_label(tier)) for tier in TIER_SEVERITY_ORDER)\n\n    def tier_for_label(self, label: str) -> ComplexityTier | None:\n        \"\"\"Resolve a display name back to its tier, case-insensitively, then canonical names.\"\"\"\n        folded: Final = label.strip().casefold()\n        labeled: Final = self.labeled_tiers()\n        return next(","sourceCodeStart":676,"sourceCodeEnd":712,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/router_strategy/complexity_router/config.py#L676-L712","documentation":"Config validator on ComplexityRouterConfig: both routing plugins and adaptive=True are set, but the adaptive bandit does not yet consume plugin-narrowed candidate pools, so the combination is unsupported — disable one.","triggerScenarios":"Thrown at litellm/router_strategy/complexity_router/config.py:694 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Disable adaptive or remove plugins; both cannot be set together."],"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"}