tutor.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from hello_agents import SimpleAgent, HelloAgentsLLM
  2. from typing import Dict, Any
  3. class TutorAgent(SimpleAgent):
  4. """
  5. 主要协调智能体,直接管理 Planner、Exercise 和 Reviewer 子智能体。
  6. 使用简单的直接调用模式,不依赖 A2A 协议。
  7. """
  8. def __init__(self, llm: HelloAgentsLLM):
  9. """
  10. 初始化 TutorAgent 和所有子智能体。
  11. Args:
  12. llm: 用于所有 agents 的大语言模型实例。
  13. """
  14. # 导入放在这里避免循环导入
  15. from agents.planner import PlannerAgent
  16. from agents.exercise import ExerciseAgent
  17. from agents.reviewer import ReviewerAgent
  18. from tools.code_runner import CodeRunner
  19. from tools.agent_tool import AgentTool
  20. # 创建子智能体实例
  21. self.planner = PlannerAgent(llm)
  22. self.exercise = ExerciseAgent(llm)
  23. self.reviewer = ReviewerAgent(llm, tools=[CodeRunner()])
  24. # 定义系统提示词
  25. system_prompt = """
  26. 你是一位智能编程导师 (Tutor)。你负责协调个性化的学习体验。
  27. 你拥有以下专业助手(工具):
  28. - call_planner: 课程规划师,制定个性化学习计划
  29. - call_exercise: 出题人,生成编程练习题
  30. - call_reviewer: 评审员,评审代码并提供反馈
  31. **关键:你必须使用工具,不能自己完成这些任务!**
  32. 工具调用格式(严格遵守此格式):
  33. [TOOL_CALL:工具名称:参数]
  34. 具体示例:
  35. 示例1 - 学习计划:
  36. 用户:"我想学习Python中的列表推导式"
  37. 你的回答:[TOOL_CALL:call_planner:query=请为学习Python列表推导式制定学习计划]
  38. 示例2 - 练习题:
  39. 用户:"请给我出一道关于列表推导式的练习题"
  40. 你的回答:[TOOL_CALL:call_exercise:query=请出一道关于列表推导式的练习题]
  41. 示例3 - 代码评审(最重要!):
  42. 用户:"请评审以下代码: numbers = [1, 2, 3]"
  43. 你的回答:[TOOL_CALL:call_reviewer:query=请评审以下代码: numbers = [1, 2, 3]]
  44. 工作流程(必须严格遵守):
  45. 1. 当用户表达学习目标时 → 立即调用 call_planner
  46. 2. 当用户请求练习时 → 立即调用 call_exercise
  47. 3. 当用户提交代码或请求评审时 → 立即调用 call_reviewer
  48. **绝对禁止的行为**:
  49. - ❌ 不要自己制定学习计划
  50. - ❌ 不要自己出练习题
  51. - ❌ 不要自己评审代码(即使代码很简单)
  52. - ❌ 不要说"工具调用失败"然后自己完成任务
  53. 正确的行为:
  54. - ✅ 识别用户意图
  55. - ✅ 立即生成工具调用(格式:[TOOL_CALL:工具名:query=...])
  56. - ✅ 等待工具返回结果
  57. - ✅ 将结果友好地呈现给用户
  58. """
  59. # 初始化父类
  60. super().__init__(
  61. name="Tutor",
  62. llm=llm,
  63. system_prompt=system_prompt
  64. )
  65. # 将子智能体包装为工具并注册
  66. self.add_tool(AgentTool(
  67. self.planner,
  68. name="call_planner",
  69. description="调用课程规划师,为用户制定个性化的学习计划"
  70. ))
  71. self.add_tool(AgentTool(
  72. self.exercise,
  73. name="call_exercise",
  74. description="调用出题人,根据学习内容生成编程练习题"
  75. ))
  76. self.add_tool(AgentTool(
  77. self.reviewer,
  78. name="call_reviewer",
  79. description="调用评审员,对用户提交的代码进行评审和反馈"
  80. ))