ai-agent-deep-dive

AI Agent 源码深度研究报告

5,668 stars Python
RAW Doc

README

产品需求文档反推总览

目标:基于现有源码结构,反推出这套 AI 编程产品的核心需求与产品设计,而不是复述实现细节。

文档原则

- 只写需求、目标、交互、约束、边界条件
- 不直接泄露原始源码实现
- 如需描述机制,只用自然语言或 Python 风格伪代码
- 文档站在产品经理 / 系统设计者视角,回答“为什么需要这个能力”

文档结构

1. 00-product-overview.md
- 产品定位
- 核心用户
- 核心问题
- 顶层系统能力

2. 01-system-prompt-and-orchestration.md
- 系统提示词层的需求
- 为什么要做动态拼装
- 为什么要做角色化 agent orchestration

3. 02-tools-permissions-and-execution.md
- 工具系统需求
- 权限系统需求
- Hook / 执行链路 / 安全要求

4. 03-skills-plugins-mcp.md
- Skills 需求
- Plugins 需求
- MCP 集成需求

5. 04-memory-and-session.md
- 记忆系统需求
- Session 管理需求
- 压缩、归档、恢复、摘要需求

6. 05-commands-ui-and-operator-experience.md
- 命令系统需求
- TUI / 状态栏 / 任务可视化需求
- 操作者体验

7. 06-verification-and-quality.md
- 验证 agent 需求
- 质量保证需求
- 失败报告与可追溯性需求

8. 07-architecture-map.md
- 按模块汇总产品能力地图
- 用于快速定位需求归属

9. 08-agent-runtime-loop.md
- 主循环规格
- 多轮执行与终止条件

10. 09-message-model-and-state.md
- 消息模型
- 会话与状态对象

11. 10-context-management.md
- 上下文预算
- 压缩与恢复

12. 11-task-model.md
- 任务模型
- 后台执行与通知

13. 12-workspace-and-isolation.md
- 工作区隔离策略
- 角色与写权限边界

14. 13-failure-recovery.md
- 失败处理
- 恢复机制

15. 14-configuration-system.md
- 配置来源与优先级
- Agent / Session 配置项

16. 15-mvp-scope.md
- Python MVP 范围
- 哪些先做,哪些后置

17. 16-python-implementation-notes.md
- Python 版实现建议
- 模块划分与里程碑

阅读建议

如果你想快速理解这套产品:

1. 先看 00-product-overview.md
2. 再看 04-memory-and-session.md
3. 再看 02-tools-permissions-and-execution.md
4. 最后看 03-skills-plugins-mcp.md06-verification-and-quality.md

---

00 Product Overview

00. 产品总览需求文档

1. 产品定义

这是一款面向软件工程任务的交互式 AI 执行系统。它不是单纯的聊天机器人,也不是只会调用几个工具的脚本外壳,而是一套把推理、工具、权限、任务拆解、记忆、扩展机制与用户交互统一起来的产品系统。

2. 产品目标

产品需要满足以下目标:

1. 帮助用户完成真实的软件工程任务,而不只是提供建议
2. 在执行过程中保持安全、可控、可恢复
3. 让复杂任务可以分解、委派、验证、追踪
4. 让系统可以扩展新的技能、插件与外部工具能力
5. 让长期使用形成可积累的记忆和工作习惯

3. 核心用户

3.1 主要用户


- 独立开发者
- 工程师
- 技术产品经理
- 有代码任务但希望借助 AI 提升效率的操作者

3.2 用户的核心诉求


- 我不只想问问题,我想让系统帮我做事
- 我不只想生成代码,我想让它真正改动项目并验证结果
- 我不只想要一次回答,我想让它持续推进任务
- 我不只想在一个固定产品里工作,我希望它能接入我自己的工具和工作流

4. 产品要解决的核心问题

4.1 普通聊天模型的问题


普通聊天模型的核心局限是:
- 只做一次性回答
- 没有稳定执行能力
- 没有工具治理
- 没有任务状态
- 没有长期上下文管理
- 无法形成可扩展工作流

4.2 简单 Agent 的问题


简单 Agent 虽然能调用工具,但通常会遇到:
- 行为发散
- 工具滥用
- 缺乏权限约束
- 上下文污染
- 任务过程不可追踪
- 做完后不验证
- 无法优雅扩展

因此,本产品的需求本质上是在解决:

如何把“模型 + 工具”升级成一个可用、可控、可扩展、可产品化的软件工程执行系统。

5. 顶层产品能力

根据源码结构反推,这套产品至少需要以下一级能力:

1. 系统提示词编排能力
2. 工具发现、执行与治理能力
3. 多 Agent 调度能力
4. Skills / Plugins / MCP 扩展能力
5. Memory / Session 管理能力
6. 命令系统与交互界面能力
7. 任务与后台执行能力
8. 验证与质量保证能力
9. Telemetry / Transcript / 可追溯能力

6. 顶层非功能需求

6.1 安全性


- 危险操作必须可拦截
- 外部工具结果必须被视为潜在不可信输入
- 用户必须能控制权限边界

6.2 可恢复性


- 会话可恢复
- 任务状态可追踪
- 子任务生命周期可清理

6.3 可扩展性


- 外部工具可接入
- 自定义技能可接入
- 插件可注入命令、技能和行为约束

6.4 成本控制


- 提示词拼装要考虑缓存
- 上下文使用要考虑预算
- 大任务要支持压缩和摘要

7. 产品价值主张

如果从需求层面概括,这套产品的价值主张不是“回答更聪明”,而是:

- 更稳定地执行任务
- 更安全地调用能力
- 更可控地使用 AI
- 更容易把 AI 接入真实工程工作流

8. 一个产品经理视角下的总需求句

可以用一句话总结:

用户需要的不是一个会聊天的模型,而是一个能够在真实工程环境中持续推进任务、遵守约束、调用工具、拆分工作、保留上下文并可被验证的 AI 软件工程操作系统。

