DeepSeek Harness plugin

dsh-vision-bridge-goodandr

Self-owned vision bridge for DeepSeek Harness: pick the vision model yourself from the available ones. Image content blocks are rewritten into text markers at the agent boundary so text-only models

Jump to install

Source facts

Repository
GooDAnDReaDY/dsh-vision-bridge
Latest update
Aug 19, 2026
Category
Workflow & Automation
GitHub stars
0
Format
plugin
Catalog evidence
Upstream dsh.bundle evidence
Evidence path
package.json#dsh.bundle
Checked against
0.1.0-rc.8
Upstream check date
2026-08-20

This evidence comes from the upstream catalog. This site has not installed, run, or security-reviewed the plugin.

Install

Start with a prompt that asks an agent to review the GitHub repository and source. Switch to the command if you want to install it yourself.

Copy this prompt into DSH, Codex, or another agent and ask it to review the GitHub repository and source first.

Do not install or run any commands yet. Read this plugin's GitHub repository, README, and relevant source code. Then answer the questions below clearly and directly so I can decide whether it fits my needs:

1. What is this plugin, and what problem does it solve?
2. Who is it for, and what are its typical use cases?
3. How is it used after installation? Include one minimal example.
4. What known limitations or privacy, security, compatibility, or maintenance risks does it have?
5. Give a clear recommendation: recommend, conditionally recommend, or do not recommend, with reasons.

Distinguish statements documented by the repository, inferences from source code, and unknowns. If evidence is insufficient, say so explicitly. Do not guess or simply repeat the README.

GitHub: https://github.com/GooDAnDReaDY/dsh-vision-bridge
Plugin: dsh-vision-bridge-goodandr
Author: GooDAnDReaDY

Check the source files

Read the README and other files from this plugin directory before installing.

File explorer3 files
README.mdSource · read only

dsh-vision-bridge

Vision bridge for DeepSeek Harness (dsh) — a self-contained replacement for dsh-vision-router.

When the chat model has no vision (e.g. deepseek-v4-flash) and a message contains an image, the image never reaches the text-only model. Instead, the plugin substitutes an automatic text description from the vision model you choose (Hermes-style). The text model just reads text and keeps the conversation going; the image stays in the session log and in the UI.

  • describe_image — a tool for when you need more precise details on an image (ask a model).
  • Description cache by contentHash of the bytes — an image is described once, then the previous description is reused on later turns.
  • You pick the vision model in Settings → Vision (a top-level settings section alongside General / Models / Plugins).

Install

# From npm after publishing:
dsh plugin --profile web add @goodandready/dsh-vision-bridge

# From GitHub:
dsh plugin --profile web add github:GooDAnDReaDY/dsh-vision-bridge
# Locally from a checkout:
dsh plugin --profile web add /path/to/dsh-vision-bridge

Restart the Web UI, open Settings → Vision, pick a provider and model (or leave empty — auto-picks the first vision-capable model).

Replacing dsh-vision-router

This does the same job but under your control and with your own vision model. If dsh-vision-router is installed, remove it:

dsh plugin --profile web remove dsh-vision-router

How it works (Hermes-style)

1. An image (from you or from a tool like generate_image) enters the chat and is shown by the UI. 2. On every LLM request, at two points: - agent/pre-step, which sees the messages claimed from the inbox — that is, the images you attach. Rewriting them here puts the description into the session history, so the model still remembers the image on later turns. - llm/stream, which sees the whole outgoing request. This is the net under everything else: a tool result is appended straight to the session and never passes through pre-step, so an image a tool produced (generate_image, for one) would otherwise reach the adapter untouched and fail the turn with does not support image input. 3. At either point the rule is the same: - if the chat model is vision-capable (inputModalities includes image) — images go through as-is; - if the model is text-only — for each image block: - already cached description (by attachmentId or content hash) → reuse it; - otherwise automatically call the vision model via ctx.llm.stream, get a description, cache it, and inject it as [The user attached an image. Here is what it contains: ...]. 3. The text model reads text, not pixels. Turns never fail with UNSUPPORTED_CONTENT. 4. describe_image stays available for when you need more precise details on an image (ask a model directly).

Settings

Settings → Vision (top-level section):

  • Provider — the vision model's provider (from the LLM catalog).
  • Model — the model (only vision-capable ones are shown).
  • Empty → auto-pick the first vision model.

In settings.yaml:

dsh-vision-bridge:
  visionProvider: ""   # empty = auto-pick
  visionModel: ""      # empty = auto-pick
  sanitizeImages: true
  maxImageBytes: 20971520
  timeoutMs: 120000

Structure

dsh-vision-bridge/
├── package.json            # dsh bundle/plugin metadata + peerDependencies
├── cordis.patch.yml        # bundle layer: inserts the plugin row
├── lib/index.js            # host: agent/pre-step sanitizer + describe_image + cache + model list
├── lib/client.js           # browser: top-level Settings → Vision section
├── README.md
└── LICENSE                 # MIT

License

MIT