DSH WorkBuddy Connect
corrinehu/dsh-workbuddy-connect将 WorkBuddy 桌面 App 包含的模型自动接入 DeepSeek Harness,在 DSH 对话窗口里零配置使用。
为端点不返回模态元数据的中转路由补上图片输入声明,让本来就能看图的模型不再被当成纯文本拒收;声明为纯文本的路由同样会被覆盖。
English: README.en.md
让 DSH 接受本会被拒收的图片,用在那些收得下图、却没有声明多模态能力的中转站/反代上。
DSH 判断一个模型能不能收图,只读 llm-pi-ai 解析出来的模型元数据。中转站的 /v1/models 通常不返回模态信息,配置里于是没有 input,落到默认值 ["text"]。图片在到达上游之前就被本地两道闸门拦掉:
| 层 | 位置 | 表现 |
|---|---|---|
| 会话准入 | dsh-api-session-controller prompt() | session/attachment-invalid,reason MODEL_DOES_NOT_SUPPORT_IMAGES |
| 请求适配 | dsh-llm-pi-ai streamWithSnapshot() | LlmError UNSUPPORTED_CONTENT |
所以模型明明认得图,DSH 却在你按下发送时就拒绝。
两道闸门读的是同一个值:adapter 的 modelOf() 解析出的模型对象。插件只在这个方法外面套一层,对管辖范围内的路由,把缺失的 image 补进 input。
cordis.patch.yml,不碰 settings 文档,不动 profile。modelOf 原样还原。modelOf 的适配器(pi-ai 路由)。官方 DeepSeek 账号路由走另一个适配器,不受影响。llm/adapters-updated,后挂载的路由、后新增的模型同样被覆盖。这是一个 DSH bundle 包(dsh.bundle.patch),不是普通 npm 脚本。
# 桌面版:在插件管理器里以本地目录安装,或
dsh plugin --profile <你的 profile> add link:<本目录绝对路径>
安装后 profile 的 package.json 会增加一条依赖,Loader 里多一行 dsh-send-photos。
卸载:在插件管理器中移除该 bundle(plugin_manager 的 remove_bundle),或
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
providers 里排除即可。["text"] 的模型也会被覆盖(解析后无法区分“声明为纯文本”和“没声明”)。如果某个 route 上有这类模型,用 providers 缩小范围,或只保留需要的那条。llm-pi-ai 路由(api: openai-completions 这类)。若将来 DSH 改了适配器内部方法名,插件会打一条 warn 并保持无害的空转。0.2.1-rc.2 上验证通过。MIT