deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
一个运行在 DeepSeek Harness (DSH) 上的动态 Cordis 插件:为所有会话提供图片上传能力,并用可配置的视觉模型自动识别图片,支持 fallback 回退链。
本项目基于 Apache License 2.0 开源。
| 能力 | 说明 |
|---|---|
| 📎 全局上传按钮 | 每个会话的输入框工具行出现上传按钮;选图后图片作为草稿缩略图附加到消息,同时文件保存到该会话工作区的 uploads/ 目录 |
| 自动图片识别 | 消息中的图片由视觉模型识别,识别结果以文字笔记注入模型上下文([uploaded image recognized by vision model <model>]) |
| 任意视觉模型选择 | 设置页自动列出所有声明支持 image 输入的模型,可任选其一作为主识别模型 |
| Fallback 回退 | 主模型识别失败(报错或空结果)时自动切换备用模型;可独立开启/关闭 |
| 无配置默认行为 | 未配置时按名称优先(vl/vision/image 匹配)自动选择识别模型,避免误选不支持识别的模型 |
src/host.js):拦截 llm/stream waterfall。请求含图片时,先对每张图片调用视觉模型识别(不带 system 消息 —— 某些网关只认同一条用户消息内的图片),再把图片块替换为文字笔记。识别请求本身通过 inFlight 防重入保护。src/client.js):注册两个 Slot —— conversation.input.left(上传按钮)与 settings.plugins.tab("图片识别"设置页)。Client 与 Host 之间仅通过包私有 JSON RPC(host.call)通信。src/host.js 与 src/client.js 正是动态插件定义所需的 code.host / code.client 函数体,可直接使用:
git clone https://github.com/ariesy/dsh-vision.git
cordis_define):plugin 前缀任取(如 dsv),插件名 dsh-visioncode.host ← src/host.js 内容code.client ← src/client.js 内容注意:动态插件是进程内的 —— DSH 重启后需重新定义并运行(步骤 2–4)。
需要把两文件包装为标准插件模块后放入预设的 cordis.yml:
// host-plugin.js —— 包装示例
module.exports = {
apply(ctx) {
return /* 粘贴 src/host.js 中 `return { ... }` 的内容 */;
},
};
// client-plugin.js —— 包装示例(同理,返回 src/client.js 中的 `return { ... }` 内容)
module.exports = {
apply(ctx) { ... },
};
# cordis.yml 或预设 composition
- id: dsh-vision-host
name: ./host-plugin.js
- id: dsh-vision-client
name: ./client-plugin.js
在任意 DSH 会话中直接下达指令,让 agent 读取本项目源码并完成定义、运行:
阅读 dsh-vision 项目(或 git clone https://github.com/ariesy/dsh-vision.git),
把 src/host.js 与 src/client.js 分别作为 code.host / code.client 定义并运行同名动态插件。
agent 会自主完成:读取源码 → cordis_define 定义插件(名称 dsh-vision)→ cordis_run 运行。之后同样需要你在运行卡片上批准,并刷新浏览器页面使 Client half 生效。
该方式与方式一本质相同,只是由 agent 代为读取和提交代码,适合不想手动复制粘贴的场景。
├── package.json # 项目元数据(npm 项目壳)
├── README.md # 本文档
└── src/
├── host.js # Host half:llm/stream 拦截、识别链、配置与上传 RPC
└── client.js # Client half:上传按钮 + 设置页 UI
cd dsh-vision && npm run check # node --check 两个源码文件
运行时验证样例(2026-08 环境):用户上传一张《示例图片》图片,模型识别并给出准确描述(期间费用区间、金额 <金额>、制单日期等字段全部正确)。
ctx.get('llm'):listProviders()、listModels(provider)、stream(options)llm/stream(waterfall,ctx.on)harness.handle(method, handler):包私有 RPCslots.inject/slots.register、host.call、React(无 JSX)ctx.get('agents') / ctx.get('subprocess') / ctx.get('fs'):上传文件落盘CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。