Files
AIChatRoom/backend/models/agent.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

169 lines
5.5 KiB
Python

"""
Agent数据模型
定义AI聊天代理的配置结构
"""
from datetime import datetime
from typing import Optional, Dict, Any, List
from pydantic import Field
from beanie import Document
class AgentCapabilities:
"""Agent能力配置"""
memory_enabled: bool = False # 是否启用记忆
mcp_tools: List[str] = [] # 可用的MCP工具
skills: List[str] = [] # 可用的技能
multimodal: bool = False # 是否支持多模态
def __init__(
self,
memory_enabled: bool = False,
mcp_tools: Optional[List[str]] = None,
skills: Optional[List[str]] = None,
multimodal: bool = False
):
self.memory_enabled = memory_enabled
self.mcp_tools = mcp_tools or []
self.skills = skills or []
self.multimodal = multimodal
def to_dict(self) -> Dict[str, Any]:
"""转换为字典"""
return {
"memory_enabled": self.memory_enabled,
"mcp_tools": self.mcp_tools,
"skills": self.skills,
"multimodal": self.multimodal
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "AgentCapabilities":
"""从字典创建"""
if not data:
return cls()
return cls(
memory_enabled=data.get("memory_enabled", False),
mcp_tools=data.get("mcp_tools", []),
skills=data.get("skills", []),
multimodal=data.get("multimodal", False)
)
class AgentBehavior:
"""Agent行为配置"""
speak_threshold: float = 0.5 # 发言阈值(判断是否需要发言)
max_speak_per_round: int = 2 # 每轮最多发言次数
speak_style: str = "balanced" # 发言风格: concise, balanced, detailed
def __init__(
self,
speak_threshold: float = 0.5,
max_speak_per_round: int = 2,
speak_style: str = "balanced"
):
self.speak_threshold = speak_threshold
self.max_speak_per_round = max_speak_per_round
self.speak_style = speak_style
def to_dict(self) -> Dict[str, Any]:
"""转换为字典"""
return {
"speak_threshold": self.speak_threshold,
"max_speak_per_round": self.max_speak_per_round,
"speak_style": self.speak_style
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "AgentBehavior":
"""从字典创建"""
if not data:
return cls()
return cls(
speak_threshold=data.get("speak_threshold", 0.5),
max_speak_per_round=data.get("max_speak_per_round", 2),
speak_style=data.get("speak_style", "balanced")
)
class Agent(Document):
"""
Agent文档模型
存储AI代理的配置信息
"""
agent_id: str = Field(..., description="唯一标识")
name: str = Field(..., description="Agent名称")
role: str = Field(..., description="角色定义")
system_prompt: str = Field(..., description="系统提示词")
provider_id: str = Field(..., description="使用的AI接口ID")
# 模型参数
temperature: float = Field(default=0.7, ge=0, le=2, description="温度参数")
max_tokens: int = Field(default=2000, gt=0, description="最大token数")
# 能力配置
capabilities: Dict[str, Any] = Field(
default_factory=lambda: {
"memory_enabled": False,
"mcp_tools": [],
"skills": [],
"multimodal": False
},
description="能力配置"
)
# 行为配置
behavior: Dict[str, Any] = Field(
default_factory=lambda: {
"speak_threshold": 0.5,
"max_speak_per_round": 2,
"speak_style": "balanced"
},
description="行为配置"
)
# 外观配置
avatar: Optional[str] = Field(default=None, description="头像URL")
color: str = Field(default="#1890ff", description="代表颜色")
# 元数据
enabled: bool = Field(default=True, description="是否启用")
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime = Field(default_factory=datetime.utcnow)
class Settings:
name = "agents"
def get_capabilities(self) -> AgentCapabilities:
"""获取能力配置对象"""
return AgentCapabilities.from_dict(self.capabilities)
def get_behavior(self) -> AgentBehavior:
"""获取行为配置对象"""
return AgentBehavior.from_dict(self.behavior)
class Config:
json_schema_extra = {
"example": {
"agent_id": "product-manager",
"name": "产品经理",
"role": "产品规划和需求分析专家",
"system_prompt": "你是一位经验丰富的产品经理,擅长分析用户需求...",
"provider_id": "openrouter-gpt4",
"temperature": 0.7,
"max_tokens": 2000,
"capabilities": {
"memory_enabled": True,
"mcp_tools": ["web_search"],
"skills": [],
"multimodal": False
},
"behavior": {
"speak_threshold": 0.5,
"max_speak_per_round": 2,
"speak_style": "balanced"
},
"avatar": "https://example.com/avatar.png",
"color": "#1890ff"
}
}