Files
autogen/agents/orchestrator.py
2026-03-12 13:27:03 +08:00

293 lines
7.7 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.

"""
Orchestrator Agent - 协调器智能体
负责流程调度与最终验证
"""
from autogen import AssistantAgent
from typing import Dict, Any, Optional, List
import os
from pathlib import Path
from config.llm_config import get_agent_llm_config, ORCH_PROMPT
class OrchestratorAgent:
"""协调器 Agent负责多智能体协同和流程控制"""
def __init__(self, llm_config: Optional[Dict] = None):
"""
初始化 Orchestrator Agent
Args:
llm_config: LLM 配置
"""
self.llm_config = llm_config or get_agent_llm_config("Orchestrator")
self.agent = AssistantAgent(
name="Orchestrator",
system_message=ORCH_PROMPT,
llm_config=self.llm_config,
description="多智能体系统协调器",
human_input_mode="NEVER"
)
self.workspace_dir = Path("workspace")
self.workspace_dir.mkdir(exist_ok=True)
# 流程状态
self.workflow_state: Dict[str, Any] = {
"current_step": 0,
"total_steps": 5,
"status": "pending",
"artifacts": {}
}
def start_workflow(self, user_requirement: str) -> Dict[str, Any]:
"""
启动完整的工作流程
Args:
user_requirement: 用户需求
Returns:
工作流状态
"""
self.workflow_state = {
"current_step": 1,
"total_steps": 5,
"status": "in_progress",
"user_requirement": user_requirement,
"artifacts": {}
}
return self.workflow_state
def validate_srs(self, srs_content: str) -> Dict[str, Any]:
"""
验证 SRS 文档的完整性
Args:
srs_content: SRS 文档内容
Returns:
验证结果
"""
prompt = f"""
请验证以下 SRS 文档的完整性:
{self._truncate(srs_content, 3000)}
检查清单:
1. ✅ 包含功能性需求列表
2. ✅ 包含非功能性需求
3. ✅ 包含验收标准
4. ✅ 包含风险分析
5. ✅ 需求具有唯一 ID
请输出验证报告,指出缺失或不完整的部分。
"""
response = self.agent.generate_reply(
messages=[{"role": "user", "content": prompt}]
)
validation_report = response if isinstance(response, str) else str(response)
# 保存验证报告
report_file = self.workspace_dir / "srs_validation.md"
with open(report_file, 'w', encoding='utf-8') as f:
f.write(validation_report)
return {
"valid": "" in validation_report and "" not in validation_report,
"report": validation_report,
"file": str(report_file)
}
def validate_tests(self, test_code: str, srs_content: str) -> Dict[str, Any]:
"""
验证测试用例的覆盖率
Args:
test_code: 测试代码
srs_content: SRS 文档
Returns:
验证结果
"""
prompt = f"""
请验证测试用例是否覆盖了所有 SRS 需求:
【SRS 需求】
{self._truncate(srs_content, 2000)}
【测试代码】
{self._truncate(test_code, 2000)}
检查清单:
1. ✅ 每个功能需求都有对应测试
2. ✅ 包含边界情况测试
3. ✅ 包含异常场景测试
4. ✅ 测试可执行且独立
5. ✅ 遵循 TDD 原则
请输出验证报告。
"""
response = self.agent.generate_reply(
messages=[{"role": "user", "content": prompt}]
)
validation_report = response if isinstance(response, str) else str(response)
return {
"valid": "" in validation_report,
"report": validation_report
}
def validate_code(self, code: str, srs_content: str, test_result: Dict) -> Dict[str, Any]:
"""
验证代码质量
Args:
code: 源代码
srs_content: SRS 文档
test_result: 测试结果
Returns:
验证结果
"""
prompt = f"""
请验证代码质量:
【SRS 需求】
{self._truncate(srs_content, 1500)}
【代码】
{self._truncate(code, 2000)}
【测试结果】
{test_result}
检查清单:
1. ✅ 实现所有功能需求
2. ✅ 通过所有测试用例
3. ✅ 代码符合规范MISRA-C/PEP8
4. ✅ 包含完整文档
5. ✅ 无安全漏洞
6. ✅ 性能满足要求
请输出代码质量验证报告。
"""
response = self.agent.generate_reply(
messages=[{"role": "user", "content": prompt}]
)
validation_report = response if isinstance(response, str) else str(response)
return {
"valid": test_result.get("success", False) and "" in validation_report,
"report": validation_report
}
def generate_final_report(self) -> str:
"""
生成最终项目总结报告
Returns:
最终报告内容
"""
prompt = """
请生成项目最终总结报告,包含:
1. 项目概述
2. 交付物清单:
- SRS 文档
- 测试用例
- 源代码
3. 质量指标:
- 测试覆盖率
- 代码质量评分
4. 合规性说明:
- ISO 26262
- MISRA-C
- ASPICE
5. 后续建议
请基于 workspace 目录下的所有文件生成完整报告。
"""
response = self.agent.generate_reply(
messages=[{"role": "user", "content": prompt}]
)
final_report = response if isinstance(response, str) else str(response)
# 保存最终报告
report_file = self.workspace_dir / "FINAL_REPORT.md"
with open(report_file, 'w', encoding='utf-8') as f:
f.write(final_report)
print(f"✅ 最终报告已生成:{report_file}")
return final_report
def request_human_approval(
self,
approval_type: str,
description: str,
data: Dict[str, Any]
) -> bool:
"""
请求人工确认(需要前端配合实现)
Args:
approval_type: 确认类型
description: 确认描述
data: 相关数据
Returns:
用户是否批准
"""
# 这里只是标记,实际的前端交互由 Streamlit 处理
print(f"\n⚠️ 需要人工确认:{description}")
print(f"类型:{approval_type}")
print(f"数据:{data}\n")
# 在命令行模式下,可以简单询问用户
# 在 GUI 模式下,这会触发前端弹窗
try:
response = input("是否批准?(y/n): ").lower()
return response == 'y'
except:
# 非交互模式下默认批准
return True
def _truncate(self, text: str, max_length: int) -> str:
"""截断文本"""
if len(text) <= max_length:
return text
return text[:max_length] + "... [内容已截断]"
def create_orchestrator_agent(llm_config: Optional[Dict] = None) -> AssistantAgent:
"""
创建 Orchestrator AgentAutoGen 原生格式)
Args:
llm_config: LLM 配置
Returns:
AutoGen AssistantAgent 实例
"""
config = llm_config or get_agent_llm_config("Orchestrator")
agent = AssistantAgent(
name="Orchestrator",
system_message=ORCH_PROMPT,
llm_config=config,
description="多智能体系统协调器",
human_input_mode="NEVER"
)
return agent