
Security News
Deno Goes the Way of the Dinosaur
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.
dsh-llm-vision
Advanced tools
Model-facing describe_image + extract_text tools for the DeepSeek Harness web GUI: gives a text-only model reliable image understanding and OCR through an OpenAI-compatible vision endpoint, with critical-inspection prompts, auto-preprocessing, retries, an
English | 中文
Give your DeepSeek Harness a pair of eyes — reliable image understanding and OCR for text-only models, configured entirely in the GUI.
Paste an image and the model describes or reads it; big screenshots are auto-compressed, transient failures retry, identical images hit a persistent cache. Built-in free presets (Zhipu / Gemini / DashScope) get you running without touching a config file.
dsh plugin --profile web add dsh-llm-vision@0.3.0
zhipu, gemini, or dashscope fill the endpoint fields for you — free
routes, no payment details (see the free presets
table).llm_vision_check tool for a full pipeline
diagnosis.Text-only models (DeepSeek V4, GLM text series, …) cannot see images. This plugin registers model-facing tools backed by any OpenAI-compatible vision endpoint:
| Tool | Purpose |
|---|---|
describe_image | Image understanding with two perspectives: normal (natural description) and critical (objective inspection that actively reports text misalignment, overlap, occlusion, wrapping anomalies, missing elements, and separates fact from guess). The critical lens is the antidote to vision models rationalizing rendering bugs — use it for page/UI problem reports and screenshot-vs-design comparisons. Accepts a single image or a batch of up to 8 images read together in one call. |
extract_text | OCR & document parsing through a dedicated OCR model — ID cards, invoices, receipts; structured output (JSON/CSV) on request; verbatim extraction that never guesses missing text. |
llm_vision_check | Diagnostics: verifies the configuration, that an API key resolves, and that the endpoint answers an authenticated probe — optionally with a real end-to-end vision call (testCall). The key itself never appears in the report. |
Plus the DSH-native experience:
dsh plugin --profile web add dsh-llm-vision@0.3.0
Then restart the GUI once — plugins load at boot, so the plugin and its settings card become visible only after the restart (configuration changes after that never need one).
The version is pinned on purpose: pnpm 11 holds back packages published in the
last 24 hours, so a bare add dsh-llm-vision (latest) would silently install
the previous release on launch day. This line is bumped with every release.
--profile web is the GUI profile of this deployment — use your own profile
name if it differs.
From a source checkout the same command accepts a tarball or local path
(pnpm pack names the tarball after the current version — use that name):
pnpm install && pnpm build && pnpm pack # → dsh-llm-vision-<version>.tgz
dsh plugin --profile web add ./dsh-llm-vision-<version>.tgz
# or: dsh plugin --profile web add /path/to/dsh-llm-vision (build first — lib/ is gitignored)
The tarball ships prebuilt lib/ (both the node half and lib/client.js), so no build step
runs on the installing machine.
Everything is configured in the GUI — the Settings → Plugins → llm-vision card. No patch file, no environment exports required:
baseURL / model / ocrModel yourself (custom).~/.dsh/settings.yaml, 0600) and never shown again. Advanced: leave
the field empty and let apiKeyEnv resolve through the credential seam
instead (presets prefill e.g. DASHSCOPE_API_KEY; the default is
VISION_API_KEY) — for users who prefer environment variables.Before configuring, the first call fails with a clear hint (llm-vision: baseURL must be an absolute http(s) URL) — that is the expected unconfigured
state, not a broken install.
The values live in the harness settings document (~/.dsh/settings.yaml,
0600, shared across profiles) and are written by the GUI. A profile patch
layer may still provide deployment defaults for the card (shown as
"Inherit"), but the card's saved values always win — the GUI is the only
configuration surface a user needs. A deployment without a settings provider
falls back to the built-in defaults.
The Provider preset selector fills baseURL / model / ocrModel /
apiKeyEnv for you — free routes, no payment details. Free policies change,
so re-check the provider docs if a call stops working:
| Preset | Endpoint | Getting a free key |
|---|---|---|
zhipu | Zhipu BigModel — permanently free GLM-4V-Flash; the best default in mainland China | open.bigmodel.cn — register, create an API key; free tier, no card |
gemini | Google Gemini — free key from Google AI Studio (aistudio.google.com) | AI Studio → "Get API key", no card; not reachable from mainland China without a proxy |
dashscope | Alibaba DashScope (the default models) with free quota | Alibaba Cloud Bailian console (bailian.console.aliyun.com) — free quota; reachable from mainland China |
Picking a preset prefills the endpoint fields (still editable before saving);
explicit field values always win at call time. The free presets reuse the
vision model for OCR (extract_text drives it with the OCR prompt) — free
tiers are rate-limited, so they suit interactive use better than batch runs.
| Key | Default | Meaning |
|---|---|---|
provider | custom | Endpoint preset: custom (all fields explicit), dashscope, zhipu (free GLM-4V-Flash), or gemini (free key). Explicit fields win. |
baseURL | — (required for custom) | OpenAI-compatible root URL; /chat/completions or /responses appended per apiStyle. |
model | preset, else qwen3-vl-plus | Vision model for describe_image; optional thinking suffix :off/:low/:medium/:high. |
ocrModel | preset, else qwen3.5-ocr | OCR model for extract_text; same suffix support. |
apiKey | — | Inline key, stored in the settings document (secret: never shown by the GUI). |
apiKeyEnv | VISION_API_KEY | Credential-reference (env var name) resolved through the credential seam; empty disables. |
criticalPrompt | built-in | describe_image critical-perspective prompt when the model passes none. |
normalPrompt | built-in | describe_image normal-perspective prompt when the model passes none. |
ocrPrompt | built-in | extract_text prompt when the model passes none. |
apiStyle | chat-completions | chat-completions or responses. |
maxBytes | 10485760 | Image byte bound (local files and downloads). Hi-res PNG wallpapers (10–30 MB) exceed the default; raise it — preprocessing compresses after loading. |
maxOutputTokens | 1024 | Output-token cap sent to the endpoint. |
timeoutMs | 60000 | Per-attempt timeout. |
maxRetries | 2 | Retries for transient failures (timeout / network / 429 / 5xx); 0 disables. |
maxEdge | 1568 | Max image edge (px) before auto-scaling; 0 disables preprocessing. |
compressEnabled | true | Auto scale/re-encode oversize images (macOS sips; skipped elsewhere). |
cacheEnabled | true | Persistent content-addressed answer cache (cross-session). |
cacheDir | $XDG_CACHE_HOME/dsh-llm-vision | Cache directory. |
cacheTtlDays | 30 | Cache entry lifetime (days). |
cacheMaxEntries | 500 | Cache capacity; oldest evicted. |
renderImagePreview | true | Upgrade attach references into inline thumbnails (display only). |
interceptImageSend | true | Rewrite image-bearing sends into attach references at submit; turn off to hand raw image blocks to other vision plugins. |
sips; every failure silently falls
back to the original image. HEIC/HEIF inputs are always re-encoded to JPEG (endpoints support
HEIC unevenly), failing loudly only when sips is absent. Fixes the classic "big screenshot
times out" failure.maxRetries with exponential backoff
(≤ 4s) under a shrinking per-attempt budget (total ≤ 2× timeout). Exhausted retries append
(已重试 N 次). Caller cancellation aborts immediately without retry.~/.cache/dsh-llm-vision/; only the
text answer is stored, never image bytes; TTL 30 days, 500 entries, atomic writes, 0600/0700
permissions. Note: OCR results of sensitive documents are stored in plain text there — set
cacheEnabled to false when that matters.redirect: 'error') — bearer
credentials and image bytes never leave the configured endpoint.maxOutputTokens × 8 + 64 KiB) before parsing; error excerpts are
bounded to 200 chars.A fully offline test suite (vitest, mock HTTP server, tmp-dir cache), a
strict typecheck, and CI on every push. Verified end-to-end in the real DSH
web GUI against a live OpenAI-compatible vision endpoint: describe_image
reads a real image (DashScope qwen3-vl-plus), extract_text OCR returns
real transcription (qwen3.5-ocr), the attach upload/readback routes work
through the live web server, and the settings card renders and saves in the
plugin-configuration page — see Configure.
sips) a
HEIC/HEIF read fails with a clear message.sips (zero dependencies); on Windows/Linux the
plugin degrades silently and sends the original bytes — never an error, but
oversized images are then likelier to time out. The bound gates loading
(maxBytes), so a too-small bound is a clean rejection, never a crash.pnpm typecheck # tsc -b + vitest program
pnpm test # vitest run (fully offline)
pnpm build # tsc -b && tsdown → lib/ + lib/client.js
pnpm watch # tsdown --watch
Apache-2.0. Built on: deepseek-harness packages/vision/tool-describe-image (whitelonng/dsh-plugin-describe-image, MIT), the dsh-web-ui plugin family (Apache-2.0), and the llm_vision design (MIT). See NOTICE and AGENTS.md.
FAQs
Model-facing describe_image + extract_text tools for the DeepSeek Harness web GUI: gives a text-only model reliable image understanding and OCR through an OpenAI-compatible vision endpoint, with critical-inspection prompts, auto-preprocessing, retries, an
The npm package dsh-llm-vision receives a total of 0 weekly downloads. As such, dsh-llm-vision popularity was classified as not popular.
We found that dsh-llm-vision demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Cloudflare is acquiring Deno’s team, which will provide another year of bug fixes and security updates before ending support for the runtime.

Security News
Anthropic’s free OSS Scanner uses Mythos and other Claude models to find open source vulnerabilities and send maintainers reports with proposed fixes.

Security News
On Front Lines’ Early Adopters: CISO podcast, Andrew Becherer shares lessons from Datadog, weighs the long-term costs of AI-built tools, and explains how founders can actually gain a CISO’s trust.