xiaoping`S学习笔记

七脉的笔记
日常学习的笔记稿与记录稿
  1. 首页
  2. Aigc-agent
  3. 正文

‌Harness 工程:Hermes为例 Agent 策略全景图与调用时序图

2026年6月20日 203点热度 0人点赞
智能摘要
Hermes Agent的核心架构围绕智能体分配、记忆系统和技能管理三大策略模块展开。其智能体分配采用多模式并行机制,子智能体委派支持并发任务处理,后台审阅与策展人模块则分别负责记忆整理与技能生命周期管理。记忆系统通过预取、回写与提示注入实现上下文感知,技能系统则依赖动态扫描、条件过滤与安全扫描来确保功能适配与安全性。整个系统在ReAct循环框架下运行,通过迭代预算和API调用双重门控维持稳定。
— 此摘要由AI生成仅供参考。
Hermes Agent 策略架构图
Hermes Agent 核心策略全景

Hermes Agent 核心策略全景

1. 智能体分配策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
子智能体委派 模型调用 delegate_task 工具 最大并发: 3, 深度: 1层, 迭代上限: 50 ThreadPoolExecutor 并行子 AIAgent,每个独立迭代预算,默认工具集 [terminal, file, web] 你说"帮我同时调研3个竞品",助手派出3个小助手分头去查,各自独立工作
后台审阅 每回合结束后自动 spawn max_iterations: 16, 工具白名单: memory + skills 守护线程中运行,限制工具集,自动拒绝危险命令,审阅记忆和技能状态 你问完一个问题后,助手在后台默默整理刚才的对话要点记到笔记本里,你看不到这个过程
策展人 (Curator) 空闲 > 2小时 + 距上次策展 > 7天 过期: 30天未用, 归档: 90天未用, Pinned 技能豁免 定期技能生命周期管理:过期技能标记,归档旧技能,pinned 技能永不过期 你一个月没用过"翻译技能",助手会自动把它标记为过期;但你置顶的"代码助手"永远不会被清理
Cron 定时任务 调度器每 60s tick,检查到期任务 Agent 迭代上限: 90, 超时: 600s, 禁用工具集: cronjob/messaging/clarify 独立 AIAgent(platform=cron, quiet_mode=True),禁止发消息和交互澄清 你设了"每天早上9点给我发科技新闻摘要",到点助手自动跑一遍搜索然后推送给你,不需要你手动问

2. 记忆系统策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
记忆预取 每回合开始,LLM 调用前 prefetch_all(query, session_id) 查询所有已注册 Provider,检索相关记忆注入 volatile 提示词层 你一开口说"我那个项目…",助手已经把之前聊过的项目信息翻出来了,不用你再复述一遍
记忆异步预取 每回合结束后 queue_prefetch_all(query) 后台线程为下一回合提前预热预取缓存,非阻塞 你刚问完一个技术问题,助手就在后台预热下一次可能用到的记忆,所以你追问时响应更快
记忆回写 每回合结束后 sync_all(user, assistant, messages) 后台单线程工作者序列化写入,保证顺序(Turn N 先于 N+1),超时 5s drain 你告诉助手"我下周要出差",聊完这句后助手就把这条信息存下来,下次对话还记得
外部 Provider 限制 初始化时 仅允许 1 个外部 Provider 防止工具 schema 膨胀和后端冲突,内置文件记忆始终运行 你接了 Honcho 记忆服务就不能同时再接 mem0,选一个用就行,助手自带的基本记忆功能不受影响
记忆提示注入 构建系统提示词时 MEMORY.md 上限 2200 字符, USER.md 上限 1375 字符 记忆内容注入 volatile 层,StreamingContextScrubber 自动从流式输出中剥离内部标签 你在对话中看到的都是干干净净的回答,但助手实际上已经把你的偏好(比如"我偏好Python")默默带进思考了
记忆提醒间隔 每 N 回合 nudge_interval: 10 回合 定期提醒 Agent 使用记忆工具记录重要信息 聊了10轮之后,助手会自我提醒"要不要把这轮重要的结论记到笔记里",而不是聊完就忘
会话切换通知 Session ID 变化时 on_session_switch(reset/rewound) 通知所有 Provider 刷新缓存的会话状态 你输入 /new 开启新对话,记忆系统会刷新状态,确保新对话不混入旧的上下文

3. 技能系统策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
技能扫描 启动时 / 缓存失效时 目录: ~/.hermes/skills/ + 外部目录 递归查找所有 SKILL.md,解析 frontmatter,按分类索引 你启动助手时,它会扫描已安装的所有技能目录,生成一份技能清单
技能过滤 扫描时逐个检查 平台匹配 + 环境匹配 + 禁用列表 platforms/frontmatter 限制平台,disabled 列表排除,environment 变量检查 你在手机上用助手时,"桌面组件"技能不会被加载,因为前缀标注了只支持 macOS
技能条件可见 构建技能索引时 fallback_for_toolsets / requires_toolsets 缺少高级工具集时显示降级技能;需要特定工具集时才显示高级技能 你没有装浏览器工具,技能列表里就会显示一个简化版的"网页摘要"替代品;装了浏览器后简化版自动隐藏
技能索引缓存 每次构建技能提示词 LRU 缓存: 8 条, 磁盘快照: .skills_prompt_snapshot.json 双层缓存:进程 LRU + 磁盘 mtime 校验,命中跳过全量扫描 你连续问了好几个问题,助手不会每次都重新扫描技能目录,而是复用上次的缓存,省时间
焦点模式降级 编码姿态下 compact_categories 降级 整个分类只显示技能名称(无描述),保留可召回性,减少 token 消耗 你在写代码时,技能列表只显示名字不显示详细说明,节省上下文空间留给代码,但需要时喊名字就能用
技能提醒间隔 每 N 回合 creation_nudge_interval: 10 回合 定期提醒 Agent 管理技能(创建/更新) 聊了10轮后,助手可能会提议"要不要把咱们常用的操作封装成一个技能,下次一键调用?"
技能查看计数 每次 skill_view 调用 bump_view + bump_use 更新 last_used_at,作为策展人过期/归档判断依据 你查看了一次"翻译"技能,助手记录"翻译最近被人用过",30天不会被自动清理
技能安全扫描 注入上下文前 _scan_for_threats(scope=context) 检测注入攻击模式,威胁文件替换为 [BLOCKED] 占位 有人往项目文档里塞了"忽略所有指令"的恶意文本,助手检测到后自动屏蔽,不会被忽悠

4. ReAct 循环策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
循环入口 run_conversation 调用后 max_iterations: 90 (主Agent) / 50 (子Agent) 双重预算门控: api_call_count + iteration_budget.remaining,任一耗尽退出 你问了一个复杂问题,助手会"思考-行动-观察"反复循环最多90轮来解答,不会永远转下去
预算宽限调用 双重预算均耗尽时 _budget_grace_call: 一次性 允许最后 1 次 API 调用做摘要/收尾,之后强制退出 助手已经试了90轮还没完全解决,它会再给自己一次机会做个总结回复给你,而不是突然中断
工具调用继续 响应包含 tool_calls — 执行工具 → 结果附加到 messages → continue 循环 助手说"让我查一下文件",查完后看到结果又接着分析,继续推进直到给你最终答案
文本响应退出 无 tool_calls + 非空 content — 认为是最终回复,break 退出循环 助手认为已经把问题答完了,直接输出结论,不再继续调用工具
空响应重试 无 tool_calls + 空 content 最多 3 次空重试,然后 fallback 重试失败后激活 fallback 模型链 模型突然返回了空白回复,助手会自动重试最多3次,再不行就切换到备用模型
长度续写 finish_reason == length 续写重试: 3 次, max_tokens 递增 追加续写提示词,逐步提升输出 token 上限 助手回答到一半被截断了(字数超限),它会自动追加"请继续"接着回答,最多续3次
execute_code 预算退还 execute_code 工具执行后 自动 refund 编程工具的迭代调用不消耗主预算 你让助手写代码,代码执行了5轮调试,这些不算在那90轮限额里,助手不会因为写代码把额度用光

5. 工具护栏策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
精确失败警告 同一工具+参数连续失败 warn: 2次, block: 5次 2 次相同调用失败后附加指导,5 次后阻止执行(hard_stop_enabled 时) 助手连续2次用同一个命令都报错,它会收到提示"换个方式试试";连续5次还在犯错就强制叫停
同类工具失败 同一工具(不同参数)连续失败 warn: 3次, halt: 8次 3 次同工具失败警告,8 次后终止整个回合 助手连着3次搜索不同关键词都没找到结果,它会觉得"这个搜索引擎今天有问题";8次后直接放弃这轮
幂等无进展 只读工具返回相同结果 warn: 2次, block: 5次 检测到循环读取同一内容无进展时警告或阻止 助手反复读取同一个文件,2次内容一样时提示"你看过这个了",5次还在看就拦住它
决策动作 护栏检查后 ALLOW / WARN / BLOCK / HALT ALLOW=正常执行, WARN=执行+附指导, BLOCK=阻止单次执行, HALT=终止整个回合 助手判断当前操作是安全的→放行;有点风险→放行但给提醒;明显错误→拦住;严重失控→终止整轮对话
工具分类 启动时静态分类 17 个幂等工具 / 17 个变更工具 幂等(只读): read_file, search_files, web_search 等; 变更: terminal, write_file, patch 等 读文件、搜索是"安全操作";写文件、执行命令是"危险操作",后者需要更严格的看管
并发执行 模型返回多个 tool_calls ThreadPoolExecutor max_workers: 8 多工具调用并行执行,按原始顺序收集结果 你说"帮我查3个网站的价格",助手同时打开3个网页,不用一个个排队等
顺序执行 单工具 / 交互式工具 todo, memory, clarify, delegate_task 等 需要 Agent 级状态的工具强制顺序执行 助手需要先确认你要存什么记忆,再执行保存,这种需要跟你交互的操作必须一步步来

6. 上下文压缩策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
压缩触发 prompt_tokens >= 阈值 threshold: 50% 上下文窗口, 最低 64K tokens 达到上下文窗口 50% 时触发压缩(Codex gpt-5.5 自动提升到 85%) 你们聊了很久,对话历史占了记忆空间的一半以上,助手自动把早期对话压缩成摘要,腾出空间继续聊
防抖动 连续压缩节省 < 10% _ineffective_compression_count >= 2 连续 2 次压缩效果差则暂停压缩,直至某次压缩节省超过 10% 压缩了发现只省了2%的空间,说明对话已经很精炼了,不再反复压缩浪费时间
头部保护 压缩时 protect_first_n: 3 条消息 + 系统提示词 系统提示词 + 前 3 条消息永不摘要 你最初设定的需求和要求永远保持原样,不会被动过手脚的摘要替换掉
尾部保护 压缩时 protect_last_n: 20 条, 最低地板: 8 条, Token 预算: 20% 最近消息受保护,确保最后一轮对话和最后可见助手消息在保护范围内 最近聊的内容保持完整原文,只有中间的旧对话才会被摘要,你不会感觉到最近的信息有缺失
摘要生成 压缩 Phase 3 summary_target_ratio: 20%, 上限 12K tokens, 辅助模型调用 使用辅助 LLM 生成结构化摘要,失败时用静态摘要兜底(8K 字符上限) 助手用另一个AI专门做摘要,把100条旧消息浓缩成20条要点;如果摘要AI挂了就用简单的文本截断兜底
迭代摘要 再次压缩时 _previous_summary 保留 已有摘要时进行增量更新,保留历史信息+添加新完成动作 第一轮压缩产生了摘要A,第二轮压缩在A基础上追加新内容变成A+,不是从头重写
压缩预清理 压缩 Phase 1(无LLM) 结果去重 + 截断大参数 + 移除图片 去重相同工具结果,大参数 JSON 截断(>200字符),多模态结果移除图片 正式压缩前先做一遍大扫除:重复的搜索结果合并、超长参数缩短、截图替换为文字说明
摘要失败回退 辅助模型不可用 冷却: 600s 无辅助模型时冷却 10 分钟;404/503/超时回退到主模型生成摘要 摘要专用的AI服务暂时不可用,助手等10分钟再试,或者让主模型临时兼做摘要

7. 系统提示词三级架构

层级 包含内容 变更频率 设计目的 用户视角触发例子
Stable SOUL.md 身份 + 工具指导 + 技能索引 + 环境探测 + 平台提示 + 模型适配指导 会话内几乎不变 最大化上游 Prompt Prefix Cache KV 命中率 你每次跟助手说话,它都带着同一套"我是谁、我有哪些能力"的基础设定,这部分不会变来变去,所以响应更快
Context 调用方 system_message + 上下文文件(AGENTS.md/.cursorrules/SOUL.md) 跨会话变化,会话内稳定 项目级上下文注入,单文件上限 20K 字符(头70%+尾20%) 你在项目目录里放了一份 AGENTS.md 描述项目规范,助手每次开会话时自动读取,知道你的项目约定
Volatile MEMORY.md + USER.md + 外部记忆 Provider 提示 + 时间戳 + Session/Model/Provider 每回合/会话变化 动态内容,时间戳仅精确到日期(非分钟)以保证缓存稳定性 你上次说的偏好"用中文回复"、你的个人资料、今天的日期——这些每次对话可能不同,所以每次都刷新

8. 凭证池与容错策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
选择策略 每次 API 调用选择凭证 fill_first(默认) / round_robin / random / least_used fill_first 优先最高优先级可用项; round_robin 轮转; random 随机; least_used 选最少使用 你有3个API Key,助手默认用第一个,用满了自动切第二个,也可以设置"轮流用"或"用得最少的"
401 处理 认证失败 瞬态冷却: 5分钟, 致命(token_invalidated等): 永久移除 区分瞬态 401(5 分钟冷却)和致命 401(永久 DEAD 状态,24h 后清理审计记录) 你的API Key临时抽风认证失败,助手等5分钟再试;但如果是Key被撤销了,助手会永久不用这个Key
429 处理 速率限制 冷却: 1小时, 支持 reset_at 覆盖 标记 EXHAUSTED 状态,冷却后自动恢复;Provider 提供的 reset_at 时间戳优先于默认值 你这小时API调用太多了被限流,助手会自动切换到备用Key,1小时后原Key恢复可用
池恢复判断 _pool_may_recover_from_rate_limit 需 entries > 1 且有可用项 单凭证池/全部冷却/Google CLI 账号级配额 → 返回 False → 直接 fallback 模型 你只有1个Key且被限流了,助手不会傻等,而是直接切到备用模型继续回答你
Fallback 模型链 主模型持续失败 有序 {provider, model, base_url?, api_key?} 列表 逐个尝试 fallback 条目,同 provider/model 去重,60s 主模型冷却后尝试恢复 Claude 挂了自动切 GPT,GPT 也挂了切 Gemini,逐级降级;1分钟后会再试试 Claude 是不是恢复了
内层重试 单次 API 调用失败 max_retries: 3, 退避: 5~120s 抖动指数 每次外层迭代内 3 次重试机会,指数退避 + 抖动 网络闪断导致一次请求失败,助手等几秒自动重试,最多3次,不会一失败就放弃
Transport 适配 根据 api_mode 选择 chat_completions(默认) / codex_responses / anthropic_messages / bedrock_converse 策略模式:提供者 API 差异封装为 4 种 Transport 实现自动适配 不管你后端用的是OpenAI、Anthropic还是AWS Bedrock,助手都能自动适配接口格式,你无需关心

9. Gateway 会话策略

策略类型 触发条件 关键参数 行为描述 用户视角触发例子
Agent 缓存 每条消息到来时复用 LRU: 128, 空闲 TTL: 3600s (1小时) 避免每次消息重建 OpenAI client 和重载工具,空闲超时自动回收 你在Telegram上连发3条消息,助手不需要每次都重新"启动",而是复用上次的连接,所以第二条开始回复更快
忙时输入模式 Agent 运行中收到新消息 interrupt(默认) / queue / steer interrupt: 中断当前,替换消息; queue: 排队等待(上限32); steer: 注入引导文本 助手正在回答你的第一个问题,你又发了一条,默认行为是助手停下手头的活先处理新问题
自动重置 会话过期 idle: 1440分钟, daily: 凌晨4点 空闲超 24h 或过凌晨 4 点自动重置;有活跃后台进程的会话永不重置 你一天没跟助手说话,第二天聊天时它会自动清空上下文重新开始,但如果它后台还在帮你编译代码就不会重置
流式投递 Agent 流式输出 edit(默认) / draft / auto / off 渐进式编辑消息展示实时进度,洪水控制自适应退避(3次失败禁用) 你在Telegram上看到助手的回答一个字一个字地出现,而不是等半天突然蹦出一大段
消息分块 响应超平台长度限制 安全限制: max(500, MAX_LEN - cursor - 100) 按换行符边界智能分割,添加 (1/2) 分块指示 助手写了一篇很长的报告,Telegram单条消息放不下,会自动分成(1/3)(2/3)(3/3)三段发送
崩溃恢复 Gateway 重启 120s 内活跃会话标记 resume_pending 崩溃后 120s 内有活动的会话保留 SessionID 和 Transcript,用户自动恢复 服务突然重启了,但因为你2分钟前还在聊天,重启后你的对话上下文会自动恢复,不会丢失

10. 工具集体系

工具集名称 包含工具 用途说明
web web_search, web_extract 网页搜索与内容提取
terminal terminal, process 终端命令执行与进程管理
file read_file, write_file, patch, search_files 文件读写与搜索
browser 13 个浏览器工具 + web_search 浏览器自动化,含 web_search 用于查找 URL
skills skills_list, skill_view, skill_manage 技能管理三件套
memory memory 跨会话记忆 CRUD
delegation delegate_task 子智能体委派
cronjob cronjob 定时任务管理
messaging send_message 跨平台消息发送
coding (姿态) 34 个工具(文件+终端+web+技能+浏览器+todo+memory+delegate等) 编码姿态自动选择的全栈工具集
safe web + vision + image_gen 无 terminal,安全沙箱工具集
hermes-webhook 仅 4 个: web_search, web_extract, vision_analyze, clarify 不可信内容场景,刻意限制防止注入攻击

Hermes Agent 调用时序图

(时序图待补充)

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 大模型智能体 技术架构 智能体策略
最后更新:2026年7月12日

七脉神剑

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

  • 熔岩之怒

    看得头大,但感觉好强

    2026年6月29日
    回复
    • QuietQuake

      @熔岩之怒 我也被弄晕了,不过真的很酷

      2026年6月29日
      回复
  • 怀旧时光

    这么多策略,脑容量告急😂

    2026年7月2日
    回复
  • Frost马

    时序图是空白的😂

    2026年7月2日
    回复
  • 豆腐脑

    这套护栏设计还挺稳

    2026年7月3日
    回复
    • 幻光之刃

      @豆腐脑 这套护栏蛮稳的

      2026年7月3日
      回复
  • 梦魇缔造者

    记忆预取那设计不错

    2026年7月3日
    回复
    • 记忆角落

      @梦魇缔造者 预取后响应快了不少,挺实用的

      2026年7月4日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    COPYRIGHT © 2026 75live.com. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang