Hermes Agent 架构深度解析
1. 前言:从一个真实的生产级 AI Agent 中学习架构
1.1. 为什么要写这本书?
1.1.1. 为什么是 Hermes Agent?
1.2. 为什么通过真实代码学习?
1.3. 如何阅读这本书
1.3.1. 推荐阅读路径
1.3.2. 代码引用约定
1.4. 前置知识
1.4.1. Python 编程
1.4.2. LLM API 基础
1.4.3. 异步编程概念
1.5. 章节概览
1.5.1. 第一部分:基础(Part 1)
1.5.2. 核心架构
1.5.3. 平台层
1.5.4. 第二部分:经验与实战(Part 2)
1.5.5. 附录
1.6. 本书的边界
1.7. 致谢
2. 第一部分:基础概念
2.1. 什么是 AI Agent?
2.1.1. 定义
2.1.1.1. 与聊天机器人的区别
2.1.1.2. 与 RAG 管线的区别
2.1.1.3. 一个精确的工作定义
2.2. 基础循环:Observe → Think → Act → Observe
2.3. Agent 架构的演进
2.3.1. ReAct (2022)
2.3.2. Reflexion (2023)
2.3.3. Toolformer (2023)
2.3.4. AutoGPT (2023)
2.4. 为什么要工具、记忆和规划?
2.4.1. 工具:Agent 的手脚
2.4.2. 记忆:Agent 的经验
2.4.3. 规划:Agent 的大脑
2.5. 通用 Agent 架构模式
2.6. Hermes 如何映射到这些概念
3. 核心循环:Agent Loop 的完整生命周期
3.1. 第一节:AIAgent 类的架构
3.1.1. 类概览
3.1.1.1. 属性分组
3.1.1.2. 类图
3.2. 第二节:run_conversation() —— 主循环
3.2.1. 方法签名
3.2.2. 完整的时序图
3.2.2.1. 步骤详解
3.3. 第三节:流式架构
3.3.1. 三种 API 模式
3.3.1.1. 统一的 SimpleNamespace 响应模式
3.3.1.2. 流式数据的累积
3.3.1.3. 流式数据流图
3.3.1.4. 思考泄漏防护(Think Scrubber)
3.3.1.5. 为什么 Hermes 不使用 async/await?
3.4. 第四节:错误分类与恢复
3.4.1. 14 种 FailoverReason
3.4.1.1. 错误分类管道
3.4.1.2. 抖动指数退避
3.4.1.3. 错误恢复的状态机
3.5. 第五节:工具执行引擎
3.5.1. 并行 vs 顺序决策
3.5.1.1. Agent 循环拦截工具
3.5.1.2. 调用链:_invoke_tool → handle_function_call → registry.dispatch
3.5.1.3. 工具名幻觉修复
3.6. 第六节:预算与迭代控制
3.6.1. IterationBudget 的工作原理
3.6.1.1. 父 Agent 与子 Agent 的预算共享
3.6.1.2. 预算耗尽的宽限机制
3.7. 第七节:会话持久化与清理
3.7.1. 循环退出时的处理
3.7.2. 轨迹保存
3.7.3. 资源清理
3.7.3.1. 后台审查线程
3.7.3.2. 插件钩子
3.8. 总结
4. 工具系统:从注册到执行的完整管道
4.1. 1. 工具系统设计哲学
4.1.1. 为什么 Agent 需要工具?
4.1.2. 自注册模式:去中心化的工具管理
4.2. 2. 注册表单例 (ToolRegistry)
4.2.1. 单例模式与线程安全
4.2.2. ToolEntry:使用 __slots__ 优化
4.2.3. 快照机制:线程安全的读取
4.2.4. 注册 API:工具的自声明
4.2.5. 注销 API:动态工具管理
4.2.6. 工具注册流程图
4.3. 3. AST 预扫描发现机制
4.3.1. 问题:导入的成本
4.3.2. AST 扫描的实现
4.3.3. 发现与导入流程
4.4. 4. 工具集系统
4.4.1. 工具集的设计目标
4.4.2. 共享工具列表
4.4.3. 递归解析与循环检测
4.4.4. 工具集解析流程图
4.5. 5. 参数类型强制转换
4.5.1. 问题的根源
4.5.2. 类型强制转换的实现
4.5.3. 值转换逻辑
4.5.4. 数字转换
4.5.5. 布尔转换
4.6. 6. 执行调度
4.6.1. 调度流程总览
4.6.2. Agent Loop 拦截
4.6.3. 钩子系统
4.6.4. 注册表调度
4.6.5. 工具调度流程图
4.7. 7. Agent Loop 拦截
4.7.1. 为什么需要拦截?
4.7.2. 拦截的工作原理
4.7.3. 注册表中的占位符
4.8. 8. 结果持久化与预算
4.8.1. 三层防御策略
4.8.2. 工具级最大结果大小
4.8.3. 结果持久化
4.8.4. 轮次预算
4.9. 9. 工具安全护栏 (Tool Guardrails)
4.9.1. 安全护栏的设计理念
4.9.2. 文件操作安全:file_safety.py
4.9.3. 护栏系统的整体架构
4.10. 10. 写后增量检查 (Post-write Delta Lint)
4.10.1. 问题:写入后的沉默失败
4.10.2. 增量检查的工作原理
4.10.3. 支持的文件类型
4.10.4. 为什么选择进程内检查?
4.10.5. 与调度管道的集成
4.11. 11. 并行执行引擎
4.11.1. 并行执行的好处
4.11.2. 工具分类
4.11.3. 并行决策流程图
4.12. 12. 异步桥接
4.12.1. 为什么需要异步桥接?
4.12.2. 持久化事件循环
4.12.3. _run_async():统一的桥接
4.13. 扩展工具集
4.13.1. 代码执行工具(PTC)
4.13.2. Mixture-of-Agents 工具
4.13.3. 环境执行后端
4.13.4. 浏览器工具
4.13.5. 其他扩展工具
4.14. 总结
5. 提示工程管线:如何组装一个完美的 System Prompt
5.1. 1. 提示工程的挑战
5.1.1. 为什么 System Prompt 如此重要?
5.1.2. 提示工程的核心矛盾
5.2. 2. 提示组装管线总览
5.2.1. 9 槽位管道概览
5.2.2. 提示组装管线流程图
5.3. 3. Agent 身份层 (SOUL.md)
5.3.1. 身份的定义
5.3.2. 自定义身份:SOUL.md
5.4. 4. 平台适配层
5.4.1. 13 个平台提示
5.4.2. 平台适配的关键考量
5.4.3. 媒体发送机制
5.5. 5. 环境感知层
5.5.1. WSL 检测
5.5.2. 环境检测函数
5.6. 6. 记忆与搜索指导
5.6.1. 记忆指导 (MEMORY_GUIDANCE)
5.6.2. 会话搜索指导 (SESSION_SEARCH_GUIDANCE)
5.6.3. 技能指导 (SKILLS_GUIDANCE)
5.7. 7. 模型特定执行规范
5.7.1. 工具使用强制指导
5.7.2. OpenAI 模型执行指导
5.7.3. Google 模型操作指导
5.7.4. 角色映射
5.8. 8. 技能索引系统
5.8.1. 双层缓存架构
5.8.2. 缓存键的设计
5.8.3. 磁盘快照
5.8.4. 技能条件过滤
5.8.5. 技能索引的输出格式
5.8.6. 技能缓存查找流程图
5.9. 9. 上下文文件优先级
5.9.1. 优先级顺序
5.9.2. .hermes.md 的搜索范围
5.9.3. 内容截断
5.9.4. YAML Frontmatter 处理
5.9.5. 上下文文件解析优先级流程图
5.10. 10. 提示注入防御
5.10.1. 13 种检测模式
5.10.2. Unicode 不可见字符扫描
5.10.3. 扫描与阻止流程
5.11. 11. Anthropic Prompt 缓存
5.11.1. 为什么需要 Prompt 缓存?
5.11.2. system_and_3 策略
5.11.3. 缓存标记的注入
5.11.4. 成本节省分析
5.11.5. Anthropic 缓存策略流程图
5.12. 总结
6. 上下文压缩:当对话超出 Token 限制
6.1. 为什么需要上下文压缩
6.1.1. Token 限制的现实
6.1.2. 成本和延迟的影响
6.1.3. 简单截断 vs. 结构化压缩
6.2. 压缩引擎抽象(ContextEngine ABC)
6.2.1. 设计理念
6.2.2. 核心接口
6.2.3. 可选扩展
6.2.4. 插件选择机制
6.3. 触发条件与阈值设计
6.3.1. 基础阈值:threshold_percent
6.3.2. 反抖动保护(Anti-Thrashing)
6.4. Phase 1: 工具结果修剪(_prune_old_tool_results)
6.4.1. 为什么先修剪工具结果?
6.4.2. Hash 去重
6.4.3. 28 种工具摘要器
6.4.4. 工具参数 JSON 截断
6.4.5. 修剪边界确定
6.5. Phase 2: 边界确定
6.5.1. 三段式分割
6.5.2. 头部保护:protect_first_n=3
6.5.3. 尾部保护:Token 预算而非固定消息数
6.5.4. 边界对齐:避免拆分工具调用组
6.6. Phase 3: LLM 摘要生成
6.6.1. 首次摘要 vs. 迭代更新
6.6.2. 摘要结构模板
6.6.3. 摘要模型的提示词设计
6.6.4. 摘要的 Token 预算
6.6.5. 序列化与截断
6.6.6. 焦点话题(Focus Topic)
6.7. Phase 4: 消息组装
6.7.1. 组装流程
6.7.2. 系统提示注入
6.7.3. 摘要前缀(SUMMARY_PREFIX)
6.7.4. 角色选择与冲突避免
6.8. Phase 5: Tool 对清理
6.8.1. 工具调用的配对约束
6.9. 失败降级和迭代压缩
6.9.1. 摘要生成失败的降级策略
6.9.2. 静态回退上下文标记
6.9.3. 迭代压缩的效果追踪
6.10. 配置参数速查表
6.11. 总结
7. 状态与会话管理:Agent 的记忆系统
7.1. 为什么 Agent 需要持久化
7.1.1. 无状态 Agent 的局限
7.1.2. 持久化的需求层次
7.2. SessionDB 架构概览
7.2.1. 技术选型:为什么是 SQLite?
7.2.2. WAL 模式详解
7.3. 数据库 Schema 详解
7.3.1. Schema 版本管理
7.3.2. sessions 表
7.3.3. 索引设计
7.3.4. messages 表
7.4. FTS5 全文搜索
7.4.1. FTS5 虚拟表结构
7.4.2. 同步触发器
7.4.3. 查询清理器(_sanitize_fts5_query)
7.4.4. CJK 回退机制
7.5. 写入并发控制
7.5.1. 问题:多进程写竞争
7.5.2. 解决方案:BEGIN IMMEDIATE + 随机抖动
7.5.3. WAL 检查点
7.6. 会话生命周期
7.6.1. 创建会话(create_session)
7.6.2. 追加消息(append_message)
7.6.3. 结束会话(end_session)
7.6.4. 重新打开会话(reopen_session)
7.6.5. 确保会话存在(ensure_session)
7.6.6. 删除会话(delete_session)
7.6.7. 修剪旧会话(prune_sessions)
7.7. 会话分支机制
7.7.1. 分支的设计动机
7.7.2. 标题的血脉继承
7.7.3. 标题验证与清理
7.8. Token 计数双模式
7.8.1. 增量模式 vs. 绝对模式
7.8.2. 计费信息
7.9. 消息加载
7.9.1. 两种加载格式
7.9.2. 还原时的反序列化
7.10. 会话列表与富预览
7.10.1. 单查询优化
7.10.2. 子会话过滤
7.11. ID 解析
7.12. Schema 迁移链 v1→v6
7.12.1. 迁移策略
7.12.2. 迁移历史
7.13. 轨迹记录
7.13.1. 轨迹格式
7.13.2. Scratchpad 转换
7.14. 会话 ID 解析
7.15. 导出与备份
7.15.1. 单会话导出
7.15.2. 全量导出
7.15.3. 消息清除
7.16. 配置参数速查表
7.17. 总结
8. 配置管理:分层配置系统
8.1. 配置层级(4 层)
8.2. DEFAULT_CONFIG 结构
8.2.1. 模型与 Provider
8.2.2. Agent 行为
8.2.3. 终端与沙箱
8.2.4. 浏览器
8.2.5. 上下文压缩
8.2.6. 辅助任务配置
8.2.7. 审批系统
8.2.8. 安全配置
8.2.9. 显示与交互
8.2.10. 配置版本控制
8.3. load_config() 深度合并
8.3.1. 深度合并逻辑
8.3.2. 环境变量展开
8.3.3. 配置路径
8.4. 环境变量管理
8.4.1. load_env() 加载
8.4.2. save_env_value() 保存
8.4.3. get_env_value() 查询
8.4.4. 可选环境变量注册表
8.5. Profile 系统
8.5.1. HERMES_HOME 覆盖
8.5.2. 隔离的资源
8.6. 配置迁移
8.6.1. 版本追踪
8.6.2. 迁移流程
8.6.3. 向后兼容处理
8.6.4. Managed 模式
8.6.5. 容器感知
8.7. 国际化(i18n)支持
8.7.1. 支持的语言
8.7.2. 配置方法
8.7.3. i18n 框架实现
8.8. Model Aliases 配置
8.9. 安全与权限
8.9.1. 文件权限
8.9.2. 密钥脱敏
8.9.3. 非 ASCII 凭证检查
8.10. 总结
9. 模型路由:多 Provider 的统一接入层
9.1. 为什么需要多 Provider
9.1.1. 成本多样性
9.1.2. 可用性保障
9.1.3. 能力差异
9.2. Provider 注册表
9.2.1. Provider 注册表:HermesOverlay 与 models.dev
9.2.1.1. HermesOverlay 数据类
9.2.1.2. models.dev 注册表
9.2.1.3. 双数据源合并
9.3. 辅助客户端路由
9.4. 文本/视觉任务的优先级链
9.4.1. 文本任务优先级链
9.4.2. 视觉任务优先级链
9.5. 客户端适配器模式
9.5.1. CodexAuxiliaryClient(Responses -> ChatCompletions)
9.5.2. AnthropicAuxiliaryClient
9.5.3. 异步适配器
9.6. 客户端缓存架构
9.6.1. 缓存设计要点
9.6.2. 异步客户端的事件循环验证
9.6.3. 启动和关闭
9.7. 支付错误自动回退
9.7.1. 支付错误检测
9.7.2. 回退链
9.8. 模型特定策略
9.8.1. 固定温度
9.8.2. Developer 角色处理
9.8.3. Anthropic 兼容 Provider
9.8.4. Opus 4.7+ 采样参数限制
9.9. 上下文长度解析 10 级优先级
9.9.1. 本地服务器类型检测
9.9.2. URL 到 Provider 推断
9.10. Token 估算
9.10.1. estimate_tokens_rough
9.10.2. estimate_request_tokens_rough
9.10.3. 上下文探测阶梯
9.11. models.dev 注册表
9.11.1. 数据解析链
9.11.2. Provider ID 映射
9.11.3. 隐藏模型过滤
9.11.4. Agent 模型过滤
9.12. 错误消息解析
9.12.1. 上下文限制提取
9.12.2. 可用输出 Token 提取
9.13. 客户端适配器
9.13.1. 适配器架构
9.13.2. AnthropicAdapter
9.13.3. BedrockAdapter
9.13.4. GeminiCloudCodeClient
9.14. 总结
10. CLI 与 UI 系统:构建交互式 Agent 界面
10.1. 为什么 Agent 需要精心设计的 UI
10.2. CLI 架构总览
10.2.1. 入口点解析
10.2.2. HermesCLI 类的生命周期
10.3. prompt_toolkit 集成
10.3.1. Layout 布局结构
10.3.2. KeyBindings 键绑定
10.3.3. Completer 补全器
10.3.4. AutoSuggest 自动建议
10.4. 输入路由优先级
10.4.1. 各级别详细说明
10.5. Slash 命令系统
10.5.1. CommandDef 数据类
10.5.2. 命令解析流程
10.5.3. 别名解析机制
10.5.4. Tab 补全实现
10.6. 皮肤/主题引擎
10.6.1. SkinConfig 数据结构
10.6.2. 内置主题
10.6.3. 颜色键系统
10.6.4. 继承机制
10.6.5. prompt_toolkit 样式桥接
10.7. KawaiiSpinner
10.7.1. 9 种动画风格
10.7.2. Kawaii 表情
10.7.3. 线程安全渲染
10.7.4. 环境适配
10.8. 工具预览系统
10.8.1. build_tool_preview()
10.8.2. get_cute_tool_message()
10.8.3. 工具失败检测
10.9. 内联 Diff 系统
10.9.1. LocalEditSnapshot
10.9.2. 皮肤感知的 ANSI 渲染
10.10. 交互模式
10.10.1. Clarify(澄清)
10.10.2. Approval(审批)
10.10.3. Secret(密码输入)
10.11. 状态栏三层自适应
10.11.1. 颜色编码
10.12. Ctrl+C 分级处理
10.13. 扩展 CLI 命令生态
10.13.1. Kanban 看板系统
10.13.2. Curator 内容管理
10.13.3. Voice 语音系统
10.13.4. Hooks 钩子系统
10.13.5. Goals 目标追踪
10.13.6. Onboarding 新手引导
10.13.7. Account Usage 用量追踪
10.13.8. 其他 CLI 改进
10.14. 源码文件索引
11. TUI Gateway:跨进程 JSON-RPC 通信
11.1. 为什么需要 Gateway
11.2. 通信协议
11.2.1. 请求格式
11.2.2. 响应格式
11.2.3. Stdout 保护
11.2.4. 错误码体系
11.3. 双调度架构
11.3.1. 内联处理器(主线程)
11.3.2. 长时处理器(线程池)
11.4. 初始化握手
11.4.1. 信号处理
11.5. prompt.submit 完整流程
11.5.1. 时序分析
11.6. 56 个 RPC 方法分类表
11.6.1. Session(会话管理)— 13 个方法
11.6.2. Prompt(提示处理)— 4 个方法
11.6.3. Media(媒体附件)— 2 个方法
11.6.4. Interaction(交互响应)— 4 个方法
11.6.5. Config(配置管理)— 3 个方法
11.6.6. Completion(补全)— 2 个方法
11.6.7. Command(命令)— 4 个方法
11.6.8. Voice(语音)— 3 个方法
11.6.9. Model & Tools(模型与工具)— 6 个方法
11.6.10. System(系统管理)— 8 个方法
11.6.11. Rollback(快照回滚)— 3 个方法
11.6.12. Advanced(高级功能)— 4 个方法
11.7. 阻塞式提示机制
11.7.1. _block() 函数
11.7.2. 超时处理
11.7.3. _pending 字典结构
11.7.4. 响应路由
11.8. 会话内存管理
11.8.1. _sessions 字典结构
11.8.2. Agent 实例生命周期
11.8.3. 孤儿会话清理
11.9. 乐观并发控制
11.9.1. history_version 机制
11.9.2. busy-state 守卫
11.10. SlashWorker 子进程
11.10.1. 通信协议
11.10.2. 序列号管理
11.10.3. 超时控制
11.10.4. Stderr 尾部追踪
11.10.5. 生命周期管理
11.11. Agent 回调系统
11.11.1. 回调注册
11.11.2. tool_start / tool_complete
11.11.3. tool_progress 回调
11.11.4. thinking / reasoning
11.11.5. clarify 回调
11.12. 消息队列与 busy→false 转换
11.12.1. Drain 机制
11.12.2. 事件顺序保证
11.13. 内存与资源管理
11.13.1. 配置缓存
11.13.2. 会话关闭
11.13.3. 进程退出
11.14. Platform 适配器基类
11.14.1. BasePlatformAdapter 接口
11.14.2. 消息处理流水线
11.14.3. 平台注册与生命周期
11.15. Stream Consumer:Agent 输出流处理
11.15.1. 核心设计
11.15.2. 核心职责
11.16. API Server:HTTP/SSE 接口
11.16.1. X-Hermes-Session-Key:长期记忆作用域
11.16.2. SSE 流式输出
11.17. 源码文件索引
12. MCP 集成:Model Context Protocol 的生产级实现
12.1. MCP 协议概述
12.2. 传输层架构
12.2.1. Stdio 传输
12.2.2. HTTP/StreamableHTTP 传输
12.3. 连接生命周期
12.3.1. MCPServerTask 的核心状态
12.3.2. 连接流程
12.3.3. 重连与指数退避
12.4. 工具注册格式
12.4.1. 命名规范
12.4.2. 工具集(Toolset)
12.4.3. Schema 转换
12.4.4. 工具过滤
12.5. OAuth 2.1 PKCE 认证
12.5.1. 配置方式
12.5.2. HermesTokenStorage
12.5.3. 跨进程令牌重载
12.5.4. 401 去重(Thundering Herd 保护)
12.6. 动态工具发现
12.6.1. 消息处理器
12.6.2. 刷新机制
12.7. 熔断器模式
12.7.1. 工作原理
12.8. Sampling 支持
12.8.1. 配置
12.8.2. 速率限制
12.8.3. 工具循环治理
12.8.4. 消息转换
12.9. 安全机制
12.9.1. 环境变量过滤
12.9.2. 工具描述注入扫描
12.9.3. 工具名称清洗
12.9.4. 凭据脱敏
12.9.5. OSV 恶意软件检查
12.10. 与内置工具的冲突保护
12.10.1. 线程安全架构
12.10.2. 总结
13. 插件系统:可扩展的 Agent 架构
13.1. 为什么需要插件系统
13.2. 插件发现
13.2.1. 用户插件
13.2.2. 项目插件
13.2.3. Pip 入口点插件
13.2.4. 发现流程
13.3. plugin.yaml 格式
13.3.1. 字段说明
13.3.2. 清单解析
13.4. PluginContext API
13.4.1. register_tool
13.4.2. register_hook
13.4.3. register_command
13.4.4. register_cli_command
13.4.5. register_context_engine
13.4.6. register_skill
13.4.7. inject_message
13.4.8. dispatch_tool
13.5. 生命周期钩子
13.5.1. 钩子列表
13.5.2. pre_tool_call:策略执行
13.5.3. pre_llm_call:上下文注入
13.5.4. on_session_start/end:会话生命周期
13.6. Hook 执行机制
13.6.1. 异常隔离
13.6.2. 模块级便捷函数
13.7. 内存提供者插件
13.7.1. Hindsight 的后续改进
13.8. 上下文引擎插件
13.8.1. 插件技能注册
13.8.2. 插件管理的全局单例模式
13.8.3. 插件加载的错误处理
13.9. 运营类插件
13.10. 插件工具合并与命令发现
13.10.1. 总结
14. 技能系统:Agent 的可复用知识单元
14.1. 什么是技能
14.2. 技能来源
14.2.1. 内置技能(Bundled Skills)
14.2.2. Hub 安装技能(Hub-installed Skills)
14.2.3. 用户创建技能(User-created Skills)
14.2.4. 插件提供技能(Plugin-provided Skills)
14.3. SKILL.md 格式
14.3.1. 完整格式
14.3.2. 前置元数据字段详解
14.3.2.1. name 和 description
14.3.2.2. platforms
14.3.2.3. prerequisites 和 required_environment_variables
14.3.2.4. triggers、fallback_for 和 requires_toolsets
14.3.2.5. metadata.hermes
14.3.3. 正文结构
14.4. 技能管理工具
14.4.1. create:创建技能
14.4.2. edit:编辑技能
14.4.3. patch:补丁技能
14.4.4. delete:删除技能
14.4.5. write_file:写入支持文件
14.4.6. remove_file:删除支持文件
14.4.7. 原子写入与回滚
14.5. 技能索引构建
14.5.1. 索引内容
14.5.2. 条件激活
14.5.3. 索引缓存
14.6. 同步机制
14.6.1. 清单格式
14.6.2. 同步策略
14.6.3. 哈希计算
14.6.4. 原子清单写入
14.6.5. 重置功能
14.6.6. 类别描述
14.7. 技能缓存
14.7.1. 内存 LRU 缓存
14.7.2. 磁盘快照缓存
14.7.3. 缓存清除
14.7.4. 技能查找策略
14.7.5. 安全检查
14.7.6. 总结
15. 安全设计:Agent 的攻防考量
15.1. Agent 安全的独特挑战
15.1.1. LLM 作为攻击面
15.1.2. 工具访问的放大效应
15.1.3. 持久上下文的累积风险
15.2. 提示注入防御
15.2.1.
_scan_context_content()
函数
15.2.2. 10 种威胁模式
15.2.3. 不可见 Unicode 字符
15.3. MCP 安全
15.3.1. 工具描述注入扫描
15.3.2. 环境变量过滤
15.3.3. 凭证错误消息净化
15.3.4. 工具名称清洗
15.4. 审批系统
15.4.1. 危险命令检测
15.4.2. 命令规范化
15.4.3. 审批决策流程
15.4.4. Cron 模式特殊处理
15.4.5. 敏感写入目标
15.5. 凭证管理
15.5.1. .env 文件隔离
15.5.2. 凭证来源抑制
15.5.3. 凭证错误消息脱敏
15.5.4. 显式配置门控
15.5.5. 凭证池
15.5.6. Auth Store 锁机制
15.6. 沙箱执行
15.6.1. execute_code 沙箱
15.6.2. 环境变量清理
15.6.3. Docker 沙箱配置
15.6.4. 代码执行模式
15.6.5. 浏览器隔离
15.7. 工具冲突保护
15.7.1. 命名空间前缀
15.7.2. 注册顺序保护
15.7.3. 最小权限原则
15.8. 预执行安全扫描(Tirith)
15.9. 安全设计的权衡
15.9.1. 误报容忍度
15.9.2. 性能影响
15.9.3. 深度防御
15.10. 总结
16. Kanban:多 Profile 协作的任务看板
16.1. 为什么 Agent 需要 Kanban
16.1.1. 单 Agent 的局限
16.1.2. Hermes Kanban 的设计目标
16.1.3. 设计决策:SQLite 而非消息队列
16.2. 架构总览
16.2.1. 三大接入面,一条代码路径
16.2.1.1. 数据模型
16.3. 调度器:核心循环
16.3.1. Tick 循环的五个阶段
16.3.2. Worker Spawn 机制
16.3.3. 失败熔断器
16.4. Worker 生命周期
16.4.1. Kanban 工具集
16.4.2. Worker 的交接上下文
16.4.3. 幻觉门控
16.5. CLI 命令参考
16.5.1. Board 管理
16.5.2. 任务生命周期
16.5.3. Worker 操作
16.5.4. 可观测性
16.6. 诊断引擎
16.6.1. 五条诊断规则
16.7. Dashboard UI
16.7.1. 看板视图
16.7.2. 交互功能
16.7.3. 实时更新
16.7.4. REST API
16.8. 集成点
16.8.1. Gateway 集成
16.8.2. Profile 系统集成
16.8.3. Skills 系统集成
16.8.4. 通知系统集成
16.9. 配置参考
16.10. 协作模式
16.11. 关键源文件
17. 第二部分:从 Hermes 学到的工程智慧
17.1. 从"它如何运转"到"我们能学到什么"
17.2. 论文与生产系统之间的鸿沟
17.3. 第二部分的章节结构
17.3.1. 工程教训:从 12,000 行代码中提炼的模式
17.3.2. 构建你自己的 Agent:从零开始的实践指南
17.3.3. 附录
17.4. 如何使用第二部分
18. 工程教训:从 12,000 行代码中提炼的模式
18.1. 架构模式总结
18.1.1. Strategy Pattern:API 路由
18.1.2. Self-Registration Pattern:工具注册表
18.1.3. Observer Pattern:回调链
18.1.4. Adapter Pattern:API 响应归一化
18.1.5. Circuit Breaker:MCP 断路器
18.1.6. Optimistic Concurrency Control:网关历史版本
18.1.7. Write-Ahead Log:SQLite WAL 模式
18.2. 性能优化策略
18.2.1. 持久化事件循环:避免 asyncio.run() 的陷阱
18.2.2. 三层结果预算系统
18.2.3. Prompt 缓存:system_and_3 策略
18.2.4. 并行工具执行策略
18.2.5. 双层技能缓存
18.3. 错误处理哲学
18.3.1. 11 类错误分类:精确优于泛型重试
18.3.2. 抖动退避:避免重试风暴
18.3.3. 优雅降级
18.4. 可扩展性设计
18.4.1. 插件钩子系统
18.4.2. MCP 动态工具发现
18.4.3. 工具集组合与菱形依赖
18.4.4. 皮肤主题引擎
18.5. 技术债务反思
18.5.1. 12,000 行的上帝类
18.5.2. 分散的提供商特定 Hack
18.5.3. 父子 Agent 间的预算共享
18.5.4. 缓存失效复杂性
18.6. 模式与反模式总结
19. 构建你自己的 Agent:从零开始的实践指南
19.1. 最小可行 Agent:200 行 Python
19.2. 架构选型决策
19.2.1. 单块 vs 微服务
19.2.2. 同步 vs 异步
19.2.3. 数据库:SQLite vs PostgreSQL
19.2.4. 通信协议:JSON-RPC vs gRPC vs REST
19.3. 工具系统设计
19.3.1. 第一步:定义工具注册接口
19.3.2. 第二步:实现自注册模式
19.3.3. 第三步:参数验证与类型强制转换
19.3.4. 第四步:并行执行策略
19.4. 上下文管理策略
19.4.1. 何时压缩
19.4.2. 如何摘要
19.4.3. Token 预算
19.4.4. 缓存策略
19.5. 多 Provider 支持
19.5.1. 适配器模式实现
19.5.2. 客户端缓存考量
19.5.3. 错误恢复跨提供商
19.6. 部署考量
19.6.1. CLI vs Web vs API
19.6.2. 进程隔离:SlashWorker 模式
19.6.3. 会话持久化
19.7. 一个完整的示例架构
19.7.1. 数据流:从用户到 LLM 再回来
19.7.2. 推荐技术栈
19.8. 从原型到生产的路线图
19.9. 最后的话
术语表
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
R
S
T
W
文件索引
核心层
Agent 子系统(agent/)
工具系统(tools/)
执行环境子目录(tools/environments/)
浏览器提供者子目录(tools/browser_providers/)
网关层(gateway/)
内置钩子子目录(gateway/builtin_hooks/)
网关平台适配器(gateway/platforms/)
TUI 网关层(tui_gateway/)
CLI 层(hermes_cli/)
插件系统(plugins/)
文件依赖关系
Hermes Agent 架构深度解析
搜索
请启用 JavaScript 以便使用搜索功能