dsh-vision-router README

The project's README from github.com/ysr666/dsh-vision-router. As one markdown file: README.md.

DSH Vision Router — eyes for text-only DeepSeek Harness agents

dsh-vision-router

Turn vision on when you need it — eyes for text-only agents on DeepSeek Harness. Free out of the box, no key, no Python, one command.

DeepSeek keeps thinking; the built-in free vision chain and fourteen deep tools do the seeing. When an image matters, enable the composer’s “👁 Vision” control and use image turns like ordinary tool-calling turns — grounded, measurable, repeatable.

awesome · DSH plugin dsh-recommend 🏅 certified dshbase install-tested DeepGuard audit clean featured on dsh-suite

Release v2.1.5 Verified: Node 22 + 24 License: MIT Node.js >=22 No Python

Ecosystem: DSHPlugin.app · Awesome Omni DSH Plugins · dshpluginhub.ai · dsh.plus · dshplugins.ai · dsh-market

English · 中文

💬 QQ community group: 1105463028

[!WARNING] 📌 Announcement (v2.1.5)

v2.1.5: Supports the current DSH stable 0.1.5-rc.1, reconciles Vision twins as providers change live, preserves Vision across wrapped-model switches, and hardens Web activation plus the release/security pipeline. What’s new →

Demo: paste an image, the agent locates the send button with vision_ground / vision_crop / vision_pixel_diff and answers with coordinates

Contents

Why this exists

Most DSH vision plugins bridge images to DeepSeek as text descriptions — lossy, one-shot, and blind to pixels. This plugin keeps the Host-canonical image pixels on the vision model's side and DeepSeek on the reasoning side, and makes looking at an image an ordinary tool call:

How it compares

One-line take: most dsh vision plugins turn images into text descriptions for DeepSeek (description bridge — lossy); this plugin hands the image turn straight to a vision model (routing bridge — pixel-level), with a built-in keyless free fallback.

[!NOTE] On DSH 0.1.2-alpha.1+, attachments remain Host-owned. Vision Router consumes the Host-persisted canonical image: clean single-frame 8-bit sRGB/sRGBA images inside the configured normalization limits can pass through byte-identically, while images that need orientation, color-space, metadata, animation, or size normalization may be re-encoded. Pixel tools therefore promise the Host-canonical raster, not preservation of the uploader's original encoded bytes.

Manual model switching MCP vision bridge dsh-vision-router
Image pixels ✅ available (when switched) ❌ text description only ✅ Host-canonical raster, on the image turn
Automatic ❌ ✅ ✅
Daily model untouched ❌ (whole session swapped) ✅ ✅
Provider failure recovery ❌ ❌ ✅ fallback chains
Reusable structured queries — partial ✅ JSON mode + caching
Free out-of-the-box ❌ ❌ ✅ built-in keyless endpoint
Fits dsh composition — external server ✅ one plugin row

Difference from existing dsh community projects (all excellent, each with its own focus; descriptions reflect their READMEs as of 2026-08):

Project Approach What this plugin adds
dsh-vision-sidecar Pre-describes images with an external VLM; the description joins the session as a message to DeepSeek; LLM7.io anonymous endpoint by default (OVHcloud listed as a no-key alternative) Description bridge; this plugin adds image routing, with vision_describe covering descriptions on demand
dsh-vision-proxy Wraps a provider route and transcribes images into text in the request stream Transcription bridge; this plugin wraps no provider — it rewrites routing through agent/request waterfalls
dsh-vision-provider Registers DeepSeek + Vision combined routes: images are described by the chosen vision model before reaching DeepSeek Two-model bridge idea; this plugin adds automatic routing, fallback chains and tools on top
modlens The first dsh vision plugin; reuses local Claude Code/Codex/OpenCode/Pi logins as vision engines Engine-reuse idea; this plugin ships its own provider chain and depends on no other local CLI
dsh-vision-toolkit Ten intent-aware visual tools (Q&A/OCR/pixel verification/UI restoration), called explicitly on demand Broader tool set; this plugin adds whole-turn auto-routing and a keyless free fallback
dsh-tool-vision An inspect_image tool plus an agent/pre-step waterfall bridge (pasted images become tool hints before entering the log) Similar waterfall bridge; this plugin adds turn routing, fallback chains, caching and the free endpoint

Design lineage

The deep-vision tool layer and UI-restoration workflow in this project were informed by Anionex/agent-vision-toolkit and its native DSH implementation Anionex/dsh-vision-toolkit. In particular, this project drew on their intent-driven tool selection, progressive tool exposure, pixel-diff verification loop, and parts of the visual-tool decomposition and naming, including long-screenshot OCR, foreground extraction, and HTML screenshot tooling.

