同步
This commit is contained in:
227
InBox/Hermes Agent 架构分析.md
Normal file
227
InBox/Hermes Agent 架构分析.md
Normal file
@@ -0,0 +1,227 @@
|
||||
---
|
||||
source: 微信公众号
|
||||
url: https://mp.weixin.qq.com/s/Rao9okjfY7gzsHldjRKdDw
|
||||
title: Hermes Agent 架构分析
|
||||
tags: [hermes-agent, architecture, AI-agent]
|
||||
---
|
||||
|
||||
# Hermes Agent 架构分析
|
||||
|
||||
## 系统全景
|
||||
Hermes Agent 是一个**多平台、可扩展的 AI Agent 框架**,核心组件包括:
|
||||
- **核心 Agent 引擎** — AIAgent 类(run_agent.py)
|
||||
- **工具系统与注册中心** — registry 架构
|
||||
- **网关与多平台适配** — 20+ 平台适配器
|
||||
- **配置与状态管理** — 双轨配置 + SQLite 会话存储
|
||||
- **安全模型** — 多层审批 + 纵深防御
|
||||
|
||||
---
|
||||
|
||||
## 核心 Agent 引擎
|
||||
|
||||
### AIAgent 类设计
|
||||
采用**大类单文件设计**(run_agent.py),所有核心逻辑汇聚于一个文件中。
|
||||
|
||||
**60+ 构造器参数**按语义分区:
|
||||
- 模型配置
|
||||
- 工具控制(enabled/disabled_toolsets)
|
||||
- 行为控制(quiet_mode, save_trajectories)
|
||||
- 上下文标识(platform, session_id)
|
||||
- 回调注入(clarify, approval, sudo, progress callbacks)
|
||||
|
||||
这是一种**配置注入(Configuration Injection)**模式。
|
||||
|
||||
### 双接口设计
|
||||
```python
|
||||
def chat(self, message: str) -> str:
|
||||
"""简单接口 — 返回最终响应字符串"""
|
||||
|
||||
def run_conversation(self, ...) -> dict:
|
||||
"""完整接口 — 返回字典"""
|
||||
```
|
||||
Facade + Full API 双层设计。
|
||||
|
||||
### 核心循环
|
||||
```
|
||||
while api_call_count < max_iterations and budget.remaining > 0:
|
||||
# 1. 预飞检查 — 上下文压缩
|
||||
# 2. API 调用
|
||||
# 3. 工具调用分支(支持并行执行)
|
||||
# 4. 终止条件
|
||||
```
|
||||
|
||||
**关键设计决策:**
|
||||
| 权衡 | 选择 | 理由 |
|
||||
|------|------|------|
|
||||
| 同步 vs 异步 | 同步循环 | 可预测性、调试简单 |
|
||||
| 迭代控制 | 双重限制 | 线程安全预算管理 |
|
||||
| 上下文压缩 | 触发式 | 仅在 token 上限时启动 |
|
||||
|
||||
### IterationBudget — 线程安全预算管理
|
||||
使用 threading.Lock 实现,解决子代理委派场景下的预算共享问题。
|
||||
|
||||
### 上下文压缩(5 阶段管线)
|
||||
1. **工具输出裁剪** — 截断超长返回值
|
||||
2. **头部保护** — 锁定系统提示 + 前 N 轮
|
||||
3. **Token 预算尾部定位** — 从尾部向前累积
|
||||
4. **结构化摘要** — LLM 摘要被截断的中间部分
|
||||
5. **工具对消毒** — 确保 tool_use/tool_result 成对出现
|
||||
|
||||
**防抖机制**:检测连续多次压缩则触发紧急降级。
|
||||
|
||||
### Prompt 缓存策略
|
||||
Anthropic system_and_3 策略:系统提示 + 最后 3 条消息设置 cache_control 断点。
|
||||
|
||||
### 多 API 模式适配
|
||||
支持 4 种 LLM API 协议:OpenAI、Anthropic、Google、OpenRouter,内部统一格式后在 API 调用前动态转换。
|
||||
|
||||
---
|
||||
|
||||
## 工具系统与注册中心
|
||||
|
||||
### Registry 架构(tools/registry.py)
|
||||
```python
|
||||
class ToolEntry:
|
||||
__slots__ = ('name', 'toolset', 'schema', 'handler', 'check_fn',
|
||||
'requires_env', 'platform_filter', 'is_mcp')
|
||||
```
|
||||
|
||||
**设计亮点:**
|
||||
- **AST 自动发现** — 扫描 tools/ 目录的 registry.register() 调用,无需手动维护导入列表
|
||||
- **MCP 影子保护** — MCP 工具同名时优先内置版本
|
||||
- **__slots__ 优化** — 减少内存开销
|
||||
|
||||
### 工具分层(6 层)
|
||||
从底层执行环境到顶层 Agent 循环,每一层单向依赖。
|
||||
|
||||
### 工具集定义
|
||||
_HERMES_CORE_TOOLS 列表,用户通过 enabled/disabled_toolsets 精确控制。
|
||||
|
||||
### 工具调用生命周期(8 步流程)
|
||||
LLM → tool_calls → model_tools.handle_function_call() → registry.dispatch() → 审批检查 → handler → JSON result → tool_result message
|
||||
|
||||
---
|
||||
|
||||
## 网关与多平台适配
|
||||
|
||||
### Gateway 架构
|
||||
异步事件循环,20+ 平台适配器并发运行,统一路由到 AIAgent。
|
||||
|
||||
### 平台适配器模式(Template Method + Strategy)
|
||||
```python
|
||||
class BasePlatformAdapter(ABC):
|
||||
# 4 个必须实现的抽象方法
|
||||
async def send_text(self, chat_id, text): ...
|
||||
async def send_typing(self, chat_id): ...
|
||||
async def get_display_name(self, user_id): ...
|
||||
async def start(self): ...
|
||||
# 10+ 可选覆盖方法
|
||||
```
|
||||
|
||||
支持 20+ 适配器:Telegram、Discord、Slack、WhatsApp、QQ、Signal、HomeAssistant、WeChat(元宝)等。
|
||||
|
||||
### 会话管理
|
||||
- 双写持久化:SQLite(主)+ JSONL(向后兼容)
|
||||
- 重置策略:idle(空闲超时)/ daily(每日定时)
|
||||
|
||||
### Agent 缓存(LRU)
|
||||
最大 128 个 Agent 实例的资源感知缓存。
|
||||
|
||||
---
|
||||
|
||||
## 数据流转
|
||||
|
||||
### 主流程(键盘 → 屏幕)
|
||||
CLI 入口 → Agent 循环 → LLM API → 工具执行 → 流式渲染 → 会话持久化
|
||||
|
||||
### 工具调用流细节
|
||||
- **Agent 级拦截**:todo_tool、memory_tool 直接处理不进 registry
|
||||
- **审批流程**:环境豁免 → YOLO 模式 → LLM 智能评估 → 人工审批
|
||||
|
||||
---
|
||||
|
||||
## 配置与状态管理
|
||||
|
||||
### 双轨配置系统
|
||||
```
|
||||
~/.hermes/
|
||||
├── config.yaml # 结构化配置 (YAML)
|
||||
├── .env # 环境变量 (API keys)
|
||||
├── skins/ # 自定义皮肤
|
||||
├── skills/ # 已安装技能
|
||||
└── sessions/ # 会话数据 (SQLite + FTS5)
|
||||
```
|
||||
|
||||
### 三套配置加载器
|
||||
- load_cli_config() — CLI 交互模式
|
||||
- load_config() — 子命令
|
||||
- 直接 YAML 加载 — Gateway
|
||||
|
||||
### SessionDB
|
||||
SQLite + FTS5 全文搜索,WAL 模式读写并发,自动迁移,Jitter 写重试。
|
||||
|
||||
---
|
||||
|
||||
## 安全模型
|
||||
|
||||
### 多层审批体系
|
||||
1. 环境检测豁免 → 2. YOLO 模式 → 3. LLM 智能评估 → 4. 人工审批回调
|
||||
|
||||
### 危险模式检测(30+ 模式)
|
||||
```python
|
||||
DANGEROUS_PATTERNS = [
|
||||
r"rm\s+(-[rf]+\s+)?/", # 文件系统破坏
|
||||
r"curl.*\|\s*(bash|sh)", # 网络风险
|
||||
r"sudo\s+", # 权限提升
|
||||
# ...
|
||||
]
|
||||
```
|
||||
Unicode 规范化防绕过(NFKC + 零宽字符移除)。
|
||||
|
||||
### 凭证保护
|
||||
- 环境变量黑名单(工具执行时自动过滤)
|
||||
- 敏感路径保护(~/.ssh/, ~/.gnupg/ 等)
|
||||
|
||||
### SSRF 防护
|
||||
在平台适配器基类中验证 URL,阻止内网/回环地址访问。
|
||||
|
||||
### 安全设计哲学
|
||||
纵深防御(Defense in Depth):最小特权、分层检查、反绕过、环境隔离、凭证隔离。
|
||||
|
||||
---
|
||||
|
||||
## 可扩展性体系
|
||||
|
||||
### 工具扩展(最核心的扩展机制)
|
||||
添加新工具仅需 2 个文件 + AST 自动发现。零配置。
|
||||
|
||||
### 技能系统(Skills)
|
||||
纯文本能力增强(~/.hermes/skills/),通过自然语言描述注入系统提示。
|
||||
|
||||
### MCP 生态
|
||||
Hermes 同时作为 MCP Server 和 MCP Client。
|
||||
|
||||
### 皮肤系统
|
||||
纯数据扩展(YAML),运行时通过 /skin 命令即时切换。
|
||||
|
||||
---
|
||||
|
||||
## 设计哲学
|
||||
|
||||
### 核心原则
|
||||
- **实用主义胜于教条主义** — 大文件不如过度拆分
|
||||
- **回调注入实现界面无关** — 4 个入口共享同一个 AIAgent
|
||||
- **分层而非分片** — 6 层清晰分层
|
||||
- **安全作为一等公民** — 深度嵌入架构
|
||||
- **约定优于配置** — 自动发现、自动加载、自动集成
|
||||
|
||||
### 主要权衡
|
||||
| 权衡 | 选择 | 收益 |
|
||||
|------|------|------|
|
||||
| 大文件 vs 小模块 | 大文件 | 核心逻辑内聚 |
|
||||
| 同步 vs 异步 | 同步 | 可预测性 |
|
||||
| 单进程 vs 微服务 | 单进程 | 部署简单 |
|
||||
| AST 发现 vs 显式注册 | 动态发现 | 零配置 |
|
||||
|
||||
### 一句话总结
|
||||
> Hermes 是一个以实用主义为导向、以可扩展性为骨架、以安全性为底线的工业级 AI Agent 框架。
|
||||
Reference in New Issue
Block a user