liurenchaxin/baxian_swarm_debate.py

319 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
四仙论道 - 基于OpenAI Swarm的辩论系统
使用OpenRouter API四仙轮流论道
"""
import os
import asyncio
import json
import subprocess
from datetime import datetime
from swarm import Swarm, Agent
from typing import Dict, List, Any
class BaxianSwarmDebate:
"""基于Swarm的四仙论道系统"""
def __init__(self):
# 从Doppler获取API密钥
self.api_key = self.get_secure_api_key()
# 初始化Swarm客户端使用OpenRouter
self.client = Swarm()
# 设置OpenRouter配置
os.environ["OPENAI_API_KEY"] = self.api_key
os.environ["OPENAI_BASE_URL"] = "https://openrouter.ai/api/v1"
# 四仙配置
self.immortals_config = {
'吕洞宾': {
'role': '剑仙投资顾问',
'gua_position': '乾☰',
'specialty': '技术分析',
'style': '一剑封喉,直指要害',
'personality': '犀利直接,善于识破市场迷雾'
},
'何仙姑': {
'role': '慈悲风控专家',
'gua_position': '坤☷',
'specialty': '风险控制',
'style': '荷花在手,全局在胸',
'personality': '温和坚定,关注风险控制'
},
'铁拐李': {
'role': '逆向思维大师',
'gua_position': '震☳',
'specialty': '逆向投资',
'style': '铁拐一点,危机毕现',
'personality': '不拘一格,挑战主流观点'
},
'蓝采和': {
'role': '情绪分析师',
'gua_position': '巽☴',
'specialty': '市场情绪',
'style': '花篮一抛,情绪明了',
'personality': '敏锐活泼,感知市场情绪'
}
}
# 创建四仙代理
self.agents = self.create_agents()
self.debate_history = []
def get_secure_api_key(self):
"""从Doppler安全获取API密钥"""
try:
result = subprocess.run(
['doppler', 'secrets', 'get', 'OPENROUTER_API_KEY_1', '--json'],
capture_output=True,
text=True,
check=True
)
secret_data = json.loads(result.stdout)
return secret_data['OPENROUTER_API_KEY_1']['computed']
except Exception as e:
print(f"❌ 从Doppler获取密钥失败: {e}")
return None
def create_agents(self) -> Dict[str, Agent]:
"""创建四仙Swarm代理"""
agents = {}
# 吕洞宾 - 剑仙投资顾问
agents['吕洞宾'] = Agent(
name="吕洞宾",
instructions=f"""
你是吕洞宾,八仙之首,剑仙投资顾问。
你的特点:
- 位居{self.immortals_config['吕洞宾']['gua_position']}之位,代表天行健
- 以剑气纵横的气势分析市场,{self.immortals_config['吕洞宾']['style']}
- 擅长{self.immortals_config['吕洞宾']['specialty']},善于识破市场迷雾
- 性格{self.immortals_config['吕洞宾']['personality']}
在辩论中,你要:
1. 提出犀利的技术分析观点
2. 用数据和图表支撑论断
3. 挑战其他仙人的观点
4. 保持仙风道骨的表达风格
5. 论道完毕后,建议下一位仙人发言
请用古雅的语言风格,结合现代金融分析。
""",
functions=[self.transfer_to_hexiangu]
)
# 何仙姑 - 慈悲风控专家
agents['何仙姑'] = Agent(
name="何仙姑",
instructions=f"""
你是何仙姑,八仙中唯一的女仙,慈悲风控专家。
你的特点:
- 位居{self.immortals_config['何仙姑']['gua_position']}之位,代表厚德载物
- {self.immortals_config['何仙姑']['style']},以母性关怀关注投资风险
- 擅长{self.immortals_config['何仙姑']['specialty']},善于发现隐藏危险
- 性格{self.immortals_config['何仙姑']['personality']}
在辩论中,你要:
1. 重点关注风险控制和投资安全
2. 提醒其他仙人注意潜在危险
3. 提供稳健的投资建议
4. 平衡激进与保守的观点
5. 论道完毕后,建议下一位仙人发言
请用温和但坚定的语调,体现女性的细致和关怀。
""",
functions=[self.transfer_to_tieguaili]
)
# 铁拐李 - 逆向思维大师
agents['铁拐李'] = Agent(
name="铁拐李",
instructions=f"""
你是铁拐李,八仙中的逆向思维大师。
你的特点:
- 位居{self.immortals_config['铁拐李']['gua_position']}之位,代表雷动风行
- {self.immortals_config['铁拐李']['style']},总是从反面角度思考
- 擅长{self.immortals_config['铁拐李']['specialty']},发现逆向机会
- 性格{self.immortals_config['铁拐李']['personality']},敢于挑战共识
在辩论中,你要:
1. 提出与众不同的逆向观点
2. 挑战市场共识和主流观点
3. 寻找逆向投资机会
4. 用数据证明反向逻辑
5. 论道完毕后,建议下一位仙人发言
请用直率犀利的语言,体现逆向思维的独特视角。
""",
functions=[self.transfer_to_lancaihe]
)
# 蓝采和 - 情绪分析师
agents['蓝采和'] = Agent(
name="蓝采和",
instructions=f"""
你是蓝采和,八仙中的情绪分析师。
你的特点:
- 位居{self.immortals_config['蓝采和']['gua_position']}之位,代表风行草偃
- {self.immortals_config['蓝采和']['style']},敏锐感知市场情绪
- 擅长{self.immortals_config['蓝采和']['specialty']},分析投资者心理
- 性格{self.immortals_config['蓝采和']['personality']}
在辩论中,你要:
1. 分析市场情绪和投资者心理
2. 关注社交媒体和舆论趋势
3. 提供情绪面的投资建议
4. 用生动的比喻说明观点
5. 作为最后发言者,要总结四仙观点
请用轻松活泼的语调,体现对市场情绪的敏锐洞察。
""",
functions=[self.summarize_debate]
)
return agents
def transfer_to_hexiangu(self):
"""转到何仙姑"""
return self.agents['何仙姑']
def transfer_to_tieguaili(self):
"""转到铁拐李"""
return self.agents['铁拐李']
def transfer_to_lancaihe(self):
"""转到蓝采和"""
return self.agents['蓝采和']
def summarize_debate(self):
"""蓝采和总结辩论"""
# 这里可以返回一个特殊的总结agent或者标记辩论结束
return None
async def conduct_debate(self, topic: str, context: Dict[str, Any] = None) -> Dict[str, Any]:
"""进行四仙论道"""
if not self.api_key:
print("❌ 无法获取API密钥无法进行论道")
return None
print("🎭 四仙论道开始!")
print("=" * 80)
print(f"🎯 论道主题: {topic}")
print()
# 构建初始提示
initial_prompt = self.build_debate_prompt(topic, context)
try:
# 从吕洞宾开始论道
print("⚔️ 吕洞宾仙长请先发言...")
response = self.client.run(
agent=self.agents['吕洞宾'],
messages=[{"role": "user", "content": initial_prompt}]
)
print("\n🎊 四仙论道圆满结束!")
print("📊 论道结果已生成")
# 生成论道结果
debate_result = {
"debate_id": f"swarm_debate_{datetime.now().strftime('%Y%m%d_%H%M%S')}",
"topic": topic,
"participants": list(self.agents.keys()),
"messages": response.messages if hasattr(response, 'messages') else [],
"final_output": response.messages[-1]["content"] if response.messages else "",
"timestamp": datetime.now().isoformat(),
"framework": "OpenAI Swarm"
}
self.debate_history.append(debate_result)
return debate_result
except Exception as e:
print(f"❌ 论道过程中出错: {e}")
return None
def build_debate_prompt(self, topic: str, context: Dict[str, Any] = None) -> str:
"""构建论道提示"""
context_str = ""
if context:
context_str = f"\n背景信息:\n{json.dumps(context, indent=2, ensure_ascii=False)}\n"
prompt = f"""
🎭 四仙论道正式开始!
论道主题: {topic}
{context_str}
论道规则:
1. 四仙按序发言:吕洞宾 → 何仙姑 → 铁拐李 → 蓝采和
2. 每位仙人从自己的专业角度分析
3. 必须提供具体的数据或逻辑支撑
4. 可以质疑前面仙人的观点
5. 保持仙风道骨的表达风格
6. 蓝采和作为最后发言者要综合总结
请吕洞宾仙长首先发言,展现剑仙的犀利分析!
"""
return prompt
def print_debate_summary(self, debate_result: Dict[str, Any]):
"""打印论道总结"""
print("\n🌟 四仙论道总结")
print("=" * 60)
print(f"主题: {debate_result['topic']}")
print(f"参与仙人: {', '.join(debate_result['participants'])}")
print(f"框架: {debate_result['framework']}")
print(f"时间: {debate_result['timestamp']}")
print("\n最终结论:")
print(debate_result['final_output'])
print("\n🔗 使用Swarm handoff机制实现自然的仙人交接")
print("✅ 相比AutoGen配置更简洁性能更优")
async def main():
"""主函数"""
print("🐝 四仙论道 - OpenAI Swarm版本")
print("🔐 使用Doppler安全管理API密钥")
print("🚀 基于OpenRouter的轻量级多智能体系统")
print()
# 创建论道系统
debate_system = BaxianSwarmDebate()
if not debate_system.api_key:
print("❌ 无法获取API密钥请检查Doppler配置")
return
# 论道主题
topics = [
"英伟达股价走势AI泡沫还是技术革命",
"美联储政策转向2024年降息预期分析",
"比特币vs黄金谁是更好的避险资产",
"中国房地产市场:触底反弹还是继续下行?"
]
# 随机选择主题(这里选第一个作为示例)
topic = topics[0]
# 构建市场背景
context = {
"market_data": "英伟达当前股价$120市值$3TP/E比率65",
"recent_news": ["ChatGPT-5即将发布", "中国AI芯片突破", "美国对华芯片制裁升级"],
"analyst_consensus": "买入评级占70%,目标价$150"
}
# 进行论道
result = await debate_system.conduct_debate(topic, context)
if result:
debate_system.print_debate_summary(result)
else:
print("❌ 论道失败")
if __name__ == "__main__":
asyncio.run(main())