DeepAI Paper Hermes Agent 教程,Hermes 终端、Docker 与安装 Hermes Agent 启动报 Invalid key: c-S-c?prompt_toolkit 快捷键崩溃排错指南

Hermes Agent 启动报 Invalid key: c-S-c?prompt_toolkit 快捷键崩溃排错指南

如果你安装或升级 Hermes Agent 之后,运行:

hermes

或:

hermes chat

刚看到 banner,CLI 就直接退出,并打印:

Error: Invalid key: c-S-c

那这大概率不是 API Key、模型、网络或配置文件的问题,而是 Hermes CLI 注册了一个 prompt_toolkit 不支持的快捷键字符串:c-S-c

这篇文章基于 NousResearch/hermes-agent issue #19903,整理一个典型的 CLI 启动崩溃 / prompt_toolkit keybinding 排错案例。

适合搜索关键词:Hermes Agent Invalid key c-S-cprompt_toolkit Invalid key c-S-cHermes CLI crash on startuphermes chat 启动崩溃Ctrl Shift C prompt_toolkit invalid key


先给结论:这是快捷键绑定问题,不是模型调用问题

issue #19903 里的核心报错是:

Error: Invalid key: c-S-c

问题位置指向 Hermes CLI 中类似这样的绑定:

@kb.add('c-S-c')  # Ctrl+Shift+C

它本意是处理 Ctrl+Shift+C:在很多 Linux 终端里,Ctrl+Shift+C 是复制快捷键,开发者希望不要把它当成 Ctrl+C 中断。

prompt_toolkit 并不接受 c-S-c 这种带 Shift 的 keybinding 字符串。结果就是:TUI 初始化 key bindings 时直接抛错,Hermes 还没进入聊天界面就崩溃。


典型现象

你可能遇到这些表现:

  • hermes 启动后立即崩溃;
  • hermes chat 同样崩溃;
  • banner 或工具面板刚渲染出来就退出;
  • 终端显示 Invalid key: c-S-c
  • 非交互模式反而可能正常,例如 hermes -z "Reply exactly: Hermes works." 能跑通。

这个细节很关键:如果非交互模式可用,说明模型、API、网络、配置大概率没问题,问题集中在交互式 TUI 的 keybinding 初始化。


影响平台:不只 macOS,也可能影响 Linux / SSH / ARM

issue 和评论里提到的环境包括:

  • macOS Terminal.app;
  • Apple Silicon / Mac Mini M4;
  • Arch Linux;
  • fish shell;
  • Wayland;
  • Kitty / Alacritty;
  • Raspberry Pi 4B ARM64;
  • 从 macOS Terminal 通过 SSH 连接远程机器。

所以不要把它误判为“某个终端模拟器坏了”。根因在 keybinding 字符串本身,而不是你按了某个快捷键。

只要 Hermes 版本里还注册了 @kb.add('c-S-c'),启动时就可能直接失败。


为什么 Ctrl+Shift+C 会导致启动崩溃?

prompt_toolkit 对 keybinding 名称有自己的格式要求。常见可用写法类似:

c-c
c-d
escape
enter

c-S-c 这种“Ctrl + Shift + C”的表示并不是它支持的 key 名称。

因此,问题不是用户真的按了 Ctrl+Shift+C,而是程序启动时注册这个快捷键就失败了。

这也是为什么 Hermes 可能在你什么都没输入时就崩溃。


立即判断是不是这个问题

可以做三个检查。

1. 看报错文本

如果有:

Invalid key: c-S-c

基本就命中了。

2. 测试非交互模式

运行:

hermes -z "Reply exactly: Hermes works."

如果它能返回:

Hermes works.

hermes / hermes chat 崩溃,那说明 TUI 层更可疑。

3. 搜索源码

如果你是源码安装或本地有 Hermes 目录,可以搜索:

rg -n "c-S-c|prompt_toolkit|@kb.add" ~/.hermes/hermes-agent

如果看到类似:

cli.py:10487: @kb.add('c-S-c')

就和 issue #19903 的根因一致。


临时 workaround:删除或注释这个 no-op 绑定

issue 里给出的临时修复很简单:删除或注释掉这段绑定。

类似:

-        @kb.add('c-S-c')  # Ctrl+Shift+C
-        def handle_ctrl_shift_c(event):
-            return
+        # Disabled: prompt_toolkit does not support c-S-c key name

为什么可以删?因为这个 handler 本身是 no-op,只是想让终端原生处理复制操作。删除这个绑定通常不会影响 Hermes 的核心功能。

不过注意:如果你不是源码安装,不建议随便改系统文件。优先升级到包含修复的版本。


推荐修复:升级到已移除无效绑定的版本

#19903 已 closed/completed,评论中提到当前 main 中相关 invalid binding 已被移除,只保留解释性注释;相关讨论指向 #19919