---

01 System Prompt And Orchestration

01. 系统提示词与 Agent 编排需求文档

1. 系统提示词为什么不是一段固定文案

从源码结构可以反推,这个产品要求系统提示词具备“动态拼装”能力,而不是固定模板。

需求原因


用户环境、工具集、语言、输出风格、会话状态、MCP 连接状态都可能变化。如果系统提示词不能动态组装,就会出现:
- 规则不匹配当前会话
- 工具说明失效
- 记忆无法注入
- token 成本失控

2. 系统提示词层的核心需求

2.1 基础身份定义


系统需要明确告诉模型:
- 你是执行型协作者
- 你的主要任务是软件工程支持
- 你的输出直接给用户看

2.2 做任务规范


系统需要内建一套工程行为规范,例如:
- 不要乱加功能
- 不要过度抽象
- 不要假装验证过
- 先读代码再改代码
- 不要随意创建文件

这不是“风格偏好”,而是稳定性需求。

2.3 风险动作规范


系统需要明确哪些操作有 blast radius,需要额外确认。例如:
- 删除
- 推送
- 外部可见动作
- 修改共享状态

2.4 工具使用语法


系统不仅要告诉模型“有什么工具”,还要告诉它:
- 什么时候读文件
- 什么时候搜索
- 什么时候编辑
- 什么时候用 shell
- 什么时候并行调用

3. 动态区块需求

系统提示词至少需要支持以下动态区块:

1. 环境信息
2. 当前语言偏好
3. 输出风格
4. 会话局部规则
5. 记忆内容
6. MCP 指令
7. scratchpad / 临时工作区规则
8. token budget 提示

4. 为什么要有 Prompt cache boundary

如果每次请求都完全重造提示词,会带来两个问题:
- 成本上升
- 缓存命中下降

因此产品需要把系统提示词分成:
- 稳定前缀
- 动态后缀

这样才能兼顾灵活性与成本控制。

5. Agent 编排的需求本质

系统需要支持把复杂任务拆给不同角色,而不是只依赖一个万能主 agent。

必须支持的角色至少包括


- 通用执行角色
- 探索角色
- 规划角色
- 验证角色

需求原因


不同任务阶段对行为模式要求不同:
- 探索需要只读
- 规划需要结构化输出
- 实施需要可执行
- 验证需要对抗性检查

如果用一个 agent 混合承担所有角色,稳定性会下降。

6. 子 Agent 设计需求

6.1 fork 子任务


系统需要支持:
- 子任务继承上下文
- 子任务尽量共享缓存前缀
- 子任务减少主线程污染

6.2 background 子任务


系统需要支持:
- 后台执行
- 进度跟踪
- 结果通知
- 可恢复输出

6.3 isolation 子任务


系统需要支持:
- worktree 隔离
- remote 隔离(如果启用)

7. Prompt 写给子 Agent 的需求

主 agent 必须能够给子 agent 交接充分背景,不能只丢一个模糊命令。产品层面要明确要求:
- 写清任务目标
- 写清已知背景
- 写清约束
- 写清期望输出

8. 伪代码表达

python
class SystemPromptBuilder:
def build(self, env, tools, memory, output_style, language, mcp_info):
static_sections = [
intro(),
system_rules(),
task_rules(),
action_safety(),
tool_usage_rules(),
]
dynamic_sections = [
env_section(env),
language_section(language),
output_style_section(output_style),
memory_section(memory),
mcp_section(mcp_info),
]
return static_sections + dynamic_sections

9. 产品经理视角下的总需求句

系统提示词层的核心需求,是把产品规则、工具语法、会话状态和环境约束组装成一套可动态生成、可缓存优化、可支持多角色协作的运行时控制平面。

---

02 Tools Permissions And Execution

02. 工具、权限与执行链需求文档

1. 为什么工具系统是产品核心

如果模型不能操作环境,它只是建议生成器。这个产品的目标是帮助用户推进真实工程任务,因此必须具备正式的工具系统。

2. 工具系统需求

2.1 基础工具能力


产品至少需要以下工具类别:
- 读文件
- 改文件
- 写文件
- 搜索文件
- 搜索内容
- shell / 命令执行
- todo / 任务管理
- 用户追问
- 启动子 agent
- 调用外部 MCP 工具

2.2 工具使用规范


系统必须对模型明确规定工具使用优先级,避免:
- 用 shell 替代专用文件工具
- 误删或误改文件
- 低效重复操作

3. 权限系统需求

3.1 用户控制边界


用户必须能控制哪些工具自动允许,哪些要询问,哪些禁止。

3.2 权限决策来源


权限决策至少可能来自:
- 当前模式
- 用户规则
- 项目规则
- Hook 决策
- 特殊工具安全策略

3.3 被拒后的行为要求


如果某次工具调用被拒绝,系统不能机械重试,而应:
- 理解拒绝信号
- 调整方案
- 必要时向用户澄清

4. 执行链路需求

工具执行不能是“模型决定 -> 直接运行”。产品需要一条正式执行链:

1. 找到工具
2. 校验输入结构
3. 做额外 validateInput
4. 执行 PreToolUse hooks
5. 做权限决策
6. 真正执行工具
7. 记录 telemetry
8. 执行 PostToolUse hooks
9. 格式化结果回流给模型

5. 为什么需要 Hook

Hook 的需求本质是:
- 让组织规则进入运行时
- 让系统可以插入额外检查
- 让工具调用具备动态治理能力

Hook 至少要支持的行为


- 返回消息
- 阻断执行
- 修改输入
- 提供 allow / ask / deny 建议
- 注入额外上下文

6. 为什么输入校验是必需的

模型本身会生成错误参数,因此产品必须在执行层拦住:
- schema 不合法
- 参数越界
- 缺字段
- 类型错误

7. shell 类工具的特殊需求

