opencode-senses Adds Local Vision to Text-Only Models
2 min read
Originally from github.com
View source
My notes
Summary
opencode-senses is an open-source plugin that gives text-only OpenCode coding models a vision layer, running fully local on a 6 GB GPU with no API keys. It auto-injects structured evidence (scene description, caption, exact OCR) whenever an image is attached, and exposes 13 additional tools (detect, zoom, diff, colors, reverse-search, and others) the model can call to dig deeper.
Key Insight
- Uses Moondream 2 (default) as the local vision model, which fits comfortably in 6 GB VRAM and peaks around 4.5 GB. Moondream 3.1 (9B) is supported for bigger cards but needs roughly 16 GB.
- Auto-provisions its own Python venv and downloads roughly 3.9 GB of model weights on first use via
uv(10-100x faster than pip), or falls back topython3 -m venvplus pip. - Architecture separates concerns cleanly: a TypeScript plugin runs inside the OpenCode session and talks to a Python runtime over line-delimited JSON-RPC on stdio, keeping the vision workload out of the text model’s context.
- Notable prompt-injection defense: everything read from an image is wrapped in an explicit
<SENSES>“untrusted data” guard, so text like “ignore previous instructions” embedded in a screenshot is treated as evidence, not a command. - Deterministic, non-hallucinatable tools exist alongside model-based ones:
senses_colors(dominant palette and RGB) andsenses_metadata(dimensions, EXIF, byte size) run without invoking the model at all, useful for ground-truth checks a vision model might get wrong. senses_zoomupscales a region (LANCZOS, 1-8x) and re-runs OCR, caption, or query on just that crop, recovering small text the model misses when reading a full screenshot at once.senses_diffproduces a pixel-level change map between two images (with anti-aliasing noise filtered out) plus an optional model-generated summary, built for UI and render iteration QA loops.- Any tool accepts an
https://URL directly as thepathargument; images are downloaded verbatim (original bytes and type preserved, no re-encode) and cached locally for reuse across calls. - Reverse image search works two ways: local perceptual-hash search across cached files (always free, no network) and an opt-in Yandex CBIR upload (no API key, but occasionally bot-blocked).