因此最稳的处理方式是:

1. 升级 Hermes Agent; 2. 确认当前安装版本不再包含 @kb.add('c-S-c'); 3. 再启动 hermeshermes chat

如果升级后仍报同样错误,说明你可能还在运行旧安装路径里的 CLI 文件。可以检查:

which hermes

以及实际源码路径里是否仍有 c-S-c


不要误判成这些问题

这个错误很容易被误判。

误判方向为什么不是
API Key 错了报错发生在 TUI 初始化阶段,还没调用模型
模型不可用非交互模式可能能正常返回
终端编码问题报错是 keybinding 名称无效,不是 UnicodeEncodeError
Ctrl+C 被按坏了用户没按键也会触发,因为启动时注册失败
网络问题本地 CLI 初始化就崩溃

所以看到 Invalid key: c-S-c 时,先查 CLI keybinding,而不是去改模型配置。


和 DeepAI API 中转站有什么关系?

这个问题本身和 DeepAI API 中转站没有直接关系。

DeepAI API 中转站适合解决的是 OpenAI-compatible 模型接入问题,例如:

  • 统一 Base URL;
  • 统一 API Key;
  • 管理多模型;
  • 在 Cherry Studio、Cline、Dify、Open WebUI 等工具里接入兼容 API。

Invalid key: c-S-c 是 Hermes CLI 本地 TUI 启动阶段的 prompt_toolkit keybinding 问题。它发生在模型请求之前,因此换 API 网关、换 Key、换模型都不会修复。

正确做法是升级 Hermes 或移除无效 keybinding。


FAQ

为什么我没按 Ctrl+Shift+C,也会报错?

因为程序启动时注册 c-S-c keybinding 就失败了,不需要用户真的按下这个快捷键。

非交互模式能用,说明什么?

说明模型调用链可能正常,问题更可能在交互式 TUI / prompt_toolkit 层。

注释掉 @kb.add('c-S-c') 会影响复制吗?

通常不会。Ctrl+Shift+C 复制本来就是终端模拟器处理的行为,Hermes 里的这个 handler 是 no-op。

macOS 上也会受影响吗?

会。issue 中 macOS Terminal.app、Linux、SSH、Raspberry Pi 等环境都有类似复现。

这个问题已经修复了吗?

#19903 已 closed/completed,评论提到当前 main 已移除 invalid binding。建议升级并确认本地实际运行的 Hermes 路径不再包含 c-S-c


总结

Hermes Agent 启动报:

Error: Invalid key: c-S-c

不是 API、模型或网络问题,而是 CLI 交互界面注册了 prompt_toolkit 不支持的 Ctrl+Shift+C keybinding。

排查顺序很简单:

1. 确认报错是否包含 Invalid key: c-S-c; 2. 测试 hermes -z 非交互模式; 3. 搜索源码里是否有 @kb.add('c-S-c'); 4. 升级 Hermes,或临时注释掉这个 no-op 绑定。

一句话总结:如果 Hermes 还没进聊天界面就崩溃,先别改 API Key,先查 prompt_toolkit 快捷键绑定。

Related Post

DeepSeek Anthropic-compatible API 第二轮 HTTP 400:为什么 thinking blocks 不能被一刀切剥掉?DeepSeek Anthropic-compatible API 第二轮 HTTP 400:为什么 thinking blocks 不能被一刀切剥掉?

Hermes 使用 DeepSeek Anthropic-compatible Messages API 且启用 reasoning_effort 时,多轮会话第二轮可能报 HTTP 400:content[].thinking must be passed back。本文客观复盘 #22313:convert_messages_to_anthropic 如何剥掉 thinking blocks,为什么 DeepSeek/Kimi 需要保留 unsigned thinking,以及 provider-aware adapter 的修复方向。

Hermes Auxiliary 任务排错:主聊天正常,为什么标题生成、压缩和后台 review 会失败?Hermes Auxiliary 任务排错:主聊天正常,为什么标题生成、压缩和后台 review 会失败?

Hermes 主聊天正常,不代表 title generation、context compression、session search、background review 都正常。本文基于 GitHub Issues 解析 auxiliary client 502、aux provider routing、compression context length 和后台 review 输出泄漏。

Hermes 安装卡在 [sudo] password:非 sudo 用户遇到 Playwright –with-deps 的半安装问题Hermes 安装卡在 [sudo] password:非 sudo 用户遇到 Playwright –with-deps 的半安装问题

在 Debian 上用非 sudo 服务用户安装 Hermes 时,安装器可能卡在 Playwright Chromium 的 `npx playwright install --with-deps chromium` sudo 密码提示,且发生在 setup_path 之前,导致没有 hermes 命令和 hermes doctor。本文客观复盘 #25816 的触发条件、安装顺序和降级处理。