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

delegate_task 为什么会偏向 Claude?从工具 schema priming 看 Hermes 子代理路由误导delegate_task 为什么会偏向 Claude?从工具 schema priming 看 Hermes 子代理路由误导

Hermes Agent 在未安装 Claude Code / Claude Desktop 的环境里,为什么偶发尝试走 Claude ACP?本文客观复盘 #22013:delegate_task 的 acp_command / acp_args 工具 schema 如何通过 claude、Claude Code、--acp --stdio 示例影响模型决策,以及为什么禁用 skill 不等于移除 core tool schema priming。

Discord 明明发了代码,Hermes 却像没看见:message.txt 附件被静默吞掉的原因Discord 明明发了代码,Hermes 却像没看见:message.txt 附件被静默吞掉的原因

Discord 会把长代码自动转成 message.txt 附件,Hermes 旧版在读取这类文本附件时可能因 Brotli br 解码失败而静默忽略内容。本文复盘 #12511:为什么 PDF 和图片能过,txt/py/html 却进不了 Agent 上下文。

Hermes 多模态排错:image_url 发给非视觉模型为什么会 400?Hermes 多模态排错:image_url 发给非视觉模型为什么会 400?

Hermes 接入 OpenAI-compatible API 时,图片消息会变成 image_url content part。如果当前模型不是 vision model,就可能返回 HTTP 400。本文基于 Hermes PR #23750 讲清 non-vision model、多模态和 DeepAI 接入排错。