shell 工具的风险高于读写文件类工具,因此需要:
- 更严格的权限策略
- 可能的前置分类器检查
- 更强的审计能力

8. 工具执行结果的产品要求

工具执行结果不仅要“返回成功/失败”,还要满足:
- 可读
- 可追踪
- 能被后续 Hook 处理
- 能成为 transcript 的一部分

9. 伪代码表达

python
def execute_tool(tool_name, raw_input, context):
tool = find_tool(tool_name)
validated = schema_validate(tool, raw_input)
validated = run_custom_validation(tool, validated)

hook_result = run_pre_hooks(tool, validated, context)
decision = resolve_permission(hook_result, context)
if decision == 'deny':
return denied_result()

final_input = maybe_update_input(validated, hook_result)
output = tool.call(final_input)
run_post_hooks(tool, final_input, output, context)
return output

10. 产品经理视角下的总需求句

工具系统必须从“可调用”升级到“可治理”:既要让模型拥有执行能力,也要在执行前后经过校验、权限、Hook、审计与结果回流,确保整个过程安全、稳定、可追踪。

---

03 Skills Plugins Mcp

03. Skills、Plugins 与 MCP 需求文档

1. 为什么产品不能只靠内置能力

如果产品所有能力都硬编码在主程序里,会遇到几个问题:
- 难以扩展
- 难以适配不同团队
- 难以承载领域知识
- 难以形成生态

因此,这套产品必须支持可扩展能力面。

2. Skills 的需求本质

Skill 不是普通帮助文档,而是一种可复用的工作流能力包。

2.1 Skill 需要承载什么


- 某类任务的使用规则
- 某类任务的上下文说明
- 某类任务的执行 SOP
- 该任务适用的工具边界

2.2 为什么 Skill 必须是 first-class primitive


因为产品需要让模型在遇到特定任务时,优先加载相应能力,而不是每次都重新即兴发挥。

3. Skill 的产品需求

1. 系统要能列出当前可用技能
2. 模型要能在合适时调用技能
3. skill 内容要能注入会话
4. skill 要能带 frontmatter 元信息
5. skill 可以约束 allowed-tools
6. skill 需要避免重复加载

4. Plugin 的需求本质

Plugin 的角色不是给程序员加脚本,而是为模型注入新的行为表面。

Plugin 至少要支持


- 新命令
- 新技能目录
- frontmatter 配置
- 运行时变量替换
- 工具约束
- 用户可调用与否的声明
- effort / model 等提示

5. 为什么要有 MCP

MCP 的需求本质是:
- 用统一协议接入外部工具
- 让产品获得更多外部能力
- 让工具与说明一起进入运行时

MCP 需要满足


1. 接入外部 server
2. 拉取工具定义
3. 注入使用说明
4. 在 agent 级别支持额外 server
5. 在生命周期结束时清理资源

6. 为什么模型需要“知道扩展能力存在”

很多系统扩展做不起来,不是因为没有插件,而是模型根本不知道:
- 有哪些技能
- 什么时候该用
- 扩展工具怎么使用

因此产品必须把这些扩展能力转化成模型可感知的提示信息。

7. Plugin / Skill / MCP 三者关系

Skill


解决“某类任务应该怎么做”

Plugin


解决“系统可以新增什么能力面”

MCP


解决“系统如何连接外部工具与外部能力”

三者叠加后,产品才能具备生态能力。

8. 伪代码表达

python
class ExtensionRuntime:
def load_skills(self, cwd):
return discover_skill_packages(cwd)

def load_plugins(self):
return discover_plugins()

def connect_mcp_servers(self, configs):
return [connect(server) for server in configs]

def expose_capabilities_to_model(self, skills, plugins, mcp_servers):
return build_runtime_capability_listing(skills, plugins, mcp_servers)

9. 产品经理视角下的总需求句

产品必须提供一套可扩展运行时:Skill 负责封装工作流知识,Plugin 负责扩展命令与能力表面,MCP 负责接入外部工具与说明,三者共同让系统具备持续生长的能力。

---

04 Memory And Session

04. 记忆与会话系统需求文档

1. 为什么需要记忆系统

如果产品只靠当前窗口上下文工作,会出现几个问题:

- 用户长期偏好无法沉淀
- 项目背景每次都要重新解释
- 复杂任务容易因上下文压缩而丢失关键事实
- 系统无法逐步形成“协作连续性”

因此,这个产品需要一个多层级记忆系统。

2. 记忆系统的产品目标

1. 保存长期有效的用户偏好和协作约束
2. 保存项目级背景信息
3. 在上下文压缩后仍能恢复关键事实
4. 支持会话恢复与后续继续执行
5. 为子任务和后台任务提供必要的上下文继承

3. 记忆层级反推

从目录结构与调用链可以推断,产品至少需要以下记忆层级:

3.1 用户级记忆


保存:
- 用户语言偏好
- 输出风格偏好
- 常见工作习惯
- 可长期生效的协作规则

3.2 项目级记忆


保存:
- 项目目录背景
- 常用命令
- 测试 / 构建约定
- 项目规范文件中的持续性要求

3.3 会话级记忆


保存:
- 当前任务目标
- 当前已知上下文
- 本轮执行中的中间状态
- 当前阶段的局部决策

3.4 子任务级记忆


保存:
- 子 agent 的任务目标
- 子 agent 的局部上下文
- fork 继承的父上下文
- 验证 / 探索 / 规划等专职子任务的专属状态

4. 记忆系统的核心需求

4.1 持久化需求


系统需要能保存以下内容:
- 用户长期偏好
- 项目常识
- 会话摘要
- 可恢复的任务元数据

4.2 注入需求


系统需要在合适的时机把记忆重新注入到模型上下文中,而不是永久塞在一次请求里。

4.3 压缩需求


当上下文接近限制时,系统必须支持:
- 自动压缩历史
- 保留关键事实
- 降低 token 成本

4.4 恢复需求


