models.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. """API 层 Pydantic 请求体。
  2. 注意:``/api/chat`` 本身**没有** Pydantic 请求体——它是 multipart/form-data
  3. (为了带文件上传),字段用 FastAPI 的 ``Form``/``File`` 声明。1.5 也是这个
  4. 形状,保持一致以免前端要改。本文件只放 JSON 体的接口模型。
  5. """
  6. from __future__ import annotations
  7. from typing import Any, Literal
  8. from pydantic import BaseModel, Field
  9. class ResumeRequest(BaseModel):
  10. """中断恢复请求(字段与 1.5 逐字对齐)。
  11. 2.0 内部把它翻译成官方 HITL 的 ``{"decisions": [...]}``,翻译逻辑见
  12. ``api/chat_routes._to_official_resume``。
  13. """
  14. session_id: str = Field(..., description="会话 ID")
  15. interrupt_token: str | None = Field(None, description="审批卡携带的中断标识,防止陈旧确认")
  16. thread_id: str | None = Field(None, description="LangGraph 线程 ID(服务端强制等于 session_id)")
  17. answers: list[str] | None = Field(
  18. None, description="提问卡的用户答案列表(与问题一一对应)"
  19. )
  20. status: str = Field(
  21. "answered", description="响应状态:answered / cancelled / error"
  22. )
  23. error: str | None = Field(None, description="错误详情(status=error 时可选)")
  24. approved: bool | None = Field(None, description="工具审批:是否批准本次工具调用")
  25. remember: bool = Field(
  26. False, description="工具审批:是否长期允许(2.0 骨架未实现长期规则,收到即忽略)"
  27. )
  28. user_name: str | None = Field(None, description="归属用户,缺省 default")
  29. class ModeUpdateRequest(BaseModel):
  30. """会话权限模式。"""
  31. mode: str = Field(..., description="plan | full")
  32. class PinUpdateRequest(BaseModel):
  33. """会话置顶。"""
  34. pinned: bool = Field(..., description="是否置顶")
  35. class TitleUpdateRequest(BaseModel):
  36. """会话标题。"""
  37. title: str = Field(..., max_length=255, description="新标题")
  38. class ThinkingUpdateRequest(BaseModel):
  39. """思考级别切换。"""
  40. level: str = Field(..., description="off | high | highest")
  41. class PreferenceRequest(BaseModel):
  42. """用户偏好写入。"""
  43. key: str = Field(..., max_length=128, description="偏好键")
  44. value: str = Field(..., description="偏好值")
  45. class ScheduleCreateRequest(BaseModel):
  46. """新建定时任务。"""
  47. title: str = Field("", max_length=255, description="任务标题")
  48. cron: str = Field(..., max_length=64, description="5 段 cron 表达式,如 '0 9 * * *'")
  49. prompt: str = Field(..., description="触发时喂给 agent 的指令")
  50. mode: Literal["plan", "full"] = Field("full", description="plan | full")
  51. enabled: bool = Field(True, description="是否立即启用")
  52. user_name: str | None = Field(None, description="归属用户,缺省 default")
  53. class ScheduleUpdateRequest(BaseModel):
  54. """更新定时任务(只传要改的字段)。"""
  55. title: str | None = Field(None, max_length=255)
  56. cron: str | None = Field(None, max_length=64)
  57. prompt: str | None = None
  58. mode: Literal["plan", "full"] | None = None
  59. enabled: bool | None = None
  60. class QuotaUpdateRequest(BaseModel):
  61. """调整每日额度。"""
  62. user_name: str | None = Field(None, description="归属用户,缺省 default")
  63. limit_tokens: int = Field(..., ge=0, description="每日 token 上限,0 = 不限")
  64. class ErrorPayload(BaseModel):
  65. """错误响应的统一载荷(与 1.5 的 {code,message} 契约一致)。"""
  66. code: str
  67. message: str
  68. detail: dict[str, Any] | None = None