Vision bridge for text-only DeepSeek models: transcribes attached images with deepseek-v4-flash-vision-exp before they reach deepseek-v4-pro, with no third-party dependencies.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-vision-pro-bridge
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:ShaineDemo/dsh-vision-pro-bridge
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
Give a text-only DeepSeek-V4-Pro brain real image understanding — without switching models, without Ollama, and without a second API key.
DeepSeek Harness (dsh) plugin. English · 简体中文
The problem
deepseek-v4-pro (and deepseek-v4-flash) are text-only models: their API rejects image bytes. In DeepSeek Harness, pasting a screenshot into a Pro session fails with "does not accept image input". Your only official option is to switch the whole conversation to the weaker, Flash-tier deepseek-v4-flash-vision-exp.
What this plugin does
It registers a twin provider route — deepseek-vision-pro (model deepseek-v4-pro-vision) — that advertises image support. When you attach an image, the plugin first asks deepseek-v4-flash-vision-exp to transcribe it into text (using your existing DEEPSEEK_API_KEY), then hands that text — plus a stable local file path — to deepseek-v4-pro. The DeepSeek wire route never sees an image; V4-Pro keeps its coding brain and still "sees" the picture.
paste screenshot → [image block admitted]
→ transcribe via deepseek-v4-flash-vision-exp (text)
→ text + local path → deepseek-v4-pro answers
Why this one
- Zero third-party dependencies. It reuses only the harness's own
@deepseek-ai/dsh-llmand@deepseek-ai/dsh-llm-deepseek. Noopenai, nosharp, noschemastery, no Ollama. - DeepSeek-only, single provider. Images go only to DeepSeek (
deepseek-v4-flash-vision-exp), through the sameDEEPSEEK_API_KEY. No second VLM vendor, no local model, no anonymous endpoints. - Official image pipeline, byte-for-byte. It subclasses the official
DeepSeekAdapter, so image normalization, Files-API upload, and inline-base64 fallback are identical to official behavior — no hand-rolled HTTP. - Minimal & auditable. One file, ~250 lines. Easy to read, verify, and fork.
- Content-addressed persistence. Images are saved under
~/.dsh/vision-pro-bridge/images/and the stable local path is passed to the model, so V4-Pro can reference it. - Pro-focused. One model,
deepseek-v4-pro-vision: keep V4-Pro's coding ability, add vision.
Install
dsh plugin --profile web add dsh-vision-pro-bridge
# restart dsh web
Usage
- In the model picker, choose DeepSeek-V4-Pro (视觉桥).
- Paste or drag a screenshot and ask normally.
Make it the default for new sessions (~/.dsh/settings.yaml):
agent-default-model:
provider: deepseek-vision-pro
model: deepseek-v4-pro-vision
Configuration
Environment variables (all optional):
| Variable | Default | Purpose |
|---|---|---|
DEEPSEEK_API_KEY |
credentials service | DeepSeek key (same as the official route) |
DEEPSEEK_BASE_URL |
https://api.deepseek.com |
Endpoint (same as the official route) |
DSH_VISION_PRO_BRIDGE_PROMPT |
built-in English transcription prompt | Override the transcription prompt (e.g. Chinese UI analysis) |
Images are cached content-addressed under ~/.dsh/vision-pro-bridge/images/ (re-attaching the same image reuses the transcription); an activity log is written to ~/.dsh/vision-pro-bridge-activity.jsonl.
How it works
apply(ctx)registers aDeepSeekAdaptersubclass for the provider routedeepseek-vision-pro.listModels/resolveModel/prepareCallall declareinputModalities: ['text', 'image'], so the harness's image gates (paste admission, thumbnails,read_image) open. OverridingprepareCallis required — otherwise the LLM runtime projects images to placeholders before they ever reach the adapter.stream()walks every message (including nestedtool-resultcontent), and for each image block reads its bytes, saves them content-addressed, and callssuper.stream()againstdeepseek-v4-flash-vision-expto produce a text transcription.- The image block is replaced with
[图片(视觉桥分析 by …)]\n<transcription>\n\n本地路径:<path>and the now text-only conversation is streamed todeepseek-v4-pro.
With no image, stream() forwards directly to Pro — zero overhead.
Limitations
- Transcription is lossy: great for layout / OCR / UI review, not for exact pixel coordinates.
- The transcription model is fixed to
deepseek-v4-flash-vision-exp. - The endpoint is resolved from
DEEPSEEK_BASE_URL(not the settings-pagellm-deepseekoverrides). - No fallback chain: if the transcription call fails, the image becomes a placeholder and the turn continues.
Alternatives
For a feature-rich take (fallback VLM chain, local Ollama, settings-page UI, image downscaling, classified errors), see dsh-vision-proxy. This plugin is the minimal, DeepSeek-only, zero-dependency version of the same idea.
License
Links
More in this category
liustack/modlens★ 4341
Vision bridge for text-only models: paste an image, get structured JSON evidence (OCR, layout, semantics).
ysr666/dsh-vision-router★ 1156
Free vision for text-only agents: built-in keyless vision chain plus pixel tools (Q&A, grounding, crop, pixel diff, colors, OCR, SVG trace, cutout, screenshots); paste an image to use it.
Anionex/dsh-vision-toolkit★ 903
Vision for text-only models: paste an image and the model switches to a Vision Toolkit variant for image Q&A, multi-image comparison, long-screenshot OCR, screenshot-to-UI reproduction, element grounding, and pixel diff. No API key by default — images are processed by the author-hosted free service, 100 per machine per day; configurable to your own provider.
dickpy/dsh-imagegen★ 125
AI image generation for the DSH Web GUI: text-to-image and image-to-image through a configurable OpenAI-compatible endpoint (gpt-image-2 / gpt-image-1 / dall-e-3), with an api_url/api_key settings card and a sidebar split-pane generation studio.
fandc520/dsh-comfyui★ 119
Drive a local or remote ComfyUI server from DeepSeek Harness: comfyui_run / comfyui_object_info / comfyui_workflow tools generate and edit images and videos, with a workflow library (graph extraction: per component / main flow / all), a load area with resolution auto-match, a live queue, SDXL and Wan 2.1 templates, a companion skill, and a same-origin media proxy.
sunxin-ai/dsh-design-qa★ 44
Design-fidelity QA for text-only models: a `deepseek_vision` tool borrows an eye from any OpenAI-compatible vision route, so the model can judge whether an implementation matches its mock — shipped with the benchmark behind that judgement (four fixtures, 23 injected defects, raw transcripts) and the questioning discipline it depends on.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.