Introduction¶
In agent development, a common gap arises: the model routing used by the main agent declares no image input and is a pure text model. When a user provides an image path for description, the agent cannot handle it—requiring either a manual switch to a session with visual capabilities or the agent to look at the image itself and summarize it. DeepSeek Harness (hereinafter DSH) follows the philosophy that “everything is a plugin,” making this single-point capability gap a perfect candidate for patching with a small plugin. Below is an introduction to dsh-tool-vision-read, maintained by Mappedinfo. It registers a vision_read tool that routes the image reading step to a dedicated vision model, allowing a pure text agent to obtain a text description of the image with a single call.
What is this¶
dsh-tool-vision-read is a DSH community plugin. Its package name is @deepseek-ai/dsh-tool-vision-read, current version 0.1.0-rc.6, licensed under MIT, independently developed and maintained by Mappedinfo, and is not part of the official DeepSeek Harness release.
One-sentence positioning: It registers the vision_read tool, reads image files via a dedicated vision model route, and returns a text description, enabling pure text agents to “see” images. It converges the concept of “routing tasks to different models based on capability” to the single act of reading images. It does not rely on third-party tools and does not require manual summarization.
Core Features¶
Tool Contract¶
vision_read(file_path: string, focus?: string)
Returns { path, provider, model, description }, where description is the text description of the image by the vision model. Only accepts PNG/JPEG/WebP/GIF paths; paths are resolved based on the cwd (current working directory) of the calling session’s workspace.
Two Execution Modes¶
direct(default): The plugin reads the file and submits it via the attachment service, using a singlellm.streamcall configured with the vision provider/model. One round trip, no agent loop.subagent: Starts a subprocess fixed to the vision route, which callsread_imageitself. It can iterate on scaling, OCR, and follow-up questions. More flexible, but at the cost of a full agent loop.
Configuration Options¶
provider(string, required): The registered provider route holding the vision model.model(string, required): The ID of the vision model on that route.toolName(string, defaultvision_read): The tool name visible to the model.mode('direct' | 'subagent', default'direct'): Execution mode.maxImageBytes(number, default follows attachment service limit): The byte limit for images sent to the vision route.maxOutputTokens(number, default1024): The token limit for the vision route’s output.prompt(string): Instructions sent with the image, supporting{{path}}and{{focus}}placeholders.
Route Validation¶
The route is parsed before the call; if the parsed route does not declare image input, the call will fail with guidance—for example, the pi-ai route requires defaultInput: [text, image] to be declared in the provider settings. Configuration parsing also fails directly if the route ID is missing, so provider and model must be specified clearly.
Installation and Enablement¶
Prerequisites: You must have a DeepSeek Harness deployment (source checkout or out-of-tree profile installation) and a model route that supports image input. The plugin has been verified against the Kimi Coding API (k3-256k).
Recommended installation as a Profile Bundle to the web profile:
dsh plugin --profile web add github:Mappedinfo/dsh-tool-vision-read
Execute the installation first, then restart dsh web. Upon successful installation, the package is added to dsh.profile.bundles. After restarting, vision_read is automatically mounted via the bundled cordis.patch.yml. The default route is kimi-coding / k3-256k.
If your vision route or model is different, there are two ways to override. For a single launch, use environment variables without editing the package:
DSH_VISION_PROVIDER=my-provider DSH_VISION_MODEL=my-vision-model dsh web
For persistent override, configure it by ID in the profile’s own cordis.patch.yml:
- id: tool-vision-read
config:
provider: my-provider
model: my-vision-model
mode: direct
Two notes: The profile’s own cordis.patch.yml is applied after the Bundle; do not insert a second tool-vision-read line in the profile.
Remove the Bundle using this command:
dsh plugin --profile web remove @deepseek-ai/dsh-tool-vision-read
For local development, you can link the local checkout:
dsh plugin --profile web add link:/absolute/path/to/dsh-tool-vision-read
If you are developing in the deepseek-harness monorepo, you can also copy the package to packages/vision/tool-vision-read, run pnpm install, and then register and mount it according to the official adding-a-package cookbook. Additionally, peer dependencies for @deepseek-ai/* are satisfied by the module closure installed by DSH (with $DSH_HOME/profiles/node_modules as a fallback), and autoInstallPeers: false prevents pnpm from pulling old registry copies. Generally, no extra handling is needed.
Typical Usage¶
End-to-end example from the README: A pure text agent (deepseek-v4-flash) calls vision_read on a JPEG, and the description is returned by Kimi K3-256K via the kimi-coding route.
user: 请用 vision_read 看一下 /Users/shiqi/Downloads/微信图片_20260816082109_883_131.jpg 并描述内容
agent: (vision_read) → "这是一张横构图、白天拍摄的现代城市/园区街景照片……天空与云约占画面上方 2/3……
左侧一栋多层建筑转角呈弧形……中右一座较低的建筑带弧形屋顶边缘和竖向格栅外立面……"
The agent itself does not handle images throughout the process; all image I/O happens on the vision route side, and it only receives a text description.
Suitable Scenarios and Notes¶
Suitable scenarios: DSH deployments where the main agent is a pure text model but occasionally needs to read images (screenshots, photos, charts); users who have configured multiple model routes and want to delegate image reading to a specific vision model.
Things to note:
- This is a non-official community plugin, independently developed and maintained. The plugin runs with the permissions of the current DSH process. It is recommended to read the source code before installation to confirm that the behavior and permission boundaries are acceptable; the license is MIT.
- The route must declare image input; otherwise, the call will fail with guidance, such as setting
defaultInput: [text, image]for the pi-ai route. - The plugin only accepts PNG/JPEG/WebP/GIF images, and paths are resolved based on the
cwdof the calling session’s workspace. Pay attention to the path resolution base when referencing across workspaces.
Conclusion¶
After the steps above, a pure text agent gains the ability to read images: vision_read hands the image to a dedicated vision model and brings the text description back into the agent’s context. The plugin is thin and does only one thing, but it perfectly fills a common gap in the DSH philosophy of “everything is a plugin”.
GitHub: https://github.com/Mappedinfo/dsh-tool-vision-read
Community Directory Page: https://www.skillhub.cn/plugins/Mappedinfo/dsh-tool-vision-read (The community directory is an independent site with no official affiliation to DeepSeek / Hyperbolic; information is subject to the GitHub repository)