Preface

DeepSeek Harness (hereinafter referred to as dsh) is an intelligent agent runtime open-sourced by DeepSeek, with the official slogan “Everything is a plugin”: model adapters, tools, sessions, sandboxes, and interfaces are all mounted on the Cordis kernel, and can be replaced by configuration without modifying the Harness source code. As of the writing of this article (2026-08-17), it is still in Developer Preview, and the current common version is 0.1.0-rc.6.

This architecture is very flexible, but it also exposes a specific gap: when using the official DeepSeek adapter by default, the main model is often pure text. After pasting screenshots, error interfaces, or two comparison images into the input box, the text model cannot see pixels and can only guess based on the attachment names. As a result, a number of vision plugins have emerged in the community, with different approaches – some are made into image recognition toolkits, and some are made into pixel-level tool calls. This article only introduces one of the more “native” paths: dsh-vision maintained by oil-oil.

The community plugin directory deepseek-harness-plugin.com lists it under “Tools and Capabilities”,收录于2026-08-15. It should be noted first that this directory is an independent site and has no official affiliation with DeepSeek / HyperMind, and cannot be regarded as an official app store. There are also warehouses with the same or similar names such as dsh-vision-recognizer, dsh-vision-toolkit, dsh-vision-router, etc., which have different capability boundaries. When installing, make sure to target github:oil-oil/dsh-vision.

What is the plugin

dsh-vision is a DeepSeek Harness plugin, with the npm package name @oil-oil/dsh-vision, current version 0.1.0, mainly written in TypeScript, licensed under MIT, requiring Node.js >= 22.19. The README states that this version is fixedly compatible with Harness 0.1.0-rc.6; the peerDependencies in package.json are also pinned to the same set of 0.1.0-rc.6 packages. The GitHub repository showed 55 stars as of 2026-08-17. The client platform declared by the plugin is web.

The problem it solves is very specific: let the already selected main model continue to act as the “brain”, while allowing images to enter the conversation in a way that is as close to native multimodality as possible.
- When the current main model itself supports images, the original image is sent directly to the model without compression or pre-OCR.
- When the current main model is a pure text model such as deepseek-official, another vision model is selected to observe the original image, and the observation result is injected as untrusted attachment context, and the final answer is still given by the original DeepSeek model.
- When both cloud vision services are unavailable, it will downgrade to macOS Vision or Tesseract, and the answer will still be given by DeepSeek.

The plugin will not change the main model selected in the bottom-right corner. It will replace the official deepseek-official adapter, but continue to use the original model list, DeepSeek settings and credentials. The cordis.patch.yml in the repository does exactly this: first disable llm-deepseek, then insert dsh-vision:

- id: llm-deepseek
  disabled: true
- insert:
    - id: dsh-vision
      name: "@oil-oil/dsh-vision"

The cloud routing, multi-image joint analysis and local downgrade are stated in the README to refer to the MIT project oil-oil/see-skill of the same author.

How it works

The README clarifies the three paths with a table:
| Current Main Model | Image Processing Method | Final Answer Provider |
| — | — | — |
| Image-supported model | Original image sent directly, no compression or pre-OCR | Current model |
| Text models such as deepseek-official | External vision model reads the original image, and the observation result is injected as untrusted attachment context | DeepSeek |
| Cloud vision service unavailable | Local downgrade via macOS Vision or Tesseract | DeepSeek |

There are a few points that need to be looked at separately to avoid confusing it with plugins that “first perform OCR then ask questions”.
1. Original image priority. When the main model can view images, the bridge routing will not be enabled at all. Custom models must declare the image input modality in Harness, otherwise they will still be treated as text models.
2. Multiple images in one request. Multiple chat attachments will be sent to the vision model together, which is suitable for front-back comparison and combined evidence, instead of generating a separate report for each image.
3. Forward the original question. The user’s task will not be wrapped into a fixed report template, and the vision model will see the original question.
4. Observation results are untrusted. The visual output is only used as context for the current request, and will not rewrite historical messages; the prompt words in the image will not obtain system permissions.

Install the plugin

The installation command given on the community directory page is:

dsh plugin add github:oil-oil/dsh-vision

The maintainer’s README writes the method with a web profile, which is consistent with the form of dsh plugin --profile <name> add github:owner/repo in the official documentation:

npx @deepseek-ai/dsh plugin --profile web add github:oil-oil/dsh-vision

The directory page also reminds that if you need a reproducible installation, you should fix the commit hash:

dsh plugin add github:oil-oil/dsh-vision#<commit>

After the installation is complete, you need to restart Harness. Afterwards, you can paste or drag images into the input box as usual. A new card will appear in the settings: Settings → Plugins → Plugin Configuration → Vision Recognition.

The repository contains both src/ and the compiled lib/. The files field in package.json will publish cordis.patch.yml and lib, and the git installation loads the built artifacts. Even so, the plugin still runs with the permissions of the current dsh process, and may execute code during installation. Before installing, you should check the source code repository and the MIT license; do not treat the one-click command on the community directory as a guarantee that it has been officially audited.

Configure vision recognition

Open “Settings → Plugins → Plugin Configuration → Vision Recognition”, you can select ZenMux, Alibaba Cloud Bailian, TokenDance or OpenRouter, and then fill in the corresponding API Key. You can also change the model ID, API address and single image limit on the same card.