All code in dsh-vision-router is independently implemented. On top of those referenced design ideas, this project independently developed its turn-level/tools-first vision routing, DSH admission/wrapper integration, multi-backend provider and failure fallback chains, built-in free vision chain, attachment/image-memory handling, caching, and related runtime resilience mechanisms.

We appreciate Anionex's prior work and the broader DSH community. Clear attribution and independent iteration can coexist; both help keep the DSH ecosystem open, collaborative, and healthy.

Acknowledgements

This project borrows ideas from all of the above — especially the keyless free-endpoint exploration (LLM7.io and OVHcloud anonymous tiers) by dsh-vision-sidecar. Thanks to the authors of dsh-vision-proxy, dsh-vision-provider, modlens, dsh-vision-toolkit, and dsh-tool-vision.

Quick start

1. Install the plugin

For normal npm/npx installs, installation is a single command:

npx @deepseek-ai/dsh plugin --profile web add dsh-vision-router

[!WARNING] If this profile already loads community plugins manually through cordis.patch.yml, do not mix that legacy setup with dsh plugin add / dsh plugin list: current DSH CLI behavior can also append bundle-patch dependencies to dsh.profile.bundles, causing those plugins to register twice. Migrate the existing manual plugin rows to bundle-managed loading first, or keep using the manual installation path. See deepseek-harness discussion #2889.

[!NOTE] Third-party dsh-web-plugin-manager / dshpm v0.4.2+ is also compatible: its quality gate now correctly allows @deepseek-ai/schemastery as a runtime dependency. The official DSH CLI above remains the recommended install path.

If you run DeepSeek Harness from a source checkout with pnpm, use the workspace script instead — dsh is not necessarily on your shell PATH:

cd deepseek-harness
pnpm dsh plugin --profile web add dsh-vision-router

If you already installed the DSH CLI globally and dsh is on PATH, the shorter dsh ... form works too. After installation, start or reload DSH Web as you normally do.

[!NOTE] If you install the plugin into a Web process that was already running long-term, let that DSH Web process reload once so the plugin bundle itself is discovered. After the plugin is loaded, adding/removing models or changing wrapper scope hot-updates without further DSH restarts.

2. Pick your normal model, then enable “👁 Vision” when needed

The stock model selector in the lower-right corner still chooses your brain/conversation model — DeepSeek, Qwen, or any other ordinary route. Vision Router’s generated “+ Auto Vision” wrappers remain real Host routes for image admission, but are hidden from the stock picker and /model when ownership can be established safely.

When you need image input, explicitly click “👁 Vision” beside the composer:

[!IMPORTANT] Pasting or uploading an image does not enable Vision automatically. Before sending an image, make sure the control shows 👁 Vision ✓.

The real wrapper route is still present underneath to satisfy DSH image admission. Hiding is presentation-only and fails open: if the browser cannot confidently prove a route belongs to Vision Router, that route remains visible rather than risking hiding a third-party provider.

3. Paste or upload the image

With “👁 Vision” enabled, paste or upload an image normally. By default the complete vision tool schema is stable from session start, so the agent can immediately use vision_describe, vision_ground, vision_crop, and the rest across multiple steps when needed.

If the session already contains images, DSH may reject switching from a vision wrapper back to a text-only route. Vision Router does not bypass that Host rule: it shows a transient error using the same interaction style as the stock model selector, keeps the real current model unchanged, and leaves 👁 Vision ✓ reflecting the actual state so the session stays usable.

The built-in anonymous OVH vision fallback is already configured, so normal image use needs no signup or API key. The lower-right chat picker selects only the brain/conversation model; vision backends do not belong there. Advanced options live under Settings → Vision Router: each vision-backend row may select any callable generative user model already configured under Settings → Models. DSH image-capability metadata is advisory only: undeclared or text-only-labelled models remain selectable and show a warning. At runtime Vision Router always tries the provider's registered DSH adapter first — including WebSocket, RPC and private transports — and falls through on a real failure. The direct compatibility bridge is used only when an http(s) OpenAI Chat Completions endpoint is positively identified. Leaving every user row empty is valid; the OVH chain remains the final fallback. Vision HTTP is an internal transport route, not a model group users should select.

See it in action

Left: an image turn — the user sends a picture, the agent calls vision_describe through the free chain and answers. Right: the finished structured answer.

A conversation turn in which the agent looks at an uploaded image through vision_describe. The agent's structured answer describing the image content.

Free vision key channels

The built-in OVH fallback is anonymous by design, and OVH caps anonymous use at 2 requests/minute per IP per model. If that feels tight, every channel below offers free vision models with much higher quotas — all of them are free to register, and none charges for the free tier. Free policies rotate often; treat this table as an August 2026 snapshot and double-check each provider's console before relying on it.

