06_three_day_workflow.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. """
  2. CodebaseMaintainer 三天工作流演示
  3. 完整展示长程智能体在三天内的工作流程:
  4. - 第一天: 探索代码库(Agent 自主探索)
  5. - 第二天: 分析代码质量(Agent 自主分析)
  6. - 第三天: 规划重构任务(Agent 自主规划)
  7. - 一周后: 检查进度
  8. """
  9. import os
  10. # 配置嵌入模型(三选一)
  11. # 方案一:TF-IDF(最简单,无需额外依赖)
  12. os.environ['EMBED_MODEL_TYPE'] = 'tfidf'
  13. os.environ['EMBED_MODEL_NAME'] = '' # 重要:必须清空,否则会传递不兼容的参数
  14. # 方案二:本地Transformer(需要: pip install sentence-transformers 和 HF token)
  15. # os.environ['EMBED_MODEL_TYPE'] = 'local'
  16. # os.environ['EMBED_MODEL_NAME'] = 'sentence-transformers/all-MiniLM-L6-v2'
  17. # os.environ['HF_TOKEN'] = 'your_hf_token_here' # 或使用 huggingface-cli login
  18. # 方案三:通义千问(需要API key)
  19. # os.environ['EMBED_MODEL_TYPE'] = 'dashscope'
  20. # os.environ['EMBED_MODEL_NAME'] = 'text-embedding-v3'
  21. # os.environ['EMBED_API_KEY'] = 'your_api_key_here'
  22. from hello_agents import HelloAgentsLLM
  23. from datetime import datetime
  24. import json
  25. import time
  26. # 导入 CodebaseMaintainer
  27. import sys
  28. sys.path.append('.')
  29. from codebase_maintainer import CodebaseMaintainer
  30. def day_1_exploration(maintainer):
  31. """第一天: 探索代码库(Agentic 方式)
  32. 在这个阶段,我们只给 Agent 高层次的目标,
  33. Agent 会自主决定:
  34. - 使用哪些 shell 命令探索代码库
  35. - 查看哪些文件
  36. - 是否记录笔记
  37. """
  38. print("\n" + "=" * 80)
  39. print("第一天: 探索代码库(Agent 自主探索)")
  40. print("=" * 80 + "\n")
  41. # 1. 初步探索 - Agent 自主决定如何探索
  42. print("### 1. 初步探索项目结构 ###")
  43. print("💡 提示:Agent 会自主决定使用哪些命令(如 find, ls, cat)\n")
  44. response = maintainer.explore()
  45. print(f"\n助手总结:\n{response[:500]}...\n")
  46. # 2. 深入分析某个模块 - Agent 自主决定分析方法
  47. print("### 2. 分析数据处理模块 ###")
  48. print("💡 提示:Agent 会自主决定如何分析这个文件\n")
  49. response = maintainer.run("请查看 data_processor.py 文件,分析其代码设计")
  50. print(f"\n助手总结:\n{response[:500]}...\n")
  51. # 模拟时间流逝
  52. time.sleep(1)
  53. def day_2_analysis(maintainer):
  54. """第二天: 分析代码质量(Agentic 方式)
  55. Agent 会自主决定:
  56. - 使用什么方法分析代码质量(grep TODO? 统计行数? 检查复杂度?)
  57. - 是否需要创建笔记记录问题
  58. - 如何组织分析结果
  59. """
  60. print("\n" + "=" * 80)
  61. print("第二天: 分析代码质量(Agent 自主分析)")
  62. print("=" * 80 + "\n")
  63. # 1. 整体质量分析 - Agent 自主决定分析方法
  64. print("### 1. 分析代码质量 ###")
  65. print("💡 提示:Agent 会自主决定如何分析(如 grep TODO, wc -l, 复杂度分析)\n")
  66. response = maintainer.analyze()
  67. print(f"\n助手总结:\n{response[:500]}...\n")
  68. # 2. 查看具体问题 - Agent 自主深入分析
  69. print("### 2. 分析 API 客户端代码 ###")
  70. print("💡 提示:Agent 会自主决定如何分析这个文件的质量\n")
  71. response = maintainer.run(
  72. "请分析 api_client.py 的代码质量,特别是错误处理部分,给出改进建议"
  73. )
  74. print(f"\n助手总结:\n{response[:500]}...\n")
  75. # 模拟时间流逝
  76. time.sleep(1)
  77. def day_3_planning(maintainer):
  78. """第三天: 规划重构任务(Agentic 方式)
  79. Agent 会自主决定:
  80. - 回顾哪些历史笔记
  81. - 如何组织任务规划
  82. - 是否需要创建新的笔记
  83. - 如何安排优先级
  84. """
  85. print("\n" + "=" * 80)
  86. print("第三天: 规划重构任务(Agent 自主规划)")
  87. print("=" * 80 + "\n")
  88. # 1. 回顾进度 - Agent 自主查看历史笔记并规划
  89. print("### 1. 回顾当前进度并规划下一步 ###")
  90. print("💡 提示:Agent 会自主查看历史笔记,分析当前进度,并制定计划\n")
  91. response = maintainer.plan_next_steps()
  92. print(f"\n助手总结:\n{response[:500]}...\n")
  93. # 2. 询问 Agent 创建详细计划(Agent 会自主决定是否使用 NoteTool)
  94. print("### 2. 让 Agent 创建详细的重构计划 ###")
  95. print("💡 提示:Agent 会自主决定如何创建和组织重构计划\n")
  96. response = maintainer.run(
  97. "请基于我们的分析,创建一个详细的本周重构计划。"
  98. "计划应该包括:目标、具体任务清单、时间安排和风险。"
  99. "请使用 NoteTool 创建一个 task_state 类型的笔记来记录这个计划。"
  100. )
  101. print(f"\n助手总结:\n{response[:500]}...\n")
  102. # 模拟时间流逝
  103. time.sleep(1)
  104. def week_later_review(maintainer):
  105. """一周后: 检查进度"""
  106. print("\n" + "=" * 80)
  107. print("一周后: 检查进度")
  108. print("=" * 80 + "\n")
  109. # 1. 查看笔记摘要
  110. print("### 1. 笔记摘要 ###")
  111. summary = maintainer.note_tool.run({"action": "summary"})
  112. print("📊 笔记摘要:")
  113. print(json.dumps(summary, indent=2, ensure_ascii=False))
  114. print()
  115. # 2. 生成完整报告
  116. print("### 2. 会话报告 ###")
  117. report = maintainer.generate_report()
  118. print("\n📄 会话报告:")
  119. print(json.dumps(report, indent=2, ensure_ascii=False))
  120. def demonstrate_cross_session_continuity():
  121. """演示跨会话的连贯性"""
  122. print("\n" + "=" * 80)
  123. print("演示跨会话的连贯性")
  124. print("=" * 80 + "\n")
  125. # 第一次会话
  126. print("### 第一次会话 (session_1) ###")
  127. maintainer_1 = CodebaseMaintainer(
  128. project_name="demo_codebase",
  129. #实际使用的时候替换代码路径
  130. codebase_path="/Users/suntao/Documents/GitHub/hello-agents/code/chapter9/codebase",
  131. llm=HelloAgentsLLM()
  132. )
  133. # 创建一些笔记
  134. maintainer_1.create_note(
  135. title="代码质量问题",
  136. content="发现多处 TODO 注释需要实现,特别是数据验证和错误处理部分",
  137. note_type="blocker",
  138. tags=["quality", "urgent"]
  139. )
  140. stats_1 = maintainer_1.get_stats()
  141. print(f"会话1统计: {stats_1['activity']}\n")
  142. # 模拟会话结束
  143. time.sleep(1)
  144. # 第二次会话 (新的会话ID,但笔记被保留)
  145. print("### 第二次会话 (session_2) ###")
  146. maintainer_2 = CodebaseMaintainer(
  147. project_name="demo_codebase", # 同一个项目
  148. #实际使用的时候替换代码路径
  149. codebase_path="/Users/suntao/Documents/GitHub/hello-agents/code/chapter9/codebase",
  150. llm=HelloAgentsLLM()
  151. )
  152. # 检索之前的笔记
  153. response = maintainer_2.run(
  154. "我们之前发现了什么代码质量问题?现在应该优先处理哪些?"
  155. )
  156. print(f"\n助手回答:\n{response[:300]}...\n")
  157. stats_2 = maintainer_2.get_stats()
  158. print(f"会话2统计: {stats_2['activity']}\n")
  159. # 展示笔记摘要
  160. summary = maintainer_2.note_tool.run({"action": "summary"})
  161. print("📊 跨会话笔记摘要:")
  162. print(json.dumps(summary, indent=2, ensure_ascii=False))
  163. def demonstrate_tool_synergy():
  164. """演示三大工具的协同(Agentic 方式)
  165. 在这个演示中:
  166. - 我们不再手动调用工具
  167. - 而是让 Agent 自主决定使用哪些工具
  168. - Agent 会根据任务自动协同使用多个工具
  169. """
  170. print("\n" + "=" * 80)
  171. print("演示三大工具的协同(Agent 自主协调)")
  172. print("=" * 80 + "\n")
  173. maintainer = CodebaseMaintainer(
  174. project_name="synergy_demo",
  175. #实际使用的时候替换代码路径
  176. codebase_path="/Users/suntao/Documents/GitHub/hello-agents/code/chapter9/codebase",
  177. llm=HelloAgentsLLM()
  178. )
  179. # Agent 自主分析并记录
  180. print("### Agent 自主分析代码库中的 TODO 项 ###")
  181. print("💡 提示:Agent 会自主决定:\n")
  182. print(" 1. 使用 TerminalTool 查找 TODO")
  183. print(" 2. 使用 NoteTool 记录发现")
  184. print(" 3. 使用 MemoryTool 记住关键信息\n")
  185. response = maintainer.run(
  186. "请分析代码库中的所有 TODO 项,并将发现记录到笔记中。"
  187. "然后告诉我应该优先实现哪些功能。"
  188. )
  189. print(f"助手回答:\n{response[:500]}...\n")
  190. # 展示统计信息
  191. stats = maintainer.get_stats()
  192. print("📊 工具使用统计:")
  193. print(f" - 工具调用次数: {stats['activity']['tool_calls']}")
  194. print(f" - 执行的命令: {stats['activity']['commands_executed']}")
  195. print(f" - 创建的笔记: {stats['activity']['notes_created']}")
  196. def main():
  197. """主函数"""
  198. print("=" * 80)
  199. print("CodebaseMaintainer 三天工作流演示(Agentic 版本)")
  200. print("=" * 80)
  201. print("\n✨ 核心特性:Agent 自主决策")
  202. print("💡 使用我们在 chapter9 创建的示例代码库")
  203. print("📁 代码库路径: ./codebase")
  204. print("📦 包含文件: data_processor.py, api_client.py, utils.py, models.py")
  205. print("\n🔧 Agent 可用工具:")
  206. print(" - TerminalTool: 执行 shell 命令")
  207. print(" - NoteTool: 创建和管理笔记")
  208. print(" - MemoryTool: 记忆管理")
  209. print("\n⚡ Agent 会自主决定:")
  210. print(" - 使用哪些工具")
  211. print(" - 执行什么命令")
  212. print(" - 如何组织信息\n")
  213. # 初始化助手
  214. maintainer = CodebaseMaintainer(
  215. project_name="demo_codebase",
  216. #实际使用的时候替换代码路径
  217. codebase_path="/Users/suntao/Documents/GitHub/hello-agents/code/chapter9/codebase",
  218. llm=HelloAgentsLLM(provider="deepseek",model="deepseek-chat",api_key="sk-1264257bc4114a73998498ad1436f8f0",base_url="https://api.deepseek.com")
  219. )
  220. # 执行三天工作流
  221. day_1_exploration(maintainer)
  222. day_2_analysis(maintainer)
  223. day_3_planning(maintainer)
  224. week_later_review(maintainer)
  225. # 额外演示
  226. print("\n\n" + "=" * 80)
  227. print("额外演示")
  228. print("=" * 80)
  229. demonstrate_cross_session_continuity()
  230. demonstrate_tool_synergy()
  231. print("\n" + "=" * 80)
  232. print("完整演示结束!")
  233. print("=" * 80)
  234. if __name__ == "__main__":
  235. main()