dsh-send-photos:让 DSH 接收未被声明为多模态的图片

前言

DeepSeek Harness(DSH)在判断一个模型能否接收图片时,只读取 llm-pi-ai 解析出的模型元数据。中转站的 /v1/models 通常不返回模态信息,配置里于是没有 input 字段,默认值是 ["text"]。图片在到达上游之前会被本地两道闸门拦掉:

  • 会话准入:dsh-api-session-controller 的 prompt() 方法返回 session/attachment-invalid,原因标记为 MODEL_DOES_NOT_SUPPORT_IMAGES。
  • 请求适配:dsh-llm-pi-ai 的 streamWithSnapshot() 抛出 LlmError,类型为 UNSUPPORTED_CONTENT。

即使上游模型本身支持图片,DSH 也会在用户按下发送时直接拒绝。

这是什么

dsh-send-photos 是一个 DSH bundle 包(dsh.bundle.patch),用于补全那些收得下图、却没有声明多模态能力的中转站/反代路由的输入声明。插件在 adapter 的 modelOf() 方法外面套一层,对管辖范围内的路由,把缺失的 image 补进 input。

维护者:Ayowait

分类:模型推理

核心价值:让 DSH 不再因为缺少模态声明而拒绝图片,从而兼容更多中转站配置。

核心功能

插件对管辖范围内的路由,在解析模型元数据后,将 image 加入 input 列表,使 DSH 允许图片通过。具体行为:

  • 不修改请求体:图片仍以标准 OpenAI image part 格式发出,不做编码、拆分或伪装。
  • 不修改配置文件:不触碰 cordis.patch.yml、settings 文档或 profile 文件。
  • 可逆:卸载时将 modelOf 原样还原。
  • 只作用于存在 modelOf 的适配器(pi-ai 路由,如 api: openai-completions)。官方 DeepSeek 账号路由走另一适配器,不受影响。
  • 监听 llm/adapters-updated,对后挂载的路由和后续新增的模型同样生效。

安装与启用

这是一个 DSH bundle 包,不是普通 npm 脚本。安装方式如下:

# 桌面版:在插件管理器里以本地目录安装,或
dsh plugin --profile <你的 profile> add link:<本目录绝对路径>

安装后,profile 的 package.json 会增加一条依赖,Loader 里会加载 dsh-send-photos。

卸载方式:

dsh plugin --profile <你的 profile> remove dsh-send-photos

配置示例

- id: dsh-send-photos
  name: dsh-send-photos
  config:
    providers: []          # 要覆盖的 route;空数组 = 全部已挂载路由
    modalities: [text, image]
    enabled: true

若只想作用于某个中转站,可缩小范围:

    providers:
      - my-relay

适用场景与注意

  • 该插件用于补声明,而非增强上游能力。如果上游模型确实不支持图片,请求会在上游失败,此时应将该 route 从 providers 中排除。
  • 显式写了 ["text"] 的模型也会被覆盖(解析后无法区分“声明为纯文本”和“没声明”)。如果某个 route 上有这类模型,用 providers 缩小范围,或只保留需要的那条。
  • 依赖 llm-pi-ai 路由(api: openai-completions 这类)。若将来 DSH 改了适配器内部方法名,插件会打一条 warn 并保持无害的空转。
  • 在 DSH 0.2.1-rc.2 上验证通过。

结尾

dsh-send-photos 让 DSH 能够兼容那些缺少模态声明的中转站配置,从而在本地完成补全后再向上游发送标准 OpenAI image part 请求。如需查看源码或提交问题,可访问:

  • GitHub:https://github.com/Ayowait/dsh-send-photos
  • 目录页:https://www.skillhub.cn/plugins/Ayowait/dsh-send-photos
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