127 lines
4.4 KiB
Python
127 lines
4.4 KiB
Python
|
|
"""
|
||
|
|
讨论结果数据模型
|
||
|
|
定义讨论结果的结构
|
||
|
|
"""
|
||
|
|
from datetime import datetime
|
||
|
|
from typing import Optional, Dict, Any, List
|
||
|
|
from pydantic import Field
|
||
|
|
from beanie import Document
|
||
|
|
|
||
|
|
|
||
|
|
class DiscussionResult(Document):
|
||
|
|
"""
|
||
|
|
讨论结果文档模型
|
||
|
|
存储讨论的最终结果
|
||
|
|
"""
|
||
|
|
discussion_id: str = Field(..., description="讨论唯一标识")
|
||
|
|
room_id: str = Field(..., description="聊天室ID")
|
||
|
|
objective: str = Field(..., description="讨论目标")
|
||
|
|
|
||
|
|
# 共识结果
|
||
|
|
consensus_reached: bool = Field(default=False, description="是否达成共识")
|
||
|
|
confidence: float = Field(default=0.0, ge=0, le=1, description="共识置信度")
|
||
|
|
|
||
|
|
# 结果摘要
|
||
|
|
summary: str = Field(default="", description="讨论结果摘要")
|
||
|
|
action_items: List[str] = Field(default_factory=list, description="行动项列表")
|
||
|
|
unresolved_issues: List[str] = Field(default_factory=list, description="未解决的问题")
|
||
|
|
key_decisions: List[str] = Field(default_factory=list, description="关键决策")
|
||
|
|
|
||
|
|
# 统计信息
|
||
|
|
total_rounds: int = Field(default=0, description="总轮数")
|
||
|
|
total_messages: int = Field(default=0, description="总消息数")
|
||
|
|
participating_agents: List[str] = Field(default_factory=list, description="参与的Agent列表")
|
||
|
|
agent_contributions: Dict[str, int] = Field(
|
||
|
|
default_factory=dict,
|
||
|
|
description="各Agent发言次数统计"
|
||
|
|
)
|
||
|
|
|
||
|
|
# 状态
|
||
|
|
status: str = Field(default="in_progress", description="状态: in_progress, completed, failed")
|
||
|
|
end_reason: str = Field(default="", description="结束原因")
|
||
|
|
|
||
|
|
# 时间戳
|
||
|
|
created_at: datetime = Field(default_factory=datetime.utcnow)
|
||
|
|
updated_at: datetime = Field(default_factory=datetime.utcnow)
|
||
|
|
completed_at: Optional[datetime] = Field(default=None, description="完成时间")
|
||
|
|
|
||
|
|
class Settings:
|
||
|
|
name = "discussions"
|
||
|
|
indexes = [
|
||
|
|
[("room_id", 1)],
|
||
|
|
[("created_at", -1)],
|
||
|
|
]
|
||
|
|
|
||
|
|
def mark_completed(
|
||
|
|
self,
|
||
|
|
consensus_reached: bool,
|
||
|
|
confidence: float,
|
||
|
|
summary: str,
|
||
|
|
action_items: List[str] = None,
|
||
|
|
unresolved_issues: List[str] = None,
|
||
|
|
end_reason: str = "consensus"
|
||
|
|
) -> None:
|
||
|
|
"""
|
||
|
|
标记讨论为已完成
|
||
|
|
|
||
|
|
Args:
|
||
|
|
consensus_reached: 是否达成共识
|
||
|
|
confidence: 置信度
|
||
|
|
summary: 结果摘要
|
||
|
|
action_items: 行动项
|
||
|
|
unresolved_issues: 未解决问题
|
||
|
|
end_reason: 结束原因
|
||
|
|
"""
|
||
|
|
self.consensus_reached = consensus_reached
|
||
|
|
self.confidence = confidence
|
||
|
|
self.summary = summary
|
||
|
|
self.action_items = action_items or []
|
||
|
|
self.unresolved_issues = unresolved_issues or []
|
||
|
|
self.status = "completed"
|
||
|
|
self.end_reason = end_reason
|
||
|
|
self.completed_at = datetime.utcnow()
|
||
|
|
self.updated_at = datetime.utcnow()
|
||
|
|
|
||
|
|
def update_stats(
|
||
|
|
self,
|
||
|
|
total_rounds: int,
|
||
|
|
total_messages: int,
|
||
|
|
agent_contributions: Dict[str, int]
|
||
|
|
) -> None:
|
||
|
|
"""
|
||
|
|
更新统计信息
|
||
|
|
|
||
|
|
Args:
|
||
|
|
total_rounds: 总轮数
|
||
|
|
total_messages: 总消息数
|
||
|
|
agent_contributions: Agent贡献统计
|
||
|
|
"""
|
||
|
|
self.total_rounds = total_rounds
|
||
|
|
self.total_messages = total_messages
|
||
|
|
self.agent_contributions = agent_contributions
|
||
|
|
self.participating_agents = list(agent_contributions.keys())
|
||
|
|
self.updated_at = datetime.utcnow()
|
||
|
|
|
||
|
|
class Config:
|
||
|
|
json_schema_extra = {
|
||
|
|
"example": {
|
||
|
|
"discussion_id": "disc-001",
|
||
|
|
"room_id": "product-design-room",
|
||
|
|
"objective": "设计用户登录系统",
|
||
|
|
"consensus_reached": True,
|
||
|
|
"confidence": 0.85,
|
||
|
|
"summary": "团队一致同意采用OAuth2.0 + 手机验证码的混合认证方案...",
|
||
|
|
"action_items": [
|
||
|
|
"设计OAuth2.0集成方案",
|
||
|
|
"开发短信验证服务",
|
||
|
|
"编写安全测试用例"
|
||
|
|
],
|
||
|
|
"unresolved_issues": [
|
||
|
|
"第三方登录的优先级排序"
|
||
|
|
],
|
||
|
|
"total_rounds": 15,
|
||
|
|
"total_messages": 45,
|
||
|
|
"status": "completed"
|
||
|
|
}
|
||
|
|
}
|