一个 DeepSeek Harness(DSH)客户端插件:粘贴到输入框的图片不再只是一条缩略图,而是变成留在文字里的内联引用芯片,发送时在文本中写入 【图片N】 标记,让模型能对上「你说的是哪张图」。
DSH 官方把粘贴的图片放进草稿附件,发送时按 {type:"image"} 内容块提交——这些图片块不带文件名,模型只能看到 N 个无名的 image.png 加一段纯文本,于是「这个文件」「第一张」这类指代无法落地。
本插件把图片同时登记进文本流:芯片保留在草稿里、在光标处,发送时序列化成 【图片1】、【图片2:重量.xlsx】 这样的位置标记。图片块仍由官方通道送达,标记让两者可以对齐。
- 粘贴即内联:粘贴图片时在光标处插入芯片(文件名来自剪贴板,剪贴板位图显示为「图片N」)。
- 拖入同样内联:从文件管理器把图片拖进窗口(拖到输入框或页面任意位置)也会插入芯片,非图片文件不拦。
- 发送带标记:
codec把芯片序列化为【图片N】;有真实文件名时写【图片N:文件名】。删掉中间某张后,剩余芯片会自动重新编号,始终和实际发出的图片顺序一致。 - 删芯片即撤图:在输入框里删掉芯片,对应草稿附件会一起移除,不会误发。
- 悬停大图:鼠标停在芯片上约 240ms 弹出尺寸明确的预览(最长边 344px,带
宽×高),不占正文空间。 - 收起官方缩略图横条:默认把输入框下方的官方图片缩略图横条隐藏;可在 设置 → 图片内联引用 里用开关实时切换(偏好存在浏览器
localStorage)。 - 对话回渲染:已发送消息里的
【图片N】会重新渲染成芯片样式,而不是裸文本。
插件是一个 DSH bundle(dsh.bundle.patch 指向包内的 cordis.patch.yml),用插件管理器安装:
plugin_manager action=install_bundle target="<本仓库目录的绝对路径>"
安装后 刷新页面(必要时 Ctrl+F5)生效。用 link: 方式安装时,改代码只要刷新页面即可;复制安装则需要重启才能加载新代码。
包名保持 @local/dsh-image-reference(DSH 的本地 bundle 惯例)。要改成自己的作用域,需同时修改 package.json 的 name 与 cordis.patch.yml 里的 name。
设置面板:Settings → 图片内联引用 → 隐藏官方附件缩略图横条。
- 偏好键:
localStorage["dsh-image-reference.hideAttachmentRail"],值为"1"/"0";未设置时用 composition 配置的默认值。 - 想在 composition 里直接定默认值:
- id: dsh-image-reference
name: '@local/dsh-image-reference'
config:
hideAttachmentRail: false # true(默认)隐藏官方缩略图横条| 环节 | 做法 | 依赖的宿主契约 |
|---|---|---|
| 粘贴 | document 捕获阶段监听 paste,不 preventDefault,让官方 intake 照常收图;下一轮任务再插芯片 |
[data-composer-card]、[data-conversation-session] |
| 拖入 | 捕获阶段监听 drop;官方 intake 是 document 级监听且会 preventDefault,所以同样只观察不拦截 |
同上;落点不在输入框内时用最近交互过的输入框 |
| 插入芯片 | conversation.input.shell(sessionId).insertReference(ref, span) |
SessionInputShell.insertReference |
| 序列化 | 注册 inputTriggers source,codec.serialize 返回 【图片N】 |
sinkSerialized 逐个 occurrence 调 serializeReference |
| 回渲染 | uiConversation.userText.register(rule) + conversation.user.text.node 槽 |
文本 token 规则契约 |
| 对账 | shell.snapshot.occurrences 为权威来源 + MutationObserver |
compose() 的 occurrences 字段 |
| 悬停 | 自建 position:fixed 预览层,读草稿附件的 previewUrl |
conversation.resolveDraftAttachments |
| 横条 | 注入 CSS,按类名稳定后缀 [class*="_imageItem"] 匹配 |
attachment 包的 rail DOM |
- 标记是文本协议:模型靠
【图片N】与图片块顺序对齐,插件无法把文件名塞进图片块本身。 - 图片块的顺序由官方按草稿附件顺序提交,所以删图后重编号是为了让「发出的图片」与标记始终一致。
- 横条收起后,移除图片只能通过删芯片完成(删芯片会撤回附件)。
- 偏好是浏览器本地存储,不做跨设备同步。
- 依赖的 DOM 属性与 CSS 类名后缀取自 DSH
0.2.1-rc.5;宿主升级后若改名,需要同步调整(client.js顶部的常量已集中声明)。
MIT

