feat: AI聊天室多Agent协作讨论平台

- 实现Agent管理,支持AI辅助生成系统提示词
- 支持多个AI提供商(OpenRouter、智谱、MiniMax等)
- 实现聊天室和讨论引擎
- WebSocket实时消息推送
- 前端使用React + Ant Design
- 后端使用FastAPI + MongoDB

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Claude Code
2026-02-03 19:20:02 +08:00
commit edbddf855d
76 changed files with 14681 additions and 0 deletions

123
backend/models/message.py Normal file
View File

@@ -0,0 +1,123 @@
"""
消息数据模型
定义聊天消息的结构
"""
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
}
}