系统架构
Hermes Agent 采用模块化设计,由 11 个主要子系统协同工作,核心代码超过 20,000 行。
架构概览
AIAgent 核心
主引擎(~10,700 行),处理消息路由、工具调用、上下文管理、会话状态
HermesCLI
终端界面(~10,000 行),TUI 渲染、命令解析、快捷键、会话管理
Prompt Builder
动态提示词构建,组装系统提示、工具定义、上下文、技能指令
Context Compressor
有损摘要压缩,可配置阈值,保护关键对话轮次
Messaging Gateway
统一消息网关,管理 17+ 平台的消息收发
Security Layer
纵深防御:DM 配对、容器隔离、SSRF 防护、Tirith 扫描
Tool System
47 种工具的注册、调度、执行和结果处理
Skill Engine
技能加载、注册、触发、执行和生命周期管理
MCP Integration
Model Context Protocol 客户端和服务器实现
Voice Pipeline
STT/TTS 管道,多提供商支持,自动降级
Scheduler
Cron 定时任务调度,技能附加,暂停/恢复管理
核心组件
run_agent.py — AIAgent 核心
系统的主要入口点和核心逻辑,约 10,700 行代码:
- 消息路由:接收用户输入,分发到对应的处理管道
- LLM 调用:管理 API 调用、流式响应、重试逻辑
- 工具执行:解析工具调用请求,执行并返回结果
- 上下文管理:维护对话历史,触发压缩
- 会话状态:管理会话的创建、恢复和持久化
- 记忆集成:读取/写入记忆文件和外部提供商
- 技能调度:匹配和执行相关技能
HermesCLI — 终端界面
全功能 TUI 实现,约 10,000 行代码:
- 输入处理:多行编辑、快捷键、历史记录
- 输出渲染:Markdown 渲染、代码高亮、进度条
- 状态栏:实时显示模型、Token、上下文、费用信息
- 命令系统:斜杠命令解析和执行
- 会话 UI:会话列表、恢复、搜索
Prompt Builder
动态构建发送给 LLM 的完整提示词:
- 组装系统提示(SOUL.md + 基础指令)
- 添加可用工具定义
- 注入上下文文件
- 附加活跃技能指令
- 格式化对话历史
目录结构
text
hermes-agent/
├── run_agent.py # AIAgent 核心引擎
├── hermes_cli.py # CLI 界面
├── prompt_builder.py # 提示词构建器
├── context_compressor.py # 上下文压缩器
├── tools/ # 工具实现
│ ├── browser.py
│ ├── terminal.py
│ ├── file_ops.py
│ ├── search.py
│ └── ...
├── platforms/ # 消息平台适配器
│ ├── telegram.py
│ ├── discord.py
│ ├── slack.py
│ └── ...
├── skills/ # 技能引擎
├── memory/ # 记忆系统
├── mcp/ # MCP 集成
├── security/ # 安全模块
├── voice/ # 语音管道
│ ├── stt/
│ └── tts/
├── gateway/ # 消息网关
├── config/ # 配置管理
└── tests/ # 测试
数据流
text
用户输入
│
▼
[消息平台 / CLI]
│
▼
[AIAgent 核心] ─────→ [Prompt Builder] ─────→ [LLM API]
│ │ │
│ │ ▼
│ │ [LLM 响应]
│ │ │
│ ▼ ▼
│ [工具调用解析] ←───────────────┘
│ │
│ ▼
│ [工具执行引擎]
│ / | \
│ ▼ ▼ ▼
│ [终端] [文件] [搜索] ...
│ │
│ ▼
│ [结果返回 AIAgent]
│ │
▼ ▼
[上下文管理] ←── [会话状态更新]
│
▼
[响应输出到用户]
上下文压缩机制
当对话历史超过配置阈值时,自动触发压缩:
- 压缩方式:使用辅助 LLM 对中间对话轮次进行有损摘要
- 触发阈值:默认上下文占用的 50%
- 保护区域:前 3 轮和后 4 轮对话不被压缩,保留最近和最早的上下文
- 手动控制:可通过
/compact命令手动触发
后台会话
后台会话在独立的守护线程中运行:
- 隔离性:每个后台会话拥有独立的代理实例
- 配置共享:使用与主会话相同的配置、工具和技能
- 非阻塞:不阻塞主对话,支持并行处理
- 结果推送:完成后自动将结果推送到发起会话