用户中断后再次回来时,系统要支持:
- 恢复当前任务状态
- 恢复关键上下文
- 继续之前的执行链

5. Session 管理需求

5.1 会话身份


每个会话都需要唯一标识,便于:
- 恢复
- 归档
- 分析
- 分享
- 跟踪任务生命周期

5.2 会话摘要


系统需要能够自动生成摘要,用于:
- 历史压缩
- 后续恢复
- 快速理解上下文

5.3 会话转录


系统需要持久记录关键消息流,至少包括:
- 用户输入
- 模型输出
- 工具调用摘要
- 子任务结果
- 失败信息

6. 为什么记忆不能等于“把所有历史都塞进去”

产品层面必须避免一种错误思路:把完整历史无脑拼进上下文。

这样会导致:
- 成本上升
- 注意力稀释
- 有效信息被噪声淹没
- 子任务污染主线程

更合理的需求是:

记忆应该是可选择地提取、压缩、恢复和注入,而不是无节制堆积。

7. fork 与记忆的需求关系

从多 agent 设计看,fork 子任务有两个特殊需求:

1. 继承足够的上下文来完成任务
2. 又不能把中间噪声带回主线程

因此系统需要:
- 支持父子上下文有边界地继承
- 支持子任务输出被总结,而不是原样回灌
- 支持 prompt cache 友好的上下文复用

8. 记忆系统的伪代码表达

python
class MemorySystem:
def load_user_memory(self, user_id):
...

def load_project_memory(self, project_root):
...

def load_session_summary(self, session_id):
...

def build_runtime_context(self, user_memory, project_memory, session_summary):
return merge_relevant_context(user_memory, project_memory, session_summary)

def compact_if_needed(self, messages):
if context_budget_low(messages):
return summarize(messages)
return messages

9. 产品经理视角下的总需求句

这套产品必须拥有一个分层记忆系统:它既能保存长期偏好与项目背景,又能在上下文预算受限时压缩历史,并在任务恢复、子任务继承和长期协作中重新注入关键事实。

---

05 Commands Ui And Operator Experience

05. 命令系统、界面与操作者体验需求文档

1. 为什么命令系统是一级产品能力

这类产品不是单轮对话工具,而是一个长期运行的操作者界面。因此,命令系统不是附属功能,而是操作面板。

2. 命令系统需求

产品需要支持用户快速控制以下对象:
- memory
- permissions
- hooks
- mcp
- skills
- tasks
- review / plan / status
- 输出风格
- model
- sandbox
- 插件管理

3. 命令系统的产品目标

1. 降低复杂能力的学习成本
2. 提供清晰的系统控制入口
3. 把高级功能从自然语言里解耦出来
4. 为插件和技能提供统一入口面

4. UI / TUI 的核心需求

4.1 任务可见性


用户需要看到:
- 当前在做什么
- 后台任务是否运行中
- 子 agent 在做什么
- 哪些动作在等待权限

4.2 状态反馈


系统需要及时反馈:
- 进度
- 错误
- 被阻断原因
- 工具运行状态

4.3 结构化展示


系统需要把复杂状态结构化展示出来,例如:
- memory 面板
- permissions 面板
- skills 列表
- hooks 状态
- mcp 状态
- tasks 状态

5. 为什么操作者体验是核心需求

如果系统很强,但用户看不懂当前状态,就会产生:
- 不信任
- 不敢授权
- 不知道何时干预
- 不知道下一步怎么控制

因此产品必须让操作者感觉:
- 任务是透明的
- 系统是可控的
- 能力是可发现的

6. 后台任务与通知需求

一旦支持 background agents,系统就必须支持:
- 后台任务注册
- 进度更新
- 完成通知
- 输出文件查看
- 必要时 kill / cancel

7. 命令系统的扩展需求

命令系统还必须允许:
- 内建命令
- 插件命令
- skill 入口
- 条件启用的功能命令

8. 产品经理视角下的总需求句

这套产品不仅要有能力,还要有可操作性。命令系统与界面层的目标,是把复杂的 AI 运行时变成用户可发现、可控制、可追踪的操作者体验。

---

06 Verification And Quality

06. 验证与质量保证需求文档

1. 为什么“做完”不等于“完成”

在 AI 编程产品里,最大的风险之一是:模型会把“代码改了”误当成“任务完成了”。

因此,这个产品必须把“验证”设计成一个独立能力,而不是可有可无的附属步骤。

2. 验证系统的产品目标

1. 独立检查实现是否真的可用
2. 防止只读代码就宣称完成
3. 防止 happy path 偏见
4. 让验证结果带证据而不是口头判断

3. 验证 Agent 的需求

3.1 独立角色


验证角色需要与实施角色分离,避免实现者偏见。

3.2 默认心智模型


验证角色的工作不是“帮实现找理由通过”,而是主动尝试发现问题。

3.3 必须禁止的行为


验证角色不能:
- 修改项目文件
- 安装依赖
- 用写操作掩盖问题

3.4 必须支持的检查类型


- build
- test suite
- lint / type-check
- 接口调用验证
- UI 自动化验证
- CLI 输入输出验证
- migration 验证
- adversarial probe

4. 输出格式需求

验证结果必须满足:
- 有检查项标题
- 有实际执行命令
- 有真实输出
- 有 PASS / FAIL / PARTIAL 结果
- 最后有统一 verdict

5. 为什么需要 adversarial probe

只验证 happy path 会导致大量问题漏检。因此系统要要求验证阶段主动尝试:
- 边界输入
- 并发场景
- 空输入 / 非法输入
- 重复请求
- 不存在资源引用

6. 为什么验证必须可追溯

如果验证没有命令和输出,用户无法判断:
- 到底测没测
- 测了什么
- 失败在哪

因此,质量系统必须要求“证据化验证”。

7. 质量保证不只是测试

