168 lines
5.3 KiB
Python
168 lines
5.3 KiB
Python
|
|
"""
|
|||
|
|
示例使用脚本
|
|||
|
|
演示如何使用多智能体系统生成代码和文档
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import asyncio
|
|||
|
|
import json
|
|||
|
|
from pathlib import Path
|
|||
|
|
from datetime import datetime
|
|||
|
|
|
|||
|
|
from crew_factory import CrewFactory, run_multi_agent_task
|
|||
|
|
from stream_manager import stream_manager
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def save_generated_content(task_id: str, output_dir: str = "generated_output"):
|
|||
|
|
"""
|
|||
|
|
订阅 SSE 流并保存生成的内容到文件
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
task_id: 任务 ID
|
|||
|
|
output_dir: 输出目录
|
|||
|
|
"""
|
|||
|
|
output_path = Path(output_dir)
|
|||
|
|
output_path.mkdir(exist_ok=True)
|
|||
|
|
|
|||
|
|
# 创建时间戳目录
|
|||
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|||
|
|
task_output_dir = output_path / f"task_{timestamp}"
|
|||
|
|
task_output_dir.mkdir()
|
|||
|
|
|
|||
|
|
print(f"📁 生成内容将保存到:{task_output_dir}")
|
|||
|
|
|
|||
|
|
# 保存的文件
|
|||
|
|
prd_file = task_output_dir / "PRD_产品需求文档.md"
|
|||
|
|
qa_file = task_output_dir / "QA_测试计划.md"
|
|||
|
|
dev_file = task_output_dir / "Dev_技术方案.md"
|
|||
|
|
final_file = task_output_dir / "Final_交付报告.md"
|
|||
|
|
|
|||
|
|
content_buffer = {
|
|||
|
|
"ProductManager": [],
|
|||
|
|
"QAEngineer": [],
|
|||
|
|
"SoftwareDeveloper": [],
|
|||
|
|
"Coordinator": []
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
print(f"\n🚀 开始订阅任务流:{task_id}\n")
|
|||
|
|
|
|||
|
|
# 获取流
|
|||
|
|
stream = await stream_manager.get_stream(task_id)
|
|||
|
|
if not stream:
|
|||
|
|
print("❌ 未找到流")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
while not stream.is_closed or not stream.queue.empty():
|
|||
|
|
try:
|
|||
|
|
event = await asyncio.wait_for(stream.get(), timeout=5.0)
|
|||
|
|
if not event:
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
# 打印事件
|
|||
|
|
agent = event.agent
|
|||
|
|
content = event.content
|
|||
|
|
event_type = event.event_type
|
|||
|
|
|
|||
|
|
print(f"[{agent}] {event_type}: {content[:100]}...")
|
|||
|
|
|
|||
|
|
# 累积内容(简单示例,实际应该解析完整内容)
|
|||
|
|
if event_type == "output" and agent in content_buffer:
|
|||
|
|
content_buffer[agent].append(content)
|
|||
|
|
|
|||
|
|
# 检测任务完成
|
|||
|
|
if event_type == "end":
|
|||
|
|
print("\n✅ 任务完成!正在保存文件...\n")
|
|||
|
|
|
|||
|
|
# 保存各角色的输出
|
|||
|
|
for role, contents in content_buffer.items():
|
|||
|
|
if contents:
|
|||
|
|
filename = None
|
|||
|
|
if role == "ProductManager":
|
|||
|
|
filename = prd_file
|
|||
|
|
elif role == "QAEngineer":
|
|||
|
|
filename = qa_file
|
|||
|
|
elif role == "SoftwareDeveloper":
|
|||
|
|
filename = dev_file
|
|||
|
|
elif role == "Coordinator":
|
|||
|
|
filename = final_file
|
|||
|
|
|
|||
|
|
if filename:
|
|||
|
|
with open(filename, 'w', encoding='utf-8') as f:
|
|||
|
|
f.write(f"# {role} 输出\n\n")
|
|||
|
|
f.write(f"生成时间:{datetime.now().isoformat()}\n\n")
|
|||
|
|
f.write('\n'.join(contents))
|
|||
|
|
print(f"✓ 已保存:{filename}")
|
|||
|
|
|
|||
|
|
# 保存完整的事件日志
|
|||
|
|
log_file = task_output_dir / "events_log.json"
|
|||
|
|
print(f"✓ 已保存完整日志:{log_file}")
|
|||
|
|
|
|||
|
|
break
|
|||
|
|
|
|||
|
|
except asyncio.TimeoutError:
|
|||
|
|
if stream.is_closed:
|
|||
|
|
break
|
|||
|
|
continue
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ 错误:{e}")
|
|||
|
|
import traceback
|
|||
|
|
traceback.print_exc()
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def main():
|
|||
|
|
"""主函数"""
|
|||
|
|
print("=" * 60)
|
|||
|
|
print("多智能体系统 - 代码和文档生成示例")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
# 用户需求
|
|||
|
|
user_requirement = """
|
|||
|
|
开发一个简单的在线待办事项应用(Todo App),包含以下功能:
|
|||
|
|
1. 用户可以注册和登录
|
|||
|
|
2. 创建、编辑、删除待办事项
|
|||
|
|
3. 标记事项为完成/未完成
|
|||
|
|
4. 按优先级和截止日期排序
|
|||
|
|
5. 基本的搜索和过滤功能
|
|||
|
|
|
|||
|
|
技术栈要求:
|
|||
|
|
- 后端:Python FastAPI
|
|||
|
|
- 数据库:SQLite
|
|||
|
|
- 前端:简单的 HTML/CSS/JavaScript
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
print(f"\n📝 用户需求:{user_requirement[:200]}...\n")
|
|||
|
|
print("⏳ 启动多智能体系统,请稍候...\n")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
# 启动任务
|
|||
|
|
task_id = await run_multi_agent_task(
|
|||
|
|
user_requirement=user_requirement,
|
|||
|
|
skip_confirmation=True
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
print(f"✅ 任务已启动,Task ID: {task_id}\n")
|
|||
|
|
|
|||
|
|
# 订阅并保存生成的内容
|
|||
|
|
await save_generated_content(task_id)
|
|||
|
|
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
print("✨ 生成完成!请查看 generated_output/ 目录")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"\n❌ 执行失败:{e}")
|
|||
|
|
import traceback
|
|||
|
|
traceback.print_exc()
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 加载环境变量
|
|||
|
|
try:
|
|||
|
|
from dotenv import load_dotenv
|
|||
|
|
load_dotenv()
|
|||
|
|
except ImportError:
|
|||
|
|
pass
|
|||
|
|
|
|||
|
|
asyncio.run(main())
|