Hermes Agent 原理与实战——第4章 CLI &TUI & Profile 与会话管理

理解 Hermes Agent 最高效的方式,是先看它的"系统总图",再逐个拆解。本章探究 Hermes 的整体架构、Agent Loop 内部机制、Prompt 组装、Provider 运行时解析以及会话存储等核心技术。通过本章,你将建立起对 Hermes 整体架构的"心理模型",理解它为何能在 CLI、Telegram、IDE、API Server 等十余种入口下保持行为一致,以及核心组件之间如何协同工作。

Hermes Agent 原理与实战——第4章 CLI &TUI & Profile 与会话管理

CLI(Command Line Interface,命令行界面)及其增强形态 TUI(Terminal User Interface,终端用户界面)是 Hermes Agent 操作最常用的入口。不同于网页 GUI 的沉重与纯命令行的简陋,Hermes 的 TUI 运行在终端内部,以字符绘制的面板、状态栏、滚动区和菜单构成了一套半可视化操作界面——比 CLI 直观,比 GUI 轻量,它支持多行编辑、斜杠命令自动补全、对话历史记录、中断并重定向,以及流式工具输出,专为长期在终端中工作的人设计。

本章系统讲解界面布局、键位、斜杠命令、会话与历史、checkpoint/rollback、跨设备 Handoff、Profile 切换、多行编辑、流式输出、打断与重定向等核心机制。掌握本章内容都将显著提升你与 Hermes Agent 的协作效率。

4.1 CLI 与 TUI

Hermes 提供两种交互界面:

  • 经典 CLIhermes chat):Hermes Agent 的 CLI 是一个完整的终端用户界面(TUI),而非 Web UI。它支持多行编辑、斜杠命令自动补全、对话历史、中断并重定向,以及流式工具输出。
  • TUIhermes --tui):TUI 是 Hermes 的现代前端——一个终端 UI(用户界面),与 经典 CLI共享同一 Python 运行时。相同的 agent、相同的会话、相同的斜杠命令;交互界面更简洁、响应更流畅。

两者共享相同的底层逻辑,所有斜杠命令和键位在两者中行为一致。

4.2 启动与界面布局

4.2.1 运行 CLI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 启动交互式 session(默认)
hermes

# 单一查询模式(非交互)
hermes chat -q "Hello"

# 具有特定的model
hermes chat --model "anthropic/claude-sonnet-4"

# 具有特定的provider
hermes chat --provider nous        # 使用诺斯门户
hermes chat --provider openrouter  # 力OpenRouter

# 具有特定的toolsets
hermes chat --toolsets "web,terminal,skills"

# 恢复之前的sessions
hermes --continue             # 恢复最近的 CLI session (-c)
hermes --resume <session_id>  # 通过 ID (-r) 恢复特定的 session

# 详细模式(调试输出)
hermes chat --verbose

1、CLI 界面布局

image-20260805233117891image-20260805233342163

Hermes CLI 横幅显示当前模型、工作目录、终端后端、可用工具以及已安装的技能。一个持久的状态栏位于输入区域上方,实时更新。

2、状态栏详解

状态栏位于输入区域上方,实时更新,其典型格式为:

1
⚕ deepseek-v4-pro │ 12.4K/200K │ [██████░░░░] 6% │ $0.06 │ 15m

各元素的含义如下:

