Slash 命令与 TUI —— 交互式会话管理、会话控制、配置命令、工具管理
简介
在前面的系列文章中,我们已经深入探讨了 Hermes Agent 的核心架构:从 Provider 配置、工具集(Toolsets)、技能系统(Skills),到 Gateway 多平台集成和各大消息平台的接入。这些文章构建了一个强大的 AI Agent 的基础能力。
但有一个问题始终没有系统讨论过:当你坐在终端前与 Hermes 对话时,如何高效地管理会话、控制行为、调整配置?
如果你只用纯文本自然语言与 Agent 交互,你很快会发现几个痛点:
- "清空对话"怎么表达? 说"让我们重新开始"有时候 Agent 理解了,有时候它以为你在做角色扮演。歧义是自然语言的固有缺陷。
- "帮我列出当前可用的工具" —— Agent 确实可以回答,但每次都要消耗 Token 让 LLM 生成回复。对于这种确定性的操作,用命令更高效。
- "切换到另一个配置"、"加载某个 Skill"、"查看会话历史" —— 这些是操作指令,不是对话内容。
这就是 Slash 命令(斜杠命令) 和 TUI(文本用户界面) 存在的意义。
Slash 命令 让你用简洁、确定性的语法控制 Agent 的行为,而不需要消耗 LLM 调用来处理简单的操作指令。TUI 则提供了一个可视化的终端界面,让你在复杂的多会话场景中游刃有余。
本文将带你全面掌握 Hermes Agent 的交互控制体系:
- Slash 命令体系:会话管理、会话控制、配置命令、工具管理
- TUI 界面:多会话浏览、实时流式输出、键盘快捷键
- 命令与对话的边界:什么时候用命令,什么时候用自然语言
- 自定义命令扩展:如何添加自己的 Slash 命令
掌握这一套交互体系,你的 Hermes Agent 使用效率至少提升 3 倍。
目录
Slash 命令体系概述
什么是 Slash 命令?
Slash 命令是以 / 开头的特殊输入,由 Hermes 的命令行解析器直接处理,不会发送给 LLM。这意味着:
- 零 Token 消耗:命令的执行不经过 LLM,不会产生 API 费用
- 即时响应:没有网络延迟,毫秒级执行
- 确定性结果:同样的命令永远产生同样的效果
- 安全隔离:命令在本地执行,不会泄露到外部 API
# 这不是 Slash 命令 —— 会发送给 LLM 处理
"请帮我清空对话历史"
# 这是 Slash 命令 —— 由本地解析器直接处理
/clear命令分类体系
Hermes 的 Slash 命令按功能分为四大类:
| 类别 | 前缀/模式 | 典型命令 | 用途 |
|---|---|---|---|
| 会话管理 | /session 相关 |
/ls、/new、/switch |
管理多个对话会话 |
| 会话控制 | / 直接命令 |
/clear、/undo、/compact |
控制当前会话状态 |
| 配置管理 | /config 相关 |
/config set、/config show |
运行时调整配置 |
| 工具管理 | /tools 相关 |
/tools list、/tools enable |
管理可用工具集 |
命令发现机制
# 查看所有可用命令
/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`
# 列出所有会话
/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`
# 创建新会话(自动生成名称)
/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`
# 通过 ID 切换
/switch 3
# → 已切换到会话 #3 (data-analysis)
# 通过名称切换
/switch code-review
# → 已切换到会话 #2 (code-review)
# 快速切换到上一个会话
/switch -
# → 已切换到上一个会话关闭会话 `/close`
# 关闭当前会话
/close
# → 会话已关闭(消息已保存)
# 关闭指定会话
/close 4
# → 会话 #4 (creative-writing) 已关闭
# 关闭所有不活跃的会话(保留当前)
/close --inactive
# → 已关闭 3 个不活跃会话重命名会话 `/rename`
/rename pr-optimization-review
# → 会话已重命名为 "pr-optimization-review"会话控制类命令
清空会话 `/clear`
当对话变得太长、偏离主题、或者你想在一个干净的上下文中开始新话题时:
/clear
# → 当前会话已清空
# 会话 #1 (default) - 消息数: 0
# 注意:清空后的消息无法恢复,但已保存到历史记录中与"创建新会话"的区别:/clear 保留当前会话 ID 和配置(模型、工具集等),只清除消息历史。适合"同一任务、重新开始"的场景。而 /new 是创建一个全新的会话。
撤回最后一条 `/undo`
/undo
# → 已撤回最后一条对话
# 已删除:
# User: "帮我写一个快速排序"
# Assistant: "好的,这是 Python 实现..."
#
# 当前消息数: 10 → 8支持连续撤回:
/undo 3
# → 已撤回最后 3 轮对话(6 条消息)压缩上下文 `/compact`
当会话消息数接近模型上下文窗口限制时,Hermes 会自动提醒。你也可以手动压缩:
/compact
# → 上下文压缩中...
#
# 压缩策略: 保留最近 10 条 + 摘要早期内容
# 原始消息数: 150
# 压缩后消息数: 12 (10 条完整 + 1 条摘要 + 1 条系统提示)
# Token 减少: 45,200 → 8,600 (减少 81%)
#
# 生成的会话摘要:
# "用户正在开发一个 Python Web 框架的 ORM 模块。
# 讨论了设计模式选择、数据库连接池优化、
# 以及迁移策略。已完成基础模型定义和 CRUD 接口。"压缩策略详解
# ~/.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`
/summarize
# → 正在生成会话摘要...
#
# ═══════════════════════════════════════
# 会话摘要: bugfix-auth-module
# ═══════════════════════════════════════
#
# 📋 主题: 认证模块 Bug 修复
# 📅 开始时间: 2025-05-22 14:30
# ⏱️ 持续时间: 45 分钟
# 💬 消息数: 28
#
# 📝 关键内容:
# 1. 发现 JWT token 过期后的刷新逻辑存在竞态条件
# 2. 使用 Redis 分布式锁解决并发刷新问题
# 3. 添加了 token 刷新的重试机制(指数退避)
# 4. 编写了 12 个单元测试覆盖边界场景
#
# ✅ 已完成:
# - refresh_token 竞态修复
# - 分布式锁实现
# - 单元测试
#
# ⏳ 待处理:
# - 集成测试
# - 性能基准测试导出会话 `/export`
# 导出为 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`
/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`
# 修改单个配置
/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`
# 快捷切换模型
/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`
# 重置所有配置到默认值
/config reset
# → 所有配置已重置为默认值
# 重置单个配置项
/config reset temperature
# → temperature 已重置为默认值 0.7工具管理类命令
列出工具 `/tools list`
/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`
# 禁用单个工具
/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`
/tools status
# → 工具状态概览:
#
# 已启用: 8 个
# 已禁用: 2 个
# 总计: 10 个
#
# 工具来源分布:
# builtin: 6 (5 启用, 1 禁用)
# skill: 4 (3 启用, 1 禁用)
#
# ⚠️ 注意: terminal 工具当前以限制模式运行
# 允许的命令: ls, cat, grep, python3, node
# 禁止的命令: rm -rf, chmod, sudo, curl | bashTUI 文本用户界面
启动 TUI
# 默认启动 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 界面分为三个区域:
┌─────────────────────────────────────┐
│ 顶部状态栏 (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 命令的最佳场景:
✅ 确定性操作:
/clear # 而不是"请清空对话"
/new # 而不是"让我们开个新对话"
/undo # 而不是"撤回刚才那条"
✅ 系统信息查询:
/tools list # 而不是"告诉我有哪些工具可用"
/config show # 而不是"我现在用的是什么配置"
/ls # 而不是"我有哪些会话"
✅ 配置调整:
/model claude # 而不是"换一个 Claude 模型"
/config set temperature 0.2 # 而不是"让回复更确定一些"什么时候用自然语言?
✅ 复杂任务描述:
"帮我重构 auth 模块,使用依赖注入模式"
✅ 创意生成:
"写一个关于 AI Agent 的科幻小说开头"
✅ 分析与推理:
"分析这个日志文件,找出性能瓶颈的原因"
✅ 代码生成与审查:
"这段代码有什么潜在的安全问题?"混合使用示例
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 命令:
# ~/.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>"使用自定义命令
/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 脚本编写更复杂的自定义命令:
# ~/.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}"""注册后即可使用:
/git-stats
# → Git 仓库统计:
# 提交数: 1234
# 仓库大小: 45M
#
# 贡献者:
# 456 Alice
# 321 Bob
# 189 Charlie总结与下篇预告
总结
本文全面介绍了 Hermes Agent 的 Slash 命令体系和 TUI 文本用户界面:
核心要点:
Slash 命令是确定性操作的最佳方式 —— 零 Token 消耗、即时响应、无歧义。将
/clear、/undo、/tools list等操作从自然语言中解放出来,既节省成本又提高效率。四大命令类别覆盖了所有交互控制需求:
- 会话管理(
/ls、/new、/switch)让你在多任务间自如切换 - 会话控制(
/clear、/undo、/compact)让你精确管理对话状态 - 配置管理(
/config set、/model)让你运行时调整 Agent 行为 - 工具管理(
/tools list、/tools enable)让你动态控制 Agent 能力
- 会话管理(
TUI 提供了高效的多会话工作流 —— 左侧面板管理会话,主区域进行对话,快捷键让一切操作无需鼠标。
自定义命令体系让 Hermes 可扩展 —— 从简单的模板命令到完整的 Python 插件,你可以根据需求扩展命令系统。
最佳实践建议:
- 把日常高频操作映射为 Slash 命令,减少 LLM 调用
- 用
/compact管理长会话的上下文大小,避免 Token 浪费 - 善用
/undo而不是重新开对话,保留有价值的上下文 - 为常用任务创建自定义命令(如
/review-pr、/deploy)
下篇预告
Cron 定时任务 —— 调度表达式、Job 配置、脚本模式、自动跑任务
在下一篇文章中,我们将进入 Hermes Agent 的自动化能力:
- Cron 调度表达式:从标准 Cron 语法到 Hermes 的扩展语法
- Job 配置详解:如何定义定时任务的触发条件、执行内容和输出处理
- 脚本模式:让 Agent 自动执行周期性任务(代码审查、日志分析、数据报告)
- 自动跑任务实战:每日构建检查、定期安全扫描、自动化报告生成
让 Agent 不只是被动响应,而是主动工作。定时任务让 Hermes 成为你 24/7 的自动化工友。
敬请期待!