dsh-plugin-verified-search
f0909172434
Verified current-source search workflow for DeepSeek Harness
PROJECT TOPICS
PROJECT README

SF视觉桥 为纯文本模型接入按需多模态能力:图片或文档先经过结构化解析,再把结果注入 DeepSeek Harness。普通图片不会默认生成 HTML,系统会根据用户问题自动选择描述/OCR、空间定位或 UI 还原;文档会把原文文字和内嵌图片分层处理,并保留页码、段落、幻灯片、Sheet、单元格和坐标锚点。
把下面这段话发给你的Harness:
请直接帮我把这个插件安装到当前的 DeepSeek Harness 环境中:
https://github.com/sparkmio/dsh-sfversion
请自行检查 Harness 的版本和目录结构,阅读插件说明,完成依赖安装、配置注册及必要的代码调整。不要只给出操作建议,请实际执行安装流程。完成后运行测试验证插件是否可用,并简要说明你做了哪些修改、如何使用,以及是否存在需要我手动处理的问题。
[📎 文件名]、URI、解析提示词或 Base64 写到可见正文;vision_ground 返回目标 bbox、中心点、0~1000 归一化坐标、九宫格区域、OCR 文字和相对关系,适合复杂图片中的“某元素大概在哪里”;vision_restore_ui 输出内联 CSS、无外部资源的完整 HTML;要求从 <!DOCTYPE html> 开始并以 </html> 结束,不完整结果不会写入缓存;vision_glance(描述/OCR)、vision_ground(空间定位)、vision_restore_ui(HTML 还原)、document_inspect(文档结构化解析);finish_reason=length,拒绝缓存被截断的结果;大图在浏览器端自动压缩。点击输入框左侧 ↑ 后可选择以下格式:
| 格式 | 原文文字 | 内嵌图片 | 位置精度 |
|---|---|---|---|
.doc |
正文、页眉页脚、脚注/批注(若解析器提供) | 旧版二进制 DOC 暂不保证可靠提取 | 仅文档顺序,不伪造页码/坐标 |
.docx |
段落、表格单元格 | word/media 图片(包括表格单元格内图片) |
段落/表格锚点;DOCX XML 本身不保证真实分页 |
.pptx |
文本框、形状文字 | 幻灯片图片 | 幻灯片 + 0~1000 归一化形状坐标 |
.xls |
Sheet、单元格、公式 | 旧版 XLS 内嵌图片不保证可靠提取 | Sheet + 单元格 |
.xlsx |
Sheet、单元格、共享字符串 | drawing 图片 | Sheet + 单元格/图片覆盖范围 |
.pdf |
PDF.js 文字层(含页码和文字 bbox) | 可提取的嵌入式栅格图片会转为 PNG;无文字层的扫描页由内置渲染器转为 PNG | 页码/文字/嵌入图片 bbox;扫描页会保留“无文字层”提示 |
.xmind |
content.json / content.xml 主题、备注 |
过滤 attachments/、缩略图等资源,避免误当正文 |
主题树路径,例如“中心主题 > 分支” |
.md / .markdown |
Markdown 原文、标题、列表、代码块 | data:image/... 图片;相对路径图片当前保留引用 |
行号/文档顺序 |
旧版 .doc/.ppt/.xls 的定位精度低于 OOXML;XMind 的“位置”是主题树路径而不是像素坐标。旧版二进制 Office 的内嵌图片提取能力有限,若必须识别其中图片,建议另存为 .docx/.pptx/.xlsx 或 PDF。
处理时不会把文档简单拼成一段无序文本,而是生成四层上下文:
文档上传完成后,输入区会显示一个带文件类型图标、文件名、扩展名和删除按钮的文件卡片;它是本插件的 UI,不是将 [📎 文件名] 当作普通文本显示。点击删除会同时移除该文档,发送后卡片会清空。
截至 2026 年 8 月 16 日,DeepSeek Harness 官方 master(47f943859bef60e4160492346772ded9b24f765a)的公开附件协议只定义 PNG/JPEG/WebP/GIF 图片,浏览器附件 UI 的已知限制也明确说明非图片文件尚无输入框文件卡片与历史渲染;其 prompt wire 目前只有 text 和 image,没有通用 { type: 'file' } 或 { type: 'document' }。所以这里不能假装调用不存在的“原生文档附件 API”。
本插件的后备链路是:文档字节经 Connection RPC 临时保存在宿主内存,输入草稿仅携带不可见的关联标记,llm/stream 在模型请求边界把它替换为已解析的文档上下文。用户可见的聊天正文不会出现 [📎 文件名]、sfv-document://...、[[SFV_DOCUMENT_V1 ...]]、Base64 或内部解析提示词;旧版客户端/历史中的可见引用仍可被兼容解析。由于 Harness 尚没有通用的可持久化文件协议,发送后的历史消息也不会由官方历史渲染器显示“原生文件卡片”。
单个文档限制为 25MB,最多分析 32 张内嵌图片,过长上下文会明确截断并提示分段上传。PDF.js 会提取文字层和可访问的嵌入式栅格图片;图片会单独送入图片识别链路。整页扫描 PDF 没有文字层且没有可分离的图片对象时,插件会自动用内置页面渲染器把页面转成 PNG,再交给已配置的视觉模型做 OCR/内容识别,不需要用户手动部署 OCR 服务或提供工作区文件路径。普通 PDF 文字层不需要视觉模型。
项目使用 GitHub Actions 自动发布。将版本写入 package.json 后提交并推送,再创建并推送对应的 vX.Y.Z tag(例如 v1.2.1),发布管线会校验版本、运行测试、由 scripts/release-notes.mjs 按 Conventional Commits 生成更新日志,并创建 GitHub Release。无需手动编写 changelog;本地可用 npm run release:notes -- --from <旧 tag> --to HEAD 预览日志。
本项目的代码、文档解析和发布脚本均维护在当前仓库中;下面区分直接使用的依赖/平台接口与设计参考,避免把参考项目误认为运行时必需项。
llm/stream 模型请求边界以及客户端会话输入 facade。@deepseek-ai/dsh-client-connection:浏览器与宿主之间的 Connection RPC;文档通过这条受控通道注册到宿主短期内存。@deepseek-ai/dsh-attachment / @deepseek-ai/dsh-client-ui-attachment:图片附件的 DSH 原生附件协议;本插件只将图片接入这条原生链路。pdfjs-dist:PDF 文字层、页码、文字 bbox 和页面渲染后备链路。xlsx:XLS/XLSX 工作簿、Sheet、单元格及图片关系解析。fflate:DOCX/PPTX/XLSX/XMind 等 ZIP/XML 容器解包。word-extractor、cfb:旧版二进制 DOC/XLS 等格式的兼容解析。@napi-rs/canvas:PDF 扫描页的 PNG 页面渲染后备。dsh-vision-toolkit:参考其在 DeepSeek Harness 中组织视觉能力、工具入口和模型适配的思路;本项目针对文档结构化解析、PDF 页面渲染和引用安全链路独立实现。{type: 'file'},而是由本插件绘制文件卡片,并使用宿主内存 + 模型边界展开。参考项目仅用于架构和交互设计,不会在安装时额外拉取;运行所需版本以 package.json 和当前 DSH 环境为准。
这个提示通常不是文档格式或文件内容错误,而是旧版本实现只从上传按钮的 props.inputActions 读取输入操作。上传按钮位于 conversation.input.left/dock 槽位时,DSH 不保证把 composer 组件树里的 props 自动注入进来,于是旧实现会误判为“接口不可用”。
当前版本通过 DSH 公开的会话输入 facade(conversation.input.for(sessionCtx))写入输入草稿,并由插件文件卡片反映该文档;文档原始字节不会写入输入框。升级插件后请完全重启 DSH Web,避免浏览器继续使用旧的 lib/client.js 缓存。如果升级后仍提示该错误,说明当前 DSH 版本没有公开会话输入 facade,需要升级 DSH,而不是重复上传文件。
完整 HTML 往往比描述或定位结果长很多,容易触发视觉模型输出上限,并且会把大量无关内容塞进 DeepSeek 上下文。现在普通图片只做必要的识别:
因此可以降低截断概率、减少 token 消耗,也避免把半截 HTML 写入缓存。
设置页可以自行修改 接口地址 和 视觉模型。插件会把填写的地址规范化为:
https://example.com/v1 → 请求 https://example.com/v1/chat/completions;.../chat/completions → 不会重复拼接。仅修改地址即可适配满足以下条件的服务,不能保证任意多模态 API 都能直接使用。自定义接口需要:
POST {baseUrl}/chat/completions;model、messages、max_tokens;messages[].content 中的 image_url.url,并能接收图片 data:image/...;base64,...;Authorization: Bearer <API Key> 鉴权;choices[0].message.content,内容是字符串或常见的文本数组;reasoning_effort 时才建议在兼容服务上使用;不支持该字段的服务可能需要在服务端忽略它或后续增加 adapter。如果目标服务使用不同的路径、鉴权方式、图片字段、请求字段或响应结构,仅改接口地址不够,需要为它增加 adapter。切换接口地址后缓存会自动隔离。
用户上传/粘贴图片或文档
│
▼
原生图片消息 / 插件文件卡片(不可见关联标记)
│
▼ 模型请求前的 llm/stream 文档展开(图片仍走 visionTranslation)
按问题选择:describe / ground / restore_ui;文档走 text-layer + document-image 分层
│
▼
描述、空间 JSON 或完整 HTML 注入 DeepSeek 上下文
llm/stream 监听器遵循 Harness waterfall 契约,必须同步返回 AsyncIterable;文档解析延迟到该流开始迭代后异步执行,避免把 Promise 返回给下游的 yield* next() 链路。
把本目录安装为 dsh profile 可解析的包(任选其一):
cp -r dsh-sfversion "$DSH_HOME/profiles/node_modules/dsh-sfversion"
# 或开发时使用符号链接/junction
在 profile 的 cordis.patch.yml 中插入插件:
- insert:
- id: dsh-sfversion
name: 'dsh-sfversion'
配置 API Key(任选其一):
dsh credentials set STEPFUN_API_KEY sk-你的密钥
重启 dsh web。
vision_glance <路径>;document_inspect <路径>;支持 doc/docx/ppt/pptx/xls/xlsx/xmind/pdf/md/markdown;vision_ground <路径>,例如“红色按钮位于哪里?”;vision_restore_ui <路径>,成功后可让 DeepSeek 用 write 工具保存为 restored-ui.html;| 项 | 值 |
|---|---|
| 视觉模型 | step-3.7-flash |
| 接口 | https://api.stepfun.com/v1 |
| 描述输出上限 | 1800 tokens |
| 空间定位输出上限 | 1400 tokens |
| UI 还原输出上限 | 8000 tokens |
| 推理强度 | low(兼容接口不支持时应忽略该字段) |
| API Key | 设置页优先,或 DSH Credential STEPFUN_API_KEY |
dsh-sfversion/
├── lib/
│ ├── index.js # 宿主插件:visionTranslation、视觉工具、缓存
│ ├── client.js # 浏览器插件 bundle:上传按钮、状态条、设置页
│ └── document.js # DOC/DOCX/PPT/PPTX/XLS/XLSX/XMind/PDF/Markdown 解析与位置锚点
├── cordis.patch.yml
└── package.json
visionTranslation 的组合);fflate(Office ZIP/XML 解包)和 pdfjs-dist(PDF 文字层解析);MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。