Skip to main content

dsh-vision

7Stars1Forks1Issues0Watchers

Adds visual capabilities to plain-text DeepSeek: defaults to Doubao Web free channel, supports automatic fallback across multiple channels, and enables structured evidence memory reuse across conversation turns.

Evidence5/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki
Language
TypeScript
License
MIT
Branch
main
antigravitydoubaodshdsh-plugingeminiimage-recognitionmultimodalocr

Install

cmdweb profile
$ dsh plugin --profile web add dsh-vision-web

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin 54xkeee/dsh-vision for me: review the repository at https://github.com/54xkeee/dsh-vision first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

One-Line Description

Give pure text DeepSeek models visual capability: convert images into "seeable" placeholders and expose a vision tool, allowing the model to proactively call image recognition during conversations. Defaults to Douban Web channel, works with browser login, no API key required.

Core Capabilities

  • Image Placeholder: Convert image blocks in user messages into text placeholders, feeding them to DeepSeek which originally only accepts text, avoiding "image paste rejected"
  • Register Vision Tool: Enable proactive model calls for single/multi-image/OCR/region detail/multi-image comparison
  • Auto Detail Upgrade: When detail=auto, first run standard check, automatically run high detail check if judged as complex image
  • Visual Evidence Memory: Recognition results written to session timeline, cross-turn reuse, auto-restore after session compression
  • Content Hash Cache: Same image + same question + same channel + same detail level = recognize only once per process, avoid duplicate charges or re-runs
  • Multi-channel Auto-fallback: Douban Web / Antigravity IDE quota / Gemini API / Cockpit reverse proxy / aicode direct / generic IDE CLI (Claude Code, Gemini CLI, etc.), auto-select per config

Technical Implementation

  • Language: TypeScript (server + React client)
  • Key Dependencies: @deepseek-ai/dsh-tools (register tools), @deepseek-ai/schemastery (Config validation), @deepseek-ai/dsh-llm (message construction)
  • Architecture Pattern: Dual-end plugin — server src/index.ts registers LLM adapter and vision tool and exposes /api/vision, client src/client/plugin.tsx mounts "Vision" panel in session header; Douban Web channel additionally requires running bridge.mjs on Windows side (puppeteer-core drives logged-in Chrome)
  • Entry Files: Server src/index.ts (exports apply, Config), client src/client/plugin.tsx (exports apply), queue bridge bridge.mjs

Use Cases

DSH users paste images in conversations wanting DeepSeek to help analyze, but the model itself only accepts text. For example: "Explain this error screenshot", "Compare these two UI screenshots which is better", "OCR this chat record". If you don't want to configure API key but want image analysis, just log in to Douban once on the default channel; if you have Antigravity/Gemini/Claude Code subscription, you can switch channels to use your quota.

Prerequisites and Compatibility

DependencyMin VersionDescription
DSH>= 0.1.0engines.dsh declared
Node>= 20engines.node declared
Runtime PlatformWSL + Windows browserDefault Douban Web channel depends on Windows-side bridge.mjs driving Chrome; non-WSL environments can still install but must use API channel
System CallsWindows curl.exe, PowerShellAPI channel uses /mnt/c/Windows/System32/curl.exe; Antigravity channel auto-discovers language_server.exe requires PowerShell
System DirectoryC:\TempBridge and API channels use ASCII paths for temp files, avoiding Chinese usernames

Installation

dsh plugin --profile web add dsh-vision-web

Configuration Options

