liurenchaxin/jixia_academy/agents/baxian/baxian_coordinator.py

244 lines
7.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
八仙论道辩论协调器
Baxian Debate Coordinator
"""
import asyncio
import logging
from typing import List, Dict, Any, Optional
from datetime import datetime
from jixia_academy.core.memory_bank.interface import MemoryBankInterface
from jixia_academy.agents.baxian.baxian_agent import BaxianAgent
from jixia_academy.agents.host.debate_master import DebateMaster
class BaxianCoordinator:
"""八仙论道辩论协调器"""
def __init__(self, memory_bank: MemoryBankInterface):
self.memory_bank = memory_bank
self.agents: Dict[str, BaxianAgent] = {}
self.debate_master = DebateMaster(memory_bank=memory_bank)
self.initialized = False
async def initialize(self):
"""初始化八仙辩论系统"""
if self.initialized:
return
print("🎭 初始化八仙辩论协调器...")
# 初始化八仙角色
baxian_roles = {
"铁拐李": {
"personality": "逆向思维专家",
"expertise": ["批判性思维", "风险识别", "逆向投资"],
"style": "直接犀利,善于质疑"
},
"吕洞宾": {
"personality": "理性分析者",
"expertise": ["逻辑分析", "平衡观点", "理性决策"],
"style": "温和深刻,逻辑清晰"
},
"何仙姑": {
"personality": "风险控制专家",
"expertise": ["风险管理", "谨慎决策", "风险预警"],
"style": "谨慎细致,注重安全"
},
"张果老": {
"personality": "历史智慧者",
"expertise": ["历史规律", "长期视角", "经验总结"],
"style": "沉稳博学,引经据典"
},
"蓝采和": {
"personality": "创新思维者",
"expertise": ["创新视角", "非传统方法", "独特见解"],
"style": "活泼新颖,创意无限"
},
"汉钟离": {
"personality": "平衡协调者",
"expertise": ["综合观点", "和谐统一", "矛盾化解"],
"style": "平和包容,寻求共识"
},
"韩湘子": {
"personality": "艺术感知者",
"expertise": ["美学感知", "深层含义", "情感洞察"],
"style": "优雅感性,触动人心"
},
"曹国舅": {
"personality": "实务执行者",
"expertise": ["实际操作", "具体细节", "可行方案"],
"style": "务实严谨,建设性强"
}
}
# 创建八仙智能体
for name, config in baxian_roles.items():
self.agents[name] = BaxianAgent(
name=name,
personality=config["personality"],
expertise=config["expertise"],
style=config["style"],
memory_bank=self.memory_bank
)
await self.agents[name].initialize()
await self.debate_master.initialize()
self.initialized = True
print("✅ 八仙辩论协调器初始化完成")
async def close(self):
"""关闭资源"""
for agent in self.agents.values():
await agent.close()
await self.debate_master.close()
self.initialized = False
async def conduct_debate(
self,
topic: str,
participants: List[str],
rounds: int,
debate_id: str
):
"""进行八仙论道辩论"""
if not self.initialized:
await self.initialize()
# 验证参与者
valid_participants = [p for p in participants if p in self.agents]
if len(valid_participants) < 2:
raise ValueError("需要至少2位有效参与者")
print(f"🎯 有效参与者: {', '.join(valid_participants)}")
# 开始辩论
await self._start_debate(topic, valid_participants, debate_id)
# 进行多轮辩论
for round_num in range(rounds):
print(f"\n🔄 第 {round_num + 1} 轮辩论:")
await self._conduct_round(
topic=topic,
participants=valid_participants,
round_num=round_num + 1,
debate_id=debate_id
)
# 结束辩论
await self._end_debate(topic, valid_participants, debate_id)
async def _start_debate(
self,
topic: str,
participants: List[str],
debate_id: str
):
"""开始辩论"""
# 主持人开场白
opening = await self.debate_master.open_debate(topic, participants)
print(f"\n📢 主持人开场: {opening}")
# 记录开场白
await self.memory_bank.add_debate_message(
debate_id=debate_id,
speaker="主持人",
message=opening,
round_num=0
)
async def _conduct_round(
self,
topic: str,
participants: List[str],
round_num: int,
debate_id: str
):
"""进行一轮辩论"""
# 获取上一轮的历史
history = await self.memory_bank.get_debate_history(debate_id)
# 每位仙人发言
for participant in participants:
agent = self.agents[participant]
# 生成观点
response = await agent.generate_viewpoint(
topic=topic,
history=history,
round_num=round_num
)
print(f"\n🗣️ {participant}: {response}")
# 记录发言
await self.memory_bank.add_debate_message(
debate_id=debate_id,
speaker=participant,
message=response,
round_num=round_num
)
# 短暂停顿
await asyncio.sleep(0.5)
async def _end_debate(
self,
topic: str,
participants: List[str],
debate_id: str
):
"""结束辩论"""
# 获取完整辩论历史
full_history = await self.memory_bank.get_debate_history(debate_id)
# 生成总结
summary = await self.debate_master.summarize_debate(debate_id)
# 主持人结束语
closing = await self.debate_master.close_debate(topic, participants, summary)
print(f"\n📢 主持人总结: {closing}")
# 记录总结
await self.memory_bank.add_debate_message(
debate_id=debate_id,
speaker="主持人",
message=closing,
round_num=-1
)
# 保存辩论结果
await self.memory_bank.save_debate_result(
debate_id=debate_id,
summary=summary,
participants=participants
)
async def test_baxian_coordinator():
"""测试八仙协调器"""
from jixia_academy.core.memory_bank.factory import get_memory_backend
memory_bank = get_memory_backend()
await memory_bank.initialize()
coordinator = BaxianCoordinator(memory_bank=memory_bank)
await coordinator.initialize()
# 测试辩论
await coordinator.conduct_debate(
topic="人工智能对投资的影响",
participants=["铁拐李", "吕洞宾", "何仙姑"],
rounds=2,
debate_id="test_debate_001"
)
await coordinator.close()
await memory_bank.close()
if __name__ == "__main__":
asyncio.run(test_baxian_coordinator())