model_usage.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from datetime import date
  2. from enum import Enum
  3. from typing import Optional
  4. from pydantic import ConfigDict
  5. from sqlalchemy import BigInteger, Column, ForeignKey, Integer
  6. from sqlmodel import Field, SQLModel
  7. from gpustack.mixins.active_record import ActiveRecordMixin
  8. class OperationEnum(str, Enum):
  9. COMPLETION = "completion"
  10. CHAT_COMPLETION = "chat_completion"
  11. EMBEDDING = "embedding"
  12. RERANK = "rerank"
  13. IMAGE_GENERATION = "image_generation"
  14. AUDIO_SPEECH = "audio_speech"
  15. AUDIO_TRANSCRIPTION = "audit_transcription"
  16. class ModelUsage(SQLModel, ActiveRecordMixin, table=True):
  17. __tablename__ = 'model_usages'
  18. id: Optional[int] = Field(default=None, primary_key=True)
  19. user_id: Optional[int] = Field(
  20. default=None,
  21. sa_column=Column(Integer, ForeignKey("users.id", ondelete="SET NULL")),
  22. )
  23. user_name: Optional[str] = Field(default=None)
  24. model_id: Optional[int] = Field(
  25. default=None,
  26. sa_column=Column(Integer, ForeignKey("models.id", ondelete="SET NULL")),
  27. )
  28. model_name: str = Field(default=...)
  29. provider_id: Optional[int] = Field(
  30. default=None,
  31. sa_column=Column(
  32. Integer, ForeignKey("model_providers.id", ondelete="SET NULL")
  33. ),
  34. )
  35. provider_name: Optional[str] = Field(default=None)
  36. provider_type: Optional[str] = Field(default=None)
  37. cluster_name: Optional[str] = Field(default=None)
  38. api_key_id: Optional[int] = Field(
  39. default=None,
  40. sa_column=Column(Integer, ForeignKey("api_keys.id", ondelete="SET NULL")),
  41. )
  42. api_key_name: Optional[str] = Field(default=None)
  43. access_key: Optional[str] = Field(default=None)
  44. api_key_is_custom: Optional[bool] = Field(default=None)
  45. # Tenant scope. Denormalized from the api_key/model used for the request.
  46. # NULL = global (admin acting in "All" mode).
  47. owner_principal_id: Optional[int] = Field(
  48. default=None,
  49. sa_column=Column(Integer, ForeignKey("principals.id", ondelete="SET NULL")),
  50. )
  51. date: date
  52. prompt_token_count: int = Field(
  53. default=..., sa_column=Column(BigInteger, nullable=False)
  54. )
  55. completion_token_count: int = Field(
  56. default=..., sa_column=Column(BigInteger, nullable=False)
  57. )
  58. prompt_cached_token_count: int = Field(
  59. default=0, sa_column=Column(BigInteger, nullable=False, default=0)
  60. )
  61. request_count: int = Field(
  62. default=..., sa_column=Column(BigInteger, nullable=False)
  63. )
  64. operation: Optional[OperationEnum] = Field(default=None)
  65. model_config = ConfigDict(protected_namespaces=())