Foreword¶
When building Agents with DeepSeek Harness (DSH), offloading reasoning to DeepSeek’s text model is no problem. However, many tasks require “seeing”: reading error text from screenshots, comparing layout differences between two versions of an interface, or extracting primary colors from design drafts. The common approach is to manually drop the image to another multimodal service and then carry the result back to the conversation, breaking the chain in the middle.
dsh-vision-suite solves this problem. While retaining the official deepseek-official text routing, it integrates image understanding, OCR, screenshot cropping, pixel comparison, primary color extraction, and secure webpage capture into Harness. Text inference is still handled by DeepSeek; the plugin will only send the user-selected image to a configured OpenAI-compatible vision model when calling remote vision tools.
What is this¶
dsh-vision-suite is maintained by princefrogdida-ux, is licensed under MIT, has a package name of dsh-vision-workbench (with the GitHub repository named dsh-vision-suite), is currently version 0.7.1, and targets Windows. The philosophy of DSH is “Everything is a plugin,” and this plugin fills the gap of vision for text-centric workflows.
The runtime environment requires Node ^22.19.0 || >=24.0.0. Local pixel processing, OCR, and browser capabilities rely on sharp, tesseract.js, and playwright-core, respectively. All three are optional dependencies loaded on demand—if you don’t use local tools, these overheads are not introduced.
Core Features¶
Six Vision Tools¶
| Tool | Purpose | Execution Location |
|---|---|---|
vision_describe |
Understand 1-4 uploaded images or workspace images, supporting image Q&A, multi-image comparison, and structured screenshot evidence | Visual Provider |
vision_ocr |
Recognize text in the whole image or a specified area, choose between remote vision model or local Tesseract | Provider or Local Machine |
vision_crop |
Crop images by pixel coordinates and save as persistent attachments for further use | Local Machine |
vision_compare |
Compare two screenshots of the same size, return the change ratio and a magenta difference map | Local Machine |
vision_palette |
Extract approximate dominant colors from images | Local Machine |
vision_browser_capture |
Capture whitelisted webpages using a standalone headless Edge or Chrome | Local Browser |
You can see the division of labor: tasks requiring model understanding go to the Visual Provider; pure pixel operations (cropping, comparing, color picking) and webpage capture are all done locally, so images don’t need to leave the machine.
Other Basic Capabilities¶
- Supports PNG, JPEG, and WebP.
- Image attachments use persistent IDs; tool results can be saved and replayed with the session.
- Supports one primary Visual Provider and up to three sequential fallback Providers. It executes limited fallback on failure and avoids continuously requesting failed endpoints through a cooling mechanism.
- Supports limits on image count, file size, pixel count, working pixels, timeout, and cache.
- API Keys are saved via Harness Credentials; they are not written into plugin configuration, logs, or page responses.
- Supports configuring separate HTTP/HTTPS proxies (
proxyUrl, default empty) for plugin requests without modifying global network settings.
Installation and Enablement¶
When compiling this information, neither the README nor package.json contained a ready-to-use one-line installation command, so I have not concatenated it myself. Please refer to the README in the GitHub repository for specific installation methods.
After installation, the plugin defaults to being disabled (enabled default false). It does not automatically take over model routing or send images. To enable it via the Harness native configuration page:
- Start the Web Profile where the plugin is installed.
- Open “Settings → Plugins → Plugin Configuration”.
- Click on Vision Workbench to expand all configuration items.
- Fill in the text model, visual provider, and API Key.
- Turn on “Enable Plugin” and save the configuration.
- Restart the current Profile to make routing and tool configuration take effect.
Regarding the API Key input box: the key will not echo back after the page refreshes; it will only indicate whether the corresponding credential is already configured. When the password box is empty, the saved key is retained, and no need to paste it again.
Minimal Viable Configuration¶
For first-time use, you only need the following items:
| Configuration Item | Recommended Value or Description |
|---|---|
enabled |
Enable |
wrapperRoute |
Keep deepseek-vision-workbench; it cannot conflict with deepseek-official or text Provider names |
textProvider.provider |
Keep deepseek-official |
textProvider.model |
Select the DeepSeek model available in the current Harness (default deepseek-v4-pro) |
visionProvider.name |
primary |
visionProvider.baseURL |
OpenAI-compatible API address of the vision service |
visionProvider.model |
The visual model name provided by the service provider |
visionProvider.credentialRef |
Credential name, e.g., VISION_API_KEY |
| API Key | Enter in the password box of the corresponding Provider card |
After saving and restarting the Profile, select in the model selector:
DeepSeek + Vision Workbench / <configured DeepSeek model>
Then upload an image and ask directly, for example, “Recognize the text in this screenshot” or “Compare the layout differences of these two images.”
Configuring Remote Vision Services¶
Any service compatible with OpenAI’s /chat/completions and supporting image_url image input can be connected. The README provides entry points for several common services:
| Provider | baseURL |
API Key Official Site |
|---|---|---|
| OpenAI | https://api.openai.com/v1 |
platform.openai.com/api-keys |
| OpenRouter | https://openrouter.ai/api/v1 |
openrouter.ai/settings/keys |
| SiliconFlow | https://api.siliconflow.cn/v1 |
cloud.siliconflow.cn/account/ak |
| Alibaba Cloud Bailian | Mainland China: https://dashscope.aliyuncs.com/compatible-mode/v1; International: https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
help.aliyun.com |
Configuration follows three steps:
- Fill the provider’s API address into
visionProvider.baseURL. - Copy a model ID that supports image input from the provider’s official website and fill it into
visionProvider.model. - Set a separate
credentialReffor this service, for exampleOPENAI_VISION_KEYorOPENROUTER_VISION_KEY, and paste the real Key into the password box of the corresponding Provider card.
Note three points: The same provider may offer both a pure text model and a vision model; before selecting a model, you must confirm it supports image_url input and the /chat/completions interface; baseURL cannot embed username, password, or API Key; normal use must be HTTPS, and only when allowInsecureLocalhost is explicitly enabled is connecting to HTTP test services on the local loopback address allowed.
Local OCR¶
vision_ocr defaults to going through the remote visual Provider; it only enters local Tesseract when explicitly selecting backend="local". Local OCR is disabled by default (localOcr.enabled default false), and you need to prepare trusted language data files yourself—the plugin will not automatically download language packs, access CDNs, or write to the Tesseract cache, and will not automatically switch to the remote Provider after a local recognition failure.
Windows configuration example:
localOcr:
enabled: true
languagePath: 'D:\vision-data\tesseract'
languages: [eng, chi_sim]
gzip: true
timeoutMs: 60000
maxLanguageBytes: 52428800
maxRegions: 50
pageSegMode: auto
autoRotate: true
lowConfidenceThreshold: 40
Files such as eng.traineddata.gz and chi_sim.traineddata.gz should exist in the directory pointed to by languagePath. Gzip is enabled by default, auto-orientation is handled, and the low-confidence hint threshold is 40.
Browser Capture¶
vision_browser_capture is disabled by default (browserCapture.enabled default false). After enabling, you must fill in an exact host whitelist; the plugin uses a standalone headless browser (browserCapture.browserChannel default msedge, chrome can be chosen) to capture only pages within the whitelist.
Provider Fallback and Limits¶
In addition to the primary Provider (visionProvider), you can configure up to three fallback Providers (fallbackProviders). The plugin attempts them one by one in the list order and will not concurrently send images to multiple endpoints; primary and backup Providers cannot have the same name.
Fallback behavior is controlled by three parameters:
| Field | Default Value | Description |
|---|---|---|
providerRouting.attemptTimeoutMs |
45000 |
Attempt timeout for a single Provider |
providerRouting.failureThreshold |
2 |
Number of consecutive failures before entering cooldown |
providerRouting.cooldownSeconds |
60 |
Cooldown time for a failed Provider |
The total timeout timeoutMs (default 120000) should be greater than attemptTimeoutMs; otherwise, there may not be enough time to attempt fallback Providers.
Default limits for images and cache: a single call supports a maximum of 4 images, single image max 10485760 bytes (10 MiB), 40000000 pixels; vision result cache is enabled by default, 200 items, TTL 3600 seconds; local processing max working pixels 16000000; visual model max output maxTokens default 4096. These all have corresponding configuration items and can be adjusted as needed.
Additionally, vision_compare requires the two screenshots to be exactly the same size; the plugin will not automatically scale or align images to avoid masking real layout changes.
Applicable Scenarios and Notes¶
This plugin is suitable for Windows users of DSH and Agent developers who need to handle screenshots and images: for example, letting an Agent read text from interface screenshots, compare the changed areas of two versions of UI, extract colors from images, or take screenshots of whitelisted webpages as session evidence. The premise is that you have a vision service API Key compatible with the OpenAI image_url format, or are willing to prepare Tesseract language files yourself for local OCR.
Before using, there are a few points to be clear about:
- The plugin runs with the permissions of the current DSH process; local tools can read and write your workspace images and invoke the local browser. It is recommended to check the repository source code and license (MIT) before installation to ensure it meets your security requirements.
- The plugin is disabled by default and will not take over routing or send images without your knowledge; images are only sent to the endpoint you configured when calling a remote vision tool.
- Remote vision services must be HTTPS,
baseURLmust not contain keys, and webpage capture must go through an exact whitelist. These three points are built-in boundaries of the plugin; do not bypass them during configuration.
Summary¶
What dsh-vision-suite does is very focused: it does not replace DeepSeek’s text inference but only adds six tools when “seeing” is needed, and it turns engineering details like credentials, fallback, and limits into explicit configuration. If you often deal with screenshots on DSH, it is worth installing and trying once.
- Plugin Directory Page: https://www.skillhub.cn/plugins/princefrogdida-ux/dsh-vision-suite
- GitHub Repository: https://github.com/princefrogdida-ux/dsh-vision-suite