在前面的系列文章中,我们已经深入探讨了 Hermes Agent 的核心架构:从 Provider 配置、工具集(Toolsets)、技能系统(Skills),到 Gateway 多平台集成和各大消息平台的接入。这些文章构建了一个强大的 AI Agent 的基础能力。

Slash 命令与 TUI —— 交互式会话管理、会话控制、配置命令、工具管理

简介

在前面的系列文章中,我们已经深入探讨了 Hermes Agent 的核心架构:从 Provider 配置、工具集(Toolsets)、技能系统(Skills),到 Gateway 多平台集成和各大消息平台的接入。这些文章构建了一个强大的 AI Agent 的基础能力。

但有一个问题始终没有系统讨论过:当你坐在终端前与 Hermes 对话时,如何高效地管理会话、控制行为、调整配置?

如果你只用纯文本自然语言与 Agent 交互,你很快会发现几个痛点:

  1. "清空对话"怎么表达? 说"让我们重新开始"有时候 Agent 理解了,有时候它以为你在做角色扮演。歧义是自然语言的固有缺陷。
  2. "帮我列出当前可用的工具" —— Agent 确实可以回答,但每次都要消耗 Token 让 LLM 生成回复。对于这种确定性的操作,用命令更高效。
  3. "切换到另一个配置"、"加载某个 Skill"、"查看会话历史" —— 这些是操作指令,不是对话内容。

这就是 Slash 命令(斜杠命令)TUI(文本用户界面) 存在的意义。

Slash 命令 让你用简洁、确定性的语法控制 Agent 的行为,而不需要消耗 LLM 调用来处理简单的操作指令。TUI 则提供了一个可视化的终端界面,让你在复杂的多会话场景中游刃有余。

本文将带你全面掌握 Hermes Agent 的交互控制体系:

  • Slash 命令体系:会话管理、会话控制、配置命令、工具管理
  • TUI 界面:多会话浏览、实时流式输出、键盘快捷键
  • 命令与对话的边界:什么时候用命令,什么时候用自然语言
  • 自定义命令扩展:如何添加自己的 Slash 命令

掌握这一套交互体系,你的 Hermes Agent 使用效率至少提升 3 倍。

目录

Slash 命令体系概述

什么是 Slash 命令?

Slash 命令是以 / 开头的特殊输入,由 Hermes 的命令行解析器直接处理,不会发送给 LLM。这意味着:

  • 零 Token 消耗:命令的执行不经过 LLM,不会产生 API 费用
  • 即时响应:没有网络延迟,毫秒级执行
  • 确定性结果:同样的命令永远产生同样的效果
  • 安全隔离:命令在本地执行,不会泄露到外部 API
text
# 这不是 Slash 命令 —— 会发送给 LLM 处理
"请帮我清空对话历史"

# 这是 Slash 命令 —— 由本地解析器直接处理
/clear

命令分类体系

Hermes 的 Slash 命令按功能分为四大类:

类别 前缀/模式 典型命令 用途
会话管理 /session 相关 /ls/new/switch 管理多个对话会话
会话控制 / 直接命令 /clear/undo/compact 控制当前会话状态
配置管理 /config 相关 /config set/config show 运行时调整配置
工具管理 /tools 相关 /tools list/tools enable 管理可用工具集

命令发现机制

bash
# 查看所有可用命令
/help

# 输出示例:
# ════════════════════════════════════════════
#  Hermes Agent - 可用命令
# ════════════════════════════════════════════
#
#  会话管理:
#    /ls              列出所有会话
#    /new [name]      创建新会话
#    /switch <id>     切换到指定会话
#    /close [id]      关闭会话
#    /rename <name>   重命名当前会话
#
#  会话控制:
#    /clear           清空当前会话消息
#    /undo            撤回最后一条对话
#    /compact         压缩会话上下文
#    /summarize       生成当前会话摘要
#    /export [format] 导出会话记录
#
#  配置管理:
#    /config show     显示当前配置
#    /config set      修改配置项
#    /config reset    重置为默认配置
#    /model <name>    切换模型
#
#  工具管理:
#    /tools list      列出所有工具
#    /tools enable    启用工具
#    /tools disable   禁用工具
#    /tools status    工具状态概览
#
#  其他:
#    /help [cmd]      显示帮助
#    /quit            退出