The API Key uses the Harness official credential service. The README states that it is written unidirectionally in the browser: the interface can only know whether the Key exists, and will not read the Key back to the page, chat, general settings or session logs. Do not write the Key into the YAML below.

In most cases, using the interface is sufficient. The equivalent non-sensitive fields are in the existing llm-deepseek section in $DSH_HOME/settings.yaml. The example given in the README is:

llm-deepseek:
  visionBackend: zenmux
  visionBackendModel: qwen/qwen3.7-plus
  visionBackendBaseURL: https://zenmux.ai/api/v1
  maxImages: 8

No restart is required after changing these fields. The routing rules are as follows:
- The platform selected in “Vision Recognition” is the main vision routing for text models.
- Other enabled vision models in Harness, existing see configurations, and local OCR will only be tried after the main routing fails.
- When the current main model itself supports images, the original image will always directly enter the current model without going through these bridges.
- When “Auto Select” is selected, there is no need to save the cloud Key in the plugin. The plugin will try in turn: the models configured in Harness that support images, the see private configuration, and finally local OCR.

Compatibility with see-skill and local downgrade

If there is no available vision model in Harness, the plugin will also read ~/.config/see/config.env and be compatible with ZenMux, Bailian, OpenRouter and TokenDance. Environment variables take precedence over this file:

export SEE_PROVIDER=zenmux
export ZENMUX_API_KEY=your-key

SEE_PROVIDER specifies the main platform; other platforms with filled Keys will only be used as backups after failure. If not specified, whichever platform is configured will be used.

Local capabilities will only be attempted when there is no cloud Key, or when all cloud routing fails:
- macOS: built-in Vision OCR, no additional installation required.
- Linux / Windows: Tesseract, you need to install the corresponding language pack yourself.

Local downgrade is mainly based on text recognition, which is not equivalent to the complete semantic understanding of a multimodal model. You cannot expect this layer to make up for the layout, icon meanings, and visual differences in the screenshot.

Daily usage

After the configuration is complete, the usage is similar to a normal multimodal conversation.
1. Confirm that Harness has been restarted, and the current profile is web (the plugin’s dsh.client.platform is web).
2. Still select the original DeepSeek model in the bottom-right corner, no need to switch to another “special image recognition” entry.
3. Paste or drag one or more images into the input box, and write the task directly, such as comparing two UI screenshots, reading an error popup, or looking at the numbers in a table screenshot.
4. If the main model can view images, the original image will enter the model as-is; if not, the plugin will first let the configured vision model observe the original image, then hand the observation results to DeepSeek.

There is no separate CLI subcommand, and you do not need to convert images to text first before pasting. This is the “close to native” mentioned in the README: the input habits remain unchanged, the identity of the main model remains unchanged, and what changes is that there is a vision bridge behind the text model.

Applicable scenarios and notes

It is more suitable for the following usage scenarios: you usually use DeepSeek as the main model in Harness, and occasionally need to view screenshots, error messages, tables or front-back comparisons, without wanting to switch to a dedicated image recognition conversation setup. Asking multiple images together and keeping the original question is also closer to “pasting images into a model that can view them” rather than “first generating a fixed-format image recognition report”.

There are several boundaries that should be treated as facts, not optional items, before use.
- Very strict version locking. The current release is targeted at 0.1.0-rc.6. Harness is still in Developer Preview, and core plugins and APIs will continue to change. You should check the peerDependencies before upgrading.
- It replaces the official adapter. cordis.patch.yml will disable llm-deepseek. If there are other plugins that also replace the DeepSeek adapter in the same profile, you need to check the loading order and conflicts yourself, and the README does not guarantee that they can be stacked.
- Images will leave your local machine. The original image is only sent to the vision service you configured, but as long as the cloud routing is used, the pixels will reach the corresponding vendor. For sensitive screenshots, you should use endpoints under your own control, or accept the capability limits of local OCR.
- Local OCR is not multimodal. macOS Vision / Tesseract can only make up for the situation when all cloud services fail, and cannot be regarded as a complete image viewing solution.
- The security model is “untrusted observation”. The visual results only participate in the current request; the instructions in the image have no system permissions. This reduces the risk of indirect prompt injection, but cannot replace your review of the vendor and source code.
- Permissions and license. The plugin runs with the permissions of the current dsh process, and may execute code during installation. Before installing, read the source code and MIT license of oil-oil/dsh-vision; fix the commit when you need a reproducible environment.
- The directory is not an official store. The dsh-vision directory page is convenient for searching categories and installation commands. Authoritative information shall be subject to the repository README, package.json and license.

Summary

dsh-vision turns “DeepSeek continues to answer, images go native or bridged according to capabilities” into an installable web plugin. If the main model can view images, it uses the original image; if not, it calls ZenMux / Bailian / TokenDance / OpenRouter (or see-skill / local OCR) to perform observation, then hands the untrusted context to the original DeepSeek. Installation and configuration are based on Harness’s existing plugin and credential mechanisms, and do not create a separate conversation entry.

Directory page: https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-vision/

GitHub: https://github.com/oil-oil/dsh-vision