这套产品的质量保证包括:
- 提示词中对诚实汇报的要求
- 验证角色的独立存在
- 执行链的日志与 transcript
- 失败可追踪
- 结果可复盘

8. 伪代码表达

python
class VerificationRunner:
def verify(self, task, changed_files, context):
checks = build_verification_plan(task, changed_files)
results = []
for check in checks:
cmd = check.command
output = run(cmd)
results.append(evaluate(output, check.expectation))
return summarize_verdict(results)

9. 产品经理视角下的总需求句

产品必须把验证设计成独立、对抗性、证据化的质量系统:它不依赖实施者自我声明,而是通过命令、输出与统一 verdict 来证明任务是否真正完成。

---

07 Architecture Map

07. 架构能力地图

1. 顶层能力区

A. 入口层


对应需求:
- 提供 CLI 入口
- 提供初始化流程
- 提供 SDK 接入方式
- 提供 MCP 入口

B. Prompt 编排层


对应需求:
- 动态生成系统提示词
- 注入环境信息
- 注入语言与输出风格
- 注入记忆、MCP 说明、会话局部规则

C. 工具执行层


对应需求:
- 工具发现
- 工具输入校验
- 权限判断
- Hook 拦截
- 执行记录
- 输出回流

D. Agent 调度层


对应需求:
- 启动子 agent
- 支持 fork / background / remote / teammate 模式
- 管理 agent 生命周期
- 管理 agent 上下文边界

E. 扩展生态层


对应需求:
- Skills
- Plugins
- MCP
- 命令扩展
- 插件变量替换与配置注入

F. Memory / Session 层


对应需求:
- 项目记忆
- 用户记忆
- 会话摘要
- transcript
- resume

G. 任务与后台层


对应需求:
- 本地任务
- 后台 agent 任务
- 远程 agent 任务
- shell 任务
- 进度追踪与通知

H. 质量保证层


对应需求:
- verification agent
- 构建 / 测试 / lint / 类型检查
- adversarial probe
- FAIL / PASS / PARTIAL 判定

I. 界面与操作者体验层


对应需求:
- TUI 展示
- 状态栏
- 权限提示
- 任务进度
- 命令系统
- agent / skills / memory / hooks 可视化

2. 跨层系统性要求

2.1 安全要求跨层存在


- Prompt 层要提醒风险
- Tool 层要校验与限权
- Hook 层要能阻断
- UI 层要能提示用户

2.2 上下文管理跨层存在


- Prompt 组装要考虑动态边界
- Session 要考虑压缩与恢复
- Agent 要考虑上下文隔离
- Skills / MCP 要考虑按需注入

2.3 产品化要求跨层存在


- 每个子系统不仅要能工作,还要:
- 可追踪
- 可恢复
- 可扩展
- 可治理

3. 反推出来的组织设计

从架构地图可以反推出,这不是一个“以模型为中心”的产品,而是一个“以运行时操作系统为中心”的产品。

模型只是其中一个核心部件,真正的产品能力来自这些部分的组合:

- prompt assembly
- tool execution pipeline
- permission governance
- agent orchestration
- extension surface
- memory/session management
- verification and traceability

4. 产品经理视角下的总需求句

该产品的架构应被理解为一张能力地图:每一层都不是独立存在的功能点,而是在共同支撑一个目标——让 AI 在真实工程环境中成为一个可控、可扩展、可追踪的执行系统。

---

08 Agent Runtime Loop

08. Agent 运行时主循环规格

目标:定义 Python 版本实现时最核心的运行时循环。该文档不是源码解释,而是实现规格。

1. 设计目标

主循环必须满足以下目标:

1. 能持续推进任务,而不是只做一次回答
2. 能在每轮后根据工具结果重新决策
3. 能在权限阻断、上下文压缩、工具失败时继续可控运行
4. 能触发子 agent、后台任务、验证任务
5. 能生成可追踪的消息流与 transcript

2. 主循环的输入

一次主循环至少需要以下输入:

- messages: 当前消息序列
- system_prompt: 已组装完成的系统提示词
- tool_registry: 当前可用工具集合
- tool_use_context: 执行上下文(cwd、权限、session、任务状态)
- memory_context: 注入后的记忆内容
- user_context: 用户态上下文
- system_context: 系统态上下文
- can_use_tool: 权限判断函数
- max_turns: 最大回合数
- task_budget: 本轮任务预算(可选)

3. 主循环的输出

主循环每轮可能产出:

- 普通 assistant 消息
- tool_use 请求
- tool_result 回写
- progress 消息
- compact / summary 边界消息
- 子任务启动事件
- terminal state(完成 / 失败 / 中断)

4. 循环状态

实现时必须维护显式状态,而不是散落在局部变量中。

建议状态字段:

python
class QueryState:
messages: list
turn_count: int
auto_compact_tracking: dict | None
pending_tool_summary: object | None
stop_hook_active: bool
max_output_recovery_count: int
has_attempted_reactive_compact: bool
transition_reason: str | None

5. 标准单轮流程

每轮执行顺序建议固定为:

1. 预处理当前消息
2. 计算 token / budget 状态
3. 调用模型
4. 解析返回内容
5. 如有工具调用,进入工具执行链
6. 将工具结果追加回消息
7. 如需压缩,执行 compact
8. 决定是否继续下一轮
9. 达到终止条件则返回 terminal state

6. 终止条件

至少支持以下终止条件:

- 模型明确结束任务
- 达到 max_turns
- 用户中断
- 权限阻断且无可行替代方案
- 发生不可恢复异常
- 任务被后台化或移交

7. 工具调用处理要求

如果模型返回一个或多个工具调用:

- 必须按顺序或编排策略执行
- 必须将每个 tool_result 写回消息流
- 如果工具失败,失败信息也必须结构化回写
- 严禁只在 UI 层显示,不回写到模型上下文

8. 压缩与恢复点

主循环必须内建以下钩子点:

