Vision & Multimodal
dsh-vision-opencode
poiuyjie/dsh-vision-opencode · ★ 12
Adds a configurable vision model to text-only main models: a vision_read_image tool, a composer-bar vision-model selector, and automatic image-to-text conversion for text-only routes.
安装
dsh plugin --profile web add github:poiuyjie/dsh-vision-opencodeGitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
dsh-vision-opencode
DeepSeek can't "see" images? OpenCode multimodal workaround: give your text-only main model a configurable vision model.
What it does
- Image pasted in chat → the vision model (e.g. MiMo-V2.5) converts it to text first, then your main model replies as usual — no model switch needed
- "Vision model" dropdown next to the input box, auto-listing every image-capable model across your providers
- Manage models under Settings → Vision;
vision_read_imagetool /vision-image-analysisskill for OCR, charts, screenshots - Resilience: 60s per-call timeout, 1 retry, and a placeholder fallback so the turn never dies
Install
Option 1 (native DSH, recommended):
dsh plugin --profile web add -w github:poiuyjie/dsh-vision-opencode
Option 2 — one-click script (install.sh Ubuntu / install.ps1 Windows):
curl -fsSL https://raw.githubusercontent.com/poiuyjie/dsh-vision-opencode/main/scripts/install.sh | bash
Restart dsh, then pick a vision model in the dropdown.
Uninstall: dsh plugin --profile web remove -w dsh-vision-opencode (or uninstall.sh).
Back up image conversations before uninstalling — old image chats may no longer reach a text-only main model afterwards.
Configuration
Edit ~/.dsh/settings.yaml (or use Settings → Vision):
vision-opencode:
provider: '' # vision model provider; empty = not chosen
model: '' # vision model id; empty = not chosen
autoConvert: true # auto-convert toggle; set false if problems
Text-only main routes are auto-detected and get image conversion; native multimodal routes keep the stock DSH path.
Turning off reasoning for the vision model
Each model has a "Reasoning" row in Settings → Vision:
| Option | Meaning |
|---|---|
| Default | Follow the provider's default level — think normally |
| Off | No thinking — faster and cheaper. Only when the provider really declares off (e.g. hy3 off:"none") |
| Force off | Best-effort at disabling thinking (e.g. reasoning_effort:"none"), not guaranteed; models without a declared off (like MiMo) get this |
Very few models have a real "Off" entry; the rest show "Default / Force off" with a "not guaranteed" note. Turning thinking off usually cuts first-token latency and cost (MiMo is verified to stop thinking with reasoning_effort:"none").
⚠️ Providers declare "turning off thinking" very inconsistently (
off:"none"/off:null/ no field). The plugin can only tell "Off" from "Force off" per each catalog and best-effort a disabling param — no guarantee every provider can actually disable thinking.
FAQ
- Disable auto-convert only (keep tool + selector): set
vision-opencode.autoConvert: falseand restart - Conversion fails / selector missing: usually no vision model picked or a version mismatch — check the browser console and file an issue
- Text-only vs native multimodal routes are auto-distinguished; no config sync on provider/model switches
Development
- Always tag before pushing: create and push a version tag for every push (e.g.
git tag v0.4.0 && git push origin v0.4.0) so every remote update carries a traceable version marker.
License
MIT