元素 描述
模型名称 当前使用的模型(超过 26 个字符时自动截断)
Token 用量 已使用的上下文 Token 数 / 最大上下文窗口
上下文条 带颜色编码阈值的视觉填充指示器
🗜️ N 上下文压缩次数——当前运行会话被自动压缩的次数。首次压缩触发后显示。
▶ N 活跃后台任务数——当前会话中仍在运行的 /background prompt(提示词)数量。至少有一个任务进行中时显示。
成本估算 本会话的预估费用(未知或零定价模型显示为 n/a
持续时间 本会话已运行的时间

状态栏会根据终端宽度自适应显示:当终端宽度大于等于 76 列时显示完整布局;52 至 75 列时切换为紧凑布局;低于 52 列时仅显示模型名称和持续时间。上下文条的颜色编码遵循以下规则:

颜色 阈值 含义
绿色 < 50% 空间充足,可放心继续对话
黄色 50% – 80% 上下文逐渐填满,建议关注
橙色 80% – 95% 接近上限,建议考虑压缩或开新会话
红色 >= 95% 接近溢出,强烈建议使用 /compress/new

使用 /usage 斜杠命令可以查看更详细的费用分解,包括输入 Token 与输出 Token 的分别计费情况。

4.2.2 启动 TUI

TUI 是 Hermes 的现代前端——一个终端 UI(用户界面),与 Classic CLI 共享同一 Python 运行时。相同的 agent、相同的会话、相同的斜杠命令;交互界面更简洁、响应更流畅。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 启动 TUI
hermes --tui

# 恢复最近的 TUI 会话(若无则回退到最近的 classic 会话)
hermes --tui -c
hermes --tui --continue

# 通过 ID 或标题恢复指定会话
hermes --tui -r 20260409_000000_aa11bb
hermes --tui --resume "my t0p session"

# 直接运行源码——跳过预构建步骤(供 TUI 贡献者使用)
hermes --tui --dev

也可以通过环境变量启用:

1
2
3
export HERMES_TUI=1
hermes          # 现在使用 TUI
hermes chat     # 同上

1、Tui 界面布局

image-20260805232649810

Classic CLI 仍作为默认方式保留。CLI 界面中记录的所有内容——斜杠命令、快捷命令、skill 预加载、personality、多行输入、中断——在 TUI 中均完全一致。

2、为什么选择 TUI

  • 即时首帧 — banner 在应用加载完成前就已渲染,因此 Hermes 启动时终端不会出现卡顿感。
  • 非阻塞输入 — 会话就绪前即可输入并排队消息。agent 上线后立即发送第一条 prompt(提示词)。
  • 丰富的浮层面板 — 模型选择器、会话选择器、审批和澄清提示均以模态面板形式渲染,而非内联流程。
  • 实时会话面板 — 工具和 skill 在初始化过程中逐步填充。
  • 鼠标友好的选择 — 拖拽高亮时使用统一背景色,而非 SGR 反色。使用终端的常规复制手势即可复制。
  • 备用屏幕渲染 — 差量更新意味着流式传输时无闪烁,退出后无滚动历史残留。
  • 编辑器增强 — 长片段的内联折叠粘贴、Cmd+V / Ctrl+V 文本粘贴(带剪贴板图片回退)、括号粘贴安全保护,以及图片/文件路径附件规范化。

4.3 关键键位

按键 操作
Enter 发送消息
Alt+EnterCtrl+JShift+Enter 换行(多行输入)。Shift+Enter 需要终端能够将其与 Enter 区分——见下文。在 Windows Terminal 中,Alt+Enter 被终端捕获(切换全屏);请改用 Ctrl+EnterCtrl+J
Alt+V 在终端支持时从剪贴板粘贴图片
Ctrl+V 粘贴文本,并尝试附加剪贴板中的图片
Ctrl+B 启动/停止语音录入(需安装 voice extra)
Ctrl+G $EDITOR(vim/nvim/nano/VS Code 等)中打开当前输入缓冲区。保存并退出后,编辑后的文本将作为下一条 prompt 发送——适合编写长篇多段落 prompt。
Ctrl+X Ctrl+E 外部编辑器的 Emacs 风格备用绑定(与 Ctrl+G 行为相同)。
Ctrl+C 打断当前正在生成的回答;2 秒内连续按两次则强制退出
Ctrl+D 退出
Ctrl+Z 将 Hermes 挂起到后台(仅 Unix)。在 shell 中运行 fg 恢复。
Tab 接受自动建议或自动补全斜杠命令
↑/↓ 浏览上一条/下一条输入历史

Ctrl+C 是 Hermes 的灵魂键之一:你可以打断后立刻发新消息纠正方向,Agent 会优雅停止当前 turn、采纳你的新指示。

4.4 斜杠命令体系

输入 / 可查看自动补全下拉菜单。Hermes 支持大量内置 CLI 斜杠命令、动态技能命令以及用户自定义的快捷命令。

4.4.1 会话生命周期命令

命令 作用
/new 开始新会话。可选的 [name] 设置初始会话标题——例如 /new my-experiment 打开一个已命名为 my-experiment 的新会话,便于之后用 /resume/sessions 查找。
/reset 等价 /new,但更"狠"——同时清掉一些临时状态
/clear 清屏并开始新会话
/exit/quit 退出
/history 显示对话历史
/save [name] 把当前会话打个标签,便于以后查找
/sessions 列出近期会话
/title [name] 设置或显示会话标题。
/resume [name] 恢复之前命名的会话。
/retry 重试最后一次助手回复
/undo 撤销最后一轮(user → assistant 一组)
/stop 终止所有正在运行的后台进程
/queue <prompt>(别名:/q 将 prompt(提示词)加入队列等待下一轮处理(不会中断当前 agent 响应)。
/steer <prompt> 在下一次工具调用之后向 agent 注入一条中途说明——不中断、不产生新的用户轮次。当前工具完成后,该文本会追加到最后一条工具结果的内容中,在不打断当前工具调用循环的情况下为 agent 提供新上下文。可用于在任务进行中调整方向(例如在 agent 运行测试时说"专注于 auth 模块")。
/goal <text> 设置一个持续目标,Hermes 将跨轮次持续推进——这是对 Ralph loop 的实现。每轮结束后,辅助裁判模型会判断目标是否完成;若未完成,Hermes 自动继续。子命令:/goal status/goal pause/goal resume/goal clear。预算默认为 20 轮(goals.max_turns);
/subgoal <text> 在循环进行中向活动目标追加一个用户自定义条件。继续 prompt 会将所有子目标原文呈现给 agent,裁判也会将其纳入 DONE/CONTINUE 判断——因此只有原始目标所有子目标都满足时,目标才会被标记为完成。子命令:/subgoal(列出)、/subgoal remove <N>/subgoal clear。需要有活动的 /goal
/status 显示会话信息——模型、提供商、profile、会话 ID、工作目录、标题、创建/更新时间戳、token 总量、agent 运行状态。
/agents(别名:/tasks 显示当前会话中的活动 agent 和运行中的任务。
/background <prompt>(别名:/bg/btw 在独立的后台会话中运行 prompt。agent 独立处理你的 prompt——当前会话保持空闲可继续其他工作。任务完成后结果以面板形式显示。
/platforms 查看当前 Gateway 状态(哪些平台在线)
/handoff <platform> 仅限 CLI。 将当前会话移交给消息平台(Telegram、Discord、Slack、WhatsApp、Signal、Matrix)。需要 gateway 正在运行且目标平台已配置 home 频道(从目标聊天中执行 /sethome
/redraw 强制完整重绘 UI(在 tmux 调整大小、鼠标选择产生残影等导致终端错位后恢复)。

4.4.2 配置命令

命令 作用
/config 显示当前配置
/model 交互式切模型
/model <provider:model> 直接切指定模型
/personality 设置预定义的 personality(人格)
/personality <name> 直接切
/skin 显示或更改显示皮肤/主题
/verbose 循环切换工具进度显示:off → new → all → verbose。
/reasoning 管理推理力度和显示(用法:/reasoning [level|show|hide])
`/voice [on off
`/busy [queue steer

4.4.3 上下文/Token命令

命令 作用
/usage 看本会话 token 用量、费用估算(输入/输出)、上下文窗口状态、会话时长,
/insights [--days N] 显示用量洞察和分析(最近 30 天)
/compress 手动压缩当前会话上下文。

4.4.4 文件改动安全命令

命令 作用
/rollback 列出 checkpoint,回滚
/rollback <N> 回滚到指定序号的检查点

Hermes 会在每次工具改文件之前自动 checkpoint,因此 /rollback 永远是你的安全网。

4.4.5 工具与技能命令

命令 作用
/tools 当前启用了哪些工具
/toolsets 列出可用工具集
`/memory [pending approve
/curator 后台 skill 维护——statusrunpinarchive
/skills 从注册表和官方可选 skill 目录搜索、浏览、检查、安装 skill。
/<skill-name> [args] 触发某个技能
/skill view <name> 查看某技能源
/skill enable <name> 启用指定技能
/skill disable <name> 禁用指定技能
/reload-mcp(别名:/reload_mcp 从 config.yaml 重新加载 MCP 服务器
/reload-skills(别名:/reload_skills 重新扫描 ~/.hermes/skills/ 以发现新安装或已删除的 skill
/reload .env 变量重新加载到运行中的会话(无需重启即可获取新 API 密钥)
/plugins 列出已安装的插件及其状态

4.4.6 自动化命令

命令 作用
/cron Cron 子菜单
/cron list 列出所有定时任务
/cron add "0 9 * * *" "总结昨日日志" 新增定时任务
/cron pause <id> 暂停指定定时任务
/cron resume <id> 恢复指定定时任务
/cron remove <id> 删除指定定时任务
/kanban Kanban 子菜单
/todo 当前 Todo 列表

4.4.7 信息命令

命令 作用
/help 显示帮助信息
/version 显示 Hermes Agent 版本、构建及环境信息。
/paste 附加剪贴板图片
/image <path> 为下一条 prompt 附加本地图片文件。
/profile 显示活动 profile 名称和主目录
/debug 上传调试报告(系统信息 + 日志)并获取可分享链接。消息平台中也可用。

4.4.8 快捷命令

你可以定义自定义命令,这些命令无需调用 LLM 即可立即运行 shell 命令。在 CLI 和消息平台(Telegram、Discord 等)中均有效。在config.yaml中配置:

1
2
3
4
5
6
7
8
# ~/.hermes/config.yaml
quick_commands:
  status:
    type: exec
    command: systemctl status hermes-agent
  gpu:
    type: exec
    command: nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader

然后在任意聊天中输入 /status/gpu

4.5 Skill 斜杠命令

~/.hermes/skills/ 中每个已安装的 skill 都会自动注册为斜杠命令。skill 名称即为命令名:

1
2
3
4
5
6
/gif-search funny cats
/axolotl help me fine-tune Llama 3 on my dataset
/github-pr-workflow create a PR for the auth refactor

# 仅输入 skill 名称即可加载它,让 agent 询问你的需求:
/excalidraw

4.6 上下文引用 @

Hermes 支持在输入框中用 @ 引入外部内容,这是避免"模型看不到我提到的那个文件"这一常见尴尬的核心机制。@ 引用会被就地展开,将内容附在你当前消息之后一并交给模型处理。

1
2
3
4
帮我看看 @./src/main.py 里 Server 类的初始化逻辑
对比 @git:HEAD~1 与 @git:HEAD 的差异
分析 @https://example.com/post 这篇博客的论点
解读 @./docs/spec.pdf

支持类型:

类型 语法示例 说明
文件 @./path/file.py 引入单个文件的内容
文件范围 @file:path/to/file.py:10-25 注入指定行范围(从 1 开始,含首尾)
目录 @./src/ 递归引入目录下的所有文本文件
Git diff @git:<rev> 引入指定提交的改动
Git 范围 @git:<rev1>..<rev2> 引入两个提交之间的差异
URL @https://... 自动 fetch 网页内容并转为 Markdown
PDF @./report.pdf 提取 PDF 中的文本内容
Office 文件 @./slides.pptx 提取演示文稿中的文本
剪贴板图片 @clipboard 粘贴剪贴板中的图片(多模态)

@ 引用的本质是一种"上下文注入"机制。它避免了用户手动复制粘贴文件内容的繁琐操作。对于大型项目,建议优先引用具体文件而非整个目录,以节省上下文窗口空间。

4.7 多行输入

有两种方式输入多行消息:

  1. Alt+Enter、 或 Ctrl+J — 插入换行符。
  2. 反斜杠续行 — 以 \ 结尾表示继续下一行,下一行的内容会被合并到同一条消息中:
1
2
3
❯ Write a function that:\
  1. Takes a list of numbers\
  2. Returns the sum

Shift+Enter 兼容性

大多数终端默认对 EnterShift+Enter 发送相同的字节序列,因此应用程序无法区分它们。Hermes 仅在终端通过【Kitty 键盘协议】或 xterm 的 modifyOtherKeys 模式发送不同序列时才能识别 Shift+Enter

终端 状态
Kitty、foot、WezTerm、Ghostty 默认启用独立的 Shift+Enter
iTerm2(近期版本)、Alacritty、VS Code terminal、Warp 在设置中启用 Kitty 协议后支持
Windows Terminal Preview 1.25+ 在设置中启用 Kitty 协议后支持
macOS Terminal.app、Windows Terminal 稳定版 不支持——Shift+EnterEnter 无法区分

当终端无法区分时,Alt+EnterCtrl+J 在大多终端中均可正常使用。但在 Windows Terminal 中,Alt+Enter 被终端捕获(切换全屏),请改用 Ctrl+Enter(传递为 Ctrl+J)或 Ctrl+J 来换行。

4.8 流式输出与打断重定向

4.8.1 工具进度显示

CLI 在 Agent 工作时显示动态反馈,让用户随时了解当前状态:

思考动画(API 调用期间):

1
2
3
  ◜ (。•́︿•̀。) pondering... (1.2s)
  ◠ (⊙_⊙) contemplating... (2.4s)
  ✧٩(ˊᗜˋ*)و✧ got it! (3.1s)

工具执行信息流

1
2
3
  ┊ 💻 terminal `ls -la` (0.3s)
  ┊ 🔍 web_search "Rust async runtime comparison" (1.2s)
  ┊ 📄 web_extract "https://docs.rs/tokio" (2.1s)

使用 /verbose 可循环切换显示模式:off -> new -> all -> verbose

display.tool_preview_length 配置项控制工具调用预览的最大字符数(默认 0 表示无限制)。

1
2
3
# ~/.hermes/config.yaml
display:
  tool_preview_length: 80   # 将工具预览截断为 80 个字符(0 = 无限制)

这在终端较窄或工具参数包含很长文件路径时非常有用。

4.8.2 打断机制

你可以在任意时刻中断 agent:

  • 输入新消息 + Enter,在 agent 工作时——这会中断当前操作并处理你的新指令。
  • Ctrl+C——中断当前操作(2 秒内双击强制退出)
    • 正在进行的终端命令会立即被终止(SIGTERM,1 秒后 SIGKILL)。
    • 中断期间输入的多条消息会合并为一条 prompt。

4.8.3 繁忙输入模式

display.busy_input_mode 配置项精确控制 Agent 工作时按下 Enter 的行为:

模式 行为 适用场景
"interrupt"(默认) 你的消息中断当前操作并立即处理 需要快速纠正方向时
"queue" 你的消息被静默排队,在 Agent 完成后作为下一轮发送 准备后续问题但不想打断当前工作时
"steer" 你的消息通过 /steer 注入当前运行,在下一次工具调用后到达 Agent——不中断,不开启新轮次 在任务执行中途补充指令,如"顺便也检查一下测试"
  • "queue" 模式适合在您希望准备后续消息但又不希望意外取消正在进行的工作时非常有用。"steer" 模式适合在不中断的情况下中途重定向 agent——例如在它还在编辑代码时说"顺便也检查一下测试"。未知值会回退到 "interrupt"
  • "steer" 有两个自动回退:如果 agent 尚未启动,或附有图片,消息会回退到 "queue" 行为,确保内容不丢失。

配置方式:

1
2
3
# ~/.hermes/config.yaml
display:
  busy_input_mode: "steer"   # 或 "queue" 或 "interrupt"

也可以动态切换:

1
2
3
4
/busy queue
/busy steer
/busy interrupt
/busy status

首次在 Hermes 工作时按下 Enter,Hermes 会打印一行提示说明 /busy 选项,该提示只在每次安装后触发一次。

4.9 会话管理

4.9.1 Session 核心概念与存储

Session 是 Hermes 中对话管理的基本单位,支持恢复、搜索和完整的生命周期管理。每次对话——无论来自 CLI、Telegram、Discord、Slack 还是任何其他消息平台——都会以完整消息历史的形式存储。

Session 数据存储在 SQLite 数据库 ~/.hermes/state.db 中,该数据库包含:

  • Session ID、来源平台、用户 ID
  • Session 标题(唯一、人类可读的名称)
  • 模型名称和配置快照
  • 系统 prompt 快照
  • 完整消息历史(角色、内容、工具调用、工具结果)
  • Token 计数(输入/输出)
  • 时间戳(started_at、ended_at)
  • 父 session ID(用于压缩触发的 session 分割)

此外,SQLite 数据库使用 FTS5(Full-Text Search version 5)虚拟表对消息内容建立全文索引,使 /recallsession_search 工具能够毫秒级地搜索历史对话。

4.9.2 会话恢复

退出 CLI 会话时(使用/exit),Hermes 会打印恢复命令:

1
2
3
4
5
6
Resume this session with:
  hermes --resume 20260225_143052_a1b2c3

Session:        20260225_143052_a1b2c3
Duration:       12m 34s
Messages:       28 (5 user, 18 tool calls)

恢复选项非常丰富:

1
2
3
4
5
6
7
hermes --continue                          # 恢复最近的 CLI 会话
hermes -c                                  # 简写形式
hermes -c "my project"                     # 恢复命名会话(谱系中最新的)

hermes --resume 20260225_143052_a1b2c3     # 通过 ID 恢复指定会话
hermes --resume "refactoring auth"         # 通过标题恢复
hermes -r 20260225_143052_a1b2c3           # 简写形式

恢复会从 SQLite 中还原完整的对话历史。Agent 能看到所有之前的消息、工具调用和响应——就像你从未离开过一样。Session ID 格式为 YYYYMMDD_HHMMSS_<hex>

4.9.3 会话命名与谱系

为 session 设置人类可读的标题,能极大提升后续查找和恢复的效率。

自动生成标题:Hermes 在第一次交换后自动为每个 session 生成简短的描述性标题(3–7 个词)。这在后台线程中使用快速辅助模型运行,不增加对话延迟。如果你已手动设置标题,则自动命名会跳过。

手动设置标题

1
/title my research project

在聊天中使用 /title My Session Name 为当前会话命名,或从命令行使用 hermes sessions rename <id> <title>。使用 hermes sessions list 浏览历史会话。

标题规则:最多 100 个字符;不能与其他 session 重复;控制字符、零宽字符和 RTL 覆盖字符会被自动去除;支持 emoji、CJK 字符和带重音字符。

压缩时的自动谱系:当 session 的上下文被压缩(手动 /compress 或自动触发)时,Hermes 会创建一个新的续接 session。如果原 session 有标题,新 session 会自动获得带编号的标题:

1
"my project" -> "my project #2" -> "my project #3"

按名称恢复时(hermes -c "my project"),系统会自动选取谱系中最新的 session。

4.9.4 跨会话搜索

跨会话搜索的另一条路径是直接在对话中指挥 Agent:

1
搜索我以前关于 PostgreSQL 索引性能的讨论,整理成一份 cheatsheet

Agent 会调用 session_search 工具,命中结果后再调用 LLM 进行摘要整理。session_search 使用 SQLite 的 FTS5 引擎,支持三种调用形式:

  1. 发现模式(传入 query):运行 FTS5 全文搜索,按 session 谱系去重,返回前 N 个 session 及其匹配上下文。
  2. 滚动模式(传入 session_id + around_message_id):返回以锚点为中心的指定窗口消息,用于发现后浏览更多上下文。
  3. 浏览模式(无参数):按时间顺序返回最近的 session 列表。

FTS5 查询语法支持:简单关键词(默认 AND)、短语("exact phrase")、布尔运算(docker OR kubernetespython NOT java)、前缀匹配(deploy*)。

4.9.5 Session 管理命令行工具

Hermes 通过 hermes sessions 提供完整的 session 管理命令集:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 列出最近的 session(默认最近 20 个)
hermes sessions list
hermes sessions list --source telegram      # 按平台过滤
hermes sessions list --limit 50             # 显示更多

# 导出 session
hermes sessions export backup.jsonl         # 导出为 JSONL(默认)
hermes sessions export --format html --session-id <id> transcript.html
hermes sessions export --format md --older-than 90 --dry-run
hermes sessions export --format trace --upload   # 上传到 HF Agent Trace Viewer

# 重命名与删除
hermes sessions rename <id> "debugging auth flow"
hermes sessions delete <id>
hermes sessions delete <id> --yes           # 跳过确认

# 清理旧 session
hermes sessions prune                       # 删除 90 天前的已结束 session
hermes sessions prune --older-than 30 --yes

# 统计信息
hermes sessions stats

导出格式支持 jsonl(机器可读,适合备份)、md/qmd(人类可读归档)、html(独立页面,适合分享)、trace(Claude Code JSONL,适合 HF Agent Trace Viewer)。--redact 选项可在导出前清除 API key、token 和凭据,强烈建议用于任何打算分享的导出。

4.10 Compression:长会话压缩机制

会话越长,token 消耗越大,模型性能也可能随之下降。Hermes 采用了一套上下文压缩策略来管理长会话。

Hermes 的上下文压缩是自动化的:

  1. 启动时:按冻结快照注入 identity + memory + skills index。
  2. 持续监控:实时监控上下文使用比例。
  3. 预警阈值:默认在上下文限制的 50% 时开始预警(状态栏变黄)。
  4. 强制阈值:默认在 80% 时触发强制压缩,把"前面 N 条"压成简洁摘要。
  5. 摘要生成:使用 Auxiliary Model(一个相对便宜的模型,如 google/gemini-3-flash-preview)生成摘要,避免烧旗舰模型额度。
  6. 事实保留:关键工具结果(如 patch 应用记录)会被保留为压缩前的"事实条目",确保不丢失重要信息。

你可以手动 /compress 提前压;可以用 /usage 看是否快到阈值;

config.yaml 中调整阈值:

1
2
3
4
5
6
7
8
9
# 在 ~/.hermes/config.yaml 中
compression:
  enabled: true
  threshold: 0.50    # 默认在上下文限制的 50% 时压缩

# 摘要模型在 auxiliary 下配置:
auxiliary:
  compression:
    model: "google/gemini-3-flash-preview"  # 指定摘要模型,留空则使用主模型

压缩触发时,中间轮次会被摘要,同时始终保留前 3 轮和后 20 轮——确保对话的开场目标和近期细节不丢失。被压缩的 session 会自动创建谱系续接(如 “my project #2”),支持按名称无缝恢复。

4.11 后台会话

在独立的后台会话中运行 prompt,同时继续使用 CLI 进行其他工作:

1
/background Analyze the logs in /var/log and summarize any errors from today

Hermes 立即确认任务并将提示符还给你:

1
2
🔄 Background task #1 started: "Analyze the logs in /var/log and summarize..."
   Task ID: bg_143022_a1b2c3

(1) 工作原理

每个 /background prompt 会在守护线程中生成一个完全独立的 agent 会话

  • 隔离对话:后台 agent 不了解当前会话的历史,只接收你提供的 prompt。
  • 相同配置:后台 agent 继承当前会话的模型、提供商、工具集、推理设置和回退模型。
  • 非阻塞:前台会话保持完全交互,你可以聊天、运行命令,甚至启动更多后台任务。
  • 多任务:可同时运行多个后台任务,每个任务都有编号 ID。

(2) 结果通知

后台任务完成时,结果会以面板形式出现在终端中:

1
2
3
4
5
6
╭─ ⚕ Hermes (background #1) ──────────────────────────────────╮
│ Found 3 errors in syslog from today:                         │
│ 1. OOM killer invoked at 03:22 — killed process nginx        │
│ 2. Disk I/O error on /dev/sda1 at 07:15                      │
│ 3. Failed SSH login attempts from 192.168.1.50 at 14:30      │
╰──────────────────────────────────────────────────────────────╯

如果任务失败,你会看到错误通知。如果配置中启用了 display.bell_on_complete,任务完成时终端会响铃。

重要:后台会话不会出现在主对话历史中。它们是独立会话,拥有各自的任务 ID(如 bg_143022_a1b2c3)。

(3) 典型使用场景

  • 长时间研究"/background research the latest developments in quantum error correction",同时继续编写代码。
  • 文件处理"/background analyze all Python files in this repo and list any security issues",同时继续对话。
  • 并行调查:同时启动多个后台任务,从不同角度探索问题。

4.12 Checkpoints 与 Rollback

Hermes Agent 可以在破坏性操作之前自动为你的项目创建快照,并通过单条命令恢复。

(1) 启用检查点

在会话中通过参数启用:

1
hermes chat --checkpoints

或在 ~/.hermes/config.yaml 中全局启用:

1
2
checkpoints:
  enabled: true

(2) 触发条件

每当在破坏性操作之前自动创建,如:

  • 文件工具write_filepatch
  • 破坏性终端命令rmrmdircpmvsed -itruncateddshred、输出重定向(>),以及 git reset/clean/checkout

Hermes 会自动:

  1. 计算受影响目录;
  2. git-like 算法生成快照存到 ~/.hermes/checkpoints/
  3. 标记 checkpoint id,附在工具结果上。

(3) 核心命令

之后你可以:

1
2
/rollback              # 回到最近一次自动 checkpoint
/rollback <name>       # 回到指定 checkpoint

也可以在普通对话中说:“撤销刚才那次改动”,Hermes 会自己理解并回滚。

管理Checkpoints:

1
2
3
hermes checkpoints            # 查看状态概览
hermes checkpoints prune      # 清理过期检查点
hermes checkpoints clear      # 清空全部检查点

4.13 Profile:CLI 中的多身份切换

(1) 什么是 Profile

Profile 是 Hermes 中实现"一台机器上运行多个独立 Agent"的核心机制。每个 profile 拥有各自独立的配置、API 密钥、记忆、会话、技能和 gateway 状态。

Profile 本质上是一个独立的 Hermes 主目录。每个 profile 拥有自己的:

  • config.yaml —— 模型、提供商、工具集及所有设置。
  • .env —— API 密钥、bot token。
  • SOUL.md —— 人格与指令。
  • 记忆(MEMORY.md、USER.md)。
  • 会话历史与 state.db。
  • 技能集合。
  • cron 任务和 gateway 状态。

每个 profile 有独立的 ~/.hermes/profiles/<name>/,相当于一份完整 ~/.hermes/。同一时间一个 profile 只允许一个 CLI/Gateway 进程占用(通过 token lock 实现,避免数据库被并发改坏)。

(2) 创建 Profile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 创建空白 profile
hermes profile create mybot

# 克隆当前 profile 的配置(不含历史数据)
hermes profile create work --clone

# 克隆所有内容(含技能、记忆、cron,但不含会话历史)
hermes profile create backup --clone-all

# 从指定 profile 克隆
hermes profile create work --clone-from coder
hermes profile create work-backup --clone-from coder --clone-all

# 为 Kanban 工作节点创建 profile(添加描述便于编排器路由)
hermes profile create researcher --description "Reads source code and external docs, writes findings."

创建 profile 后,它会自动成为独立的命令。例如创建名为 coder 的 profile,你立即就拥有了 coder chatcoder setupcoder gateway start 等命令。

(3) 使用 Profile

命令别名:每个 profile 在 ~/.local/bin/<name> 自动获得一个命令别名,支持所有 hermes 子命令:

1
2
3
4
5
6
coder chat                    # 与 coder agent 对话
coder setup                  # 配置 coder 的设置
coder gateway start          # 启动 coder 的 gateway
coder doctor                # 检查 coder 的健康状态
coder skills list            # 列出 coder 的技能
coder config set model.default anthropic/claude-sonnet-4

你也可以通过-p参数显式指定 profile:

1
2
3
hermes -p coder chat
hermes --profile=coder doctor
hermes chat -p coder -q "hello"

切换默认值

1
2
3
hermes profile use coder      # 将 coder 设为默认 profile
hermes chat                   # 现在指向 coder
hermes profile use default    # 切换回默认

(4) 工作原理

profile 使用 HERMES_HOME 环境变量。运行 coder chat 时,包装脚本在启动 hermes 前将 HERMES_HOME 设置为 ~/.hermes/profiles/coder。由于代码库中 119+ 个文件通过 get_hermes_home() 解析路径,Hermes 状态会自动限定在 profile 目录范围内——包括配置、会话、记忆、技能、状态数据库、gateway PID、日志和 cron 任务。

这与终端工作目录是分开的。工具执行从 terminal.cwd 开始(或在 local 后端使用 cwd: "." 时从启动目录开始),而非自动从 HERMES_HOME 开始。

默认 profile 就是 ~/.hermes 本身。无需迁移——现有安装的工作方式完全不变。

(5) Profile 的运行时识别

CLI 始终通过多种方式显示当前活跃的 profile:

  • 提示符:显示 coder ❯ 而非默认的
  • 启动横幅:启动时显示 Profile: coder
  • hermes profile:显示当前 profile 名称、路径、模型、gateway 状态。

(6) Profile 与 Gateway

每个 profile 以独立进程运行各自的 gateway,使用各自的 bot token:

1
2
coder gateway start           # 启动 coder 的 gateway
assistant gateway start       # 启动 assistant 的 gateway(独立进程)

安全性方面,如果两个 profile 意外使用了相同的 bot token,第二个 gateway 将被阻止并显示明确的错误信息,指出冲突的 profile。这一"token 锁"机制支持 Telegram、Discord、Slack、WhatsApp 和 Signal。

持久化服务同样按 profile 隔离:

1
2
coder gateway install         # 创建 hermes-gateway-coder systemd/launchd 服务
assistant gateway install     # 创建 hermes-gateway-assistant 服务

(7) Profile 的管理

1
2
3
4
5
6
7
8
hermes profile list           # 显示所有 profile 及其状态
hermes --profile work         # 这次会话用 work profile
hermes profile show coder     # 显示某个 profile 的详细信息
hermes profile rename coder dev-bot   # 重命名(同步更新别名和服务)
hermes profile export coder   # 导出为 coder.tar.gz
hermes profile import coder.tar.gz    # 从归档文件导入
hermes profile delete coder   # 删除 profile(需输入名称确认)
hermes profile delete coder --yes     # 跳过确认

注意:你无法删除默认 profile(~/.hermes)。如需删除所有内容,请使用 hermes uninstall

(8) Profile 与工作区、沙箱的区别

Profile 常与"工作区"或"沙箱"混淆,但它们是完全不同的概念:

概念 作用范围 说明
Profile Hermes 状态目录 提供独立的 config、.env、SOUL.md、会话、记忆、日志、cron 和 gateway 状态
工作区/工作目录 终端命令执行位置 terminal.cwd 单独控制,是 shell 命令的起始目录
沙箱 文件系统访问限制 用于隔离文件系统访问,profile 提供沙箱隔离

在默认的 local 终端后端下,agent 仍拥有与你的用户账户相同的文件系统访问权限。如果你希望 profile 默认在特定项目文件夹中启动,请在该 profile 的 config.yaml 中设置绝对路径的 terminal.cwd

1
2
3
terminal:
  backend: local
  cwd: /absolute/path/to/project

4.13 Personality 与 SOUL.md

设置预设个性以改变 Agent 的语气:

1
2
3
/personality pirate
/personality kawaii
/personality concise

内置个性包括:helpfulconcisetechnicalcreativeteacherkawaiicatgirlpirateshakespearesurfernoiruwuphilosopherhype

你也可以在 ~/.hermes/config.yaml 中定义自定义个性:

1
2
3
4
5
personalities:
  helpful: "You are a helpful, friendly AI assistant."
  kawaii: "You are a kawaii assistant! Use cute expressions..."
  pirate: "Arrr! Ye be talkin' to Captain Hermes..."
  # 添加您自己的!

Personality 与 SOUL.md 对比:

  • SOUL.md 是 Hermes 的"主身份",第一槽位写入系统提示。只从 $HERMES_HOME/SOUL.md 加载,不会从当前工作目录读取——这保证了"换项目不换人格"。
  • /personality <preset> 是对 SOUL 的叠加层(session-level overlay),适合临时切换风格:“严肃技术顾问”、“幽默助理”、“冷酷代码评审"等。

修改自己的 SOUL:

1
nano ~/.hermes/SOUL.md

或在 TUI 里 /soul,会调系统编辑器。修改完保存即可,下次会话生效。

要让 Hermes 有完全不同的人设(比如把它包装成"客户支持助理 Lily”),重写 SOUL.md 是最干净的做法。

4.14 Skin / Theme 定制

hermes_cli/skin_engine.py 让你能换:banner 颜色、spinner 表情和动词、回答框标签、品牌字、工具活动前缀。

1
2
3
hermes skin list
hermes skin use cyberpunk
hermes skin reset

或在 config.yaml 中:

1
2
display:
  skin: cyberpunk

4.15 跨设备 Handoff

在 CLI session 中使用 /handoff <platform> 可以将实时对话转移到消息平台的主频道。Agent 会从 CLI 停止的地方精确接续——相同的 session ID、完整对话记录、工具调用历史一并保留。

Handoff 执行流程

1
2
# 在 CLI session 内
/handoff telegram

执行过程如下:

  1. 验证:CLI 验证目标平台已启用且已设置主频道(在目标聊天中运行一次 /sethome 即可配置)。未配置主频道时 CLI 会拒绝并提示 /sethome

  2. 阻塞轮询:CLI 将 session 标记为待处理并阻塞轮询 gateway。如果 agent 正在处理当前轮次,操作会被拒绝——请等待当前响应完成后再执行 handoff。

  3. Gateway 接管:Gateway 监视器认领切换请求,并向目标适配器请求新线程:

    • Telegram:开启新的论坛话题(如果在聊天中启用了Topics 模式则为私信话题,或论坛超级群组话题)。
    • Discord:在主文字频道下创建自动归档的线程。
    • Slack:发布一条种子消息并使用其 ts 作为线程锚点。
    • WhatsApp / Signal / Matrix / SMS:无原生线程,回退到直接使用主频道。
  4. 状态同步:Gateway 将目标键重新绑定到你现有的 CLI session ID,然后伪造一个合成用户轮次,让 agent 确认已在新位置工作。

  5. CLI 退出:Gateway 确认成功后,CLI 打印 /resume 提示并干净退出:

    1
    2
    
    ↻ Handoff complete. The session is now active on telegram.
      Resume it on this CLI later with: /resume my-session-title
    
  6. 平台继续:从此时起,对话在目标平台上继续。在新线程中回复即可——该频道中任何已授权用户共享同一 session。

恢复到 CLI:

当你想回到桌面终端时,只需运行 /resume <title>(或在 shell 中运行 hermes -r "<title>"),即可从平台停止的地方继续对话。这种跨设备无缝切换的能力,使得 Hermes 成为真正"随处可用"的 Agent 伴侣。

4.16 资深用法

1、一次性 Prompt 模式(Headless)

1
hermes chat -q "总结一下 ~/code/myapp 这个项目的目录结构" --toolsets file,terminal

适合配合 shell 脚本,把 Hermes 当成强力 CLI 工具使用。stdin 会被自动当作附件注入:

1
cat error.log | hermes chat --toolsets file -q "诊断这段日志的根因"

2、Headless API 模式

hermes api start --host 0.0.0.0 --port 8000 可启动一个 OpenAI-Compatible 端点,把 Hermes 当成"自托管 ChatGPT"暴露给 Open WebUI、LobeChat 或 LibreChat:

1
2
3
curl http://localhost:8000/v1/chat/completions \
  -H 'Authorization: Bearer any-token' \
  -d '{"model":"hermes","messages":[{"role":"user","content":"hello"}]}'

4.17 一份"高效用 CLI"的清单

最后给你一份"打字习惯"清单,照着练一周,你就能成为 Hermes 的熟练用户:

  1. 默认开 TUI:永远把"想要 Agent 干什么"自然表达出来,不要纠结"如何写 prompt"。
  2. 不顺心就 Ctrl+C + 立即纠正方向:不需要等它说完,也不需要开新会话。打断后立即发新指令是最快的迭代方式。
  3. 改文件之后 ,不放心 /rollback:养成在关键改动后确认变更的习惯。检查点永远是你的安全网。
  4. 会话长了 /usage 看一眼,必要时 /compress:关注状态栏的颜色变化,在上下文变橙/红之前主动管理。
  5. 想让它沉淀经验,直接说"把这一招记下来":Hermes 会自动写入 MEMORY.md,并在适当时机将其转化为技能。
  6. 切换关注的项目时 cd 进项目根,@./ 引用自动让它读懂:利用 @ 引用机制快速给 Agent 提供项目上下文。
  7. 每天结束让它写一段"今日复盘":主动回写 MEMORY.md,构建个人知识库。
  8. 定期 /skills 浏览 Hub:下载、裁剪与你工作流相关的技能,持续扩展 Agent 的能力边界。
  9. 利用 /background 做并行任务:不要让 Agent 的长时间研究阻塞你的主线工作。
  10. 善用 /handoff 实现跨设备无缝切换:在电脑前开始,在手机上继续,再回到电脑前收尾。