dsh-read-animation:让智能体真正「看见」动图

前言

在 DeepSeek Harness(DSH)里给模型看图,常见路径是 read_image 或各类多模态插件。资料里写得很直白:Harness 会把存入的每张图规范成单帧 8-bit sRGB 光栅再交给模型,动图也不例外。对一个 8 帧 GIF 实测时,read_image 往往只得到 pages=1 的第一帧,其余帧在规范化阶段就被丢掉;上层 vision 插件再宣称支持 GIF,也补不回已经丢失的时间轴。

dsh-read-animation(维护者 NeoHotaru,社区分类为模型推理)针对的就是这条链路:在字节仍完整、或仍可从磁盘读取的前提下解码动画,UI 继续播放你粘贴的原始 GIF/WebP,模型则收到带索引与时间标注的采样帧序列(或拼成一张标注网格图),而不是默片第一帧。

这是什么

一句话:DeepSeek Harness 插件——粘贴的动图 GIF 或 WebP 在界面里照常播放,模型侧得到按时间均匀采样、带标签的帧序列说明。

  • 名称:dsh-read-animation(npm / 插件包名)
  • 维护者:NeoHotaru
  • 许可证:MIT(见仓库 package.json)
  • 目录页:https://www.skillhub.cn/plugins/NeoHotaru/dsh-read-animation
  • 源码:https://github.com/NeoHotaru/dsh-read-animation

社区插件目录由 SkillHub 等站点收录,与 DeepSeek / 幻方无官方从属关系;安装与行为以仓库 README 与发布包为准。

问题从哪来

README 归纳的机制大致如下:

  1. 本地附件管线对 image/gif 不走直通,经重编码后 sharp 只保留第 0 页。
  2. admitPromptContent 在 Host 侧对图片做单帧规范化,动图原始多帧在此丢失;之后 vision 插件、路由或 LLM 适配器看到的已是静图。
  3. 聊天框粘贴 GIF/WebP 时,浏览器侧字节可以完整上传,但 Host 规范化仍会毁掉动画;插件在 admitPromptContent 外包一层:解码并缓存帧,对外仍返回原有结果,不改动你写的消息正文。
  4. 动图 PNG(APNG)在 README 中写明:当前依赖的 libvips 读不出 acTL 等块,插件会按名称识别并拒绝,而不是静默只给第一帧。

因此能力要落在「文件里动画仍完整」或「粘贴/upload 路径上仍保有原始字节」的时刻;插件在展示读路径 readImage 上回传原始文件供浏览器播放,在模型读路径 readImageRequest 上拼出带标注的帧表(构建一次并缓存)。

核心功能

粘贴与 UI 展示

粘贴动图后:

  • 消息内容不变,不会把一条动图变成多张静图塞进对话。
  • Web UI 通过 session.readAttachment → Host readImage 拿到原始 Blob 与 mediaType,浏览器自行播放动画。
  • 各采样帧在附件显示名里带索引与起始时间(例如 x.gif#frame16@1960ms),Harness 渲染给模型时为 Image "<name>" … 形式。

模型侧:帧表与工具

适配器通过 readImageRequest(ref, target, signal) 取图;插件将多帧合成一张带标注的网格图(README 举例:8 帧手机比例动图可为 4×2 网格,每格原尺寸,下方印帧号、时长与起始时间),同一份附件多次请求结果一致。

工作区或文件附件中的动图可用工具 read_animation(path, …):返回文本头(路径、类型、总帧数、时长、fps、是否循环、采样说明等),再按帧附带说明与图片。可通过参数指定 frames 索引或提高 max_frames 做更密采样;README 明确写出采样间隙之间看不到的运动,避免模型误判。

版本与环境

  • DSH:0.1.3-alpha.2 或更高(engines.dsh 与 README Install 一节一致;细项见仓库 COMPATIBILITY.md)。
  • Node:^22.19.0 || >=24.0.0(package.json)。
  • 当前抓取到的包版本:0.1.2(以你实际 add 时 registry 解析为准)。

安装与启用

将 web 换成你实际使用的 profile 名。安装后需重启正在运行的 DSH 实例,插件行在下一进程生效。

官方 README 给出的安装方式:

dsh plugin --profile web add dsh-read-animation

也可从带标签的 Git 提交安装(会拷贝整个仓库,含测试与 fixtures;README 更推荐 npm):

dsh plugin --profile web add github:NeoHotaru/dsh-read-animation#v0.1.0

本地 checkout 开发链(需在该目录执行 npm install 以拉取 sharp):

cd dsh-read-animation
npm install
dsh plugin --profile web add link:$PWD

Web 侧栏 Plugins 页可使用相同 spec;Settings 里插件列表为只读。插件以当前 DSH 进程的权限运行,安装前请自行审阅源码与 MIT 许可证条款。

典型用法

聊天里粘贴动图

  1. 安装并重启 DSH(--profile web 或你的 profile)。
  2. 在输入框直接粘贴 GIF 或动图 WebP,正常发送。
  3. 界面应持续播放原动画;向支持视觉的模型提问时,模型侧应收到采样帧或合成帧表,而非仅第一帧。

无需在消息里额外写说明;插件不修改你输入的文字。

工作区文件:read_animation

对磁盘上的动图路径调用工具(参数以运行时 schema 为准,README 示例如下逻辑):

  • 默认在时间轴上均匀采样若干帧,并在 <content> 里说明只附上了哪些帧索引。
  • 需要盯某一时刻时,用 frames 指定索引;需要更密预览时提高 max_frames。

返回结构示意(摘自 README,路径请换成你的环境):

<path>D:\work\dance.gif</path>
<type>animation</type>
<content>
image/gif animation, 480x270 px, 24 frames, 1200 ms total, ~20 fps, loops forever.
Attached below are 6 frames sampled evenly in time from this animation. ...
Only frames 0, 4, 9, 13, 18, 23 of 24 were sampled, ...
</content>

随后每一采样帧会有类似标题:

frame 9 of 24 (sample 3) · starts at 450 ms · displayed for 50 ms
[ image ]

适用场景与注意

适合谁

  • 需要让 Agent 理解 UI 动效、加载动画、短演示 GIF/WebP 的开发者。
  • 已在用 DSH Web profile,并愿意在粘贴或 read_animation 路径上补全「时间维」信息的多模态工作流。

限制与注意

  • 不能指望在 Host 已单帧化之后由别的插件「反推」动画;本插件在 admit / 读图请求等 seam 上介入。
  • APNG 当前明确不支持,会拒绝而非只给第一帧。
  • 依赖 sharp 等原生模块,安装失败时请按 README 检查 Node 版本与 npm install。
  • 社区目录星标等元数据会变动;撰写时 GitHub 显示约 2 stars,不构成质量背书。

结尾

若你的痛点是「动图在 DSH 里只会变成第一帧」,dsh-read-animation 把解码、UI 原样播放与模型侧标注采样绑在同一插件里,并与 readImageRequest 工具链对齐。进一步了解可打开社区目录页与仓库 README(含中文 README.zh.md)。

  • 目录:https://www.skillhub.cn/plugins/NeoHotaru/dsh-read-animation
  • GitHub:https://github.com/NeoHotaru/dsh-read-animation
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