ConfigTypeDescriptionDefault
defaultChannelEnumDefault channel: auto (use Antigravity if configured, otherwise Douban web) / web (Douban) / ide (IDE CLI) / antigravity / genlang / cockpit / aicodeauto
defaultModelStringPanel default model name (pro keyword auto-selects Antigravity pro tier)gemini-3.7-flash
webChannel.enabledBooleanDouban Web channel toggletrue
webChannel.queuePortNumberWSL-side queue service port, bridge.mjs connects to this by default9340
webChannel.timeoutMsNumberTimeout waiting for web AI response (ms)240000
antigravityWorkspace / antigravityProjectId / antigravityLsExe / antigravityWindowsHome / antigravityBrainDirStringAntigravity IDE channel config, all empty = channel disabledAll empty strings
genlangKeyStringGemini Developer API key (AIza… or AQ.)Empty
cockpitBaseUrl / cockpitKeyStringCockpit reverse proxy address and keyhttp://127.0.0.1:65386 / Empty
oauthAccount / oauthClientId / oauthClientSecretStringOAuth credentials needed for aicode direct (user-provided, plugin doesn't include)All empty
ideCli.enabled / ideCli.exe / ideCli.argsTemplate / ideCli.imageRefTemplate / ideCli.timeoutMs / ideCli.cwdBoolean/String/String/String/Number/StringGeneric IDE CLI channel (Claude Code / Gemini CLI / Qwen Code / MiMo, etc.), configure driver without code changesfalse / empty / -p {prompt} / {path} / 120000 / empty
visionUpstreamsString ArrayUpstream LLMs for conversation flow wrapper, registers a vision adapter for each upstream["deepseek"]
upstreamProviderStringLegacy single upstream field for backward compatibilitydeepseek
cacheMaxNumberIn-process LRU cache entry limit64
manifestMax / rehydrateMaxNumberVisual memory list and post-compression restore entry limits12 / 4
allowedImageDirsString ArrayIf non-empty, only allow image_path to read local images from these directories[]
curlPathStringPath for WSL to call Windows curl.exe/mnt/c/Windows/System32/curl.exe

Local Override: All configs can be overridden in ~/.dsh/dsh-vision.json as JSON (loaded by loadOverrides, path uses $DSH_HOME or ~/.dsh).

FAQ

Q: Can it be used immediately after installation?

A: The default channel is Douban Web (zero cost, no API key). In WSL environment, you need to run node bridge.mjs once on the Windows side, and log in to Douban in that Chrome. After that, you can paste images.

Q: Can it work without a Windows browser?

A: Yes, but you need to switch channels. Configure genlangKey (Gemini API) or cockpitKey (Cockpit reverse proxy), then change defaultChannel to the corresponding channel; Antigravity channel is only available when that IDE is running.

Q: Will the same image with repeated questions cause duplicate charges or re-runs?

A: No. The plugin calculates cache key by image byte hash + prompt + detail level + mode + region + model + channel + prompt version; same process + same request = recognize only once (src/vision-core.ts:124).

Q: What's the maximum number of images per request?

A: Maximum 8 images, single image max 8MB, total max 32MB, HTTP request body max 48MB; OCR/region/comparison modes have additional validation (src/index.ts:731,902-904,1004).

Q: Why doesn't the web channel connect directly to Chrome on WSL?

A: WSL cannot actively connect to Windows ports by default, so the plugin runs a queue service on WSL side (default 127.0.0.1:9340), polled actively by bridge.mjs on Windows side to drive the logged-in Chrome (src/web-channels.ts:43, README.md:113-127).

Q: How to uninstall?

A: Config file is ~/.dsh/dsh-vision.json (loaded by loadOverrides); delete this file to clear local key/path overrides. Plugin itself is uninstalled via dsh plugin --profile web remove dsh-vision-web (src/index.ts:109-122).

Learning Curve

Beginner — works out of the box with zero config on WSL + Windows browser combination; switching to API/Antigravity/IDE CLI channels requires writing some YAML.

Known Issues and Limitations

  • Single image 8MB / single request total 32MB / HTTP request body 48MB limits, exceeding returns error (src/index.ts:902-904,1004)
  • Maximum 8 images per request; comparison mode requires at least 2 images; region detail requires region coordinates or natural language (src/index.ts:731-733)
  • Default Douban Web channel requires bridge.mjs continuously running on Windows side, and that Chrome must be logged into Douban; unlogged bridge reports "Douban input box not found"
  • Antigravity channel depends on running Antigravity IDE and language_server.exe; PID/port/CSRF auto-discovered per call, but if IDE is completely closed it errors directly (src/index.ts:320-323,509)
  • API channel depends on WSL calling Windows curl.exe (default /mnt/c/Windows/System32/curl.exe), ensure path exists in network-restricted environments
  • Gemini API overload (503) triggers auto-retry 2 times, only then returns error to model if still failing (src/index.ts:211-229)
  • aicode channel (oauthAccount) returns 500 when Antigravity IDE workspace binding is needed; plugin suggests switching to cockpit channel (src/index.ts:279-281)
  • Client panel doesn't provide advanced editing (crop/rotate) besides "delete single image" shortcut; pre-process externally
  • Error messages auto-truncate (e.g., stderr limited to 500 chars, agentapi errors limited to 1200 chars) for log readability, but full logs may be needed for troubleshooting (src/index.ts:141-148)

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/54xkeee/dsh-vision)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory