前言¶
在 DSH 客户端里拖入或粘贴图片,默认往往会走附件栏上传管线。如果你希望图片像普通文件引用一样落在光标处、不占附件区,同时仍能让模型按路径读图,就需要在官方分流逻辑之外做一层客户端行为调整。下面介绍维护者 Da0Mine 发布的客户端插件 dsh-inline-image-ref:它把拖入、粘贴、文件选择器进来的图片改成在光标处插入 @路径 胶囊,并支持悬停预览原图。
这是什么¶
dsh-inline-image-ref 是 DSH 生态里的客户端插件(dsh-client,platform: web,immediately: true)。一句话定位:拖进输入框的图片按文件引用处理——不弹附件栏,在光标处插 @路径 胶囊;鼠标悬停胶囊可看原图。
- 维护者:江浩文(Da0Mine)
- 许可证:MIT
- 当前 npm 版本(资料):
1.0.1 - 目录页:https://www.skillhub.cn/plugins/Da0Mine/dsh-inline-image-ref
- 源码:https://github.com/Da0Mine/dsh-inline-image-ref
插件以当前 DSH 进程权限运行;安装前请自行核对源码与许可证。
核心行为¶
官方在 dsh-client-ui-conversation 里用 MIME 与路径判断图片是走上传还是引用。本插件在不改官方核心代码的前提下,分两条路处理。
有真实 OS 路径的图片¶
桌面端拖入、带路径的粘贴、文件选择器选中的图片:在 drop / paste / change 的 capture 阶段把对应 File 的 type 抹成 application/octet-stream,官方判断就会走 insertFileReferences(),在实时选区(光标)之后插入 @路径 胶囊。光标定位、前导空格、撤销、忙碌态拒绝、@路径 格式化仍由官方实现。
没有路径的图片(剪贴板截图 / 位图)¶
客户端 Remote 的 workspaceFiles 只读,无法直接写盘。插件带 Host 半,提供保存路由:
POST /dsh-inline-image/save?name=<文件名>&sessionId=<会话 id>
请求体为文件字节;响应形如 { ok: true, value: { path, name, originalName, dir } }。
落盘目录与 WorkBuddy 临时图类似,在系统临时目录下:
%TEMP%\dsh-inline-image\<sha256 前 2 位>\<名字>-<sha256 前 16 位>.<ext>
要点:内容寻址(同图重复粘贴同路径,只刷新 mtime);24 小时 TTL 扫过期文件;不向项目目录写入;单文件上限 32MB。保存成功后客户端用 caretSpan() + insertReference() 在光标处插 @<绝对路径> 胶囊。失败则退回原生附件管线。
缩略图与悬停预览通过 remote.workspaceFiles.readBytes(sessionId, 绝对路径) 读字节,不另建读路由。
入口对照¶
| 入口 | 带真实 OS 路径的图片 | 没有路径的图片 | 普通文件 |
|---|---|---|---|
| 拖入 | 光标处 @路径 胶囊 |
落盘后 @绝对路径 |
原生 @路径(不变) |
| Ctrl+V | 同上 | 同上(截图也能变文件) | 不变;带文字时交回原生 |
| 文件选择器 | 光标处 @路径 胶囊 |
同上 | 不变 |
悬停引用胶囊时浮层显示原图(读不到则说明),pointer-events: none,不挡点击。已发送消息里符合规则的蓝色 @路径 链接也可悬停预览,范围限于输入框与聊天转录相关 DOM([data-composer-card]、[data-composer-input]、[data-chat-turn]、[data-chat-flow] 等);整段须为单一引用,夹在句子里的片段不触发。
复制粘贴草稿不退化¶
官方复制胶囊会得到 clipboardText(@"路径" 文本),粘回往往只剩文字。插件在 paste 的 capture 阶段识别「带图片扩展名的 @路径」,按原顺序用 insertText 与 insertReference 重建;仅在这类粘贴上接管,普通文字与非图片 @ 引用仍交给官方。代价:此类粘贴为纯文本重建,富文本格式(如加粗)不保留。
安装与启用¶
推荐从 npm 安装:
npm install dsh-inline-image-ref
手工接入桌面 profile 时,编辑 ~/.dsh/profiles/desktop/package.json,在 dependencies 与 dsh.profile.bundles 中加入本包,并在 node_modules 建同目录 Junction。示例结构(bundles 中需包含现有条目与本插件名):
{
"dependencies": { "dsh-inline-image-ref": "link:./node_modules/dsh-inline-image-ref" },
"dsh": { "profile": { "bundles": [ "…", "dsh-inline-image-ref" ] } }
}
修改后重启 DSH 宿主(客户端 bundle 在启动时聚合)。
环境要求:node >= 22(见 package.json engines)。
典型用法¶
- 在对话输入框中,从资源管理器拖一张本地图片到光标位置 → 出现
@路径胶囊,附件栏不出现图片上传项。 - 截屏后
Ctrl+V→ 无路径位图先 POST 到 Host 落临时目录,再插入@绝对路径胶囊。 - 鼠标悬停胶囊或消息里符合条件的
@路径链接 → 浮层预览;模型侧仍通过路径让 DSH fs 沙箱读取(对工作区与平台临时根的写/读策略与官方一致)。
需要长期可复现的图:不要只依赖 %TEMP% 下 24 小时 TTL 的副本,应把图放进工作区再从资源管理器拖入(走原路径引用,不受 TTL 影响)。
适用场景与注意¶
适合谁
- 习惯在提示词里用
@文件引用、希望图片与文本混排在同一输入流里的 DSH 桌面/Web 客户端用户。 - 不想让每张图都占附件栏、但仍要模型按路径读图的多模态或文本+工具读文件工作流。
已知限制(README 原文)
- 文件名到绝对路径的映射记在
localStorage["dsh-inline-image/labels/v1"](最多 300 条);不同目录同名图会互相覆盖,仅最后一张能预览。 - 未经本插件插入的
@图片(手打路径或其它插件)通常无法预览(Lexical 装饰节点可能只有title)。 - 临时目录文件 24 小时后清理,隔天再引用可能「读不到这张图」;工作区路径不受影响。
- 交给模型的是路径引用而非内联图片字节;文本模型需自行读文件,多模态也不会自动把图塞进上下文——这是「按文件处理」的设计取舍。
权限与安全
插件含客户端注入与 Host 写临时目录路由;安装前应阅读 client.js、补丁与 Host 路由实现。DSH 社区目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-inline-image-ref 把输入框里的图片统一成光标处的 @路径 引用,并补上悬停预览与无路径截图落盘,在尽量复用官方引用管线的前提下减少附件栏干扰。需要插件条目与讨论可参考目录页 https://www.skillhub.cn/plugins/Da0Mine/dsh-inline-image-ref,问题与源码见 https://github.com/Da0Mine/dsh-inline-image-ref。