platform_api_key.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """
  2. 平台API Key数据传输对象定义
  3. 定义平台API Key相关API请求和响应的数据结构
  4. 需求: 7.1, 7.5, 7.6
  5. """
  6. from datetime import datetime
  7. from typing import Optional
  8. from pydantic import BaseModel, ConfigDict, Field
  9. class ApiKeyCreate(BaseModel):
  10. """创建API Key请求
  11. 需求 7.5: 用户创建API Key时允许设置备注名称
  12. 新增: 支持设置密钥类型
  13. """
  14. name: Optional[str] = Field(None, max_length=100, description="备注名称", examples=["我的API密钥"])
  15. key_type: str = Field(
  16. default="public",
  17. pattern="^(public|local)$",
  18. description="密钥类型:public(公钥,访问云端模型)/ local(本地私钥,访问本地模型)",
  19. examples=["public"]
  20. )
  21. class ApiKeyResponse(BaseModel):
  22. """API Key响应(列表展示用)
  23. 需求 7.3: API Key列表展示时仅显示密钥的前缀部分(如sk-aigc-xxxx...xxxx)
  24. 需求 7.6: 支持查看、禁用、启用、删除操作
  25. 新增: 密钥类型
  26. """
  27. id: int
  28. api_key_prefix: str = Field(..., description="脱敏显示,如sk-aigc-xxxx...xxxx")
  29. name: Optional[str] = Field(None, description="备注名称")
  30. status: str = Field(..., description="状态:active/disabled")
  31. key_type: str = Field(..., description="密钥类型:public/local")
  32. last_used_at: Optional[datetime] = Field(None, description="最后使用时间")
  33. created_at: datetime
  34. model_config = ConfigDict(from_attributes=True)
  35. class ApiKeyCreateResponse(BaseModel):
  36. """创建API Key响应(包含完整密钥,仅创建时返回一次)
  37. 需求 7.1: 生成以"sk-aigc-"为前缀、总长度48字符的密钥
  38. 需求 7.2: 仅在创建时完整显示一次密钥内容
  39. 新增: 密钥类型
  40. """
  41. id: int
  42. api_key: str = Field(..., description="完整密钥(仅此一次显示)")
  43. api_key_prefix: str = Field(..., description="密钥前缀")
  44. name: Optional[str] = Field(None, description="备注名称")
  45. key_type: str = Field(..., description="密钥类型:public/local")
  46. created_at: datetime
  47. class ApiKeyStatusUpdate(BaseModel):
  48. """更新API Key状态请求
  49. 需求 7.6: 支持禁用、启用操作
  50. """
  51. status: str = Field(..., pattern="^(active|disabled)$", description="状态:active/disabled", examples=["active"])