会话管理类命令

列出所有会话 `/ls`

bash
# 列出所有会话
/ls

# 输出:
# ┌────┬────────────────────┬──────────┬──────┬───────────────────┐
# │ ID │ 名称               │ 消息数   │ 模型 │ 最后活跃         │
# ├────┼────────────────────┼──────────┼──────┼───────────────────┤
# │  1 │ default            │    128   │ gpt-4│ 2 分钟前          │
# │  2 │ code-review        │     56   │ gpt-4│ 1 小时前          │
# │  3 │ data-analysis      │     89   │ claude│ 3 小时前          │
# │  4 │ creative-writing   │     34   │ gpt-4│ 昨天              │
# │  5 │ system-design      │    201   │ gpt-4│ 2 天前            │
# └────┴────────────────────┴──────────┴──────┴───────────────────┘
#
# * 表示当前活跃会话

创建新会话 `/new`

bash
# 创建新会话(自动生成名称)
/new
# → 新会话已创建: #6 (session-2025-05-22-001)

# 创建带名称的新会话
/new bugfix-auth-module
# → 新会话已创建: #7 (bugfix-auth-module)

# 创建新会话并指定模型
/new --model claude-sonnet-4 data-analysis
# → 新会话已创建: #8 (data-analysis), 模型: claude-sonnet-4

切换会话 `/switch`

bash
# 通过 ID 切换
/switch 3
# → 已切换到会话 #3 (data-analysis)

# 通过名称切换
/switch code-review
# → 已切换到会话 #2 (code-review)

# 快速切换到上一个会话
/switch -
# → 已切换到上一个会话

关闭会话 `/close`

bash
# 关闭当前会话
/close
# → 会话已关闭(消息已保存)

# 关闭指定会话
/close 4
# → 会话 #4 (creative-writing) 已关闭

# 关闭所有不活跃的会话(保留当前)
/close --inactive
# → 已关闭 3 个不活跃会话

重命名会话 `/rename`

bash
/rename pr-optimization-review
# → 会话已重命名为 "pr-optimization-review"

会话控制类命令

清空会话 `/clear`

当对话变得太长、偏离主题、或者你想在一个干净的上下文中开始新话题时:

bash
/clear
# → 当前会话已清空
#   会话 #1 (default) - 消息数: 0
#   注意:清空后的消息无法恢复,但已保存到历史记录中

与"创建新会话"的区别/clear 保留当前会话 ID 和配置(模型、工具集等),只清除消息历史。适合"同一任务、重新开始"的场景。而 /new 是创建一个全新的会话。

撤回最后一条 `/undo`

bash
/undo
# → 已撤回最后一条对话
#   已删除:
#     User: "帮我写一个快速排序"
#     Assistant: "好的,这是 Python 实现..."
#
#   当前消息数: 10 → 8

支持连续撤回:

bash
/undo 3
# → 已撤回最后 3 轮对话(6 条消息)

压缩上下文 `/compact`

当会话消息数接近模型上下文窗口限制时,Hermes 会自动提醒。你也可以手动压缩:

bash
/compact
# → 上下文压缩中...
#
#   压缩策略: 保留最近 10 条 + 摘要早期内容
#   原始消息数: 150
#   压缩后消息数: 12 (10 条完整 + 1 条摘要 + 1 条系统提示)
#   Token 减少: 45,200 → 8,600 (减少 81%)
#
#   生成的会话摘要:
#   "用户正在开发一个 Python Web 框架的 ORM 模块。
#    讨论了设计模式选择、数据库连接池优化、
#    以及迁移策略。已完成基础模型定义和 CRUD 接口。"

压缩策略详解

yaml
# ~/.config/hermes/compact.yaml
compact:
  # 触发条件
  trigger:
    message_count: 100      # 消息数超过阈值
    token_ratio: 0.8        # Token 使用超过上下文 80%

  # 压缩策略
  strategy: "summary"       # summary | truncate | hybrid

  # summary 模式配置
  summary:
    keep_recent: 10         # 保留最近 N 条消息
    summarizer: "auto"      # auto | same-model | cheap-model
    # auto 策略:优先使用 cheap-model,失败时回退 same-model

  # truncate 模式配置
  truncate:
    keep_recent: 20         # 只保留最近 N 条消息
    keep_system: true       # 始终保留 system prompt

  # hybrid 模式配置
  hybrid:
    keep_recent: 10
    summarizer: "cheap-model"
    fallback: "truncate"    # 摘要失败时的回退策略

