Files
AIChatRoom/backend/models/message.py
Claude Code edbddf855d feat: AI聊天室多Agent协作讨论平台
- 实现Agent管理,支持AI辅助生成系统提示词
- 支持多个AI提供商(OpenRouter、智谱、MiniMax等)
- 实现聊天室和讨论引擎
- WebSocket实时消息推送
- 前端使用React + Ant Design
- 后端使用FastAPI + MongoDB

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 19:20:02 +08:00

124 lines
3.9 KiB
Python

"""
消息数据模型
定义聊天消息的结构
"""
from datetime import datetime
from typing import Optional, Dict, Any, List
from enum import Enum
from pydantic import Field
from beanie import Document
class MessageType(str, Enum):
"""消息类型枚举"""
TEXT = "text" # 纯文本
IMAGE = "image" # 图片
FILE = "file" # 文件
SYSTEM = "system" # 系统消息
ACTION = "action" # 动作消息(如调用工具)
class MessageAttachment:
"""消息附件"""
attachment_type: str # 附件类型: image, file
url: str # 资源URL
name: str # 文件名
size: int = 0 # 文件大小(字节)
mime_type: str = "" # MIME类型
def __init__(
self,
attachment_type: str,
url: str,
name: str,
size: int = 0,
mime_type: str = ""
):
self.attachment_type = attachment_type
self.url = url
self.name = name
self.size = size
self.mime_type = mime_type
def to_dict(self) -> Dict[str, Any]:
"""转换为字典"""
return {
"attachment_type": self.attachment_type,
"url": self.url,
"name": self.name,
"size": self.size,
"mime_type": self.mime_type
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "MessageAttachment":
"""从字典创建"""
return cls(
attachment_type=data.get("attachment_type", ""),
url=data.get("url", ""),
name=data.get("name", ""),
size=data.get("size", 0),
mime_type=data.get("mime_type", "")
)
class Message(Document):
"""
消息文档模型
存储聊天消息
"""
message_id: str = Field(..., description="唯一标识")
room_id: str = Field(..., description="聊天室ID")
discussion_id: str = Field(..., description="讨论ID")
agent_id: Optional[str] = Field(default=None, description="发送Agent ID(系统消息为空)")
# 消息内容
content: str = Field(..., description="消息内容")
message_type: str = Field(default=MessageType.TEXT.value, description="消息类型")
attachments: List[Dict[str, Any]] = Field(default_factory=list, description="附件列表")
# 元数据
round: int = Field(default=0, description="所属轮次")
token_count: int = Field(default=0, description="token数量")
# 工具调用相关
tool_calls: List[Dict[str, Any]] = Field(default_factory=list, description="工具调用记录")
tool_results: List[Dict[str, Any]] = Field(default_factory=list, description="工具调用结果")
# 时间戳
created_at: datetime = Field(default_factory=datetime.utcnow)
class Settings:
name = "messages"
indexes = [
[("room_id", 1), ("created_at", 1)],
[("discussion_id", 1)],
[("agent_id", 1)],
]
def get_attachments(self) -> List[MessageAttachment]:
"""获取附件对象列表"""
return [MessageAttachment.from_dict(a) for a in self.attachments]
def is_from_agent(self, agent_id: str) -> bool:
"""检查消息是否来自指定Agent"""
return self.agent_id == agent_id
def is_system_message(self) -> bool:
"""检查是否为系统消息"""
return self.message_type == MessageType.SYSTEM.value
class Config:
json_schema_extra = {
"example": {
"message_id": "msg-001",
"room_id": "product-design-room",
"discussion_id": "disc-001",
"agent_id": "product-manager",
"content": "我认为登录系统应该支持多种认证方式...",
"message_type": "text",
"round": 1,
"token_count": 150
}
}