from pydantic import BaseModel, Field, ConfigDict from typing import List, Optional, Dict, Any from datetime import datetime from ..config.config import Config class FileAttachment(BaseModel): """附件信息""" file_id: str # 火山方舟返回的 file_id filename: str # 原始文件名 media_type: str # "image" | "video" | "audio" size: Optional[int] = None # 文件字节数 class ChatMessage(BaseModel): role: str # "user" | "assistant" | "system" content: str attachments: Optional[List[FileAttachment]] = None # 附件列表(图片/视频/音频) timestamp: Optional[datetime] = None response_id: Optional[str] = None thinking: Optional[str] = None searching: Optional[str] = None # 帖子请求 class CommentRequest(BaseModel): id: str # 帖子的主键 # 兴趣圈提示词模版 class CirclePromptConfig(BaseModel): appName: str # 包名,作为唯一标识 name: str # 兴趣圈名称 role: str # AI 扮演的角色 style: str # 回复风格描述 keywords: List[str] = [] # 推荐使用的关键词 forbidden: List[str] = [] # 禁止使用的词语 extra_instruction: str # 是给模型更细化的行为指引,可以包含在最终提示词中。 # Ai的请求对象 class ChatRequest(BaseModel): model_config = ConfigDict(populate_by_name=True) messages: List[ChatMessage] model: Optional[str] = Config.MODEL_NAME stream: Optional[bool] = False source: Optional[str] = None # source=app 时走第三方 token 认证 token: Optional[str] = None # App 端传入的第三方 token session_id: Optional[str] = Field(None, alias="sessionId") # 会话ID,前端传 sessionId # Ai的返回对象 class ChatResponse(BaseModel): message: ChatMessage model: str usage: Optional[Dict[str, Any]] = None response_id: Optional[str] = None # 流式对象 class StreamResponse(BaseModel): content: str finished: bool model: str timestamp: datetime type: str = "answer" # "thinking"=AI思考开过车delta | "searching"=搜索状态/关键词 | "answer" = 正式回答 delta(现有逻辑) # 历史人物 class HistoricalFigure(BaseModel): id: str = Field(alias="_id") # MongoDB _id name: str # 姓名,如 "孔子" era: str # 朝代/时期,如 "春秋时期" description: str # 简介,如 "儒家创始人" prompt: str # 说话风格提示词,用于 AI 润色 model_config = ConfigDict(populate_by_name=True) # 历史人物新增/修改(不含 id,由 MongoDB 生成) class FigureUpsert(BaseModel): name: str era: str description: str prompt: str # 润色请求 class RephraseRequest(BaseModel): figureId: str # 历史人物 _id text: str # 用户原文 # 机器人群内自动回复 class GroupChatRequest(BaseModel): message: str #@机器人的消息 user_id: str # 用户编号= IM中的account app_name: str #IM群所对应的app包名 # 帖子评论区机器人多轮对话 class PostCommentBotRequest(BaseModel): post_id: str # 帖子 MongoDB ObjectId user_id: str # 评论用户账号 app_name: str # app 包名 message: str # @机器人的消息内容 parent_comment: Optional[str] = None # 被回复的评论原文(场景2)