- 调用模型前检查是否需要压缩
- 工具结果过长时应用 result budget
- prompt 过长时触发 compact / reactive compact
- resume 时从 compact boundary 后恢复有效消息

9. 子 agent 与后台任务接入点

主循环必须允许以下事件打断常规路径:

- 启动 foreground subagent
- 启动 background subagent
- 接收 task notification
- 继续 resume 某个已有 agent

10. Python 版推荐伪代码

python
def query_loop(params):
state = init_state(params)

while True:
if should_stop(state, params):
return terminal_result(state)

state = maybe_compact(state, params)
request = build_model_request(state, params)
response = call_model(request)
state.messages.append(response.assistant_message)

if response.tool_calls:
tool_events = run_tools(response.tool_calls, params)
state.messages.extend(tool_events)
state.transition_reason = 'tool_round'
continue

if response.should_launch_subagent:
launch_subagent(response, params)
state.transition_reason = 'subagent'
continue

if response.is_terminal:
return terminal_result(state)

state.turn_count += 1

11. 实现边界

Python 第一版务必保证:
- 单主循环是清晰、可测试的
- 每轮状态可序列化
- 每轮输出可回放
- 每轮失败可定位

不要把主循环写成大量隐式副作用的脚本式逻辑。

12. 验收标准

程序员实现完成后,应满足:

1. 可以连续多轮处理任务
2. 工具结果能回流并影响下一轮
3. 超长上下文会压缩而不是直接崩溃
4. 子任务可以插入主流程
5. transcript 可完整记录轮次

---

09 Message Model And State

09. 消息模型与状态规格

1. 为什么消息模型必须先定义

这类 Agent 系统的核心不是“函数调用”,而是“结构化消息驱动状态变化”。如果消息模型不稳定,后面的 memory、resume、工具执行、agent 任务都会混乱。

2. 顶层消息类型

Python 版本建议至少定义以下消息类型:

- system
- user
- assistant
- tool_use
- tool_result
- progress
- attachment
- summary
- compact_boundary
- notification
- tombstone(可选,用于删除/隐藏历史消息后的链修复)

3. 核心消息字段

所有消息建议共享:

python
class BaseMessage:
id: str
type: str
created_at: float
parent_id: str | None
session_id: str

assistant 消息


python
class AssistantMessage(BaseMessage):
content_blocks: list
usage: dict | None
stop_reason: str | None

user 消息


python
class UserMessage(BaseMessage):
content_blocks: list
source: str | None

tool_use 消息块


python
class ToolUseBlock:
id: str
name: str
input: dict

tool_result 消息块


python
class ToolResultBlock:
tool_use_id: str
content: str | list
is_error: bool = False

4. 为什么 parent_id 很重要

消息链必须可追踪。这样才能支持:
- transcript 回放
- resume
- 历史修复
- compact boundary 后的有效链重建

5. progress 消息的处理原则

高频 progress 消息通常是 UI 态,而不是核心 transcript。实现时建议:

- 可以显示在界面中
- 但默认不参与核心 parent chain
- 不应污染 resume 后的模型上下文

6. attachment / notification 的用途

这类消息用于携带结构化系统事件,例如:
- hook 阻断
- task notification
- permission 说明
- MCP 附加上下文

不要把所有系统事件都挤进普通文本消息中。

7. 状态对象要求

除消息外,还要有显式状态对象:

python
class SessionState:
session_id: str
cwd: str
current_task_id: str | None
memory_summary: str | None
active_agent_ids: list[str]
current_permission_mode: str
token_budget_state: dict | None

8. compact boundary 的需求

压缩前后必须有清晰边界,方便:
- 知道哪些历史被总结了
- resume 时只加载必要部分
- 保持消息链清晰

9. transcript 存储要求

transcript 至少要支持:
- 顺序追加
- 按 session 加载
- 按 agent 侧链加载
- 读取尾部摘要
- 限制超大文件读取风险

10. 验收标准

1. 任一轮对话都能序列化为结构化消息
2. tool_use 和 tool_result 可一一对应
3. progress 不污染核心历史链
4. 会话可按消息链恢复
5. 子 agent transcript 能独立存储

---

10 Context Management

10. 上下文管理与压缩规格

1. 目标

上下文管理的目标不是“保留一切”,而是让模型在有限预算内持续拿到最关键的信息。

2. 必须保留的信息

优先级最高的信息包括:

1. 当前用户任务目标
2. 系统硬规则与安全约束
3. 用户明确偏好
4. 最近关键工具结果
5. 当前活跃子任务状态
6. 记忆摘要
7. 最近 compact 后的摘要

3. 可压缩的信息

以下信息应优先被压缩或裁剪:

- 旧的长日志
- 重复解释
- 已完成步骤的冗余细节
- 大量相似 read/search 结果
- 旧的 progress 消息

4. 上下文预算机制

Python 版建议同时维护:
- 粗略 token 估计
- 工具结果字符预算
- 每轮输出预算
- 全任务预算(可选)

5. 压缩触发条件

建议在以下情况触发:

- 请求前 token 估计超过阈值
- 工具结果总量过大
- 模型返回 prompt too long
- resume 重建会话时

6. 压缩策略层级

6.1 轻量裁剪


先裁剪:
- 重复 progress
- 冗长工具输出尾部
- 无关附件

6.2 摘要压缩


把旧消息浓缩成 summary message。

6.3 边界标记


插入 compact boundary,标记压缩点。

7. 子任务上下文要求

fork 子任务


- 继承必要父上下文
- 尽量维持 cache-friendly prefix
- 子任务输出不要原样全部灌回主线程

verification 子任务


- 需要任务目标、改动文件、实现摘要
- 不需要完整噪声过程

8. 工具结果预算

工具结果必须经过 budget 控制。否则:
- 长 grep
- 长 read
- 长 shell 输出
会迅速污染上下文。

9. Python 版伪代码

