{"_id":"@dsh-extension/dsh-vision-bridge","_rev":"3-f2da0328f51df8d3c57271a0b93f6e1a","name":"@dsh-extension/dsh-vision-bridge","dist-tags":{"latest":"1.0.0"},"versions":{"0.0.1":{"name":"@dsh-extension/dsh-vision-bridge","version":"0.0.1","keywords":["deepseek","deepseek-harness","dsh","plugin","vision","multimodal","vision-language-model","text-only-llm","on-demand-vision"],"author":{"name":"sfyyy"},"license":"MIT","_id":"@dsh-extension/dsh-vision-bridge@0.0.1","maintainers":[{"name":"sfyyy","email":"751289526@qq.com"}],"homepage":"https://github.com/sfyyy/dsh-vision-bridge#readme","bugs":{"url":"https://github.com/sfyyy/dsh-vision-bridge/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"6e9e979a1e1df2094cfb18870a940251d10ce50d","tarball":"https://registry.npmjs.org/@dsh-extension/dsh-vision-bridge/-/dsh-vision-bridge-0.0.1.tgz","fileCount":9,"integrity":"sha512-+pi2g9OtQLnGC4W8W919JAQse9YvJCvaafQF/KIoHekQfEispQzIQcllMwuDyCUbohcg2uVRIQTG0cgbhzUGXw==","signatures":[{"sig":"MEQCIEdhUKa3fd8PoDcIMALi+xNtFARU7WUEdXslMTnyAyoxAiBBOEx4KWlZSHXtv8B+dWG4ngR+tfwpZ12bcqqWwe+aFg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54824},"main":"./lib/index.js","type":"module","types":"./lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"b50b35f78030e007ba9638b229506922266a987b","scripts":{"test":"node --test test/index.test.js","prepack":"npm test"},"_npmUser":{"name":"sfyyy","email":"751289526@qq.com"},"repository":{"url":"git+https://github.com/sfyyy/dsh-vision-bridge.git","type":"git"},"_npmVersion":"11.19.0","description":"On-demand vision for text-only DSH sessions: images become markers, and a vision_describe tool sends only image + question to an OpenAI-compatible vision model","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":">=4.0.0-rc.7 <5.0.0","@deepseek-ai/dsh-llm":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-agent":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-tools":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/schemastery":">=3.18.0 <4.0.0","@deepseek-ai/dsh-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-attachment":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-credentials":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-runtime":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-host-webserver":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-slots":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-primitives":">=0.0.1-rc.1 <0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-vision-bridge_0.0.1_1786894035167_0.3262948168575657","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@dsh-extension/dsh-vision-bridge","version":"0.0.2","keywords":["deepseek","deepseek-harness","dsh","dsh-plugin","plugin","vision","multimodal","vision-language-model","vlm","image-understanding","image-analysis","screenshot","ocr","openai","openai-compatible","chat-completions","llm","llm-agent","agent","text-only-llm","on-demand-vision","cost-saving","one-api","vllm"],"author":{"name":"sfyyy"},"license":"MIT","_id":"@dsh-extension/dsh-vision-bridge@0.0.2","maintainers":[{"name":"sfyyy","email":"751289526@qq.com"}],"homepage":"https://github.com/sfyyy/dsh-vision-bridge#readme","bugs":{"url":"https://github.com/sfyyy/dsh-vision-bridge/issues"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"dist":{"shasum":"49f4c87efb8cb5136fd628e657661dacdca90774","tarball":"https://registry.npmjs.org/@dsh-extension/dsh-vision-bridge/-/dsh-vision-bridge-0.0.2.tgz","fileCount":9,"integrity":"sha512-u1R7IYDegt1RjMm2xgWmMSBFKq4lOK/ca3YXAPOGoIfuD0jWet5ifAHYcwzyJh4uuA7dBsE9Bn6SMBI5/WsTrw==","signatures":[{"sig":"MEYCIQDjYk1Vj1mce6g5Q2wBnk1vemZj+rYD51cAsksi9fGZMwIhAMg0xjOtrY4ZP8HgD55cjyyJIZHf/9c0JG2QTq47psg9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59360},"main":"./lib/index.js","type":"module","types":"./lib/types/index.d.ts","exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"gitHead":"1e183e20f7b6790550889936d9eef3e7767baf75","scripts":{"test":"node --test test/index.test.js","prepack":"npm test"},"_npmUser":{"name":"sfyyy","email":"751289526@qq.com"},"repository":{"url":"git+https://github.com/sfyyy/dsh-vision-bridge.git","type":"git"},"_npmVersion":"11.19.0","description":"On-demand vision for text-only DSH sessions: images become markers, and a vision_describe tool sends only image + question to an OpenAI-compatible vision model","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"peerDependencies":{"@deepseek-ai/cordis":">=4.0.0-rc.7 <5.0.0","@deepseek-ai/dsh-llm":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-agent":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-tools":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/schemastery":">=3.18.0 <4.0.0","@deepseek-ai/dsh-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-attachment":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-credentials":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-runtime":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-host-webserver":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-slots":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-primitives":">=0.0.1-rc.1 <0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/dsh-vision-bridge_0.0.2_1786895615726_0.5918397763697159","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@dsh-extension/dsh-vision-bridge","version":"1.0.0","description":"On-demand vision for text-only DSH sessions: images become markers, and a vision_describe tool sends only image + question to an OpenAI-compatible vision model","type":"module","main":"./lib/index.js","types":"./lib/types/index.d.ts","keywords":["deepseek","deepseek-harness","dsh","dsh-plugin","plugin","vision","multimodal","vision-language-model","vlm","image-understanding","image-analysis","screenshot","ocr","openai","openai-compatible","chat-completions","llm","llm-agent","agent","text-only-llm","on-demand-vision","cost-saving","one-api","vllm"],"license":"MIT","author":{"name":"sfyyy"},"repository":{"type":"git","url":"git+https://github.com/sfyyy/dsh-vision-bridge.git"},"bugs":{"url":"https://github.com/sfyyy/dsh-vision-bridge/issues"},"homepage":"https://github.com/sfyyy/dsh-vision-bridge#readme","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"test":"node --test test/index.test.js","prepack":"npm test"},"exports":{".":{"types":"./lib/types/index.d.ts","default":"./lib/index.js"},"./client":{"types":"./lib/types/client/index.d.ts","default":"./lib/client.js"},"./package.json":"./package.json"},"peerDependencies":{"@deepseek-ai/cordis":">=4.0.0-rc.7 <5.0.0","@deepseek-ai/schemastery":">=3.18.0 <4.0.0","@deepseek-ai/dsh-agent":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-attachment":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-runtime":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-primitives":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-client-ui-slots":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-credentials":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-host-webserver":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-llm":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-settings":">=0.0.1-rc.1 <0.2.0","@deepseek-ai/dsh-tools":">=0.0.1-rc.1 <0.2.0"},"dsh":{"bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-settings","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-slots"],"platform":"web"}},"gitHead":"3d00656398d2a146ae698944756ae4d5ec71d9fb","_id":"@dsh-extension/dsh-vision-bridge@1.0.0","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-MmBSxLZuzpeDdZrMNvrAyNyz+KRTwKkTEXnGbhaAOdmsQHl8/GIv6eRSQYHH9VcvEzT6MoDvWyOJwjydHIie7g==","shasum":"fbd48d49ac0adbc11105a1d5eb2e3bb84835f262","tarball":"https://registry.npmjs.org/@dsh-extension/dsh-vision-bridge/-/dsh-vision-bridge-1.0.0.tgz","fileCount":9,"unpackedSize":59360,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDETOpQp282mL3umE/Jw2Wy6zamrxF/6q/ntHo5wGdW8gIga3WoyfGmTgT3fP1AmZ7auHK6QHF75P483bS3ILlUcU4="}]},"_npmUser":{"name":"sfyyy","email":"751289526@qq.com"},"directories":{},"maintainers":[{"name":"sfyyy","email":"751289526@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/dsh-vision-bridge_1.0.0_1786895636058_0.815054638269548"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-16T15:27:14.847Z","modified":"2026-08-16T15:53:56.371Z","0.0.1":"2026-08-16T15:27:15.309Z","0.0.2":"2026-08-16T15:53:35.882Z","1.0.0":"2026-08-16T15:53:56.187Z"},"bugs":{"url":"https://github.com/sfyyy/dsh-vision-bridge/issues"},"author":{"name":"sfyyy"},"license":"MIT","homepage":"https://github.com/sfyyy/dsh-vision-bridge#readme","keywords":["deepseek","deepseek-harness","dsh","dsh-plugin","plugin","vision","multimodal","vision-language-model","vlm","image-understanding","image-analysis","screenshot","ocr","openai","openai-compatible","chat-completions","llm","llm-agent","agent","text-only-llm","on-demand-vision","cost-saving","one-api","vllm"],"repository":{"type":"git","url":"git+https://github.com/sfyyy/dsh-vision-bridge.git"},"description":"On-demand vision for text-only DSH sessions: images become markers, and a vision_describe tool sends only image + question to an OpenAI-compatible vision model","maintainers":[{"name":"sfyyy","email":"751289526@qq.com"}],"readme":"# @dsh-extension/dsh-vision-bridge\n\n> 让 DSH 的纯文本 DeepSeek 会话获得**按需多模态能力**。\n\n[![JavaScript](https://img.shields.io/badge/JavaScript-ES2022-F7DF1E.svg?logo=javascript&logoColor=black)](https://developer.mozilla.org/en-US/docs/Web/JavaScript)\n[![TypeScript](https://img.shields.io/badge/TypeScript-typings-3178C6.svg?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)\n[![npm version](https://img.shields.io/npm/v/@dsh-extension/dsh-vision-bridge.svg?logo=npm&color=cb3837)](https://www.npmjs.com/package/@dsh-extension/dsh-vision-bridge)\n[![npm downloads](https://img.shields.io/npm/dm/@dsh-extension/dsh-vision-bridge.svg?color=cb3837)](https://www.npmjs.com/package/@dsh-extension/dsh-vision-bridge)\n[![GitHub stars](https://img.shields.io/github/stars/sfyyy/dsh-vision-bridge.svg)](https://github.com/sfyyy/dsh-vision-bridge)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![DeepSeek Harness](https://img.shields.io/badge/DeepSeek%20Harness-plugin-4B6BFE.svg)](https://www.npmjs.com/package/@deepseek-ai/dsh)\n\n[English](./README.md) · [npm](https://www.npmjs.com/package/@dsh-extension/dsh-vision-bridge)\n\n一个 DSH 插件：会话全程停留在文本模型上，只有当模型真正需要看图时——截图、上传的图片、流程图、图表——才通过 `vision_describe` 工具把「图片 + 问题」交给 OpenAI 兼容的视觉模型处理。\n\n- **长上下文永远不会发给视觉模型** —— 30 万 token 的会话历史绝不发送，每次视觉调用只有「图 + 问题」，成本最低。\n- **会话日志与界面保留原图** —— 只有模型*输入*被改写为文本标记。\n- **自带视觉端点** —— 任何 OpenAI 兼容的 `/v1/chat/completions` 服务（OpenAI、DeepSeek、Gemini 代理、本地 vLLM/One-API…）都可用。\n\n## ❤️ 赞助商\n\n> [想出现在这里吗？](mailto:sfyyy@users.noreply.github.com) —— 以 API 捐赠的方式赞助本项目。\n\n<table>\n\n<tr>\n<td width=\"180\"><a href=\"https://api.xiaoyaoapi.cc/\"><img src=\"https://api.xiaoyaoapi.cc/logo.png\" alt=\"xiaoyaoapi\" width=\"150\"></a></td>\n<td>🎉 感谢 <a href=\"https://api.xiaoyaoapi.cc/\">xiaoyaoapi</a> 为本项目捐赠 API！xiaoyaoapi 是一个面向开发者的 OpenAI 兼容 AI API 聚合网关，基于 New API 构建，提供统一管理后台。它支持统一密钥管理、透明用量统计，并在单一端点下聚合多个主流大模型渠道——让开发者以更低成本、更便捷的方式接入领先的大模型服务，可直接作为本插件的视觉端点使用。</td>\n</tr>\n\n</table>\n\n## 工作原理\n\n```text\n用户/工具产生图片 ──► 图片保留在会话与界面中\n                        │\n                        ▼ （模型输入层）\n                  图片被改写为文本标记\n                （标记里带附件 id，并提示调用 vision_describe）\n                        │\n                        ▼\n   文本模型调用 vision_describe(attachmentIds / paths, question)\n                        │\n                        ▼\n   视觉模型（只收到 图 + 问题）→ 返回文本答案 → 作为工具结果回到会话\n```\n\n- `agent/pre-step` 钩子记录会话中出现过的所有图片附件（用户上传 + 工具产生的截图，包括嵌套在 `tool-result` 里的），建立附件索引，供 `vision_describe` 按 id 解析字节。\n- 包装 `session.deriveMessages()`：任何进入文本模型的请求都不含图片块（原生 DeepSeek 适配器会拒绝图片内容），图片被替换为文本标记；会话事件日志与界面展示保持原图不变。\n- DSH 内置 `llm-pi-ai` 负责构造 OpenAI 多模态请求；插件只维护唯一的 `vision-bridge` provider 路由，不重复实现协议适配器。\n\n### 图片准入\n\nDSH Web 会在消息进入 agent 前根据当前 DeepSeek 模型执行图片能力检查。本插件保留 admission bypass，让图片先进入会话；随后标记改写保证文本模型请求中不含图片块。插件关闭或卸载后，原生准入检查恢复。\n\n可通过 `GET /_dsh/vision-bridge/settings` 检查 `value.admissionBypass` 与依赖服务状态。\n\n## 安装\n\n从 npm registry 安装（非本地安装），一条命令即可：\n\n```sh\n# 如果你的终端里已经有 dsh 命令：\ndsh plugin --profile web add @dsh-extension/dsh-vision-bridge\n\n# 或者你一直使用 npx，可以写成：\nnpx @deepseek-ai/dsh@0.1.0-rc.6 plugin --profile web add @dsh-extension/dsh-vision-bridge\n```\n\n> `--profile` 指定你要启动的 profile（`web` 即浏览器 UI profile）；如果你的 profile 名字不同，请相应调整或省略。\n>\n> 新增客户端 bundle 后需要重启一次 `dsh web`，让界面加载。\n\n## 配置\n\n在 DSH **设置 → Vision Bridge** 中填写，或编辑 `~/.dsh/vision-bridge.json`：\n\n```json\n{\n  \"enabled\": true,\n  \"baseUrl\": \"https://api.openai.com/v1\",\n  \"apiKey\": \"sk-xxxx\",\n  \"apiKeyEnv\": \"\",\n  \"model\": \"gpt-5.6-terra\"\n}\n```\n\n- `baseUrl` 可以是 API 根地址、`.../v1` 基址或完整的 `.../chat/completions` 地址（插件会自动规范化）。\n- `apiKeyEnv` 与 `apiKey` 二选一；直接填写的 key 会同步到 DSH credential store，并以 `DSH_VISION_BRIDGE_API_KEY` 引用。\n- 插件在 DSH 的 `llm-pi-ai.providers` 中维护唯一的 `vision-bridge` 路由，不改动其它 provider。\n- `enabled: false` 时整条链路关闭：不注册工具、不改写图片、不启用准入 bypass（恢复原生行为）。\n\n**优先级（高者生效）：** 设置页（含 schema 默认值）→ 环境变量 → 配置文件。\n\n**环境变量覆盖：** `DSH_VISION_BRIDGE_BASE_URL`、`DSH_VISION_BRIDGE_API_KEY`、`DSH_VISION_BRIDGE_API_KEY_ENV`、`DSH_VISION_BRIDGE_MODEL`、`DSH_VISION_BRIDGE_ENABLED`。\n\n## vision_describe 工具\n\n- **参数**\n  - `attachmentIds`：当前会话中的图片附件 id（形如 `sha256:...`），可多张；\n  - `paths`：本地图片绝对路径（png/jpeg/webp/gif），可单独或与附件 id 混用，**共 1–4 张**；\n  - `question`：必填，针对图片的具体问题。\n- **行为**：解析图片 → 通过 `vision-bridge` 路由把「图片 + 问题」发给视觉模型 → 返回文本答案作为工具结果。\n- 支持多图对比：把多张图放在同一条 user 消息里一起发送。\n- 附件 id 只能来自当前会话（用户上传或工具产生）；`paths` 走 DSH 的沙箱感知文件服务。\n\n## 验证\n\n```sh\nnpm test\n```\n\n测试覆盖：图片标记改写（含嵌套 tool-result）、附件 id/路径两种解析、事件日志附件索引、禁用时全链路关闭、纯文本会话不受影响。\n\n## 开发\n\n从本地源码目录安装：\n\n```sh\ndsh plugin inject /path/to/dsh-vision-bridge\n```\n\n## 搜索关键词\n\n`deepseek` · `deepseek-harness` · `dsh` · `plugin` · `vision` · `multimodal` · `vision-language-model` · `VLM` · `image understanding` · `screenshot` · `OCR` · `image analysis` · `OpenAI-compatible` · `text-only-llm` · `on-demand vision` · `LLM agent`\n\n## 协议\n\n[MIT](./LICENSE)\n","readmeFilename":"README.zh-CN.md"}