diff --git a/litellm/models/end_user.py b/litellm/models/end_user.py index efc7f9ef2ed..c1e5e10ccc8 100644 --- a/litellm/models/end_user.py +++ b/litellm/models/end_user.py @@ -5,7 +5,7 @@ Canonical definition for ``litellm_endusertable``. Re-exported from ``litellm.proxy._types`` for backwards compatibility. """ -from typing import Literal +from typing import Final, Literal from pydantic import BaseModel, ConfigDict, model_validator @@ -29,17 +29,18 @@ class LiteLLM_EndUserTable(LiteLLMPydanticObjectBase): @model_validator(mode="before") @classmethod def set_model_info(cls, values): - if isinstance(values, BaseModel): - normalized = values.model_dump() - elif hasattr(values, "__dict__") and not isinstance(values, dict): - normalized = dict(values.__dict__) - elif isinstance(values, dict): - normalized = dict(values) - else: - return values + raw: Final = ( + values.model_dump() + if isinstance(values, BaseModel) + else dict(values.__dict__) # mutable-ok: object normalization + if hasattr(values, "__dict__") and not isinstance(values, dict) + else dict(values) # mutable-ok: dict copy + if isinstance(values, dict) + else values + ) - if normalized.get("spend") is None: - normalized["spend"] = 0.0 - return normalized + if isinstance(raw, dict) and raw.get("spend") is None: + raw["spend"] = 0.0 # rebind-ok: default spend value + return raw model_config = ConfigDict(protected_namespaces=()) diff --git a/litellm/models/tag.py b/litellm/models/tag.py index cefb0bf7b28..5ca02a43df7 100644 --- a/litellm/models/tag.py +++ b/litellm/models/tag.py @@ -6,6 +6,7 @@ Canonical definition for ``litellm_tagtable``. Re-exported from """ from datetime import datetime +from typing import Final from pydantic import BaseModel, model_validator @@ -28,17 +29,19 @@ class LiteLLM_TagTable(LiteLLMPydanticObjectBase): @model_validator(mode="before") @classmethod def set_model_info(cls, values): - if isinstance(values, BaseModel): - normalized = values.model_dump() - elif hasattr(values, "__dict__") and not isinstance(values, dict): - normalized = dict(values.__dict__) - elif isinstance(values, dict): - normalized = dict(values) - else: - return values + raw: Final = ( + values.model_dump() + if isinstance(values, BaseModel) + else dict(values.__dict__) # mutable-ok: object normalization + if hasattr(values, "__dict__") and not isinstance(values, dict) + else dict(values) # mutable-ok: dict copy + if isinstance(values, dict) + else values + ) - if normalized.get("spend") is None: - normalized["spend"] = 0.0 - if normalized.get("models") is None: - normalized["models"] = [] - return normalized + if isinstance(raw, dict): + if raw.get("spend") is None: + raw["spend"] = 0.0 # rebind-ok: default spend value + if raw.get("models") is None: + raw["models"] = [] # mutable-ok: default models value # rebind-ok: default models value + return raw diff --git a/litellm/models/user.py b/litellm/models/user.py index 766947b8a0d..14b2d1de333 100644 --- a/litellm/models/user.py +++ b/litellm/models/user.py @@ -6,6 +6,7 @@ Canonical definition for ``litellm_usertable``. Re-exported from """ from datetime import datetime +from typing import Final from pydantic import BaseModel, ConfigDict, Field, model_validator @@ -50,22 +51,24 @@ class LiteLLM_UserTable(LiteLLMPydanticObjectBase): @model_validator(mode="before") @classmethod def set_model_info(cls, values): - if isinstance(values, BaseModel): - normalized = values.model_dump() - elif hasattr(values, "__dict__") and not isinstance(values, dict): - normalized = dict(values.__dict__) - elif isinstance(values, dict): - normalized = dict(values) - else: - return values + raw: Final = ( + values.model_dump() + if isinstance(values, BaseModel) + else dict(values.__dict__) # mutable-ok: object normalization + if hasattr(values, "__dict__") and not isinstance(values, dict) + else dict(values) # mutable-ok: dict copy + if isinstance(values, dict) + else values + ) - if normalized.get("spend") is None: - normalized["spend"] = 0.0 - if normalized.get("models") is None: - normalized["models"] = [] - if normalized.get("teams") is None: - normalized["teams"] = [] - return normalized + if isinstance(raw, dict): + if raw.get("spend") is None: + raw["spend"] = 0.0 # rebind-ok: default spend value + if raw.get("models") is None: + raw["models"] = [] # mutable-ok: default models value # rebind-ok: default models value + if raw.get("teams") is None: + raw["teams"] = [] # mutable-ok: default teams value # rebind-ok: default teams value + return raw def is_over_budget(self) -> bool: if self.max_budget is None: