Hermes Agent 深度实战:自我进化的 AI Agent 架构与生产级实践
引言:当 AI 不再是"每次从零开始"
2026年,GitHub 上最炙手可热的开源项目不再是某个新框架或新语言,而是一个能"和你一起成长"的 AI Agent。
Hermes Agent,15.5万星,稳居全球开源项目排名前50,超越了大量历史悠久的明星项目。从诞生到登顶, Hermes Agent 只用了不到一年。背后的开发团队 Nous Research,也许你没有听过这个名字——但你一定听说过他们参与开发的 Llama 系列模型。是的,这家低调的 AI 实验室,在训练大模型的同时,花了大量精力打造了一个"活的"AI Agent 框架。
传统 AI Agent 的问题是什么?你和它聊了100次,它依然记不住你第三天说的那个项目细节。每次新建会话,它就像失忆了一样。你教它做了一件复杂的事,下次遇到类似的,它又要重新摸索。
Hermes Agent 要解决的核心问题就是这个:让 AI Agent 真正具有持续学习和自我改进的能力,而不是每次都从零开始。
本文基于源码(v0.14.0,9022次提交)和官方文档,对 Hermes Agent 的六层架构、记忆系统、Skills 自进化闭环、工具注册中心等核心模块进行深度拆解,并提供完整的生产级部署与实践指南。
一、Nous Research:从 Llama 到 Hermes 的演进之路
1.1 低调的明星实验室
Nous Research 由 former Meta AI 研究员创立,专注于大模型民主化和开源 Agent 技术。2025年,他们开源了 Hermes 系列模型。2026年2月底,Hermes Agent 正式对外发布,迅速走红。
与 OpenAI、Anthropic 这些高调的公司不同,Nous Research 选择了另一条路:不做闭源 API 服务,而是把最核心的能力开源出来,让全球开发者一起构建生态。
核心设计哲学:"The agent that grows with you"
这不仅仅是一句 slogan,而是贯穿整个项目架构的核心指导思想。
1.2 项目关键数据
| 指标 | 数据 |
|---|---|
| GitHub Stars | 153,465+ |
| Forks | 24,475+ |
| 贡献者 | 215+ |
| 正式版本 | v0.2.0 ~ v0.14.0(2026年5月) |
| 代码规模 | AIAgent 核心约12k LOC + CLI约11k LOC |
| 测试规模 | ~17,000 个测试 / ~900 个测试文件 |
| 主语言 | Python + TypeScript (Ink TUI) |
| 支持平台 | 15+(Telegram, Discord, Slack, WhatsApp等) |
二、整体架构:六层骨架深度解析
Hermes Agent 的核心架构由六层组成,每一层各司其职,共同构成了一个完整的自学习 Agent 系统:
┌─────────────────────────────────────────────────────┐
│ Layer 1: CLI / TUI 入口层 │
│ (HermesCLI, Ink TUI) │
├─────────────────────────────────────────────────────┤
│ Layer 2: AIAgent 同步推理循环 │
│ (run_agent.py, ~12k LOC) │
│ 模型生成 → 工具执行 → 结果回喂 → 迭代 │
├─────────────────────────────────────────────────────┤
│ Layer 3: 工具注册中心 (Tool Registry) │
│ 集中注册表 + Toolset 机制 │
├─────────────────────────────────────────────────────┤
│ Layer 4: 插件扩展系统 (Plugin System) │
│ 按平台启停的工具集 │
├─────────────────────────────────────────────────────┤
│ Layer 5: 记忆与压缩管线 (Memory Pipeline) │
│ 三层记忆 + 冻结快照 + FTS5 搜索 │
├─────────────────────────────────────────────────────┤
│ Layer 6: Curator 后台自学习器 │
│ 自动从对话历史中提取模式,生成 Skills │
└─────────────────────────────────────────────────────┘
2.1 入口层:多端统一的接入体验
Hermes Agent 的入口层支持多种交互方式:
CLI(命令行):通过 hermes 命令直接启动,提供完整的交互式体验。
TUI(终端用户界面):基于 TypeScript + Ink 构建的美观终端界面,比纯 CLI 更友好。
Gateway(消息网关):这是 Hermes Agent 最具特色的入口之一。通过配置一次,可以同时连接到 15+ 个消息平台:
- 即时通讯:Telegram、Discord、Slack、WhatsApp、Signal、Email
- 国内平台:钉钉、飞书、企业微信
- 其他:Matrix 等
这意味着你可以:
- 在 Telegram 上和它对话
- 在 Discord 群里 @它
- 在钉钉里用机器人模式调用它
- 所有这些都连接同一个后台 Agent 实例
API Server:对外提供 REST API,方便集成到其他系统。
Cron:定时任务触发器,可以设置周期性任务。
ACP:Anthropic Agent Communication Protocol,跨 Agent 通信协议。
Batch Runner:批量任务执行器。
这种"一个核心,多个外壳"的设计哲学,让 Hermes Agent 不绑定任何特定平台,同时又能在每个平台上提供最佳体验。
2.2 核心推理循环:ReAct 模式的工程化实现
Hermes Agent 的核心推理引擎是一个同步式工具调用 Agent,采用经典的 ReAct(Reasoning + Acting)循环:
# run_agent.py 中的核心循环(简化版)
class AIAgent:
def run(self, task: str) -> str:
messages = []
system_prompt = self.build_system_prompt()
messages.append({"role": "system", "content": system_prompt})
messages.append({"role": "user", "content": task})
while self.should_continue(messages):
# Step 1: LLM 生成工具调用或回复
response = self.llm.chat(messages)
messages.append({"role": "assistant", "content": response})
# Step 2: 解析工具调用
tool_calls = self.parse_tool_calls(response)
if not tool_calls:
# 没有工具调用,直接返回回复
return response
# Step 3: 执行工具
for tool_call in tool_calls:
result = self.execute_tool(tool_call)
messages.append({
"role": "user",
"content": f"<tool_result>{result}</tool_result>"
})
# Step 4: 检查是否达到停止条件
if self.is_final_response(response):
return response
return self.summarize(messages)
这个循环的关键在于 should_continue 和 is_final_response 的实现:
- 最大迭代次数:防止无限循环(默认 50 次)
- 工具调用检测:通过 prompt 工程让模型决定是否需要调用工具
- 停止信号:当模型认为任务完成时退出循环
- 结果回喂:每次工具执行结果都作为新的 user message 回喂给模型
2.3 工具注册中心:可插拔的工具生态
# 工具注册中心示例
class ToolRegistry:
"""集中管理所有可用工具的注册表"""
def __init__(self):
self._tools: Dict[str, Tool] = {}
self._toolsets: Dict[str, List[str]] = {}
def register(self, tool: Tool, toolsets: List[str] = None):
"""注册一个工具,可选加入多个工具集"""
self._tools[tool.name] = tool
if toolsets:
for ts in toolsets:
if ts not in self._toolsets:
self._toolsets[ts] = []
self._toolsets[ts].append(tool.name)
def get_tools(self, toolsets: List[str] = None) -> List[Tool]:
"""获取工具集下的所有工具"""
if not toolsets:
return list(self._tools.values())
result = []
for ts in toolsets:
result.extend(self._tools[t] for t in self._toolsets.get(ts, []))
return result
def register_by_platform(self, platform: str):
"""根据平台启用不同的工具集"""
platform_toolsets = {
"telegram": ["messaging", "files"],
"discord": ["messaging", "files", "moderation"],
"cli": ["shell", "files", "search"],
"api": ["web", "files", "data"],
}
return self.get_tools(platform_toolsets.get(platform, []))
这种设计的精妙之处在于:
- 按平台启停:在 Telegram 上只启用消息相关工具,在 CLI 上启用 shell 工具
- 工具集组合:可以将多个工具集组合,实现复杂的工作流
- 动态注册:支持运行时注册新工具,无需重启
2.4 插件扩展系统:Toolset 机制
# 插件系统示例 - 支持多种执行后端
class ToolExecutor:
"""统一的工具执行器,支持多种后端"""
def __init__(self):
self.backends = {
"local": LocalBackend(), # 本地直接执行
"docker": DockerBackend(), # Docker 容器隔离执行
"ssh": SSHBackend(), # 远程 SSH 执行
"singularity": SingularityBackend(), # HPC 场景
"modal": ModalBackend(), # Serverless 执行
"daytona": DaytonaBackend(), # 云端开发环境
}
async def execute(self, tool: Tool, params: dict, backend: str = "local"):
"""根据后端类型选择执行环境"""
be = self.backends.get(backend, self.backends["local"])
return await be.run(tool, params)
这个多后端设计解决了实际生产中的一个大问题:工具执行需要平衡能力、隔离性和可扩展性。
local:最快,但有安全风险docker:隔离性好,适合执行第三方工具ssh:访问远程服务器modal:无服务器执行,按需扩展daytona:云端开发环境
三、记忆系统:三层架构的工程艺术
Hermes Agent 的记忆系统是它与其他 Agent 框架最大的差异化所在。它不是简单地"记住对话",而是通过三层架构解决不同层次的问题。
3.1 Layer 1:内置记忆(Built-in Memory)
两个 Markdown 文件构成了最基础的记忆层:
MEMORY.md(Agent 个人笔记,2200 字符上限)
# MEMORY.md
## 关键决策记录
- 2026-05-10: 选择了 PostgreSQL 而非 MySQL,因为其 JSONB 支持更强大
- 2026-04-28: 确认使用 pnpm 作为包管理器,弃用 npm
## 项目上下文
- 主项目路径: ~/projects/hermes-integration
- API Gateway: localhost:8080
- 数据库: postgresql://localhost:5432/appdb
## 常用工作流程
- 测试流程: pnpm test → pnpm build → docker push
- 代码审查: 先运行 pnpm lint,再提交 PR
USER.md(用户画像,1375 字符上限)
# USER.md
## 用户偏好
- 编程语言: Python, TypeScript, Rust
- 框架偏好: FastAPI, Next.js
- 代码风格: 偏好函数式风格,变量命名清晰
## 上下文理解
- 工作场景: 全栈开发,日常使用 Docker 和 Kubernetes
- 关注点: 性能优化、系统架构、AI Agent 开发
- 沟通风格: 直接高效,不喜欢废话
这两个文件在每次会话启动时注入到系统提示词的最前面,确保 Agent 始终携带关键上下文。
3.2 Layer 2:外部记忆提供者(External Memory Providers)
八个可插拔的外部后端,通过统一接口访问不同的记忆存储:
| Provider | 特点 | 适用场景 |
|---|---|---|
| Honcho | Nous 自研,轻量级 | 默认选择 |
| Holographic | 向量嵌入 | 语义相似记忆检索 |
| Mem0 | 托管服务 | 快速上手 |
| Hindsight | 事后总结 | 任务复盘 |
| OpenViking | 企业级 | 大规模部署 |
| RetainDB | SQL 后端 | 已有数据库 |
| ByteRover | 云原生 | Kubernetes 环境 |
| Supermemory | 浏览器插件 | Web 场景 |
关键约束:同时只激活一个外部 Provider
这个设计选择很有智慧。多个 Provider 会引入冲突解决、优先级排序等复杂问题,而单一 Provider 则大大简化了系统复杂度。
3.3 Layer 3:会话搜索(Session Search)
所有历史会话都存储在 SQLite 中,配合 FTS5 全文索引:
# 会话搜索实现
class SessionSearch:
def __init__(self, db_path: str):
self.conn = sqlite3.connect(db_path)
# 创建 FTS5 虚拟表
self.conn.execute("""
CREATE VIRTUAL TABLE IF NOT EXISTS sessions_fts
USING fts5(
content,
tokenize='unicode61 remove_diacritics 2'
)
""")
def index_session(self, session_id: str, messages: List[dict]):
"""索引会话内容"""
content = "\n".join(
f"{m['role']}: {m['content']}"
for m in messages
)
self.conn.execute(
"INSERT INTO sessions_fts(rowid, content) VALUES (?, ?)",
(session_id, content)
)
self.conn.commit()
def search(self, query: str, limit: int = 5) -> List[dict]:
"""语义搜索历史会话"""
results = self.conn.execute("""
SELECT rowid, snippet(sessions_fts, 0, '【', '】', '...', 32)
FROM sessions_fts
WHERE sessions_fts MATCH ?
ORDER BY rank
LIMIT ?
""", (query, limit)).fetchall()
return [{"session_id": r[0], "snippet": r[1]} for r in results]
3.4 冻结快照:Prompt Cache 的工程优化
这是记忆系统中最有技术含量的设计之一。
当 Agent 处理一个长对话时,LLM 的上下文窗口是有限的。每次都要重新发送所有历史消息,成本高昂。Hermes Agent 的解决方案是"冻结快照":
class MemoryContextManager:
"""
冻结快照模式:避免 Prompt Cache 成本翻倍
问题:如果在 Prefix Cache 有效期内重新加载相同的前缀,
LLM 服务商通常会收取完整前缀的成本。
解决:将前缀内容冻结为一个"快照",只有在特定触发条件下
才刷新,避免重复计算。
"""
FROZEN_TRIGGERS = [
"new_session", # 新会话开始
"memory_updated", # 记忆文件被修改
"skills_changed", # Skills 更新
"hourly_refresh", # 每小时强制刷新
"user_request", # 用户主动刷新
]
def __init__(self, agent: AIAgent):
self.agent = agent
self.frozen_context = None
self.frozen_hash = None
def get_context(self) -> str:
"""获取当前上下文(可能从缓存返回)"""
context = self.build_fresh_context()
current_hash = self.compute_hash(context)
# 只有在内容变化时才重建缓存
if current_hash != self.frozen_hash:
self.frozen_context = context
self.frozen_hash = current_hash
return self.frozen_context
def build_fresh_context(self) -> str:
"""构建完整的上下文内容"""
parts = []
# Layer 1: 内置记忆(始终激活)
parts.append(self.read_file("MEMORY.md"))
parts.append(self.read_file("USER.md"))
# Layer 2: 外部记忆(按需)
if self.external_provider:
parts.append(self.external_provider.get_context())
# Layer 3: 会话搜索结果(按需)
if self.should_search_sessions():
results = self.session_search.search(
self.current_task, limit=3
)
parts.append(self.format_session_results(results))
return "\n\n".join(parts)
冻结快照的核心逻辑:
- 计算当前上下文内容的哈希值
- 只有哈希变化时才重新构建
- 哈希相同时,直接返回缓存的冻结版本
- 触发条件限定为 5 种事件,避免频繁刷新
这个设计让 LLM API 的前缀缓存命中率大幅提升,实际成本通常只有原价的 10%。
3.5 记忆系统的七个源码级设计细节
翻过 Hermes Agent 的源码,你会发现一些教科书上不会教的工程技巧:
① Unicode 冷门字符做分隔符
# 用 § (分段符) 而非常规分隔符
MEMORY_DELIMITER = "\u00a7" # §
# 避免和用户内容冲突(用户很少输入 §)
② 子串匹配定位,不需要 ID
# 传统做法:每条记忆有唯一 ID,删除时查找 ID
# Hermes 做法:直接用子串匹配定位
def remove_memory_entry(content: str, entry_marker: str) -> str:
# 找到要删除的内容起止位置
start = content.find(entry_marker)
end = content.find(MEMORY_DELIMITER, start + 1)
return content[:start] + content[end + 1:]
③ 锁文件分离
# 错误做法:直接锁文件本身
with open("memory.md", "r+") as f:
flock(f, LOCK_EX)
# 如果加锁失败,文件内容可能已损坏
# 正确做法:用单独的 .lock 文件
lock_path = "memory.md.lock"
with open(lock_path, "w") as lock_f:
flock(lock_f, LOCK_EX)
with open("memory.md", "r+") as f:
# 执行读写操作
④ 原子 rename 写入
# 错误做法:直接 open("w") 会先清空文件
with open("memory.md", "w") as f: # 文件在写之前就被清空了!
f.write(new_content)
# 正确做法:写临时文件,再 rename(原子操作)
temp_path = "memory.md.tmp"
with open(temp_path, "w") as f:
f.write(new_content)
os.rename(temp_path, "memory.md") # 原子替换
⑤ 冻结快照刷新时机
只在 Prefix Cache 反正要失效的 5 个事件里顺势 reload。
⑥ 上下文围栏(Context Fence)
<memory-context>
<agent-note>
<!-- 这是 Agent 自己的笔记 -->
Agent 写的记忆内容
</agent-note>
<user-input>
<!-- 用户输入的原始内容 -->
用户说的话
</user-input>
</memory-context>
通过 XML 结构区分"引用内容"和"用户输入",然后 strip 标签,防止 fence injection 攻击。
⑦ MemoryStore ≠ MemoryProvider
文档说是统一接口,源码里其实是两套并行系统。理解这个区别,才能正确调试记忆问题。
四、Skills 自进化系统:让 AI 写自己的使用手册
Skills 系统是 Hermes Agent 最核心的创新,也是"自我进化"的具体实现。
4.1 Skills 是什么?
Skills 是一组定义 Agent 行为的指令和工具,它们允许 Agent 从经验中创建可重用的工作流程,并在未来的会话中复用。
<!-- 一个自动生成的 SKILL.md 示例 -->
# SKILL.md
## skill-name: docker-cleanup
## description: 清理 Docker 镜像和容器的标准流程
## triggers: ["docker 清理", "清理 docker", "docker空间不足"]
## confidence: 0.95
## times_used: 12
## last_refined: 2026-05-20
### 触发条件
当用户提到清理 Docker 资源时激活。
### 执行流程
1. 停止所有已停止的容器: `docker container prune -f`
2. 删除悬空镜像: `docker image prune -f`
3. 删除未使用的网络: `docker network prune -f`
4. 可选:删除所有未使用的镜像: `docker image prune -a`
### 注意事项
- 删除前确认没有重要数据
- 生产环境慎用 `-a` 参数
- 可以加 `--filter` 做更精细过滤
4.2 七阶段 Skills 进化闭环
Skills 的生成和进化是一个完整的七阶段闭环:
阶段1: 触发检测
↓ 模型识别当前任务可被 Skill 复用
阶段2: 经验提取
↓ 从对话历史中提取成功的工作流程
阶段3: 模式抽象
↓ 将具体操作抽象为通用模板
阶段4: SKILL.md 生成
↓ 生成结构化技能文档
阶段5: 安全扫描
↓ 检查生成的 Skill 是否有安全隐患
阶段6: 原子写入
↓ 安全地写入 skills/ 目录
阶段7: 索引注册
↓ 将新 Skill 加入检索索引
↓ (循环回到阶段1)
class Curator:
"""
Curator 是 Hermes Agent 的后台自学习器。
它在每次对话结束后运行,分析对话历史,提取模式,
生成新的或改进现有的 Skills。
"""
SKILL_TEMPLATE = """# SKILL.md
## skill-name: {name}
## description: {description}
## triggers: {triggers}
## confidence: {confidence}
## times_used: {times_used}
## last_refined: {last_refined}
{triggers}
### 触发条件
{trigger_conditions}
### 执行流程
{workflow}
### 注意事项
{considerations}
"""
def run(self, conversation: List[dict]) -> Optional[str]:
"""分析对话,生成或改进 Skills"""
# 阶段1: 检测是否有值得提取的工作流程
patterns = self.detect_workflow_patterns(conversation)
if not patterns:
return None
# 阶段2: 验证模式的有效性
for pattern in patterns:
# 检查是否已经有类似的 Skill
existing = self.find_similar_skill(pattern)
if existing:
# 改进现有 Skill
improved = self.refine_skill(existing, pattern)
self.safe_write_skill(improved)
else:
# 创建新 Skill
new_skill = self.generate_skill(pattern)
self.safe_write_skill(new_skill)
def safe_write_skill(self, skill: dict):
"""原子写入 + 安全扫描"""
# 安全扫描
security_issues = self.scan_security(skill)
if security_issues:
logging.warning(f"Skill {skill['name']} 安全问题: {security_issues}")
# 降级处理:加入白名单或拒绝写入
if not self.is_whitelisted(skill):
return
# 原子写入
temp_path = f"skills/{skill['name']}.tmp"
with open(temp_path, "w") as f:
f.write(skill["content"])
os.rename(temp_path, f"skills/{skill['name']}.md")
4.3 Prompt Cache 与指令权重的权衡
生成的 Skill 内容会作为系统提示词的一部分。每次对话都会加载所有相关 Skills,如果 Skill 内容过多,会显著增加 token 消耗。
Hermes Agent 的解决思路:
class SkillLoader:
"""渐进式 Skill 加载"""
# Skill 的触发元数据(description, triggers)始终加载
# 完整内容按需加载
def load_skills(self, task: str) -> str:
candidates = self.search_skills(task)
# 按相关度排序,取前 N 个
top_skills = sorted(candidates, key=lambda x: x.score, reverse=True)[:5]
# 元数据始终加载(便宜)
metadata = "\n".join(s.metadata for s in top_skills)
# 完整内容只加载最高相关的 2 个(昂贵)
full_content = []
for s in top_skills[:2]:
full_content.append(s.full_content)
return f"# Relevant Skills Metadata:\n{metadata}\n\n# Top Skill Detail:\n{full_content[0] if full_content else ''}"
五、生产级部署:从 $5 VPS 到 GPU 集群
5.1 快速启动
# 安装(支持 uv 包管理器)
uv tool install hermes-agent
# 或者从源码安装
git clone https://github.com/NousResearch/hermes-agent
cd hermes-agent
uv sync
# 初始化配置
hermes init
# 启动 TUI 界面
hermes tui
5.2 多种部署模式
① $5 VPS(最低成本方案)
适合个人使用、学习和研究:
# 环境变量配置
export HERMES_MODEL=anthropic/claude-3-haiku
export HERMES_PROVIDER=openrouter
export HERMES_PLATFORM=telegram
# 后台运行
nohup hermes gateway --platform telegram > hermes.log 2>&1 &
② Docker 部署(推荐生产方案)
FROM python:3.11-slim
WORKDIR /app
RUN pip install hermes-agent
# 配置
COPY .env /app/.env
# 运行
CMD ["hermes", "gateway", "--platform", "telegram", "--log-level", "info"]
docker run -d \
--name hermes \
--env-file .env \
-v hermes_data:/app/data \
-p 8080:8080 \
hermes-agent:latest
③ GPU 集群(高性能方案)
# 使用本地模型(Ollama 集成)
export HERMES_MODEL=local/llama3
export HERMES_PROVIDER=ollama
export OLLAMA_HOST=http://localhost:11434
# 使用 Modal 运行无服务器推理
export HERMES_EXECUTION_BACKEND=modal
④ Kubernetes 部署(企业级方案)
apiVersion: apps/v1
kind: Deployment
metadata:
name: hermes-agent
spec:
replicas: 3
selector:
matchLabels:
app: hermes
template:
metadata:
labels:
app: hermes
spec:
containers:
- name: hermes
image: hermes-agent:latest
env:
- name: HERMES_MODEL
valueFrom:
secretKeyRef:
name: hermes-secrets
key: model-api-key
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "1000m"
5.3 与 OpenClaw 的对比
| 维度 | Hermes Agent | OpenClaw |
|---|---|---|
| 架构哲学 | 自进化,Skills 自动生成 | 插件化,工具驱动 |
| 记忆系统 | 三层架构(内置+外部+搜索) | 会话级,上下文注入 |
| 平台支持 | 15+ 即时通讯平台 | 桌面端为主 |
| 学习方式 | Curator 后台自动学习 | 规则配置 |
| 部署复杂度 | 中等(多组件) | 低(单体) |
| Stars | 153,465 | 360,000+ |
| 定位 | "与你共同成长" | "AI 编程助手" |
两者定位不同:Hermes Agent 更像一个"AI 伙伴",随着使用越来越懂你;OpenClaw 更像一个"专业助手",在特定领域极其强大。
六、性能优化:让 Hermes Agent 跑得更快更省
6.1 Token 成本优化
策略一:使用更小的模型处理简单任务
class ModelRouter:
"""智能模型路由"""
ROUTING_RULES = {
"quick_reply": "claude-3-haiku", # 快速回复
"code_review": "claude-3-sonnet", # 代码审查
"complex_reasoning": "claude-3-opus", # 复杂推理
"file_operations": "claude-3-haiku", # 文件操作
}
def route(self, task: str, history: List[dict]) -> str:
# 根据任务类型和对话长度选择模型
task_type = self.classify_task(task)
if len(history) < 5 and task_type in ["quick_reply", "file_operations"]:
return "claude-3-haiku"
elif task_type == "complex_reasoning":
return "claude-3-opus"
else:
return "claude-3-sonnet"
策略二:启用 Prompt Cache
# 使用支持缓存的模型提供商
export HERMES_PROVIDER=openai
export OPENAI_API_BASE=https://api.openai.com/v1
# OpenAI 的 Cache API 会自动利用缓存
策略三:减少历史消息发送
class MessageSummarizer:
"""消息摘要器,压缩历史"""
def summarize_if_needed(self, messages: List[dict], max_tokens: int = 8000):
total_tokens = self.count_tokens(messages)
if total_tokens <= max_tokens:
return messages
# 摘要早期消息
old_messages = messages[:-20] # 保留最近20条
new_messages = messages[-20:]
summary = self.summarize(old_messages)
return [
{"role": "system", "content": f"历史摘要:\n{summary}"}
] + new_messages
6.2 响应速度优化
# 启用流式输出
agent = AIAgent(
model="claude-3-sonnet",
streaming=True, # 流式输出,边生成边显示
max_concurrent_tools=3, # 允许并发执行独立工具
)
# 工具执行超时配置
TOOL_TIMEOUTS = {
"bash": 30, # Shell 命令最多 30 秒
"web_search": 10, # 搜索最多 10 秒
"file_read": 5, # 文件读取最多 5 秒
"http_request": 15, # HTTP 请求最多 15 秒
}
6.3 内存使用优化
# 配置内存限制
agent = AIAgent(
max_memory_chars={
"MEMORY.md": 2200, # Agent 笔记上限
"USER.md": 1375, # 用户画像上限
},
session_search_limit=5, # 每次最多检索 5 条历史
skill_load_limit=5, # 最多同时加载 5 个 Skills
)
七、实践案例:从零构建你的第一个自进化工作流
7.1 场景:自动代码审查助手
部署一个监听 GitHub PR 的 Hermes Agent,自动审查代码并给出建议:
# 1. 创建 GitHub Webhook 集成
hermes plugin install github
# 2. 配置
cat > ~/.hermes/config/github.yaml << 'EOF'
webhook:
port: 8080
path: /webhook/github
secret: ${GITHUB_WEBHOOK_SECRET}
triggers:
- event: pull_request
action: code_review
- event: push
branches: [main, develop]
action: run_tests
skills:
- code_review
- security_scan
EOF
# 3. 启动
hermes gateway --config github.yaml
7.2 自定义 Skill 示例
# ~/.hermes/skills/github-pr-review.md
# SKILL.md
## skill-name: github-pr-review
## description: GitHub Pull Request 自动代码审查
## triggers: ["PR审查", "review", "代码审查", "pull request"]
## confidence: 0.92
## times_used: 47
## last_refined: 2026-05-18
### 触发条件
收到 GitHub PR 相关的 Webhook 事件时激活。
### 执行流程
1. 解析 PR 信息(标题、描述、文件变更)
2. 使用 `github_get_pr_details` 获取完整 diff
3. 逐文件分析变更,识别:
- 潜在 bug(空指针、边界条件、并发问题)
- 代码风格问题
- 安全风险(SQL注入、XSS、敏感信息泄露)
- 性能问题(N+1查询、内存泄漏)
- 架构问题(违反SOLID原则)
4. 生成审查报告,使用结构化格式
5. 通过 GitHub API 提交 Review Comment
### 输出格式
```markdown
## PR 审查报告
### 总体评分: 8/10
### 发现的问题
#### 🔴 高优先级
- `src/auth.py:45` - SQL 注入风险,使用参数化查询
#### 🟡 中优先级
- `src/utils.py:78` - N+1 查询问题,建议使用 JOIN
#### 🟢 低优先级
- 代码风格不一致,建议使用 black 格式化
注意事项
- 只提建议,不做决定
- 优先肯定做得好的地方
- 复杂问题给出具体的改进方案
- 尊重作者的代码风格偏好
### 7.3 多 Agent 协作模式
Hermes Agent 支持 ACP(Agent Communication Protocol),可以实现多 Agent 协作:
```python
# 主 Agent(协调者)
class CoordinatorAgent(AIAgent):
def __init__(self):
super().__init__()
self.sub_agents = {
"coder": CoderAgent(),
"reviewer": ReviewerAgent(),
"tester": TesterAgent(),
}
async def handle_task(self, task: str):
plan = await self.planning_phase(task)
results = {}
# 并行执行独立的子任务
for step in plan.steps:
agent = self.sub_agents[step.agent]
results[step.id] = await agent.execute(step.task)
# 汇总结果
return await self.synthesis_phase(plan, results)
八、工具注册实战:扩展 Hermes 的能力边界
8.1 注册自定义工具
from hermes import tool, ToolRegistry
@tool(
name="fetch_tech_news",
description="获取指定技术领域的最新新闻",
parameters={
"topic": {"type": "str", "description": "技术主题", "required": True},
"limit": {"type": "int", "description": "返回数量", "default": 5},
}
)
async def fetch_tech_news(topic: str, limit: int = 5) -> str:
"""抓取技术新闻的核心实现"""
import httpx
async with httpx.AsyncClient() as client:
response = await client.get(
"https://newsapi.org/v2/everything",
params={"q": topic, "pageSize": limit, "apiKey": API_KEY}
)
data = response.json()
articles = [
f"- **{a['title']}** ({a['source']['name']})\n {a['description']}"
for a in data.get("articles", [])
]
return "\n\n".join(articles) if articles else "未找到相关新闻"
# 注册到工具中心
registry = ToolRegistry()
registry.register(fetch_tech_news, toolsets=["web", "research"])
8.2 内置工具集一览
| 工具集 | 包含工具 | 适用平台 |
|---|---|---|
messaging | send_message, reply, broadcast | Telegram, Discord, Slack |
files | read, write, list, search | 所有平台 |
shell | bash, exec, run_command | CLI, API |
search | web_search, site_search, github | 所有平台 |
code | lint, format, test, build, deploy | CLI |
data | db_query, cache_get, cache_set | API |
moderation | filter_content, report_user | Discord, Telegram |
web | fetch, scrape, screenshot | API, CLI |
九、与其他主流框架的横向对比
9.1 完整技术栈对比
| 维度 | Hermes Agent | AutoGPT | LangChain Agents | OpenClaw |
|---|---|---|---|---|
| 自进化能力 | ✅ 七阶段 Skills 闭环 | ❌ 无 | ❌ 需手动 | ⚠️ 有限 |
| 记忆系统 | ✅ 三层架构 | ❌ 简单 KV | ⚠️ 可选 | ✅ 会话级 |
| 工具注册 | ✅ 集中注册表 | ❌ 硬编码 | ✅ LangChain Tools | ✅ 插件 |
| 多平台 | ✅ 15+ | ❌ 仅 API | ⚠️ 需扩展 | ❌ 桌面端 |
| 学习闭环 | ✅ Curator 自动 | ❌ 无 | ❌ 无 | ⚠️ 配置驱动 |
| 生产就绪度 | ⚠️ v0.14.0 | ❌ 实验性 | ✅ 高 | ✅ 高 |
| Stars | 153,465 | 160,000+ | N/A(生态) | 360,000+ |
| 部署复杂度 | 中 | 低 | 中 | 低 |
9.2 选型建议
- 个人使用,追求 AI 越来越懂你 → Hermes Agent
- 快速原型,最小化配置 → AutoGPT
- 企业级,需要 LangChain 生态 → LangChain Agents
- 专业编程辅助,需要 IDE 集成 → OpenClaw
十、总结与展望
Hermes Agent 给我们展示了一条重要的方向:AI Agent 不应该每次都从零开始。
通过三层记忆系统、七阶段 Skills 进化闭环、六层模块化架构,Hermes Agent 构建了一个真正具有"学习能力"的 AI 系统。它的设计哲学——"The agent that grows with you"——正在重新定义我们对 AI 工具的期待。
已经验证的方向:
- Skills 自动生成是可行的,关键在于安全扫描和原子写入
- 三层记忆架构有效平衡了成本、精度和召回
- 多平台统一接入不牺牲体验
- Curator 后台学习器可以在不干扰主循环的情况下持续改进
正在探索的方向:
- 多 Agent 协作学习(多个 Hermes 实例共享 Skills)
- Skills 的版本控制和 A/B 测试
- 跨模态 Skills(从图像、音频中学习)
- 隐私保护的学习机制(在本地完成所有学习)
对于开发者而言,Hermes Agent 既是工具,也是研究样本。它的源码(9022次提交、900个测试文件)中蕴含了大量可以借鉴的工程实践——文件锁策略、分隔符选择、冻结快照时机、上下文围栏……这些细节决定了系统能否在生产环境中稳定运行。
未来已来。你是选择让 AI 每次从零开始,还是让它和你一起成长?