models.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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
  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. thread_id: str | None = Field(None, description="LangGraph 线程 ID(服务端强制等于 session_id)")
  16. answers: list[str] | None = Field(
  17. None, description="提问卡的用户答案列表(与问题一一对应)"
  18. )
  19. status: str = Field(
  20. "answered", description="响应状态:answered / cancelled / error"
  21. )
  22. error: str | None = Field(None, description="错误详情(status=error 时可选)")
  23. approved: bool | None = Field(None, description="工具审批:是否批准本次工具调用")
  24. remember: bool = Field(
  25. False, description="工具审批:是否长期允许(2.0 骨架未实现长期规则,收到即忽略)"
  26. )
  27. user_name: str | None = Field(None, description="归属用户,缺省 default")
  28. class ModeUpdateRequest(BaseModel):
  29. """会话权限模式。"""
  30. mode: str = Field(..., description="plan | full")
  31. class PinUpdateRequest(BaseModel):
  32. """会话置顶。"""
  33. pinned: bool = Field(..., description="是否置顶")
  34. class TitleUpdateRequest(BaseModel):
  35. """会话标题。"""
  36. title: str = Field(..., max_length=255, description="新标题")
  37. class ThinkingUpdateRequest(BaseModel):
  38. """思考级别切换。"""
  39. level: str = Field(..., description="off | high | highest")
  40. class PreferenceRequest(BaseModel):
  41. """用户偏好写入。"""
  42. key: str = Field(..., max_length=128, description="偏好键")
  43. value: str = Field(..., description="偏好值")
  44. class ScheduleCreateRequest(BaseModel):
  45. """新建定时任务。"""
  46. title: str = Field("", max_length=255, description="任务标题")
  47. cron: str = Field(..., max_length=64, description="5 段 cron 表达式,如 '0 9 * * *'")
  48. prompt: str = Field(..., description="触发时喂给 agent 的指令")
  49. mode: str = Field("full", description="plan | full")
  50. enabled: bool = Field(True, description="是否立即启用")
  51. user_name: str | None = Field(None, description="归属用户,缺省 default")
  52. class ScheduleUpdateRequest(BaseModel):
  53. """更新定时任务(只传要改的字段)。"""
  54. title: str | None = Field(None, max_length=255)
  55. cron: str | None = Field(None, max_length=64)
  56. prompt: str | None = None
  57. mode: str | None = None
  58. enabled: bool | None = None
  59. class QuotaUpdateRequest(BaseModel):
  60. """调整每日额度。"""
  61. user_name: str | None = Field(None, description="归属用户,缺省 default")
  62. limit_tokens: int = Field(..., ge=0, description="每日 token 上限,0 = 不限")
  63. class ErrorPayload(BaseModel):
  64. """错误响应的统一载荷(与 1.5 的 {code,message} 契约一致)。"""
  65. code: str
  66. message: str
  67. detail: dict[str, Any] | None = None