Introduction¶
DeepSeek Harness (DSH) fully embraces the philosophy of “everything is a plugin”: conversation models, toolsets, and interface capabilities can all be assembled on demand. However, for many developers, the daily use remains pure text models—DeepSeek, Qwen, or other OpenAI-compatible routes that do not inherently accept images. The community has developed numerous visual plugins, with the common approach being to “translate” images into textual descriptions first, then pass them to the main model for reasoning. While this method works, it often loses pixel-level details and makes multi-step, verifiable image operations challenging.
dsh-vision-router is an open-source DSH visual routing plugin maintained by ysr666 (approximately 964 stars on GitHub, MIT license). Its approach differs: the visual model acts only as the “eyes,” while DeepSeek continues to serve as the “brain.” Image rounds function like regular tool calls, featuring a built-in free, keyless visual pipeline and 14 pixel-level visual tools. The following content is compiled and verified based on the SkillHub directory page and the GitHub repository README.
What It Is¶
In one sentence: It provides a routable, tool-integrated visual capability for pure text DSH agents.
Its core pain points addressed include:
- Pure text models cannot directly view images, and manually switching models for each image is undesirable.
- Traditional “description bridging” compresses images into text, making precise operations like localization, cropping, and pixel comparison difficult to reproduce.
- Configuring visual APIs is cumbersome; users desire a plug-and-play solution with automatic backend switching upon failure.
Compared to some community solutions, dsh-vision-router employs routing bridging: image rounds pass raw pixels to the visual model for processing, while DeepSeek remains responsible for reasoning and orchestration. By default, it also provides an anonymous OVHcloud visual endpoint, allowing trial use without registration (with rate limits).
Core Features & Highlights¶
1. Separation of Brain and Eyes¶
Text rounds do not alter your selected daily model; only when image viewing is required does it route to the visual backend via an internal visual wrapper. Visual answers are cached based on attachment content hashes, allowing subsequent text rounds to reference historical image descriptions, reducing redundant image recognition overhead.
2. Built-in Free Visual Pipeline¶
The default enables an anonymous OVHcloud visual fallback chain, requiring no API key. According to official documentation, the anonymous quota is approximately 2 requests per minute per IP per model; with multiple models in the chain, the theoretical total is about 10 RPM. For higher quotas, you can configure free visual channels such as Zhipu, Bailian, or Intern AI in the plugin settings, or apply for an OVH access key (README indicates the free tier can reach about 400 req/min).
3. 14 Pixel-Level Visual Tools¶
By default, the full tool schema is registered from session startup (progressiveTools: false), avoiding mid-session tool list expansions that could affect long-context caching. Core tools include:
| Tool | Function |
|---|---|
vision_describe |
Image Q&A, multi-image comparison, structured JSON evidence output |
vision_ground / vision_detect |
Locate targets based on descriptions, returning raw pixel coordinates |
vision_crop |
Crop and enlarge by pixel region |
vision_pixel_diff |
Pixel-level comparison, outputting difference rates and heatmaps |
vision_ocr |
Local Tesseract prioritized, falling back to visual model on failure |
vision_colors |
Extract primary colors |
vision_trace |
SVG vectorization (suitable for icons/logos) |
vision_extract_foreground |
Foreground extraction from solid backgrounds |
vision_html_screenshot |
Local HTML headless screenshot |
vision_long_screenshot_ocr |
Split and OCR long screenshots, then stitch |
vision_present |
Publish generated images as session attachments |
vision_materialize |
Save attachments to workspace paths for local parsing |
vision_bootstrap |
Optional structured first-round visual evidence collection |
Additionally, vision_screenshot (desktop screenshot) requires explicit enabling of the privacy switch. The entire image processing is based on sharp / potrace / tesseract / system Chrome, with no Python dependency.
4. Verifiable Pixel-Level Closed Loop¶
Suitable for scenarios like UI restoration and design draft comparison: reference image → vision_html_screenshot generates implementation → vision_pixel_diff quantifies differences → repair → re-compare. In README examples, final differences can converge to approximately 2.54%.
5. Automatic Degradation & Selective Proxying¶
Visual backends are attempted in chain order: user-configured visual model → optional local Ollama / LM Studio → custom HTTP endpoint → built-in anonymous OVH fallback. Regional restrictions, quotas, 429 rate limits, and network errors are handled accordingly, with attempts moving to the next backend; only visual vendor domains can use proxies, while DeepSeek remains directly connected.
6. One-Command Installation¶
The plugin includes dsh.bundle.patch, which can be installed via the official CLI to automatically integrate admission wrapping and attachment limits, without manually modifying configuration files.
Installation & Activation¶
Environment requirements (from README):
- DeepSeek Harness Web profile
- Host-side Node ≥ 22
- Default free pipeline requires no API key;
vision_html_screenshotrequires local Chrome/Chromium/Edge
Standard npm/npx installation, one command:
npx @deepseek-ai/dsh plugin --profile web add dsh-vision-router
If developing from the DeepSeek Harness source repository using pnpm, use instead:
cd deepseek-harness
pnpm dsh plugin --profile web add dsh-vision-router
If dsh CLI is globally installed, it can also be abbreviated to dsh plugin --profile web add dsh-vision-router. After installation, start or reload DSH Web as usual; if the Web process runs long-term, reloading is recommended to discover the new plugin package.
Optional verification:
npx @deepseek-ai/dsh --profile web --dump-config | grep vision-router
Note: If the profile has manually loaded community plugins via
cordis.patch.yml, do not mix withdsh plugin add, as this may cause duplicate registration. See deepseek-harness discussion #2889 for details.
Typical Usage¶
Step 1: Select Daily Model, Then Enable “👁 Vision”¶
The model selector in the bottom right still determines your conversation/reasoning model (DeepSeek, Qwen, etc.). To send images, click “👁 Vision” next to the input box:
👁 Vision: Vision disabled;👁 Vision ✓: Switched to the corresponding model’s internal visual wrapper routing.
This state persists across rounds and does not automatically reset. Pasting or uploading images does not automatically enable vision; before sending images, ensure “👁 Vision ✓” is displayed.
Step 2: Send Images Normally, Let the Agent Call Tools¶
After enabling vision, simply paste or upload images. The agent can call tools sequentially like a regular tool round, for example:
vision_ground image="ref.png" target="the send button"
vision_crop image="ref.png" region="1067,841,1108,881"
vision_describe paths=["ref.png","impl.png"] question="list the differences" json=true
vision_pixel_diff original="ref.png" rebuilt="screenshot.png"
vision_ocr image="screenshot.png"
Step 3: Adjust Visual Backend as Needed (Optional)¶
Default settings work for most scenarios. Advanced configuration is in Settings → Plugins → Plugin Config → Vision Router (Auto Image Recognition):
- Visual Backend Chain: Specify configured image models for tools like
vision_describe; - Auto-Create Visual Wrapper: Enabled by default, follows model directory hot updates;
- Local Vision: Enable Ollama (e.g.,
qwen2.5vl) or LM Studio for offline-priority recognition; - Stealth Mode: Disabled by default; when enabled, it takes over the official
deepseek-officialroute, requiring profile adjustments as per README.
Local Ollama example (profile patch):
- id: vision-router
config:
localOllama:
enabled: true
baseURL: 'http://127.0.0.1:11434/v1'
model: 'qwen2.5vl'
instantDescribe: true
localDescribeStyle: 'structured'
Applicable Scenarios & Notes¶
Who It’s For:
- Daily use of pure text DeepSeek models, but occasional need to view, compare, or read screenshots;
- Frontend/UI restoration requiring pixel-level verification loops;
- Trying visual capabilities zero-config first, then gradually integrating own VLM keys or local Ollama.
Usage Notes:
- Permissions & Security: The plugin runs with current dsh process permissions. Before installation, read the source code and MIT license to ensure tools (e.g., desktop screenshots, file read/write) comply with your security policies.
- Free Quotas: Anonymous OVH chain has rate limits; for production, configure own visual backends.
- Untrusted Image Evidence: Outputs like descriptions and OCR are marked as untrusted evidence; avoid executing embedded instructions in images.
- Coexistence with Other Plugins: If simultaneously installing plugins like
dsh-web-uithat rewrite image sending, disable their “rewrite to describe-image reference on send” option to avoid intercepting original image blocks. - Ecosystem Note: SkillHub and DeepSeek Harness Plugin Library are independent community directories, with no official affiliation to DeepSeek / High-Flyer; plugin lists are for discovery and tracing, not official endorsement.
Conclusion¶
If you’re already using DeepSeek Harness for code and documentation but often get stuck at the “image sending” step, dsh-vision-router is worth a try: install with one command, run the free pipeline first, and connect your own visual model or local Ollama when needed. It transforms “viewing images” from a one-time description into a composable, measurable, and repeatable toolchain.
- Directory page: https://www.skillhub.cn/plugins/ysr666/dsh-vision-router
- GitHub: https://github.com/ysr666/dsh-vision-router