from typing import List, Dict, Any, Optional, Union from pydantic import BaseModel, Field # 聊天完成请求模型 class ContentItem(BaseModel): type: str text: Optional[str] = None image_url: Optional[Dict[str, str]] = None class ChatMessage(BaseModel): role: str content: Union[str, List[ContentItem]] class ChatCompletionRequest(BaseModel): model: str messages: List[ChatMessage] temperature: Optional[float] = 1.0 top_p: Optional[float] = 1.0 n: Optional[int] = 1 stream: Optional[bool] = False max_tokens: Optional[int] = None presence_penalty: Optional[float] = 0 frequency_penalty: Optional[float] = 0 # API密钥创建模型 class ApiKeyCreate(BaseModel): name: str = Field(..., description="密钥名称") key_value: str = Field(..., description="密钥值") weight: int = Field(1, description="权重") rate_limit: int = Field(60, description="速率限制(每分钟请求数)") is_enabled: bool = Field(True, description="是否启用") notes: Optional[str] = Field(None, description="备注") # API密钥更新模型 class ApiKeyUpdate(BaseModel): name: Optional[str] = Field(None, description="密钥名称") key_value: Optional[str] = Field(None, description="密钥值") weight: Optional[int] = Field(None, description="权重") rate_limit: Optional[int] = Field(None, description="速率限制(每分钟请求数)") is_enabled: Optional[bool] = Field(None, description="是否启用") notes: Optional[str] = Field(None, description="备注") # 批量操作基础模型 class BatchOperation(BaseModel): action: str = Field(..., description="操作类型:import, enable, disable, delete") key_ids: Optional[List[str]] = Field(None, description="要操作的密钥ID列表") # 批量导入的密钥项模型 class ImportKeyItem(BaseModel): name: str = Field(..., description="密钥名称") key: str = Field(..., description="密钥值") weight: int = Field(1, description="权重") rate_limit: int = Field(60, description="速率限制(每分钟请求数)") enabled: bool = Field(True, description="是否启用") notes: Optional[str] = Field(None, description="备注") # 批量导入模型 class BatchImportOperation(BatchOperation): keys: List[ImportKeyItem] = Field(..., description="要导入的密钥列表") key_ids: Optional[List[str]] = None # 系统配置更新模型 class ConfigUpdate(BaseModel): PROXY_HOST: Optional[str] = Field(None, description="代理服务器主机") PROXY_PORT: Optional[str] = Field(None, description="代理服务器端口") PROXY_USER: Optional[str] = Field(None, description="代理服务器用户名") PROXY_PASS: Optional[str] = Field(None, description="代理服务器密码") BASE_URL: Optional[str] = Field(None, description="基础URL,用于图片访问地址") IMAGE_LOCALIZATION: Optional[bool] = Field(None, description="是否启用图片本地化存储") IMAGE_SAVE_DIR: Optional[str] = Field(None, description="图片保存目录") save_to_env: bool = Field(True, description="是否保存到环境变量文件") # 日志级别更新模型 class LogLevelUpdate(BaseModel): level: str = Field(..., description="日志级别: DEBUG, INFO, WARNING, ERROR, CRITICAL") save_to_env: bool = Field(True, description="是否保存到环境变量文件") # JWT认证请求模型 class LoginRequest(BaseModel): admin_key: str = Field(..., description="管理员密钥") # JWT令牌响应模型 class TokenResponse(BaseModel): token: str = Field(..., description="JWT令牌") expires_in: int = Field(..., description="有效期(秒)") token_type: str = Field("bearer", description="令牌类型")