生成会话摘要 `/summarize`

bash
/summarize
# → 正在生成会话摘要...
#
# ═══════════════════════════════════════
#  会话摘要: bugfix-auth-module
# ═══════════════════════════════════════
#
#  📋 主题: 认证模块 Bug 修复
#  📅 开始时间: 2025-05-22 14:30
#  ⏱️ 持续时间: 45 分钟
#  💬 消息数: 28
#
#  📝 关键内容:
#  1. 发现 JWT token 过期后的刷新逻辑存在竞态条件
#  2. 使用 Redis 分布式锁解决并发刷新问题
#  3. 添加了 token 刷新的重试机制(指数退避)
#  4. 编写了 12 个单元测试覆盖边界场景
#
#  ✅ 已完成:
#  - refresh_token 竞态修复
#  - 分布式锁实现
#  - 单元测试
#
#  ⏳ 待处理:
#  - 集成测试
#  - 性能基准测试

导出会话 `/export`

bash
# 导出为 Markdown
/export markdown
# → 已导出到: ./exports/session-default-2025-05-22.md

# 导出为 JSON
/export json
# → 已导出到: ./exports/session-default-2025-05-22.json

# 导出为纯文本
/export text
# → 已导出到: ./exports/session-default-2025-05-22.txt

# 导出并复制剪贴板
/export clipboard
# → 已复制到剪贴板

配置管理类命令

查看当前配置 `/config show`

bash
/config show
# → 当前配置:
#
#  ┌──────────────────────┬──────────────────────────────┐
#  │ 配置项               │ 值                           │
#  ├──────────────────────┼──────────────────────────────┤
#  │ provider             │ openai                       │
#  │ model                │ gpt-4o                       │
#  │ temperature          │ 0.7                          │
#  │ max_tokens           │ 4096                         │
#  │ system_prompt        │ default                      │
#  │ toolset              │ full                         │
#  │ memory               │ enabled                      │
#  │ memory_backend       │ sqlite                       │
#  │ auto_compact         │ true                         │
#  │ stream_output        │ true                         │
#  └──────────────────────┴──────────────────────────────┘

修改配置 `/config set`

bash
# 修改单个配置
/config set temperature 0.3
# → temperature: 0.7 → 0.3

# 修改模型
/config set model claude-sonnet-4
# → model: gpt-4o → claude-sonnet-4
#   注意:新模型将在下一条消息生效

# 修改系统提示
/config set system_prompt "你是一个资深的 Python 架构师,擅长设计模式和代码审查。"
# → system_prompt 已更新

# 批量修改
/config set temperature 0.2 max_tokens 8192 stream_output false
# → 已更新 3 个配置项

切换模型 `/model`

bash
# 快捷切换模型
/model gpt-4o
# → 模型已切换为 gpt-4o

/model claude-sonnet-4
# → 模型已切换为 claude-sonnet-4

# 查看可用模型
/model list
# → 可用模型:
#    openai/gpt-4o
#    openai/gpt-4o-mini
#    anthropic/claude-sonnet-4
#    anthropic/claude-haiku
#    google/gemini-2.5-pro

重置配置 `/config reset`

bash
# 重置所有配置到默认值
/config reset
# → 所有配置已重置为默认值

# 重置单个配置项
/config reset temperature
# → temperature 已重置为默认值 0.7

工具管理类命令

列出工具 `/tools list`

bash
/tools list
# → 可用工具:
#
#  ┌────┬──────────────────┬──────────┬──────────┬────────────────────┐
#  │ #  │ 工具名称         │ 状态     │ 来源     │ 描述               │
#  ├────┼──────────────────┼──────────┼──────────┼────────────────────┤
#  │  1 │ read_file        │ ✅ 启用  │ builtin  │ 读取文件内容       │
#  │  2 │ write_file       │ ✅ 启用  │ builtin  │ 写入文件           │
#  │  3 │ patch            │ ✅ 启用  │ builtin  │ 文件查找替换编辑   │
#  │  4 │ terminal         │ ✅ 启用  │ builtin  │ 执行 shell 命令    │
#  │  5 │ search_files     │ ✅ 启用  │ builtin  │ 文件内容搜索       │
#  │  6 │ web_search       │ ⏸️ 禁用 │ builtin  │ 网络搜索           │
#  │  7 │ skill_invoke     │ ✅ 启用  │ skill    │ 调用已加载的技能   │
#  │  8 │ memory_read      │ ✅ 启用  │ skill    │ 读取持久记忆       │
#  │  9 │ memory_write     │ ✅ 启用  │ skill    │ 写入持久记忆       │
#  │ 10 │ cron_create      │ ⏸️ 禁用 │ skill    │ 创建定时任务       │
#  └────┴──────────────────┴──────────┴──────────┴────────────────────┘

