from pydantic import BaseModel, Field from typing import Optional, Literal, List from app.schemas.auth import UserOut # LLM Provider 类型 LLMProviderType = Literal["openai", "claude", "ollama", "deepseek", "custom"] LLMType = Literal["chat", "vlm", "embedding", "rerank"] # 单个模型配置 class LLMModelConfig(BaseModel): name: str = "" # 模型名称/别名,用于标识 # provider 已废弃为必填字段:优先通过 base_url + model 推断。 provider: Optional[LLMProviderType] = None model: str = "" base_url: str = "" api_key: str = "" enabled: bool = True # 是否启用 # LLM 配置输入 - 每种类型支持多个模型 class LLMConfigIn(BaseModel): chat: Optional[List[LLMModelConfig]] = [] vlm: Optional[List[LLMModelConfig]] = [] embedding: Optional[List[LLMModelConfig]] = [] rerank: Optional[List[LLMModelConfig]] = [] # 定时任务配置 class SchedulerConfigIn(BaseModel): daily_plan_time: Optional[str] = "08:00" forum_scan_interval_minutes: Optional[int] = 30 todo_ai_generate_time: Optional[str] = "08:00" enabled: Optional[bool] = True # 用户资料更新 class ProfileUpdateIn(BaseModel): full_name: Optional[str] = Field(None, min_length=2, max_length=50) password: Optional[str] = Field(None, min_length=8) current_password: Optional[str] = None # 完整设置输出 class SettingsOut(BaseModel): profile: UserOut llm_config: Optional[dict] = None scheduler_config: Optional[dict] = None model_config = {"from_attributes": True} # 测试 LLM 连接请求 class LLMTestIn(BaseModel): type: LLMType # provider 已废弃为必填字段:优先通过 base_url + model 推断。 provider: Optional[LLMProviderType] = None model: str base_url: str api_key: str