Channel Free vision model(s) Free quota CN direct? Where to get the key
OVHcloud AI Endpoints (access key) Qwen2.5-VL-72B-Instruct — the same endpoint the built-in fallback uses 400 req/min per project per model (vs 2 anonymous) ✅ OVH account → Public Cloud project (attach a payment method; free models are not charged) → AI Endpoints access key
Zhipu (bigmodel.cn) glm-4.6v-flash · glm-4.1v-thinking-flash · glm-4v-flash — three permanently free models; chaining them triples capacity uncapped tokens ✅ open.bigmodel.cn → API keys
DashScope (Aliyun) qwen3-vl-flash (limited-time free) and the Qwen-VL series new users: 1M tokens per model series / 90 days ✅ bailian.console.aliyun.com
Intern AI (Shanghai AI Lab) internvl-latest · internvl3.5-latest 30 RPM, 90M tokens/month ✅ chat.intern-ai.org.cn
Groq meta-llama/llama-4-scout-17b-16e-instruct (native multimodal, up to 5 images) 30 RPM / 14,400 req/day, no card ❌ proxy console.groq.com
Google AI Studio gemini-2.5-flash · gemini-2.5-flash-lite 10–30 RPM / 500–1,500 req/day ❌ proxy aistudio.google.com
NVIDIA NIM meta/llama-3.2-11b-vision-instruct · nvidia/nemotron-nano-12b-v2-vl 40 RPM, no card ⚠️ build.nvidia.com
OpenCode Zen mimo-v2.5-free (vision + code) 30 RPM / 500 req/day ⚠️ opencode.ai/zen
OpenRouter google/gemma-4-26b-a4b-it:free · google/gemma-4-31b-it:free 50 req/day on unpaid accounts ❌ proxy openrouter.ai

Any of these channels can join the vision chain as an httpProviders entry (key in the matching environment variable or ~/.dsh/.credentials.yaml), and the chain tries your entries before the anonymous fallback.

[!NOTE] Free-tier policies change without notice — Cerebras retired its free tier in July 2026 (now a one-time $5 credit), SambaNova's free tier is down to 20 requests/day, and Hugging Face's is $0.10/month. Third-party “:free relay” aggregators are deliberately not listed: they rotate quickly, lack SLAs, and some resell quota in ways that violate upstream terms.

Highlights

dsh-vision-router (ysr666/dsh-vision-router)

Searching Database…

What is this?dsh-vision-router is a plugin for DeepSeek Harness (DSH) that gives text-only DeepSeek agents the ability to 'see' images. It routes image turns to a free built-in vision chain and fourteen pixel-level tools (Q&A, grounding, crop, pixel diff, colors, OCR, SVG trace, cutout, screenshots) while DeepSeek keeps doing the reasoning.
Is this a standalone app or a plugin I add to DeepSeek Harness?It is a DSH plugin installed with 'dsh plugin add', not a separate application — it patches the DSH composition to add a vision wrapper, a 'Vision' toggle in the composer, and routes image turns to vision tools.
How do I install and enable it?Run 'dsh plugin add' via the official DSH CLI (or the pnpm workspace script from a source checkout), reload DSH Web once, then click the '👁 Vision' toggle next to the composer whenever you want to send an image.
Do I need Python or an API key for the vision tools to work?No. The whole pipeline (downscale, grounding, crop, pixel diff, palette, OCR, SVG trace, cutout, HTML screenshot) runs on sharp/potrace/tesseract/system Chrome, and the built-in OVHcloud anonymous endpoint works without any account or key.
Is the free vision fallback unlimited?No, the built-in keyless OVHcloud fallback is capped at 2 requests per minute per IP per model (roughly 10 RPM across its five models); you can register free provider keys with much higher quotas if that limit is too tight.
How is this different from other DSH vision plugins?Most DSH vision plugins describe an image as text and hand that description to DeepSeek (lossy, one-shot); dsh-vision-router instead routes the whole image turn to a real vision model and lets the agent keep calling vision tools iteratively, while DeepSeek's text turns stay untouched.
Does DeepSeek still do the reasoning when Vision is on?Yes — the vision model is only called as the 'eyes' on demand for image turns; DeepSeek itself remains the reasoning model, and plain text turns are unaffected in model, cost, and context.
What tools does the agent get once Vision is enabled?Fourteen pixel-level tools including visiondescribe, visionground, visioncrop, and visionpixeldiff, plus OCR, SVG trace, cutout, color palette extraction, and HTML screenshots, which the agent can chain across multiple steps.
Can I use my own vision model instead of the free fallback?Yes — under Settings → Vision Router you can assign any callable generative model already configured in Settings → Models; user-provided models are tried first, and the OVH chain is only the final fallback.
Creator
ysr666
Size
8.3 MB
Stars
1.2K
Age
2mo
Commits · 90 Days