启用/禁用工具 `/tools enable` `/tools disable`

bash
# 禁用单个工具
/tools disable web_search
# → web_search 已禁用

# 禁用多个工具
/tools disable web_search cron_create
# → 已禁用 2 个工具

# 启用工具
/tools enable web_search
# → web_search 已启用

# 按来源批量操作
/tools disable skill:memory_write
# → 已禁用 memory_write (来源: skill)

工具状态概览 `/tools status`

bash
/tools status
# → 工具状态概览:
#
#  已启用: 8 个
#  已禁用: 2 个
#  总计:   10 个
#
#  工具来源分布:
#    builtin:  6 (5 启用, 1 禁用)
#    skill:    4 (3 启用, 1 禁用)
#
#  ⚠️ 注意: terminal 工具当前以限制模式运行
#     允许的命令: ls, cat, grep, python3, node
#     禁止的命令: rm -rf, chmod, sudo, curl | bash

TUI 文本用户界面

启动 TUI

bash
# 默认启动 TUI 模式
hermes chat

# 输出:
# ╔══════════════════════════════════════════════════════════╗
# ║  Hermes Agent v0.12.0                          TUI Mode  ║
# ╠══════════════════════════════════════════════════════════╣
# ║                                                          ║
# ║  📂 会话列表 (←/→ 切换)                                  ║
# ║  ┌──────────────────────────────────────────────────┐   ║
# ║  │ > #1 default [gpt-4o]        ● 128 msg  2 min   │   ║
# ║  │   #2 code-review [gpt-4]       56 msg  1 hr      │   ║
# ║  │   #3 data-analysis [claude]    89 msg  3 hr      │   ║
# ║  └──────────────────────────────────────────────────┘   ║
# ║                                                          ║
# ║  💬 对话区 (↑/↓ 滚动)                                    ║
# ║  ┌──────────────────────────────────────────────────┐   ║
# ║  │                                                  │   ║
# ║  │  User: 帮我审查这个 PR 的安全性                    │   ║
# ║  │  Agent: 我来帮你审查。让我先查看最近的变更...       │   ║
# ║  │         [调用 terminal: git diff HEAD~1]           │   ║
# ║  │  Agent: 发现了 2 个潜在问题:                       │   ║
# ║  │         1. SQL 注入风险 (第 42 行)                 │   ║
# ║  │         2. 缺少输入验证 (第 67 行)                 │   ║
# ║  │  ▌                                               │   ║
# ║  └──────────────────────────────────────────────────┘   ║
# ║                                                          ║
# ║  ⌨️ 输入: /help 查看命令  |  Ctrl+C 中断  |  Ctrl+Q 退出 ║
# ╚══════════════════════════════════════════════════════════╝

TUI 布局说明

TUI 界面分为三个区域:

text
┌─────────────────────────────────────┐
│          顶部状态栏 (1 行)            │
│  版本号 | 当前模型 | 会话名称 | 状态  │
├─────────────────────────────────────┤
│                                     │
│    左侧面板 (可选,可折叠)           │
│    ┌─────────────────────────────┐  │
│    │ 📂 会话列表                 │  │
│    │ > #1 default ●              │  │
│    │   #2 code-review            │  │
│    │   #3 data-analysis          │  │
│    │                             │  │
│    │ 🔧 工具状态                 │  │
│    │ ✅ 8 enabled               │  │
│    │ ⏸️ 2 disabled              │  │
│    └─────────────────────────────┘  │
│                                     │
├─────────────────────────────────────┤
│                                     │
│         主对话区 (自动扩展)          │
│                                     │
│  User: 帮我看看这个代码              │
│  Agent: 好的,让我先读取文件...      │
│  [调用 read_file: main.py]           │
│  Agent: 代码整体结构不错...          │
│                                     │
│  ▌ (光标 - 当前输入位置)             │
│                                     │
├─────────────────────────────────────┤
│         底部状态栏 (2 行)            │
│  Token 使用 | 消息数 | 快捷键提示    │
│  Ctrl+C: 中断  Ctrl+L: 清屏         │
└─────────────────────────────────────┘

