Hermes Agent 深度解析:越用越强的自进化 AI 智能体
的场景(DevOps、内容创作、研究分析、客户服务等),Hermes Agent 的自进化特性能够带来随时间不断累积的复合收益——这是目前大多数 Agent 框架所不具备的特质。因为"任务完成"在 Agent 架构中难以精确定义,而工具调用次数是衡量"对话复杂度"的可靠代理指标——简单的问答不会触发(迭代少),只有真正经历了多步执行的任务才会触发。一旦建立缓存,对话中途。:对 Skill 内容、系
1. 项目概述
Hermes Agent 是 Nous Research 开源的一款自进化 AI 智能体框架。
-
仓库:https://github.com/NousResearch/hermes-agent
-
语言:Python ≥ 3.11(93.1%),少量 TypeScript
-
许可证:MIT
-
最新版:v0.9.0(2026-04-13)
-
前身:OpenClaw(安装向导自动检测并迁移旧配置)
Hermes Agent 的核心理念只有一句话:AI 智能体应该像人类一样,从每次经历中学习并积累技能,而不是每次对话都从零开始。
2. 解决什么问题
2.1 传统 AI 助手的三大痛点
|
痛点 |
具体表现 |
|---|---|
| 无记忆 |
每次新对话重新开始,上次解决过的问题下次还要重解 |
| 无成长 |
使用一年和使用一天没有区别,没有技能积累 |
| 强绑定 |
绑定特定模型/平台,迁移成本极高 |
2.2 Hermes Agent 的解决思路
ounter(lineounter(lineounter(line传统 Agent:任务 → 执行 → 结束(遗忘) ↓Hermes Agent:任务 → 执行 → 自动创建 Skill → 下次复用 → 定期优化 → 越来越强
Hermes 通过三个机制解决上述问题:
-
程序性记忆(Skill):将解决问题的过程固化为可复用的 SKILL.md 文档
-
情节性记忆(SQLite):用带 FTS5 全文检索的 SQLite 记录所有历史对话
-
定时自我优化(Cron):内置调度器定期"唤醒"agent 复习和改进既有技能
2.3 其他设计目标
-
零锁定:支持 20+ 模型提供商,
hermes model一键切换,无需改代码 -
多端统一:一个后端进程同时服务 CLI、Telegram、Discord、Slack、WhatsApp 等 16+ 平台
-
廉价部署:支持 $5 VPS、本地机器、GPU 集群,idle 时近乎零成本
3. 整体架构设计
3.1 分层架构
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line┌─────────────────────────────────────────────────────┐│ 入口层 Entry Points ││ CLI │ Gateway │ ACP Adapter ││ (cli.py) │ (18 平台适配) │ (IDE 集成) │└───────────────────────────┬─────────────────────────┘ ↓┌─────────────────────────────────────────────────────┐│ 核心引擎 AIAgent (run_agent.py) ││ 对话循环 │ Provider 路由 │ 上下文压缩 ││ Session 持久化 │ Prompt 缓存 │ Iteration 管理 │└──────────┬────────────────────────┬─────────────────┘ ↓ ↓┌──────────────────┐ ┌───────────────────────────┐│ Tool Registry │ │ Skills System ││ 47 个内置工具 │ │ ~/.hermes/skills/ ││ 19 个工具集 │ │ 渐进式加载 (3 级) │└──────────┬───────┘ └───────────────────────────┘ ↓┌─────────────────────────────────────────────────────┐│ Provider 层(20+ 模型提供商) ││ Anthropic │ OpenAI │ OpenRouter │ Ollama │ GLM ││ HuggingFace │ Kimi │ MiniMax │ Google AI │ ... │└──────────────────────────┬──────────────────────────┘ ↓┌─────────────────────────────────────────────────────┐│ 执行环境层(6 种后端) ││ Local │ Docker │ SSH │ Daytona │ Singularity │ Modal│└─────────────────────────────────────────────────────┘
3.2 数据流向
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line用户输入 │ ▼[入口适配器] ──→ 统一 Message 格式 ──→ [AIAgent 核心] │ ┌─────────────────────────┤ ▼ ▼ [构建 Prompt] [查询 Skills] 系统提示 + FTS5 全文搜索 历史对话 + 渐进式加载 可用工具列表 │ ▼ [调用 LLM API](流式输出) │ ┌──────┴──────┐ ▼ ▼ [有工具调用] [直接响应] │ │ ▼ ▼ [工具执行] 返回给用户 并发/串行 │ ▼ [结果追加历史] │ ▼ [检查 token 阈值] 超限 → 上下文压缩 │ ▼ [循环直到无工具调用] │ ▼ [自动创建/更新 Skill]
4. 核心模块详解
4.1 文件结构
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linehermes-agent/├── run_agent.py # 核心引擎,AIAgent 类(约 11,000 行)├── cli.py # 交互式 CLI(Rich + prompt_toolkit)├── model_tools.py # 工具编排与自动发现├── hermes_state.py # SQLite + FTS5 历史存储├── toolsets.py # 19 个工具集定义├── tools/│ └── registry.py # 工具注册中心├── gateway/ # 18 个平台适配器├── skills/ # 内置技能包├── cron/ # 定时任务调度器├── batch_runner.py # RL 训练轨迹生成└── hermes_cli/ ├── commands.py # 统一命令注册表 └── config.py # 配置管理
4.2 核心引擎:run_agent.py
AIAgent 是整个框架的心脏,负责管理完整的 Agent 对话循环:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineclass AIAgent: async def run(self, user_message: str): while api_call_count < max_iterations: # 1. 构建 prompt(系统提示 + 历史 + skills + memory) messages = self._build_messages()
# 2. 调用 LLM(流式) response = await self.provider.complete(messages, tools=self.tools)
# 3. 有工具调用则分发执行 if response.tool_calls: results = await self._dispatch_tools(response.tool_calls) # 检测是否可并行执行(_PARALLEL_SAFE_TOOLS) # 文件操作路径重叠 → 自动串行回退
# 4. 工具结果追加历史 self.history.append(results)
# 5. Token 超阈值 → 触发上下文压缩 if self._token_usage > self.compression_threshold: await self._compress_context()
# 6. 无工具调用 → 终结响应 else: return response.content
# 7. 任务完成 → 自动创建 Skill await self._maybe_create_skill()
关键设计细节:
-
Prompt 缓存:利用 Anthropic prefix caching,节省最高 75% 输入 token 费用。一旦建立缓存,对话中途禁止修改系统提示或工具集(会破坏缓存命中)
-
Iteration Budget:默认每个 session 90 轮 LLM 调用,非计费操作(如读本地文件)可"退款"到预算池
-
子 Agent:可 spawn 隔离子 agent 处理并行工作流,父子各有独立的 iteration budget
4.3 工具注册中心:tools/registry.py
采用装饰器 + 自动发现模式:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefrom tools.registry import registry
@registry.register( name="web_search", description="Search the web for information", schema={ "type": "object", "properties": { "query": {"type": "string", "description": "Search query"} }, "required": ["query"] })async def handle_web_search(query: str) -> str: result = await exa_client.search(query) return json.dumps(result)
注册中心在启动时自动扫描 tools/ 目录,收集所有 schema,并按工具集分组提供给 LLM。
4.4 历史存储:hermes_state.py
使用 SQLite + FTS5 全文检索,无需向量数据库:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line-- 主表CREATE TABLE sessions ( id TEXT PRIMARY KEY, created_at TIMESTAMP, summary TEXT);
CREATE TABLE messages ( id TEXT PRIMARY KEY, session_id TEXT, role TEXT, content TEXT, created_at TIMESTAMP, FOREIGN KEY (session_id) REFERENCES sessions(id));
-- FTS5 全文索引(轻量替代向量检索)CREATE VIRTUAL TABLE messages_fts USING fts5( content, content=messages, content_rowid=rowid);
检索时先用 FTS5 找相关段落,再用 LLM 总结压缩,最终注入当前 prompt。
5. Skills 自进化系统
这是 Hermes Agent 最核心的差异化特性。
5.1 Skill 是什么
Skill 是一种结构化知识文档,格式为 SKILL.md(YAML frontmatter + Markdown 正文),保存在 ~/.hermes/skills/ 目录下。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line---name: review-mrversion: 1.2.0description: Review a GitLab MR before deploymentplatforms: [linux, macos]requires_tools: [execute_code, web_search]metadata: hermes: tags: [devops, gitlab, review]---
# Deploy Review MR
## 使用场景当需要审查 GitLab MR 时,尤其是涉及数据库变更或 Apollo 配置修改。
## 前置条件- 已配置 GITLAB_TOKEN 环境变量- 已安装 jq
## 执行步骤
### 1. 获取 MR Diff```bashcurl -s "https://gitlab.com/api/v4/projects/{PROJECT_ID}/merge_requests/{MR_ID}/diffs" \ -H "PRIVATE-TOKEN: $GITLAB_TOKEN"```
### 2. 检查高危变更重点检查:- `db/migrate/` 目录下的迁移文件- `config/apollo/` 下的配置变更- `Gemfile.lock` 依赖变化
### 3. 生成审查报告...
## 已知陷阱(从失败中学到的)- Apollo 配置变更必须与后端代码同步部署,顺序错误会导致服务中断- 大表 migration 在高峰期不要执行
5.2 Skill 完整 Schema
SKILL.md 的 frontmatter 支持以下所有字段:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line---name: skill-name # 必填,最长 64 字符,全局唯一description: 描述 # 必填,最长 1024 字符version: 1.0.0 # 可选license: MIT # 可选(agentskills.io 兼容)platforms: [macos, linux] # 可选,省略则全平台
# 环境变量声明(新版)required_environment_variables: - name: API_KEY prompt: "Enter your API key" help: "https://example.com/keys" optional: false
# 安装配置setup: help: "https://example.com/setup" collect_secrets: - env_var: API_KEY prompt: "Enter API key" secret: true
# 元数据(工具集依赖、关联技能等)metadata: hermes: tags: [fine-tuning, llm] related_skills: [peft, lora] requires_toolsets: [browser] # 需要特定工具集才显示 fallback_for_toolsets: [browser] # 工具集不可用时自动激活 requires_tools: [browser_navigate] fallback_for_tools: [browser_navigate] config: - key: wiki.path description: "Path to wiki" default: "~/wiki" prompt: "Wiki directory"---
5.3 渐进式加载(节省 Token)
Skills 采用三级渐进式加载,避免一次性注入所有知识造成 token 浪费:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineLevel 0(总是加载):技能名称 + 描述列表 约 3,000 tokens,帮助 LLM 知道"有哪些技能"
Level 1(按需加载):完整技能内容 当 LLM 判断当前任务需要某个 Skill 时才加载
Level 2(按需加载):技能引用的外部文档 当 Skill 内容引用了额外资料时才加载
5.4 自动创建 Skill 的完整机制(源码级解析)
这是整个自进化系统最核心的部分,下面从源码视角完整还原实现。
5.4.1 触发时机:不是任务完成,而是计数器驱动
很多人以为 Skill 是在"任务完成后"自动创建的,实际上触发机制更为精细——是基于工具调用迭代次数计数器(_iters_since_skill)。
ounter(lineounter(lineounter(lineounter(lineounter(line# run_agent.py 第 8189-8193 行# 每次 LLM 发起一次 API 调用,计数器 +1if (self._skill_nudge_interval > 0 and "skill_manage" in self.valid_tool_names): self._iters_since_skill += 1
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# run_agent.py 第 10741-10745 行# 达到阈值时,设置 review 标志,并重置计数器_should_review_skills = Falseif (self._skill_nudge_interval > 0 and self._iters_since_skill >= self._skill_nudge_interval and "skill_manage" in self.valid_tool_names): _should_review_skills = True self._iters_since_skill = 0
默认阈值是 10 次工具调用迭代,可通过配置文件调整:
ounter(lineounter(lineounter(line# config.yamlskills: creation_nudge_interval: 10 # 每 10 次迭代触发一次 Skill 审查
计数器重置时机:当 LLM 在对话中主动调用了 skill_manage 工具(说明它已经在处理 Skill),计数器归零,避免重复触发:
ounter(lineounter(lineif function_name == "skill_manage": self._iters_since_skill = 0
为什么是计数器而不是任务完成事件? 因为"任务完成"在 Agent 架构中难以精确定义,而工具调用次数是衡量"对话复杂度"的可靠代理指标——简单的问答不会触发(迭代少),只有真正经历了多步执行的任务才会触发。
5.4.2 执行时机:response 发出后,后台静默运行
Skill review 不阻塞主对话。触发条件满足时,是在当前 response 已经发送给用户之后,异步启动一个后台线程:
ounter(lineounter(lineounter(lineounter(line用户消息 → LLM 执行 N 次工具调用(N≥10)→ 生成最终 response → 发送给用户 ↓ [后台静默] 启动 review thread 用户完全感知不到
5.4.3 后台 review agent 的实现
Hermes 的做法很聪明:fork 出一个全新的 AIAgent 实例来做 review,而不是在主 agent 上追加逻辑。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# run_agent.py 第 2195 行def _spawn_background_review( self, messages_snapshot: List[Dict], # 完整对话历史的快照 review_skills: bool = False,) -> None: """后台线程:永不修改主对话历史,永不产生用户可见输出。""" prompt = self._SKILL_REVIEW_PROMPT
def _run_review(): review_agent = AIAgent( model=self.model, max_iterations=8, # 最多 8 轮迭代(够用但有上限) quiet_mode=True, # 完全静默 ) # 禁用递归触发,防止 review agent 再次触发 review review_agent._skill_nudge_interval = 0 review_agent._memory_nudge_interval = 0
review_agent.run_conversation( user_message=prompt, conversation_history=messages_snapshot, # 注入完整对话历史 )
t = threading.Thread(target=_run_review, daemon=True, name="bg-review") t.start()
关键设计:
-
messages_snapshot是主对话历史的深拷贝快照,review agent 读它但不修改它 -
quiet_mode=True确保 review agent 的所有输出对用户不可见 -
max_iterations=8给 LLM 足够空间决策并写入 Skill,但设置上限防止失控 -
daemon=True确保主进程退出时 review thread 自动终止
5.4.4 LLM 如何判断"值不值得创建 Skill"
review agent 启动后,把完整对话历史 + 下面这段 prompt 发给 LLM:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# run_agent.py 第 2171-2180 行_SKILL_REVIEW_PROMPT = ( "Review the conversation above and consider saving or updating a skill " "if appropriate.\n\n" "Focus on: was a non-trivial approach used to complete a task that required " "trial and error, or changing course due to experiential findings along the " "way, or did the user expect or desire a different method or outcome?\n\n" "If a relevant skill already exists, update it with what you learned. " "Otherwise, create a new skill if the approach is reusable.\n" "If nothing is worth saving, just say 'Nothing to save.' and stop.")
LLM 的判断标准(完全由语言模型自主决策,无硬编码规则):
|
判断维度 |
说明 |
|---|---|
| 试错过程 |
任务是否经历了反复尝试、多次调整方向? |
| 实验性发现 |
是否在执行中发现了预期外的情况,并据此改变策略? |
| 用户纠偏 |
用户是否对方法或结果表达了不满,促使 agent 改变方式? |
| 可复用性 |
这个方法下次遇到类似问题时还能用吗? |
退出条件:如果 LLM 认为这次对话不值得保存,它直接回复 "Nothing to save." 并停止调用任何工具。这是 Skill 创建的自然过滤器——简单的问答、一次性任务不会产生噪音 Skill。
5.4.5 系统 Prompt 中的预埋指令
除了事后的 review 机制,Hermes 还在系统 Prompt 中预埋了指令,让主 agent 在对话中途也可以主动创建 Skill:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# run_agent.py 第 3183 行SKILLS_GUIDANCE = ( "After completing a complex task (5+ tool calls), fixing a tricky error, " "or discovering a non-trivial workflow, save the approach as a skill with " "skill_manage so you can reuse it next time.\n" "When using a skill and finding it outdated, incomplete, or wrong, " "patch it immediately with skill_manage(action='patch') — don't wait to be asked. " "Skills that aren't maintained become liabilities.")
同时,skill_manage 工具的 schema 描述中也明确了创建时机:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineCreate when: - complex task succeeded (5+ tool calls) - errors overcome - user-corrected approach worked - non-trivial workflow discovered - user asks you to remember a procedure
Update when: - instructions stale/wrong - OS-specific failures discovered - missing steps or pitfalls found during use
Skip for: simple one-offs
5.4.6 新建 vs. 更新的判断
没有硬编码的去重逻辑(如哈希比对),完全依赖 LLM 语义判断:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linereview agent 拿到对话历史 ↓调用 skills_list() 工具,列出现有所有 Skills ↓LLM 语义比较:这次学到的东西,和哪个现有 Skill 最相关? ↓┌───────────────────────────────────┐│ 有相关 Skill? ││ ├─ 是 → skill_manage(action='patch', name='xxx', ...) 更新│ └─ 否 → skill_manage(action='create', name='yyy', ...) 新建└───────────────────────────────────┘
这种设计的优缺点:
-
优点:灵活,能理解语义相近的合并需求,不会因为名字不同就创建重复 Skill
-
缺点:依赖 LLM 判断,可能因模型能力差异产生不一致的结果
5.4.7 完整时序图
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line主对话线程 后台 review 线程──────────────────────────────────── ──────────────────────────────用户: "帮我部署这个服务" ↓[iter 1] LLM 调用 execute_code _iters_since_skill = 1[iter 2] LLM 调用 web_search _iters_since_skill = 2[iter 3] LLM 调用 execute_code _iters_since_skill = 3...(中间经历了几次失败和调整)[iter 10] LLM 生成最终 response _iters_since_skill = 10 → 触发! ↓response 发送给用户 ✓ spawn bg-review thread ↓ ↓主线程继续等待 review_agent.run_conversation(下一条用户消息 messages_snapshot, prompt=_SKILL_REVIEW_PROMPT ) ↓ LLM 分析对话历史... "用户部署过程中遇到了端口冲突, 需要先检查占用,这是可复用的" ↓ skill_manage( action='create', name='service-deploy-linux', content='...' ) ↓ 写入 ~/.hermes/skills/ service-deploy-linux/SKILL.md ✓
5.5 自进化闭环总览
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line ┌──────────────────┐ │ 用户完成复杂任务 │ │ (≥10 次工具调用) │ └────────┬─────────┘ ↓ [后台 review agent 启动] LLM 审查完整对话历史 ↓ ┌─────────────┴─────────────┐ ▼ ▼ 值得保存 不值得保存 ↓ ↓ 新建或更新 SKILL.md "Nothing to save." 写入 ~/.hermes/skills/ 静默退出 ↓ ┌──────────┼──────────┐ ▼ ▼ ▼下次同类 使用中发现 Cron 定时任务直接 Skill 过时 任务可加载复用 → 立即 patch 指定 Skill
5.6 技能来源
|
来源 |
描述 |
|---|---|
| 自动生成 |
对话中后台 review agent 自动创建 |
| 主动触发 |
主 agent 在对话中途主动调用 |
| 官方内置 |
仓库内预置,涵盖 DevOps、MLOps、研究等 |
| agentskills.io |
开放标准社区目录(Hermes 发起) |
| GitHub 直装 | hermes skill install github:user/repo |
| ClawHub / LobeHub |
第三方技能市场 |
5.7 自进化研究项目
Nous Research 还有姊妹项目 hermes-agent-self-evolution,将 Skill 自进化推向更深层:
-
DSPy:自动优化 prompt 文本
-
GEPA(遗传进化 Prompt 算法):对 Skill 内容、系统提示、工具描述进行"变异 + 选择 + 保留",类似生物进化,最终存活的是效果最好的版本
6. 工具系统
6.1 47 个内置工具,19 个工具集
|
工具集 |
包含工具 |
|---|---|
| web |
搜索、抓取、截图、浏览器自动化(含反检测) |
| code |
多语言代码执行、调试 |
| files |
读写、目录操作、diff |
| media |
图像生成(fal.ai)、语音合成(edge-tts) |
| memory |
Skill 管理、历史检索 |
| system |
进程管理、环境变量 |
| mcp |
MCP 协议外部工具接入 |
|
... |
... |
6.2 并行执行优化
工具注册时可声明是否并发安全:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line_PARALLEL_SAFE_TOOLS = { "web_search", "web_fetch", "image_generate", "text_to_speech", "read_file" # 只读操作安全并行}
# 文件写操作会检测路径重叠,重叠则自动串行_FILE_WRITE_TOOLS = {"write_file", "edit_file", "delete_file"}
7. 多平台 Gateway
7.1 支持的 16+ 平台
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line即时通讯:Telegram | Discord | Slack | WhatsApp | Signal | Matrix | WeChat | WeCom电子邮件:Email (SMTP/IMAP)苹果生态:iMessage (via BlueBubbles)Web 接口:REST API | WebSocketIDE 集成:ACP Protocol(Cursor 等)命令行:CLI(主入口)
7.2 Telegram 高级特性
-
私聊 Topics:按项目隔离对话,不同 Topic 可绑定不同 Skill 集
-
DNS-over-HTTPS 回落:在
api.telegram.org被封锁的网络环境下自动切换
7.3 统一路由设计
所有平台适配器最终将消息转化为统一格式,路由到同一个 AIAgent 核心,Session 按平台+用户 ID 隔离:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# gateway/base.pyclass BaseGateway: async def on_message(self, platform: str, user_id: str, text: str): session_key = f"{platform}:{user_id}" agent = self.session_pool.get_or_create(session_key) response = await agent.run(text) await self.send_response(response)
8. 模型无关性设计
8.1 支持的 20+ 提供商
|
类别 |
提供商 |
|---|---|
|
云端旗舰 |
Anthropic (Claude), OpenAI (GPT), Google AI Studio (Gemini) |
|
聚合路由 |
OpenRouter(200+ 模型), Nous Portal |
|
中国模型 |
GLM (z.ai), Kimi/Moonshot, MiniMax |
|
本地推理 |
Ollama, HuggingFace (本地) |
|
自定义 |
任意 OpenAI 兼容 endpoint |
8.2 切换模型零代码改动
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 交互式切换hermes model
# 直接指定HERMES_MODEL=claude-opus-4-6 hermesHERMES_MODEL=ollama/llama3 hermes
8.3 Prompt 缓存策略(成本优化)
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineAnthropic prefix cache 原理:┌────────────────────────────────────────┐│ 系统提示 (不变) │ ← 缓存│ 工具定义 (不变) │ ← 缓存│ Skills Level 0 (不变) │ ← 缓存├────────────────────────────────────────┤│ 对话历史 (增长) │ ← 不缓存│ 用户最新消息 │ ← 不缓存└────────────────────────────────────────┘
节省:最高 75% 输入 token 费用限制:对话中途不能修改缓存部分(否则缓存失效,成本骤增)
9. 案例演示
案例一:首次处理部署审查,自动学习
场景:用户第一次让 Hermes 审查一个 GitLab MR。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line用户:帮我审查一下 MR !1234,项目 ID 是 5678
Hermes:好的,我来帮你审查。[调用 web_search 工具查找 GitLab API 文档][调用 execute_code 工具获取 MR diff][分析变更:发现 db/migrate/ 下有新迁移文件][调用 web_search 查询 Rails migration 最佳实践]
审查结果:⚠️ 发现 db/migrate/20260415_add_index_users.rb - 该迁移在 users 表上添加索引,生产环境有 500万 行 - 建议使用 add_index :users, :email, algorithm: :concurrently - 直接添加会锁表约 30 秒,高峰期风险极高
✅ 代码逻辑无问题✅ 测试覆盖完整
建议:修改迁移使用 concurrent 模式后再合并。
---[后台自动执行]已创建新 Skill:~/.hermes/skills/gitlab-mr-review.md - 记录了 GitLab API 调用方式 - 记录了数据库迁移审查要点 - 记录了本次发现的"大表加索引"陷阱
案例二:第二次同类任务,直接复用 Skill
场景:一周后,用户再次请求 MR 审查。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line用户:帮我审查 MR !2345,项目 5678
[Hermes 内部:FTS5 搜索历史,发现"MR 审查"相关记忆][加载 Skills Level 0:发现 gitlab-mr-review.md,usage_count=1][加载 Skills Level 1:读取完整 Skill 内容]
Hermes:好的,我根据上次的经验来审查。[直接调用 execute_code,使用 Skill 中记录的 API 格式][检查重点:迁移文件 + Apollo 配置(Skill 中的检查清单)]
⏱ 完成时间:比上次快 40%(无需重新查文档)
案例三:Cron 自动进化 Skill
场景:Hermes 的 Cron 调度器在凌晨触发优化任务。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line[Cron 触发,凌晨 3:00]
Nudge:你在过去两周使用了 gitlab-mr-review Skill 7 次, 其中有 2 次需要额外查询 Apollo 配置相关信息。 请复习并改进这个 Skill。
[Hermes 自动执行][读取 Skill 当前内容][读取 7 次使用的对话历史][发现:Apollo 配置变更是高频检查项,但 Skill v1.0 中没有覆盖]
[自动更新 Skill 至 v1.1] 新增:Apollo 配置变更检查章节 新增:配置与代码部署顺序的注意事项 更新:usage_count = 7
[完成,无需用户干预]
案例四:多平台统一体验
场景:用户在不同场景下使用同一个 Hermes 实例。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line早上 9:00 [Telegram] 用户:把昨天那个性能优化报告发给我一份 Hermes:[FTS5 搜索昨天的 session,找到报告内容] [通过 Telegram 发送 PDF]
中午 12:00 [CLI] $ hermes "继续昨天的性能优化工作" Hermes:[加载昨天的 session 摘要] 好的,昨天我们分析了数据库查询慢的问题, 已定位到 N+1 查询在 UserService.list(), 接下来要...
晚上 7:00 [Discord] 用户:@hermes 帮我看看这段 Python 代码 Hermes:[全新 Discord session,但有 Skill:debug-python] [直接应用已有的调试经验]
案例五:子 Agent 并行工作流
场景:处理需要并发调查的复杂分析任务。
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# 主 Agent 自动 spawn 子 Agent"""用户:帮我分析竞品 A、B、C 三家公司的技术架构差异
Hermes(主 Agent):我来并行分析这三家公司。 [spawn sub_agent_1] → 分析公司 A 的技术博客和 GitHub [spawn sub_agent_2] → 分析公司 B 的技术博客和 GitHub [spawn sub_agent_3] → 分析公司 C 的技术博客和 GitHub [等待三个子 Agent 完成] [汇总结果,生成对比报告]
完成!这比串行处理节省了约 65% 的时间。"""
10. 与主流框架对比
|
维度 |
Hermes Agent |
LangChain |
AutoGen |
OpenAI Swarm |
|---|---|---|---|---|
| 记忆系统 |
SQLite + FTS5 + Skill |
插件化(需额外配置) |
基础历史 |
无内置记忆 |
| 自进化 | 内置
(Cron + 自动创建 Skill) |
无 |
无 |
无 |
| 多平台 | 16+ 平台内置
(Telegram, Discord...) |
需自建 |
需自建 |
无 |
| 模型支持 | 20+ 提供商
,一键切换 |
多,但切换需改代码 |
OpenAI 为主 |
OpenAI 专属 |
| 向量数据库 | 不需要
(FTS5) |
通常需要 |
通常需要 |
不需要 |
| 部署复杂度 | 低
(单进程,SQLite) |
高(多依赖) |
中 |
低但功能少 |
| RL 训练支持 | 内置
batch_runner |
无 |
无 |
无 |
| 与 MCP 关系 |
Client + Server 双模式 |
Client |
Client |
无 |
核心差异:Hermes Agent 不是工具编排器,而是有记忆、会学习的自主 Agent 系统。
11. 总结与展望
11.1 架构设计的务实之道
Hermes Agent 的架构展示了一种**"务实 > 完美"**的工程哲学:
|
常见"理想"方案 |
Hermes 的务实选择 |
理由 |
|---|---|---|
|
向量数据库(Pinecone 等) |
SQLite + FTS5 |
零依赖,够用,可离线 |
|
复杂知识图谱 |
YAML Skill 文档 |
人类可读,LLM 易理解 |
|
多服务微架构 |
单进程 |
部署简单,idle 零成本 |
|
专有 AI 框架 |
标准 OpenAI SDK |
兼容所有提供商 |
11.2 版本演进速度
Hermes Agent 在 2026 年 3-4 月迭代极为迅速:
|
版本 |
日期 |
关键新特性 |
|---|---|---|
|
v0.5.0 |
3/28 |
HuggingFace、Telegram Topics、Modal、移除 litellm(供应链安全) |
|
v0.6.0 |
3/30 |
多 Profile、MCP Server 模式、Docker 完整支持 |
|
v0.7.0 |
4/3 |
可插拔 memory provider、凭证池轮转、反检测浏览器 |
|
v0.8.0 |
4/8 |
后台任务通知、实时模型切换、Google AI Studio |
|
v0.9.0 |
4/13 |
Android Termux、iMessage/WeChat/WeCom、Web Dashboard、Fast Mode |
11.3 Hermes 的核心价值主张
ounter(lineounter(lineounter(line传统 AI Agent 是"工具"——你告诉它做什么,它做完就忘。Hermes Agent 是"同事"——它记得你们一起解决过什么, 并且会在你睡觉的时候自己复习。
对于需要长期、反复处理同类任务的场景(DevOps、内容创作、研究分析、客户服务等),Hermes Agent 的自进化特性能够带来随时间不断累积的复合收益——这是目前大多数 Agent 框架所不具备的特质。

——新书推荐——
更多推荐



所有评论(0)