{"record":{"id":"0d183abba16f9685","repo":"BerriAI/litellm","slug":"qualityrouter-model-name-is-listed-in-availab","errorCode":null,"errorMessage":"QualityRouter: model '{name}' is listed in available_models but has no model_info.litellm_routing_preferences","messagePattern":"QualityRouter: model '(.+?)' is listed in available_models but has no model_info\\.litellm_routing_preferences","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"litellm/router_strategy/quality_router/quality_router.py","lineNumber":174,"sourceCode":"        `available_models`, plus side indices `_model_keywords`,\n        `_model_quality`, and `_model_cost`. Raises if any listed model is\n        missing `litellm_routing_preferences`.\n        \"\"\"\n        model_list: Final = getattr(self.litellm_router_instance, \"model_list\", None) or []\n        available: Final = set(self.config.available_models)\n\n        # Track which available models we've matched so we can error on missing.\n        seen: Final[dict[str, bool]] = {name: False for name in available}\n        tier_to_models: Final[dict[int, list[str]]] = {}\n\n        for deployment in model_list:\n            name = self._get_deployment_model_name(deployment)\n            if name is None or name not in available:\n                continue\n\n            raw_prefs = self._get_routing_preferences(deployment)\n            if raw_prefs is None:\n                raise ValueError(\n                    f\"QualityRouter: model '{name}' is listed in available_models \"\n                    f\"but has no model_info.litellm_routing_preferences\"\n                )\n\n            # Validate via the Pydantic model so we get a clear error for\n            # missing quality_tier, wrong types, etc. This also means\n            # `RoutingPreferences` is the single source of truth for the\n            # accepted shape — readers relied on raw dicts before.\n            try:\n                if isinstance(raw_prefs, RoutingPreferences):\n                    prefs = raw_prefs\n                elif isinstance(raw_prefs, dict):\n                    prefs = RoutingPreferences(**raw_prefs)\n                else:\n                    # A Pydantic object of some other shape — coerce via its dict.\n                    prefs = RoutingPreferences(\n                        **(raw_prefs.model_dump() if hasattr(raw_prefs, \"model_dump\") else dict(raw_prefs))\n                    )","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/BerriAI/litellm/blob/77b7c6c40c0c5aa5fbcb1d6a1825ac39ca8829b8/litellm/router_strategy/quality_router/quality_router.py#L156-L192","documentation":"Raised during QualityRouter model indexing: a model listed in available_models has no model_info.litellm_routing_preferences, so its quality tier/cost/keywords cannot be derived and it is unusable for quality routing.","triggerScenarios":"Thrown at litellm/router_strategy/quality_router/quality_router.py:174 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Add model_info.litellm_routing_preferences for the model, or remove it from available_models."],"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-14T00:17:10.932Z"}