dsh-vision-hub
Vision hub plugin for DeepSeek Harness. Pixel-level vision tooling, a five-tier provider fallback chain, automatic image-model routing, and a chat-side image bridge with inline previews — in one plugin.
dsh-vision-hub is the merged successor of dsh-vision-router (14 vision_* tools, provider resilience) and dsh-tool-vision (image bridge + inspect_image) — both original codebases are preserved and maintained here.
Features
14 pixel-level vision tools
vision_describe · vision_ground · vision_detect · vision_crop · vision_pixel_diff · vision_ocr · vision_trace · vision_colors · vision_extract_foreground · vision_html_screenshot · vision_screenshot · vision_long_screenshot_ocr · vision_present · vision_materialize
Plus the inspect_image tool (dsh-tool-vision compatible) for ad-hoc image inspection with your configured vision model.
Five-tier provider fallback chain
- User-configured models (your
vision_*model settings) - Local Ollama
- Local LM Studio
- Custom HTTP endpoints (OpenAI-compatible)
- OVH anonymous free endpoint as a last-resort fallback
The resilience layer (lib/vision-resilience.js) adds a failure taxonomy, deadline budgets, a circuit breaker, per-turn memory, and structured errors so a flaky endpoint degrades gracefully instead of failing the call.
Content-hash caching & downscaling
Identical images are served from cache; oversized inputs are downscaled before being sent to a provider.
Image bridge + inline previews
When the active model is text-only (bridgeTextOnly, default on):
- Pasted images are exported to disk and replaced with a durable text hint stamped with an invisible
\u200b[bridge]marker (the hint survives in chat history and keeps request reconstruction intact). - The browser client scans for marker-stamped hints and renders inline thumbnails via a loopback route, with a lightbox on click, a configurable rescan interval, and a hide-hint-on-load option.
- Multimodal models listed in
multimodalModelskeep receiving raw image blocks.
Settings card
A single settings card in the plugin settings UI covers both the router tooling (progressive tools, provider chain, caching) and the image bridge (export dir, preview, scan interval). The native EAC settings page is untouched.
Install
dsh plugin add xing666173/dsh-vision-hub
Requires a DeepSeek Harness profile with the dsh-settings / dsh-tools / dsh-llm-deepseek / dsh-anonymous-user-id services (standard in desktop profiles). Restart the harness after installing.
Quick start
- Ask for the model to inspect an image: the bridge exports it and the hint points at
inspect_image. - Use
vision_describe/vision_ocretc. directly when you want a specific tool. - If every provider is unreachable, the OVH free fallback keeps the call working with a clear warning.
Configuration
See the dsh-vision-hub settings card. Highlights:
| Key | Meaning |
|---|---|
progressiveTools |
Expose tools progressively (opt-in; recommended off for long sessions) |
bridgeTextOnly |
Bridge images to text hints on text-only models (default true) |
bridgeExportDir |
Where bridged images are exported (default <tmp>/dsh-vision-bridge) |
bridgePreview |
Render inline previews of bridged images (default true) |
bridgePreviewScanIntervalMs |
Rescan interval for new hints (default 2000) |
bridgePreviewHideHint |
Hide the text hint once the preview loads |
inspectModel / baseURL / apiKey |
inspect_image provider settings (dsh-tool-vision compatible) |
multimodalModels |
Model IDs that keep receiving raw image blocks |
Development
pnpm install
pnpm test # 590 tests (583 pass / 7 environment-skipped)
The test suite covers provider chain construction, resilience behavior, caching, bridge export semantics, preview-route security (containment, size cap, host checks, missing-file 404, NTFS-ADS legacy filenames), client marker scanning, manifest/bundle invariants, and the rc6/rc7 contract seam.
License
MIT — three-way attribution: ysr666 (dsh-vision-router) · Scorp1o117 (dsh-tool-vision) · xing666173 (merge & maintenance). See LICENSE.
v0.1.0 — see CHANGELOG.md.
No comments yet. Be the first to write one.