chat.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from pydantic import BaseModel, Field, ConfigDict
  2. from typing import List, Optional, Dict, Any
  3. from datetime import datetime
  4. from ..config.config import Config
  5. class FileAttachment(BaseModel):
  6. """附件信息"""
  7. file_id: str # 火山方舟返回的 file_id
  8. filename: str # 原始文件名
  9. media_type: str # "image" | "video" | "audio"
  10. size: Optional[int] = None # 文件字节数
  11. class ChatMessage(BaseModel):
  12. role: str # "user" | "assistant" | "system"
  13. content: str
  14. attachments: Optional[List[FileAttachment]] = None # 附件列表(图片/视频/音频)
  15. timestamp: Optional[datetime] = None
  16. response_id: Optional[str] = None
  17. thinking: Optional[str] = None
  18. searching: Optional[str] = None
  19. # 帖子请求
  20. class CommentRequest(BaseModel):
  21. id: str # 帖子的主键
  22. # 兴趣圈提示词模版
  23. class CirclePromptConfig(BaseModel):
  24. appName: str # 包名,作为唯一标识
  25. name: str # 兴趣圈名称
  26. role: str # AI 扮演的角色
  27. style: str # 回复风格描述
  28. keywords: List[str] = [] # 推荐使用的关键词
  29. forbidden: List[str] = [] # 禁止使用的词语
  30. extra_instruction: str # 是给模型更细化的行为指引,可以包含在最终提示词中。
  31. # Ai的请求对象
  32. class ChatRequest(BaseModel):
  33. model_config = ConfigDict(populate_by_name=True)
  34. messages: List[ChatMessage]
  35. model: Optional[str] = Config.MODEL_NAME
  36. stream: Optional[bool] = False
  37. source: Optional[str] = None # source=app 时走第三方 token 认证
  38. token: Optional[str] = None # App 端传入的第三方 token
  39. promptType: Optional[str] = None # 提示词类型 默认为null,entrepreneur=企业家
  40. session_id: Optional[str] = Field(None, alias="sessionId") # 会话ID,前端传 sessionId
  41. # Ai的返回对象
  42. class ChatResponse(BaseModel):
  43. message: ChatMessage
  44. model: str
  45. usage: Optional[Dict[str, Any]] = None
  46. response_id: Optional[str] = None
  47. # 流式对象
  48. class StreamResponse(BaseModel):
  49. content: str
  50. finished: bool
  51. model: str
  52. timestamp: datetime
  53. type: str = "answer" # "thinking"=AI思考开过车delta | "searching"=搜索状态/关键词 | "answer" = 正式回答 delta(现有逻辑)
  54. # 内容审核请求
  55. class ModerationRequest(BaseModel):
  56. model_config = ConfigDict(populate_by_name=True)
  57. # 审核类型:text=文本 | image=图片 | video=视频;不传则根据已传参数自动推断
  58. type: Optional[str] = None
  59. # 文本审核:待审核的文本内容
  60. content: Optional[str] = None
  61. # 图片审核:图片 URL
  62. image_url: Optional[str] = Field(default=None, alias="ImageUrl")
  63. # 视频审核:视频 URL
  64. video_url: Optional[str] = Field(default=None, alias="VideoUrl")
  65. # 视频审核:视频封面图 URL
  66. thumb_url: Optional[str] = Field(default=None, alias="ThumbUrl")
  67. # 内容审核返回
  68. class ModerationResponse(BaseModel):
  69. sensitive: bool # true=检测到敏感/违规内容,false=合规内容
  70. # 历史人物
  71. class HistoricalFigure(BaseModel):
  72. id: str = Field(alias="_id") # MongoDB _id
  73. name: str # 姓名,如 "孔子"
  74. era: str # 朝代/时期,如 "春秋时期"
  75. description: str # 简介,如 "儒家创始人"
  76. prompt: str # 说话风格提示词,用于 AI 润色
  77. model_config = ConfigDict(populate_by_name=True)
  78. # 历史人物新增/修改(不含 id,由 MongoDB 生成)
  79. class FigureUpsert(BaseModel):
  80. name: str
  81. era: str
  82. description: str
  83. prompt: str
  84. # 润色请求
  85. class RephraseRequest(BaseModel):
  86. figureId: str # 历史人物 _id
  87. text: str # 用户原文
  88. # 机器人群内自动回复
  89. class GroupChatRequest(BaseModel):
  90. message: str #@机器人的消息
  91. user_id: str # 用户编号= IM中的account
  92. app_name: str #IM群所对应的app包名
  93. # 帖子评论区机器人多轮对话
  94. class PostCommentBotRequest(BaseModel):
  95. post_id: str # 帖子 MongoDB ObjectId
  96. user_id: str # 评论用户账号
  97. app_name: str # app 包名
  98. message: str # @机器人的消息内容
  99. parent_comment: Optional[str] = None # 被回复的评论原文(场景2)
  100. # 角色对话请求(企业家/女性情感等)
  101. class RoleBasedChatRequest(BaseModel):
  102. message: str = Field(..., description="用户消息内容")
  103. app_name: str = Field(..., description="应用包名")
  104. user_id: Optional[str] = Field(None, description="用户编号(可选)")