dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Bridges images into text for non-vision DeepSeek Harness models — your message stays untouched, zero manual setup.
中文 | English
让不支持图片输入的模型(如 deepseek-v4-pro、deepseek-v4-flash)也能接收截图。 粘贴的图片由配置的视觉模型自动识别,描述以折叠的上下文条目写入会话历史——你的原始消息保持原样。模型自己能看图时(目录里声明了 image 输入)插件完全不干预,图片原样交给模型。每个会话都生效;与模型相关,与会话无关。纯插件 + 配置实现,不修改 DSH 源码。
image 输入,要么开启 autoDeclareInput: true 让插件在启动时与适配器变化时替已配置模型补上声明(原生视觉模型同样需要声明才能收到图)。system-prompt/assemble(pre-step 前、同一步发生),从 assembly.variables 读取 GUI 此刻选择的准确 provider/model(由 DSH 的 model-selection 机制写入)。agent/pre-step 时先判定当前模型能否自己看图——命中 nativeVision 白名单,或目录条目声明了 image 输入(passThroughDeclaredVision,默认开)——能看图就完全不干预,图片原样交给模型。判定结果按 provider/model 缓存,适配器变化时清空。agent/pre-step 与下一步共用同一个判定,两者不会打架。llm/stream 阶段把图片块替换为短占位文本(完整内容在描述消息里,不重复消耗 token),所以图片永远不会到达网关;GUI 显示不受影响。visionProvider/visionModel 默认路由。nativeVision 白名单内;image 输入(或 passThroughDeclaredVision: false)。read_image 等工具结果里内嵌的图片同样会被识图替换(声明 input: [text, image] 会解锁 read_image 的执行门槛,这一层替换保证模型主动读的图也不会直达网关)。构建产物 lib/ 已提交进仓库,无需构建步骤,装来即用:
# GitHub 安装
dsh plugin --profile web add github:soarGuo/dsh-auto-vision
# npm 安装(发布后)
dsh plugin --profile web add dsh-auto-image
# 或 tarball 安装(在仓库目录里先 pnpm pack)
dsh plugin --profile web add ./dsh-auto-image-0.2.0.tgz
安装后重启 DSH。
模型声明零手动配置。 只要模型自己的目录条目声明了 image 输入(原生视觉模型通常都声明了),插件就无需任何配置:准入放行,且带图时插件完全不干预。只有当某个模型确实支持图片、但目录条目没声明时,才需要开启 autoDeclareInput: true 让插件替它补声明(它会扫描 llm-pi-ai / llm-deepseek 段,幂等写入)。
插件自身配置(均可省略,以下为默认值):
auto-vision:
visionProvider: deepseek-official # 默认识图路由
visionModel: deepseek-v4-flash-vision-exp # 默认视觉模型
nativeVision: # 原生视觉白名单:带图时不干预,也是识图路由的候选
[
{ provider: deepseek-official, model: deepseek-v4-flash-vision-exp },
{ provider: deepseek, model: deepseek-v4-flash-vision-exp }
]
passThroughDeclaredVision: true # 目录声明了 image 的模型直接放行原图;false 则只认白名单
autoDeclareInput: false # 给未声明的模型补 image 声明(会污染模型目录,按需开启)
settings.yaml 修改即时生效(热重载)。识图路由也可指向任一网关的视觉模型:
auto-vision:
visionProvider: deepseek
visionModel: deepseek-v4-flash-vision-exp
以某 OpenAI 兼容网关路由为例:
llm-pi-ai:
providers:
{
my-gateway:
{
displayName: My Gateway,
models:
[
{ id: my-pro, name: My-Pro, input: [ text, image ] },
{ id: my-vision, name: My-Vision, input: [ text, image ] }
],
baseURL: https://example.com/v1,
apiKeyEnv: MY_API_KEY
}
}
运行时依赖:无。 manifest 不声明 dependencies / optionalDependencies。插件在运行时只导入宿主已经提供的官方模块:
| 模块 | 来源 | 用途 |
|---|---|---|
@deepseek-ai/dsh-llm | DSH 宿主 | 消息构造、llm/stream 请求 |
@deepseek-ai/schemastery | DSH 宿主(@deepseek-ai/dsh 的直接依赖) | 配置 schema |
其余 @deepseek-ai/* 只在类型层引用,编译后不产生 import。插件不捆绑依赖,不含原生制品,要求的 Node 版本与 DSH 宿主一致(^22.19.0 || >=24.0.0)。
权限边界。 插件只经 DSH 的公开服务工作,不直接触碰系统资源:
| 能力 | 是否使用 | 说明 |
|---|---|---|
| 文件系统 | 否 | 不 import node:fs,不读写任何路径;图片始终以附件引用形式流转 |
| 网络 | 间接 | 只经 ctx.llm.stream 调用你已配置的模型路由,不自行发起 HTTP 请求 |
| 命令执行 | 否 | 不 import node:child_process |
| 凭据 | 否 | 不读 process.env,不接触 API key;凭据由 DSH 的适配器管理 |
| 加载器改写 | 否 | 不触碰 Loader/Fiber 的 insert/remove/patch,不遮蔽官方组件 |
唯一会写入的地方,是经 ctx.settings.update() 给你已配置的模型补 input: [text, image] 声明(可用 autoDeclareInput: false 关闭)。这是 DSH 的公开设置接口,写入的是模型能力声明,不涉及凭据字段。
外部服务。 识图会调用 visionProvider / visionModel 指定的模型路由,产生一次真实的模型请求与相应计费;该请求由 DSH 适配器发出,使用你为该路由配置的凭据。除此之外插件不联系任何第三方服务。
失败边界。
[识图失败:...]),文字照常送达模型。input: [text, image] 后,GUI 会把被桥接模型显示为"支持图片";实际图片由插件桥接,不会发给网关。deepseek-official)的模型如需桥接,同样在 llm-deepseek.models 里声明 input: [text, image]。dsh plugin --profile web remove dsh-auto-image
重启 DSH。
pnpm install
pnpm test # vitest 单元测试
pnpm typecheck # 类型检查
pnpm build # 重建 lib/(发布前记得提交构建产物)