Skip to content

About

DSH client plugin: pasted images stay in the composer as inline reference chips and are sent as 【图片N】 markers

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

图片内联引用 · Image Reference Chips

一个 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 顶部的常量已集中声明)。

License

MIT

About

DSH client plugin: pasted images stay in the composer as inline reference chips and are sent as 【图片N】 markers

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages