liurenchaxin/modules/legacy-support/experiments/baxian_custom_api_debate.py

250 lines
10 KiB
Python
Raw Permalink 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
# -*- coding: utf-8 -*-
"""
八仙辩论系统 - 自定义API版本
使用自定义LiteLLM端点而不是Google ADK
"""
import asyncio
import aiohttp
import json
import os
from typing import List, Dict, Any
import time
class CustomAPIAgent:
"""使用自定义API的代理"""
def __init__(self, name: str, personality: str, api_url: str, api_key: str, model: str = "fireworks_ai/accounts/fireworks/models/deepseek-v3-0324"):
self.name = name
self.personality = personality
self.api_url = api_url
self.api_key = api_key
self.model = model
async def generate_response(self, prompt: str, session: aiohttp.ClientSession) -> str:
"""生成AI回应"""
try:
headers = {
"Content-Type": "application/json",
"x-litellm-api-key": self.api_key
}
payload = {
"model": self.model,
"messages": [
{"role": "system", "content": f"你是{self.name}{self.personality}"},
{"role": "user", "content": prompt}
],
"max_tokens": 1000,
"temperature": 0.8
}
async with session.post(
f"{self.api_url}/v1/chat/completions",
headers=headers,
json=payload,
timeout=aiohttp.ClientTimeout(total=30)
) as response:
if response.status == 200:
result = await response.json()
content = result.get('choices', [{}])[0].get('message', {}).get('content', '')
if content:
return content.strip()
else:
print(f"{self.name} API返回空内容: {result}")
return f"[{self.name}暂时无法回应API返回空内容]"
else:
error_text = await response.text()
print(f"{self.name} API错误 ({response.status}): {error_text[:200]}...")
return f"[{self.name}暂时无法回应API错误: {response.status}]"
except Exception as e:
print(f"{self.name} 生成回应时出错: {e}")
return f"[{self.name}暂时无法回应,连接错误]"
class BaXianCustomDebateSystem:
"""八仙自定义API辩论系统"""
def __init__(self, api_url: str, api_key: str):
self.api_url = api_url.rstrip('/')
self.api_key = api_key
# 创建八仙代理
self.agents = {
"吕洞宾": CustomAPIAgent(
"吕洞宾",
"八仙之首,男性代表,理性务实,善于分析问题的本质和长远影响。你代表男性视角,注重逻辑和实用性。",
api_url, api_key
),
"何仙姑": CustomAPIAgent(
"何仙姑",
"八仙中唯一的女性,温柔智慧,善于从情感和人文角度思考问题。你代表女性视角,注重关怀和和谐。",
api_url, api_key
),
"张果老": CustomAPIAgent(
"张果老",
"八仙中的长者,经验丰富,代表传统智慧和保守观点。你重视稳定和传承,谨慎对待变化。",
api_url, api_key
),
"韩湘子": CustomAPIAgent(
"韩湘子",
"八仙中的年轻人,充满活力和创新精神。你代表新生代观点,勇于尝试和改变。",
api_url, api_key
),
"汉钟离": CustomAPIAgent(
"汉钟离",
"八仙中的富贵者,见多识广,代表富裕阶层的观点。你注重效率和成果,善于资源配置。",
api_url, api_key
),
"蓝采和": CustomAPIAgent(
"蓝采和",
"八仙中的贫苦出身,朴实无华,代表普通民众的观点。你关注基层需求,重视公平正义。",
api_url, api_key
),
"曹国舅": CustomAPIAgent(
"曹国舅",
"八仙中的贵族,出身高贵,代表上层社会观点。你注重秩序和礼仪,维护既有体系。",
api_url, api_key
),
"铁拐李": CustomAPIAgent(
"铁拐李",
"八仙中的平民英雄,不拘小节,代表底层民众观点。你直言不讳,为弱势群体发声。",
api_url, api_key
)
}
# 定义四对矛盾的对角线辩论
self.debate_pairs = [
("吕洞宾", "何仙姑", "男女对立辩论"),
("张果老", "韩湘子", "老少对立辩论"),
("汉钟离", "蓝采和", "富贫对立辩论"),
("曹国舅", "铁拐李", "贵贱对立辩论")
]
async def test_api_connection(self) -> bool:
"""测试API连接"""
print(f"🔍 测试API连接: {self.api_url}")
try:
async with aiohttp.ClientSession() as session:
headers = {"x-litellm-api-key": self.api_key}
async with session.get(
f"{self.api_url}/v1/models",
headers=headers,
timeout=aiohttp.ClientTimeout(total=10)
) as response:
if response.status == 200:
models = await response.json()
print(f"✅ API连接成功找到 {len(models.get('data', []))} 个模型")
return True
else:
error_text = await response.text()
print(f"❌ API连接失败 ({response.status}): {error_text[:200]}...")
return False
except Exception as e:
print(f"❌ API连接测试失败: {e}")
return False
async def conduct_debate(self, topic: str) -> None:
"""进行完整的八仙辩论"""
print(f"\n{'='*80}")
print(f"🎭 八仙自定义API辩论系统")
print(f"📝 辩论主题: {topic}")
print(f"🔗 API端点: {self.api_url}")
print(f"{'='*80}\n")
# 测试API连接
if not await self.test_api_connection():
print("❌ API连接失败无法进行辩论")
return
async with aiohttp.ClientSession() as session:
for i, (agent1_name, agent2_name, debate_type) in enumerate(self.debate_pairs, 1):
print(f"\n🎯 第{i}场辩论: {debate_type}")
print(f"⚔️ {agent1_name} VS {agent2_name}")
print(f"📋 主题: {topic}")
print("-" * 60)
agent1 = self.agents[agent1_name]
agent2 = self.agents[agent2_name]
# 第一轮agent1开场
prompt1 = f"针对'{topic}'这个话题请从你的角度阐述观点。要求1)明确表达立场 2)提供具体论据 3)字数控制在200字以内"
print(f"\n🗣️ {agent1_name}发言:")
agent1_reply = await agent1.generate_response(prompt1, session)
print(f"{agent1_reply}\n")
# 第二轮agent2回应
prompt2 = f"针对'{topic}'这个话题,{agent1_name}刚才说:'{agent1_reply}'。请从你的角度回应并阐述不同观点。要求1)回应对方观点 2)提出自己的立场 3)字数控制在200字以内"
print(f"🗣️ {agent2_name}回应:")
agent2_reply = await agent2.generate_response(prompt2, session)
print(f"{agent2_reply}\n")
# 第三轮agent1总结
prompt3 = f"针对'{topic}'这个话题的辩论,{agent2_name}回应说:'{agent2_reply}'。请做最后总结发言。要求1)回应对方观点 2)强化自己立场 3)寻求共识或妥协 4)字数控制在150字以内"
print(f"🗣️ {agent1_name}总结:")
agent1_final = await agent1.generate_response(prompt3, session)
print(f"{agent1_final}\n")
print(f"✅ 第{i}场辩论结束\n")
# 短暂延迟避免API限制
await asyncio.sleep(1)
print(f"\n🎉 八仙辩论全部结束!")
print(f"📊 共进行了 {len(self.debate_pairs)} 场对角线辩论")
print(f"🎭 参与仙人: {', '.join(self.agents.keys())}")
async def main():
"""主函数"""
# 配置
api_url = "http://master.tailnet-68f9.ts.net:40012"
# 尝试不同的API密钥格式
gemini_key = os.getenv('GEMINI_API_KEY', '')
if not gemini_key:
print("❌ 错误: 未找到GEMINI_API_KEY环境变量")
print("请设置环境变量: export GEMINI_API_KEY=your_api_key")
return
# 使用提供的LiteLLM虚拟密钥
test_keys = [
"sk-0jdcGHZJpX2oUJmyEs7zVA" # LiteLLM虚拟密钥
]
print("🚀 启动八仙自定义API辩论系统...")
# 辩论主题
topic = "工作量证明vs无限制爬虫从李时珍采药到AI数据获取的激励机制变革"
# 尝试不同的API密钥
for api_key in test_keys:
if not api_key or api_key == "sk-":
continue
print(f"\n🔑 尝试API密钥: {api_key[:15]}...")
debate_system = BaXianCustomDebateSystem(api_url, api_key)
# 测试连接
if await debate_system.test_api_connection():
print(f"✅ 使用API密钥成功: {api_key[:15]}...")
await debate_system.conduct_debate(topic)
return
else:
print(f"❌ API密钥失败: {api_key[:15]}...")
print("\n❌ 所有API密钥都失败了")
print("\n🔍 可能的解决方案:")
print(" 1. 检查LiteLLM服务器是否正确配置")
print(" 2. 确认API密钥格式")
print(" 3. 联系服务器管理员获取正确的虚拟密钥")
print(" 4. 检查网络连接和防火墙设置")
if __name__ == "__main__":
asyncio.run(main())