python
def manage_context(messages, budget):
messages = drop_ephemeral_progress(messages)
messages = trim_large_tool_results(messages, budget.tool_result_chars)

if estimate_tokens(messages) > budget.max_input_tokens:
summary = summarize_old_messages(messages)
messages = build_post_compact_messages(summary, messages)

return messages

10. 验收标准

1. 长任务不会因上下文无限增长而崩溃
2. resume 后仍可恢复关键事实
3. 子任务不会把噪声大规模回灌主线程
4. 工具长输出会被预算裁剪

---

11 Task Model

11. 任务模型与后台执行规格

1. 目标

任务系统负责把“一个 agent 在做什么”变成可追踪对象,而不是只存在于对话文本里。

2. 任务类型

Python 版建议至少支持:

- main_session_task
- local_agent_task
- background_agent_task
- shell_task
- verification_task
- remote_task(可后置)

3. 核心任务字段

python
class TaskRecord:
task_id: str
type: str
session_id: str
parent_task_id: str | None
agent_id: str | None
description: str
status: str
created_at: float
started_at: float | None
finished_at: float | None
output_path: str | None
error: str | None
result_summary: str | None
progress: dict | None

4. 状态机

建议统一状态:
- pending
- running
- waiting_permission
- backgrounded
- completed
- failed
- cancelled
- killed

5. 背景任务需求

background agent 至少要支持:
- 注册
- 更新进度
- 存储输出文件路径
- 完成时通知主线程
- 失败时通知主线程
- 支持 kill / cancel

6. 进度跟踪需求

任务进度至少记录:
- 工具调用次数
- token 使用量
- 最近活动
- 最近摘要

7. 输出文件需求

后台任务建议将结果落盘到 output file,用于:
- 主线程查看
- resume 后读取
- 审计

8. 通知机制需求

任务结束时,系统必须向主线程注入结构化 notification,而不是只静默完成。

9. 验收标准

1. 每个子 agent 都能注册为任务
2. 背景任务可查询状态
3. 任务可输出结果文件
4. 任务完成/失败会通知主线程
5. 任务可被停止

---

12 Workspace And Isolation

12. 工作区与隔离策略规格

1. 目标

不同 agent 不能默认拥有相同的文件系统权限。产品必须允许根据角色与场景控制工作区隔离。

2. 隔离模式

Python 版建议至少定义:

2.1 shared workspace


主线程默认工作区,共享项目目录。

2.2 read-only workspace


用于探索、规划、验证等只读角色。

2.3 temp workspace


用于临时脚本、临时测试产物。

2.4 worktree workspace


用于隔离修改型子任务,避免污染主分支。

2.5 remote workspace


用于远程执行环境(第一版可不做)。

3. 为什么隔离必须存在

没有隔离会导致:
- 子任务互相污染
- 验证角色破坏项目
- fork 实验影响主线程
- 风险动作边界模糊

4. 角色与隔离建议

- Explore Agent -> read-only
- Plan Agent -> read-only
- Verification Agent -> read-only + temp writable
- General Agent -> shared 或 worktree
- 高风险实现任务 -> worktree

5. 路径翻译需求

如果子任务运行在 worktree 中,而继承的上下文引用的是父工作区路径,系统需要能做路径翻译或重新读取。

6. 清理需求

隔离工作区结束后必须支持:
- 清理临时文件
- 清理临时目录
- 清理 worktree(如适用)
- 清理孤儿进程

7. 验收标准

1. 只读角色不能修改项目文件
2. 验证角色只能在 temp 目录写测试脚本
3. worktree 任务不污染主项目目录
4. 任务结束后能清理隔离资源

---

13 Failure Recovery

13. 失败处理与恢复规格

1. 目标

Agent 系统不能把失败当成异常边缘情况。失败是常态,系统必须有明确恢复策略。

2. 失败类型

建议至少区分:

- tool_input_error
- permission_denied
- hook_blocked
- shell_runtime_error
- model_api_error
- prompt_too_long
- mcp_connect_error
- task_killed
- resume_load_error
- session_storage_error

3. 各类失败处理原则

tool_input_error


- 直接回写错误给模型
- 不执行真实工具

permission_denied


- 不重复原样调用
- 引导模型调整方案

hook_blocked


- 将阻断原因结构化返回
- 允许模型或用户后续处理

prompt_too_long


- 触发 compact / reactive compact
- 必要时重建消息序列后重试

model_api_error


- 保留错误记录
- 可尝试有限恢复

4. resume 恢复需求

系统必须支持:
- 读取 transcript
- 找到 compact boundary 后有效历史
- 恢复 session_id 与 project dir
- 恢复活跃任务或至少恢复摘要

5. 子任务失败需求

子任务失败后不能静默消失,必须:
- 写入任务状态
- 通知主线程
- 保留错误摘要

6. 恢复策略级别

轻恢复


- 调整输入
- 重新请求权限
- 简短重试

中恢复


- 压缩上下文后重试
- 重建子任务上下文

重恢复


- resume 会话
- 用户介入
- 终止并保留证据

7. 验收标准

1. 常见失败都有明确处理路径
2. 子任务失败不会丢失
3. prompt too long 可进入压缩恢复
4. 会话中断后可恢复

---

14 Configuration System

14. 配置系统规格

1. 目标

配置系统负责把产品的默认行为、用户偏好、项目约束和扩展能力统一管理,而不是散落在代码里。

2. 配置来源

Python 版建议支持以下来源:

1. 全局用户配置
2. 项目级配置
3. session 级配置
4. plugin / skill frontmatter 配置
5. 环境变量
6. CLI 参数覆盖

3. 配置优先级

建议优先级从高到低:

1. runtime override / CLI 参数
2. session 配置
3. 项目配置
4. 用户全局配置
5. 默认配置

4. 必须可配置的项目

- 默认模型
- 语言
- 输出风格
- permission mode
- hook 开关与 hook 配置
- MCP server 配置
- plugin 路径
- skill 路径
- token / task budget
- 自动 compact 开关
- transcript 持久化开关

