mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-15 23:31:29 +00:00
Retypes the 54 highest-density reportAny/reportExplicitAny sources with real types instead of shuffling the ceilings around: typed prisma table Protocols so the untyped client surface stops at the query, local TypedDicts for JSON and dict payloads, concrete chunk and logging types on the streaming and callback surfaces, and 3-argument getattr with a Callable annotation where an SDK object is genuinely duck-typed No cast(), no type: ignore, no noqa, no suppression comments, and no new Any annotations. Whole-tree basedpyright drops 1,941 errors with no rule rising anywhere, and all three budget files are ratcheted so the cleared headroom cannot silently grow back Adds a GDC regression test pinning the named AttributeError that the typed credential accessor now raises when with_gdch_audience is missing
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
"""
|
|
Base model class for domain models.
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Any
|
|
|
|
from pydantic import BaseModel, ConfigDict
|
|
|
|
|
|
class DomainModel(BaseModel):
|
|
"""Base class for all domain models."""
|
|
|
|
model_config = ConfigDict(
|
|
from_attributes=True,
|
|
protected_namespaces=(),
|
|
extra="ignore",
|
|
)
|
|
|
|
created_at: datetime | None = None
|
|
updated_at: datetime | None = None
|
|
|
|
@classmethod
|
|
def from_db_record(cls, record: Any) -> "DomainModel":
|
|
"""Create a domain model from a database record."""
|
|
if record is None:
|
|
raise ValueError("Cannot create domain model from None record")
|
|
if isinstance(record, dict):
|
|
return cls(**record)
|
|
if hasattr(record, "model_dump") and callable(record.model_dump):
|
|
return cls(**record.model_dump())
|
|
if hasattr(record, "dict") and callable(record.dict):
|
|
return cls(**record.dict())
|
|
return cls(**dict(record))
|
|
|
|
def to_db_dict(self, exclude_unset: bool = False) -> dict[str, object]:
|
|
"""Convert domain model to a dictionary for database operations."""
|
|
return self.model_dump(exclude_none=True, exclude_unset=exclude_unset)
|