终端里终于能直接看图了:Hermes CLI 与 TUI 内联图片上线

你在终端里让 Hermes 看了看刚截的页面,它回你一句“右边那个按钮被裁掉了一截”。你想指回去确认位置,抬头一看——屏幕上没有图,只有一行路径:/tmp/screenshot-2026-11-05.png。于是你切到文件管理器、双击、等预览器打开、再切回终端,来回两趟,注意力已经散了。
这个断掉的动作链现在修好了。11 月 4 日合并的改动让 Hermes 在经典 CLI 和 TUI 里直接把图画出来:你附上的图片画在你那条消息下面,工具产出的图片画在工具那一行下面。
以前只有路径,现在图就在对话里
具体分两类:
- 你自己附的图:通过
/paste、/image或者把文件拖进终端附加的图片,画在你那条消息下面。 - 工具产出的本地图片:
vision_analyze看过的图、image_generate生成的图、浏览器或 computer-use 的截图,画在对应工具那一行下面。
有两件事不会画出来,知道了能省得你怀疑功能坏了:read_file 读不了图片,所以它不会画任何图;远程图片 URL 也不会被下载来画,只有本地文件才会被渲染。
一个开关,五种取值
配置在 config.yaml 的 display 段里,默认是 auto:
display:
inline_images: auto # auto | kitty | iterm | unicode | off
五个档位的意思:
auto:在 kitty 和 Ghostty 里画全分辨率图(走 kitty 图形协议,用 Unicode 占位符占位),经典 CLI 和 TUI 都支持;在 iTerm2、WezTerm、Konsole 里,经典 CLI 会用 iTerm2 的内联图片协议画全分辨率图。其余终端——包括 tmux、GNU screen、SSH 进 VS Code、以及 kitty/Ghostty 之外的 TUI——用真彩半块(half-block,用两个半高字符拼出一个彩色像素格)显示。kitty:强制走 kitty 协议。典型场景是经典 CLI 跑在 tmux 里,同时给 tmux 开了set -g allow-passthrough on。iterm:经典 CLI 里强制走 iTerm2 协议;TUI 这一档会退回auto。unicode:永远用半块。off:只显示路径,和以前完全一样。
对照表更直观:
| 终端 | auto 下的效果 |
|---|---|
| kitty / Ghostty | 全分辨率(CLI 与 TUI) |
| iTerm2 / WezTerm / Konsole | 全分辨率(仅经典 CLI) |
| VS Code 终端(已开启图片支持) | 全分辨率(仅经典 CLI) |
| tmux / GNU screen / SSH 进 VS Code | 真彩半块 |
| 其他终端,含 sixel 终端 | 真彩半块 |
VS Code 那个开关,Hermes 会自己问一次
VS Code 的终端其实能显示真图,但前提是设置里打开了 terminal.integrated.enableImages。以前 Hermes 没法知道这件事,只能保守地画色块。
现在经典 CLI 启动时会问 VS Code 一次:发一个被 DA1 收尾的 XTSMGRAPHICS 查询,时机在 prompt_toolkit 接管 tty 之前。只有 VS Code 的图片插件会回这个查询,所以“有回音”就等于“图片支持开着”。答案会被缓存,一次启动只问一次。走 Remote-SSH、在 Windows 上、或者没有 tty 时,这个探测直接跳过。
如果探测结果是关着,Hermes 会在大约每五次启动里挑一次,把随机小提示替换成一行“去设置里打开 terminal.integrated.enableImages“的提示——不会每次都念。
为什么很多终端只能给色块
原因不神秘:一行一行往下排的终端渲染器,只能可靠测量两种图片形态。一种是 kitty 的 Unicode 占位符(图片按格子占位,行数可以被数清楚);另一种是真彩半块(每两个字符拼一个像素块,天然按行算)。iTerm2 的协议是“在预留的若干行上作画”,但那些行没人算得准,所以它只出现在经典 CLI 里,不进 TUI。
这也解释了为什么 tmux 和 GNU screen 默认落到半块:它们会吃掉或改写透传的图形转义序列,除非你显式开透传并强制 kitty 档。
改窗口大小之后会怎样
CLI 在终端尺寸变化时会重画整个 transcript。kitty 图和半块图会跟着重画回来;iTerm2 协议那类图片在重画后的屏幕里会留下空白行,只在上面已经滚出去的历史里保持可见。这不是 bug,是协议差异——知道这一点,就不会以为图挂了。
哪些图会被画、哪些不会
工具结果里挑哪一张图画,只看具名字段:image_url、url、path、image_path、screenshot_path,并且先看结果、再看参数。所以 search_files 列出的一堆 PNG 路径不会让终端开始刷图。
另外,过大的 PNG 预览在解码开始之前就会被拒绝——这条是刻意加的边界,避免一张巨图把终端拖死。
画图是本地渲染:图片本来就要随附件或工具结果发给模型,这一层只是在你的屏幕上多画几十行像素,不会额外增加模型侧的 token 消耗。
现在能用吗
这批改动 11 月 4 日合并进 main,晚于 v0.22.7(11 月 3 日)的发布点,所以还没进正式版本:写这篇时它只在 main 上。想马上试,从源码跑 hermes 即可;等正式版本出来再升级也行。
顺带一提,如果你关心图片进上下文之后如何分配预算,站内的图像上下文预算那篇和图片视觉路由指南讲的是另一半问题:图怎么被理解、花多少 token。这次解决的是“你看得见它”。如果你用的是命令面板一类的操作习惯,命令面板指南也值得一读;还没装 Hermes 的话,从安装页开始。