model_schema.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. """
  2. 模型数据传输对象定义(新表结构)
  3. """
  4. from datetime import datetime
  5. from typing import Any, Generic, List, Optional, TypeVar
  6. from decimal import Decimal
  7. from pydantic import BaseModel, ConfigDict
  8. T = TypeVar("T")
  9. class ModelPriceNewResponse(BaseModel):
  10. """单条价格记录响应"""
  11. id: int
  12. label: str
  13. tier_min: Optional[Decimal] = None
  14. tier_max: Optional[Decimal] = None
  15. tier_unit: Optional[str] = None
  16. input_price_original: Decimal
  17. output_price_original: Decimal
  18. discount_rate: Decimal
  19. discount_label: Optional[str] = None # 如 "1折"、"5折"
  20. input_price_discounted: Decimal
  21. output_price_discounted: Decimal
  22. currency: str = "CNY"
  23. unit: str
  24. display_multiplier: int = 1000000
  25. model_config = ConfigDict(from_attributes=True)
  26. class ModelResponse(BaseModel):
  27. """模型详情响应"""
  28. id: int
  29. model_code: str
  30. display_name: Optional[str] = None
  31. img: Optional[str] = None
  32. tag1: Optional[str] = None
  33. tag2: Optional[str] = None
  34. description: Optional[str] = None
  35. custom_description: Optional[str] = None
  36. keywords: Optional[str] = None
  37. display_tags: Optional[List[str]] = None
  38. input_modalities: Optional[List[str]] = None
  39. output_modalities: Optional[List[str]] = None
  40. features: Optional[Any] = None
  41. rate_limits: Optional[Any] = None
  42. tool_call_prices: Optional[Any] = None
  43. categories: List[int] = []
  44. category: Optional[int] = None # 兼容字段,取 categories[0]
  45. supplier: str
  46. is_featured: bool = False
  47. is_search: bool = False
  48. is_thinking: bool = False
  49. is_api_enabled: bool = False
  50. is_show_enabled: bool = True
  51. source_url: Optional[str] = None
  52. crawled_at: Optional[datetime] = None
  53. created_at: datetime
  54. updated_at: datetime
  55. # 前端兼容字段
  56. title: Optional[str] = None # = model_code
  57. name: Optional[str] = None # = display_name
  58. keyword: Optional[str] = None # = keywords
  59. model_config = ConfigDict(from_attributes=True)
  60. class ModelListResponse(BaseModel):
  61. """模型列表响应(含价格)"""
  62. id: int
  63. model_code: str
  64. display_name: Optional[str] = None
  65. img: Optional[str] = None
  66. tag1: Optional[str] = None
  67. tag2: Optional[str] = None
  68. description: Optional[str] = None
  69. custom_description: Optional[str] = None
  70. keywords: Optional[str] = None
  71. display_tags: Optional[List[str]] = None
  72. categories: List[int] = []
  73. category: Optional[int] = None # 兼容字段,取 categories[0]
  74. supplier: str
  75. is_featured: bool = False
  76. is_search: bool = False
  77. is_thinking: bool = False
  78. is_api_enabled: bool = False
  79. is_show_enabled: bool = True
  80. created_at: datetime
  81. updated_at: datetime
  82. # 前端兼容字段(旧字段名映射)
  83. title: Optional[str] = None # = model_code
  84. name: Optional[str] = None # = display_name
  85. keyword: Optional[str] = None # = keywords
  86. # 价格列表(is_active=true 的所有记录)
  87. prices: List[ModelPriceNewResponse] = []
  88. model_config = ConfigDict(from_attributes=True)
  89. class PaginatedResponse(BaseModel, Generic[T]):
  90. """分页响应"""
  91. total: int
  92. page: int
  93. page_size: int
  94. items: List[T]
  95. class ApiResponse(BaseModel, Generic[T]):
  96. """统一API响应"""
  97. code: int
  98. message: str
  99. data: Optional[T] = None
  100. class KeywordsResponse(BaseModel):
  101. keywords: List[str]
  102. class FeaturedModelsResponse(BaseModel):
  103. items: List[ModelListResponse]
  104. class ModelPricingResponse(BaseModel):
  105. """模型定价信息(用于 /pricing/{model_code} 端点)"""
  106. model_code: str
  107. display_name: Optional[str] = None
  108. description: Optional[str] = None
  109. custom_description: Optional[str] = None
  110. features: Optional[Any] = None
  111. rate_limits: Optional[Any] = None
  112. tool_call_prices: Optional[Any] = None
  113. display_tags: Optional[List[str]] = None
  114. input_modalities: Optional[List[str]] = None
  115. output_modalities: Optional[List[str]] = None
  116. categories: List[int] = []
  117. source_keys: Optional[List[str]] = None
  118. normalized_keys: Optional[List[str]] = None
  119. is_api_enabled: bool = False
  120. prices: List[ModelPriceNewResponse] = []