Gives text-only models vision: forwards user images to an OpenAI-compatible vision model and shows the descriptions in a Web UI right panel.
Install
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:jyh20030112/dsh-visual-plugin
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. Only install sources you trust, and pin a commit (github:owner/repo#sha).
README
A plugin for DeepSeek Harness.
Features
- Automatic description — the wrapper adapter recursively describes uploaded images and image-bearing tool results in a model-bound copy while the visible chat keeps the originals.
- In-conversation lifecycle cards — automatic analysis appears immediately below its source image and settles in place as success or failure; one logical analysis produces one card.
- Intent-aware prompts — send an image with a question and the description is generated from your own words.
vision_describetool — the model can answer a later follow-up question when the automatic description lacks the requested detail.- Right-side panel — configure endpoint / model / key, test the connection, watch one latest description per image with thumbnails (2s auto-refresh), read remaining balance.
- Secrets stay secret — the API key lives in the harness credentials seam (write-only, never echoed).
How it works
image in composer or tool result → wrapper finds it at any content depth → visible message keeps the image
→ adapter stream → readImage → vision API → "[视觉描述] …" in the private model request only
→ text-only model answers → /vision-bridge/recent → panel thumbnail + description (2s poll)
Unconfigured or failed calls degrade to a [视觉描述失败] <reason> placeholder, so the conversation never breaks.
Quick start
dsh plugin --profile web add dsh-visual-plugin # or: github:jyh20030112/dsh-visual-plugin
When developing this checkout against a local DeepSeek Harness source tree, install the local package instead:
cd /absolute/path/to/dsh-visual-plugin
npm run bootstrap
dsh plugin --profile web add link:/absolute/path/to/dsh-visual-plugin
bootstrap automatically finds a sibling or ancestor-adjacent Harness checkout.
For another layout, set its location explicitly:
HARNESS=/absolute/path/to/deepseek-harness npm run bootstrap
Restart dsh web, then:
- Open the panel from the sidebar footer (视觉桥接 / Vision Bridge).
- Configure the endpoint URL, a vision model name, and the API key; click 保存配置 → 测试连接.
- In the model picker, select provider DeepSeek (Vision) — the plugin's wrapper adapter declares image input so the gateway admits uploads.
- Send an image (optionally with a question). The model answers from the generated description and the panel shows the thumbnail + description within ~2s.
Reference local model
This project is developed and tested with a locally deployed
Empero AI Qwythos-9B
as the vision backend. Its SGLang deployment can expose an OpenAI-compatible
/v1 endpoint; enter the endpoint URL and the server's registered model name
(for example, Qwythos) in the Vision Bridge panel. The plugin is not tied to
Qwythos-9B and can use any compatible vision model.
Uninstall
dsh plugin --profile web remove dsh-visual-plugin
Restart dsh web. The command forwards to pnpm remove inside the profile, and the bundle layer list reconciles to drop the plugin automatically.
Project layout
src/
index.ts host plugin: vision orchestration + vision_describe + HTTP routes
vision.ts OpenAI-compatible vision calls (describe / test / balance)
model-messages.ts model-bound image rewrite + per-attachment cache
description-policy.ts intent-first prompt + low-information retry
config.ts settings namespace `vision-bridge` + schema
adapter.ts deepseek-vision wrapper adapter (admission + private rewrite boundary)
client/ browser half: panel / sidebar toggle / automatic + tool cards / locales / css
cordis.patch.yml bundle patch layer
Build
npm run bootstrap && npm run typecheck && npm run build # needs a local harness checkout
Prebuilt lib/ is committed, so consumers never build.
CI/CD
ci.yml verifies artifacts and the pack contents on every push/PR. release.yml (tag v*) checks the version, packs, creates a GitHub Release, and publishes to npm.
Resources
Thanks
- HsiangNianian — for their help and insights during development.
- dsh-auto-continue — a DSH Web UI plugin that auto-resumes interrupted requests with 「继续」 (error classification, adaptive backoff, browser notifications); a handy companion.
License
Links
More in this category
Mars-Sea/dsh-commandcode-provider★ 9
Unofficial Command Code LLM provider: registers a `commandcode` route with a live model catalog and reasoning-effort support.
feibi-mochi/deepseek-harness-wallet★ 8
Multi-provider wallet chip: official DeepSeek balance, per-session cost & tokens, third-party token totals, recharge shortcut, low-balance alerts.
franksong2702/dsh-codex-connect★ 7
Connect ChatGPT OAuth and OpenAI Codex models to DeepSeek Harness, with opt-in search and image tools.
Noob-stupid/dsh-github-login★ 4
Visual GitHub login without a terminal: in-window device flow, token synced into the gh CLI, and host status/launch endpoints.
btspoony/dsh-llm-fallbacks★ 4
Role-based LLM retry & fallback strategies.
omdsh-dev/Qwen-MM-Plugins★ 4
Qwen multi-modal plugin support.