TUI 快捷键与操作

全局快捷键

快捷键 功能 说明
Ctrl+C 中断当前响应 停止 Agent 正在生成的回复
Ctrl+D 发送 EOF 退出交互模式(同 /quit
Ctrl+L 清屏 清除屏幕输出
Ctrl+Q 退出 TUI 保存会话后退出

导航快捷键

快捷键 功能 说明
Tab 命令补全 自动补全 Slash 命令
/ 历史浏览 浏览输入历史
/ 光标移动 在输入行内移动光标
Ctrl+A 行首 移动光标到行首
Ctrl+E 行尾 移动光标到行尾
Ctrl+W 删除单词 删除光标前的单词
Ctrl+U 删除整行 清空当前输入行

多面板操作

快捷键 功能 说明
Ctrl+P 切换面板 在会话列表和对话区之间切换
Ctrl+B 折叠/展开侧栏 切换左侧面板可见性
Ctrl+N 新建会话 创建新的对话会话
Ctrl+S 切换会话 打开会话选择器
Enter 确认选择 在会话列表中确认选择
/ 快速搜索 打开命令/会话搜索

命令与对话的智能边界

什么时候用 Slash 命令?

使用 Slash 命令的最佳场景:

text
✅ 确定性操作:
   /clear          # 而不是"请清空对话"
   /new            # 而不是"让我们开个新对话"
   /undo           # 而不是"撤回刚才那条"

✅ 系统信息查询:
   /tools list     # 而不是"告诉我有哪些工具可用"
   /config show    # 而不是"我现在用的是什么配置"
   /ls             # 而不是"我有哪些会话"

✅ 配置调整:
   /model claude   # 而不是"换一个 Claude 模型"
   /config set temperature 0.2  # 而不是"让回复更确定一些"

什么时候用自然语言?

text
✅ 复杂任务描述:
   "帮我重构 auth 模块,使用依赖注入模式"

✅ 创意生成:
   "写一个关于 AI Agent 的科幻小说开头"

✅ 分析与推理:
   "分析这个日志文件,找出性能瓶颈的原因"

✅ 代码生成与审查:
   "这段代码有什么潜在的安全问题?"

混合使用示例

text
User: /new api-refactoring
User: 帮我重构 API 路由层,现在太臃肿了
Agent: 让我先看看当前的路由结构...
       [调用 search_files: "routes/*.py"]
Agent: 当前有 12 个路由文件,总行数 3400+...
       建议按领域拆分。你想先从哪个模块开始?
User: 从用户模块开始吧
Agent: 好的,让我读取用户相关的路由...
       [调用 read_file: routes/users.py]
       ...
User: /undo          # 撤回 Agent 的错误建议
User: 不对,我想保留原来的用户路由,只重构权限部分
Agent: 明白了,让我重新审视权限相关的路由...
       ...
User: /compact       # 压缩上下文,节省 Token
User: 继续,接下来重构订单模块

自定义 Slash 命令

创建自定义命令

Hermes 支持通过配置文件添加自定义 Slash 命令:

yaml
# ~/.config/hermes/custom-commands.yaml
custom_commands:
  # 简单命令:映射到固定回复
  - name: "/now"
    description: "显示当前时间"
    action: "reply"
    template: "当前时间: {{now('%Y-%m-%d %H:%M:%S')}}"

  - name: "/weather"
    description: "查询天气"
    action: "reply"
    template: "当前城市: {{env.CITY}}\n天气: {{exec('curl wttr.in/{{env.CITY}}?format=3')}}"

  # 脚本命令:执行外部脚本
  - name: "/deploy"
    description: "执行部署脚本"
    action: "script"
    script: "~/.hermes/scripts/deploy.sh"
    args:
      - "--env"
      - "production"
    confirm: true  # 执行前需要确认

  # 复合命令:执行多个操作
  - name: "/review-pr"
    description: "审查最近的 PR"
    action: "composite"
    steps:
      - command: "terminal"
        args: "git fetch origin"
      - command: "terminal"
        args: "git diff origin/main...HEAD"
      - command: "send_to_llm"
        prompt: "请审查以上代码变更,关注安全性和性能问题"

  # 模板命令:带参数的命令
  - name: "/find"
    description: "搜索文件"
    action: "script"
    script: "~/.hermes/scripts/find-file.sh"
    args: ["{{arg0}}"]
    usage: "/find <pattern>"

使用自定义命令

bash
/now
# → 当前时间: 2025-05-22 18:30:45

/weather
# → 当前城市: Beijing
#   天气: +15°C  晴

/deploy
# → ⚠️ 确认执行部署脚本? [y/N]
# → y
# → 部署中...
# → ✅ 部署完成

/review-pr
# → [执行 git fetch origin] ✓
# → [执行 git diff origin/main...HEAD] ✓
# → [发送差异给 LLM 审查]
# → Agent: 审查结果...

/find "*.py"
# → 找到 42 个 Python 文件

命令插件体系

Hermes 还支持通过 Python 脚本编写更复杂的自定义命令:

python
# ~/.hermes/plugins/git_stats.py
from hermes.commands import BaseCommand, register

@register
class GitStatsCommand(BaseCommand):
    """Git 仓库统计信息"""
    name = "/git-stats"
    description = "显示 Git 仓库统计信息"

    def execute(self, args):
        import subprocess

        # 获取提交数
        commits = subprocess.check_output(
            ["git", "rev-list", "--count", "HEAD"]
        ).decode().strip()

        # 获取贡献者
        contributors = subprocess.check_output(
            ["git", "shortlog", "-sn", "--all"]
        ).decode()

        # 获取文件大小
        size = subprocess.check_output(
            ["du", "-sh", "."]
        ).decode().strip()

        return f"""Git 仓库统计:
  提交数: {commits}
  仓库大小: {size}

  贡献者:
{contributors}"""

注册后即可使用:

bash
/git-stats
# → Git 仓库统计:
#     提交数: 1234
#     仓库大小: 45M
#
#     贡献者:
#       456    Alice
#       321    Bob
#       189    Charlie

总结与下篇预告

总结

本文全面介绍了 Hermes Agent 的 Slash 命令体系和 TUI 文本用户界面:

核心要点:

  1. Slash 命令是确定性操作的最佳方式 —— 零 Token 消耗、即时响应、无歧义。将 /clear/undo/tools list 等操作从自然语言中解放出来,既节省成本又提高效率。

  2. 四大命令类别覆盖了所有交互控制需求

    • 会话管理(/ls/new/switch)让你在多任务间自如切换
    • 会话控制(/clear/undo/compact)让你精确管理对话状态
    • 配置管理(/config set/model)让你运行时调整 Agent 行为
    • 工具管理(/tools list/tools enable)让你动态控制 Agent 能力
  3. TUI 提供了高效的多会话工作流 —— 左侧面板管理会话,主区域进行对话,快捷键让一切操作无需鼠标。

  4. 自定义命令体系让 Hermes 可扩展 —— 从简单的模板命令到完整的 Python 插件,你可以根据需求扩展命令系统。

最佳实践建议:

  • 把日常高频操作映射为 Slash 命令,减少 LLM 调用
  • /compact 管理长会话的上下文大小,避免 Token 浪费
  • 善用 /undo 而不是重新开对话,保留有价值的上下文
  • 为常用任务创建自定义命令(如 /review-pr/deploy

下篇预告

Cron 定时任务 —— 调度表达式、Job 配置、脚本模式、自动跑任务

在下一篇文章中,我们将进入 Hermes Agent 的自动化能力:

  • Cron 调度表达式:从标准 Cron 语法到 Hermes 的扩展语法
  • Job 配置详解:如何定义定时任务的触发条件、执行内容和输出处理
  • 脚本模式:让 Agent 自动执行周期性任务(代码审查、日志分析、数据报告)
  • 自动跑任务实战:每日构建检查、定期安全扫描、自动化报告生成

让 Agent 不只是被动响应,而是主动工作。定时任务让 Hermes 成为你 24/7 的自动化工友。

敬请期待!