前言¶
在 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 归纳的机制大致如下:
- 本地附件管线对
image/gif不走直通,经重编码后sharp只保留第 0 页。 admitPromptContent在 Host 侧对图片做单帧规范化,动图原始多帧在此丢失;之后 vision 插件、路由或 LLM 适配器看到的已是静图。- 聊天框粘贴 GIF/WebP 时,浏览器侧字节可以完整上传,但 Host 规范化仍会毁掉动画;插件在
admitPromptContent外包一层:解码并缓存帧,对外仍返回原有结果,不改动你写的消息正文。 - 动图 PNG(APNG)在 README 中写明:当前依赖的 libvips 读不出
acTL等块,插件会按名称识别并拒绝,而不是静默只给第一帧。
因此能力要落在「文件里动画仍完整」或「粘贴/upload 路径上仍保有原始字节」的时刻;插件在展示读路径 readImage 上回传原始文件供浏览器播放,在模型读路径 readImageRequest 上拼出带标注的帧表(构建一次并缓存)。
核心功能¶
粘贴与 UI 展示¶
粘贴动图后:
- 消息内容不变,不会把一条动图变成多张静图塞进对话。
- Web UI 通过
session.readAttachment→ HostreadImage拿到原始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 许可证条款。
典型用法¶
聊天里粘贴动图¶
- 安装并重启 DSH(
--profile web或你的 profile)。 - 在输入框直接粘贴 GIF 或动图 WebP,正常发送。
- 界面应持续播放原动画;向支持视觉的模型提问时,模型侧应收到采样帧或合成帧表,而非仅第一帧。
无需在消息里额外写说明;插件不修改你输入的文字。
工作区文件: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