dsh-web-search-ddg
aooyoo
Zero-token DuckDuckGo search provider for the DeepSeek Harness (DSH) web seam — local headless browser, no API key, no m…
chou109/dsh-vision-bridge
dsh-vision-bridge:在 DeepSeek Harness 聊天框粘贴图片,任意模型都能看懂——纯文本模型自动转成图片路径并调用 vision_chat 识图,支持图片的模型直接接收原图。粘贴即用,自动识别、自动回答。dsh-vision-bridge: paste any image into the DeepSeek Harness chat box — every model can see it: text-only models get an automatic vision_chat bridge, vision-capable models receive the image directly. Paste, send, done.
PROJECT TOPICS
PROJECT README
Paste an image into the DeepSeek Harness chat box and let the agent see and describe it automatically — no more "current model does not support images" errors, no manually handing over file paths.
国内镜像 / Mirror: also hosted on gitee.com/chill109/dsh-vision-bridge — Gitee is a mainland-China Git host (faster access from mainland China; use it if GitHub is slow).
| Platform | Windows / macOS / Linux (dsh web) |
| Requires | DeepSeek Harness dsh web 0.1.0-rc.6 + the qwen-mm-plugins-api MCP server (vision_chat tool) |
| License | MIT (add a LICENSE file before publishing) |
中文版见 README.zh.md。
This part is written for people who just want the feature installed.
Before this project, pasting an image into the chat box with a text-only model (e.g. deepseek-v4-flash) showed:
当前模型不支持图片,请切换支持图片的模型 / The current model does not support images; switch to a model that does
After installing this project:
vision_chat from qwen-mm-plugins-api) to recognize it — it answers with a description, OCR, VQA… whatever you asked.You never type a path; the recognition happens on its own.
Please understand this clearly: this project is only a bridge — it makes the image sendable and hands it to the agent as a path. It does not include or install any vision model:
- The vision plugin must be configured by you (e.g. register qwen-mm-plugins-api in
profiles\web\cordis.patch.ymlwith a working API key);- The vision model is freely selectable — any tool that takes an image and returns text works;
- If you did not specify which vision model to use, let the AI recommend a compatible one (e.g.
mcp-qwen-mm-plugins-api/vision_chat); the placeholder tells the agent to use whichever vision tool it currently has.
dsh web --host 127.0.0.1 --port 3080)vision_chat tool; needs a working DashScope-compatible API key)git (used by the installer to apply the patches)Apply the host patch — removes the "model does not support images" rejection:
cd "$env:USERPROFILE\.dsh\profiles\node_modules\@deepseek-ai\dsh-host-apiproxy\lib"
git -c core.autocrlf=false apply --unsafe-paths --directory="$PWD" "..\..\..\..\..\..\dsh-vision-bridge\patch\dsh-host-apiproxy.patch"
Apply the LLM patch — text-only models receive images as a path + a vision instruction:
cd "$env:USERPROFILE\.dsh\profiles\node_modules\@deepseek-ai\dsh-llm-pi-ai\lib"
git -c core.autocrlf=false apply --unsafe-paths --directory="$PWD" "..\..\..\..\..\..\dsh-vision-bridge\patch\dsh-llm-pi-ai.patch"
Restart the harness — close the DeepSeek Harness Server window, run start-dsh.bat (or restart dsh web), then hard-refresh the browser (Ctrl+F5).
.\install.ps1 # applies both patches and restarts the harness
Copy/paste this whole paragraph into your AI assistant:
Deploy the dsh-vision-bridge feature from
https://github.com/chou109/dsh-vision-bridge(mainland-China mirror:https://gitee.com/chill109/dsh-vision-bridge) to my local DeepSeek Harness web profile.
- Windows: run
.\install.ps1from the repo root — it appliespatch\dsh-host-apiproxy.patchandpatch\dsh-llm-pi-ai.patchinto%USERPROFILE%\.dsh\profiles\node_modules\@deepseek-ai\...withgit -c core.autocrlf=false apply, then restarts the harness. macOS/Linux:./install.sh(restartdsh webyourself).- If the scripts are unavailable, apply the two patches manually exactly as the README "For AI" section describes.
- Note: this project is only a bridge between "image sending" and a vision-model plugin — it does not include a vision model. The vision plugin must be configured separately and the vision model can be freely chosen. If I did not specify which vision model to use, please recommend a compatible one (e.g.
mcp-qwen-mm-plugins-api/vision_chat), and confirm it is registered inprofiles\web\cordis.patch.ymlwith a working API key.- After the harness is back, verify: I paste an image into the chat box and send it — the agent must automatically describe the image (it receives
[图片附件:<path>(如需了解内容,请调用你可用的视觉识图工具…)]and automatically calls its available vision tool).
vision_chat and answers..\install.ps1 -Uninstall
or manually: git apply -R both patches (or reinstall @deepseek-ai/dsh-host-apiproxy@0.1.0-rc.6 and @deepseek-ai/dsh-llm-pi-ai@0.1.0-rc.6), then restart the harness.
This part is written for AI agents that install, debug, or extend this feature. It assumes you can run shell commands and read the dsh packages in node_modules.
Paste-to-vision is two patches to shipped dsh packages (no client-side change needed — the chat composer already allows pasting; the block was a server-side rejection at send time):
patch/dsh-host-apiproxy.patch — in @deepseek-ai/dsh-host-apiproxy/lib/index.js, the prompt RPC handler previously rejected any message containing image parts when the selected model's inputModalities lacked image (returning attachment-error / MODEL_DOES_NOT_SUPPORT_IMAGES, which the UI renders as "当前模型不支持图片…"). The patch deletes that rejection: image parts are admitted for any model. (1 hunk; the file gets smaller.)
patch/dsh-llm-pi-ai.patch — in @deepseek-ai/dsh-llm-pi-ai/lib/index.js, the stream() entry previously threw UNSUPPORTED_CONTENT when a text-only model received image blocks. The patch instead projects each image block to a text placeholder:
[图片附件:<abs path>(如需了解内容,请调用你可用的视觉识图工具识别此图片;例如 vision_chat,images 参数传此路径)]
The path is resolved by imageAttachmentPath() from the content-addressed ref: <DSH_HOME>/attachments/v1/objects/<aa>/<sha256>.<ext> (a best-effort hardlink adds the extension so tools can sniff it). The projection recurses into tool-result content too, so images returned by tools (e.g. read_image) are handled the same way. (3 hunks.)
The recognition side is NOT part of this repo — the placeholder is a generic instruction ("use whatever vision tool you have available"), so the agent automatically picks the vision tool currently registered in the profile. A typical pairing is the vision_chat tool of the qwen-mm-plugins-api MCP server (registered in profiles/web/cordis.patch.yml → mcp-qwen-mm-plugins-api with a working API key), but any tool that accepts an image path and returns text works.
Data flow: paste → draft thumbnail → send → prompt RPC admitted (patch 1) → message persisted with image parts (UI history still shows the image) → LLM request serialization hits a text-only model → projection (patch 2) → agent context receives the path placeholder → agent calls vision_chat(path) → answer.
$profiles = "$env:USERPROFILE\.dsh\profiles" # or $env:DSH_HOME\profiles
# 1. host-apiproxy (removes the rejection)
$d = "$profiles\node_modules\@deepseek-ai\dsh-host-apiproxy\lib"
git -c core.autocrlf=false apply --unsafe-paths --directory="$d" patch\dsh-host-apiproxy.patch
# 2. llm-pi-ai (image -> path text projection)
$d = "$profiles\node_modules\@deepseek-ai\dsh-llm-pi-ai\lib"
git -c core.autocrlf=false apply --unsafe-paths --directory="$d" patch\dsh-llm-pi-ai.patch
index.js with a/index.js/b/index.js headers; run from the repo root.-c core.autocrlf=false is mandatory on Windows.0.1.0-rc.6. If git apply fails, the installed version differs — re-diff against npm pack @deepseek-ai/dsh-host-apiproxy@0.1.0-rc.6 (and the same for dsh-llm-pi-ai).install.ps1/install.sh detect the patch state via markers (host: string MODEL_DOES_NOT_SUPPORT_IMAGES absent ⇒ patched; llm: function projectImageBlocksToText present ⇒ patched).Paste an image into the chat box and send it (empty text auto-sends).
Expected: the agent's turn shows it analyzed the image (description/OCR/answers).
On the wire: the user message that reached the LLM contains [图片附件:<path>(如需了解内容,请调用你可用的视觉识图工具识别此图片;例如 vision_chat,images 参数传此路径)] — the placeholder is a generic instruction (it does not hardcode one tool); the agent calls whichever vision tool it has. This is by design, not an error.
Direct checks:
# host patch live: the reason string is gone from the running code
Select-String "$profiles\node_modules\@deepseek-ai\dsh-host-apiproxy\lib\index.js" -Pattern 'MODEL_DOES_NOT_SUPPORT_IMAGES' # -> no match
# llm patch live
Select-String "$profiles\node_modules\@deepseek-ai\dsh-llm-pi-ai\lib\index.js" -Pattern 'projectImageBlocksToText' # -> match
| Symptom | Cause | Fix |
|---|---|---|
| "当前模型不支持图片…" still shows on send | Host patch not loaded (harness not restarted, or the profile node_modules junction was refreshed by a reinstall) |
Restart harness; re-apply the patch; verify with the checks above |
| Agent replies "I can't see the image" | No vision tool registered or the API key is missing | Register a vision MCP (e.g. mcp-qwen-mm-plugins-api) in profiles\web\cordis.patch.yml; set the key; restart |
| Installer reports success but the feature is dead | git silently skips the patch when the path contains non-ASCII characters (e.g. a Chinese user name) — exit 0 but no change | The installer now re-checks file content and fails loudly; manually verify with Select-String (above), or move dsh to an ASCII-only path, or apply with git apply -p1 by hand |
| Placeholder path points to a missing file | Attachment store root differs (DSH_HOME override) or the object was cleaned |
Check <DSH_HOME>\attachments\v1\objects\<aa>\<sha256>; re-paste the image |
git apply fails |
Installed package version ≠ 0.1.0-rc.6 | Re-diff against npm pack of the exact version |
| Images sent to a model that DOES support images | No projection runs (by design) — raw image parts go to the model | Not a bug; the feature targets text-only models |
taskkill /F /T /PID <node dsh web pid> then npx -y @deepseek-ai/dsh web --host 127.0.0.1 --port 3080. install.ps1 does this automatically.install.ps1 -Uninstall (or git apply -R both patches), restart.profiles\node_modules\@deepseek-ai\* are junctions to the npx cache. Re-running npx -y @deepseek-ai/dsh with a newer package version can overwrite patched files — re-apply after upgrades.dsh-client-ui-conversation for this feature; the composer already allows pasting.prompt RPC checked modelInfo.inputModalities and refused. Removing that one check is the entire client-visible fix.attachments/v1/objects/…), so the cheapest reliable bridge is a path. The placeholder text doubles as an instruction, so any agent with the vision_chat tool recognizes the image without extra configuration.tool-result content, so read_image / save_view results are bridged the same way for text-only models.model.input includes image, no projection runs and the model sees the pixels directly.Made for DeepSeek Harness users who want to paste a picture and get an answer.
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。