第 12 章
全流程串联
从用户输入到 Agent 响应的完整之旅
🎯
跟着一个请求走一遍
就像在工厂里跟着一个产品从原材料变成成品,我们现在要跟着一个用户请求,走完它在 OpenHarness 中的完整旅程。这一章把前面学到的所有知识串联起来。
场景:用户说「帮我修复 login.py 中的 Bug」
让我们完整追踪这个请求在 OpenHarness 中的每一步:
第 1 步:CLI 入口
用户在终端输入请求。CLI(命令行界面)接收到文字后,将其包装成一条用户消息(User Message),传递给 Engine。
📂 涉及代码:cli.py → 解析命令行参数和输入
第 2 步:Engine 初始化
Engine 准备 Agent Loop 需要的所有组件:
• 加载系统提示词(System Prompt)
• 注入 MEMORY.md 中的记忆
• 准备工具列表(内置 + MCP)
• 初始化权限检查器
📂 涉���代码:engine/query_engine.py → 组装运行上下文
第 3 步:Agent Loop 第一轮
消息被发送给 LLM(通过 Anthropic API)。LLM 分析请求,决定先读取文件:
返回:tool_use → Read(file_path="login.py")
📂 涉及代码:engine/query.py → run_query 循环
第 4 步:Hook + 权���检查
在执行 Read 工具之前:
1. PreToolUse Hook 被触发 → 记录日志
2. PermissionChecker 检查 → Read 是只读操作,默认模式下自动通过
📂 涉及���码:hooks/executor.py + permissions/checker.py
第 5 步:工具执行
Read 工具被执行:
• 打开 login.py 文件
• 读取内容
• 包装成 ToolResult 返回
结果被添加到消息历史中。
���� 涉及代码���tools/file_read.py → execute()
第 6 步:Agent Loop 第二轮
LLM 看到了文件内容,发现第 42 行有一个条件判断写反了。决定修复:
返回:tool_use → Edit(file_path="login.py", old_string="if user == None", new_string="if user is not None")
这次 Edit 是写入操作。在默认模式下:
• Hook 触发
• 权限检查 → 需要用户确认
• 用户在终端看到确认提示,点击「允许」
• Edit 工具执行修改
第 7 步:Agent Loop 第三轮
LLM 看到修改成功,决定运行测试确认:
返回:tool_use → Bash(command="python -m pytest test_login.py")
用户确认后,测试运行通过。
第 8 步:循环结束
LLM 认为任务完成,返回最终响应(stop_reason="end_turn"):
「已修复 login.py 第 42 行的 Bug。问题是条件判断 `if user == None` 应该改为 `if user is not None`。测试已通过。���
Agent Loop 结束,结果显示在终端。
第 9 步:记忆(可选)
如果在过程中发现了值得记住的信息(比如这是一个反复出现的 Bug 模式),Agent 会写入记忆文件,供下次对话参考。
全流程总结
让我们回顾涉及的所有子系统:
1. CLI / UI → 用户界面
2. Engine → Agent Loop 核心循环(3 轮)
3. API → 与 LLM 通信(3 次调用)
4. Tools → Read、Edit、Bash(3 个工具)
5. Hooks → PreToolUse / PostToolUse(每次工具前后)
6. Permissions → 读取自动通过、写入需确认(2 次确认)
7. Memory → 可选的跨会话记忆
看到了吗?一个简单的「修复 Bug」请求,就涉及了 OpenHarness 的大部分子系统。这就是 Harness 的威力 —— 所有组件协同工作,让 Agent 能完���复杂任务。
📌 关键要点
所有概念串联起来了
恭喜你完成了全部 12 章的学习!现在你理解了:Agent 是什么、Harness 的五大能力、Agent Loop 循环、工具系统、权限控制、Hook 生命周期、技能按需加载、记忆持久化、MCP 标准协议、多 Agent 协作,以及它们如何在一个真实请求中协同工作。
下一步该做什么?
现在你对 OpenHarness 有了全面的理解,可以考��:
🔍 阅读源码
OpenHarness 只有约 11,700 行代码,按照这门课的���序阅读会非常顺畅。
🔧 写一个自定义工具
继承 BaseTool,实现自己的工具,注册到工具列表中。
📚 编写一个 Skill
为你的项目或团队编写专属技能文件。
🌐 搭建 MCP Server
把你常用的服务封装成 MCP Server,让 Agent 能直接使用。
🤝 贡献代码
OpenHarness 是开源的,欢迎贡献代��和想法。
🧠 检验理解
在「修复 Bug」的完整流程中,Agent Loop 一共循环了几轮?
🧠 检验理解
在默认权限模式下,这个流程中哪些操作需要用户确认?