5. Agent 级配置需求

每个 agent 定义建议支持:
- agent_type
- when_to_use
- allowed_tools / disallowed_tools
- model
- memory scope
- mcp_servers
- background capability
- isolation mode

6. 配置系统验收标准

1. 用户可在不改代码的情况下调整运行行为
2. 项目可定义局部约束
3. session 可临时覆盖配置
4. plugin / skill 可附带配置元信息

---

15 Mvp Scope

15. Python 版本 MVP 范围

1. 目标

避免 Python 版本一开始就无限扩张。MVP 只做能跑通核心闭环的最小系统。

2. MVP 必须包含

2.1 主循环


- 多轮 query loop
- tool call -> tool result -> next turn

2.2 基础工具


- read file
- write file
- edit file
- grep/search
- bash

2.3 基础权限系统


- allow / ask / deny
- 被拒后不原样重试

2.4 基础 transcript / session


- 消息持久化
- resume 会话

2.5 基础 memory


- 用户 / 项目记忆注入
- 简单记忆文件结构

2.6 基础 agent orchestration


- main agent
- 至少一个 verification agent
- 可选一个 explore / plan agent

2.7 基础 compact


- 超长消息时压缩历史
- 工具结果 budget 裁剪

3. MVP 可以后置的能力

- 完整 TUI
- remote execution
- 多人 teammate / swarm
- 高级 telemetry
- 高级 tracing
- 复杂 MCP delta 更新
- 高级 proactive / coordinator 模式
- 完整插件生态

4. 推荐实现顺序

1. 消息模型
2. 主循环
3. 工具执行链
4. transcript / resume
5. memory
6. verification agent
7. skills / plugin / MCP 里的最小一项

5. 成功标准

MVP 成功不等于“功能很多”,而是下面闭环能跑通:

用户给任务 -> 系统多轮推进 -> 调用工具 -> 保留上下文 -> 必要时压缩 -> 完成后给结果 -> 可恢复会话 -> 可做基本验证

6. 不建议在 MVP 阶段做的错误方向

- 先做复杂 UI
- 先做很多 agent 类型
- 先做大而全插件系统
- 没有 transcript / resume 就上 background task
- 没有权限系统就直接开放 bash

---

16 Python Implementation Notes

16. Python 实现注意事项

1. 实现原则

目标不是逐字复刻原实现,而是用 Python 重建同样的产品能力结构。

2. 模块建议

建议 Python 项目按以下模块拆:

- runtime/:query loop, orchestration
- messages/:message schemas
- tools/:tool registry and execution
- permissions/:permission engine
- memory/:memory loading and retrieval
- tasks/:background task model
- storage/:transcript and session persistence
- agents/:agent definitions
- extensions/:skills/plugins/mcp
- verification/:verification runner

3. 推荐先用的数据模型

优先用:
- pydantic / dataclasses 定义消息与状态
- sqlite 或 JSONL 先做 transcript
- 明确的 service 层代替隐式全局状态

4. 不要过早做的事

- 不要先优化 UI
- 不要先做复杂并发
- 不要先支持十几种 agent
- 不要把 memory 做成向量库重系统

5. 第一阶段的最佳目标

先做出一个:
- 结构清晰
- transcript 可回放
- message 模型稳定
- verification 能跑
- compact 能工作

的 Python core runtime。

6. 推荐里程碑

Milestone 1


- message model
- query loop
- basic tools
- transcript

Milestone 2


- permissions
- memory
- resume
- compact

Milestone 3


- verification agent
- simple skill loading
- background local agent tasks

Milestone 4


- MCP / plugin minimal support
- worktree isolation
- richer UI

---

README

AI Agent Deep Dive

<a href="https://www.star-history.com/?repos=tvytlx%2Fai-agent-deep-dive&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=tvytlx/ai-agent-deep-dive&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=tvytlx/ai-agent-deep-dive&type=date&legend=top-left" />
<img alt="Star History Chart" src="https://api.star-history.com/chart?repos=tvytlx/ai-agent-deep-dive&type=date&legend=top-left" />
</picture>
</a>

PDF 下载 / PDF Report:
- 新增《Hermes Agent 源码深度解析》,在我的知识星球 矩阵之外
- ClaudeCode ai-agent-deep-dive-v2.1.pdf 新增第八章:记忆系统
- ClaudeCode ai-agent-deep-dive-v2.pdf

Notes

- 本仓库仅保留面向学习与评论的分析材料,不提供源码目录。
- 第二版 PDF 已完成。

Teaching Agent Code

这个仓库现在还包含一个教学用的最小 Python Agent 项目,用于演示一个 AI Agent 的核心结构应该怎么组织。

核心代码位置

- Agent 核心代码:src/agt/agent.py
- CLI 入口:src/agt/cli.py
- 教学文档:docs/

这个教学项目的定位

这个最小 Agent 项目是为了教学而设计的,特点是:

- 尽量保持结构清晰
- 尽量减少不必要的工程复杂度
- 所有核心代码集中在一个很小的范围内,方便学习
- 当前重点放在:Agent 主循环、Fake LLM 接口、Skills 发现、CLI 骨架

如何运行最小 Agent

本项目使用 Poetry 管理依赖。

#### 1. 安装依赖

bash
poetry install

#### 2. 运行最小 Agent CLI

bash
poetry run agt "你好"

#### 3. 查看 Skills

bash
poetry run agt --skills-dir ./skills --list-skills

当前实现说明

当前版本是一个教学型最小实现,还没有接入真实远程模型 API。

目前内置的是一个可替换的 Fake LLM:
- 用户输入什么
- 它就会用流式文本块的方式返回一个测试响应

这样做的目的,是为了让后续接入真实模型时,只需要替换 LLM 调用层,而不需要重写整个 Agent 主体。

---