Tools & Capabilities
dsh-image2-plugin
544244857/dsh-image2-plugin · ★ 1
DeepSeek Harness bundle that exposes an OpenAI-compatible image relay as the image2_generate tool for text-to-image and image-to-image, with inline media previews.
Manifest details
安装
dsh plugin --profile web add 'github:544244857/dsh-image2-plugin#fc44d3feb4be5b7b4d0e0c20bd2b4d09c925dc1e'GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
Language: English · 中文
Community tags: dsh-plugin · deepseek-harness · cordis · bundle · text-to-image · image-to-image · image-generation · ai-image · image-relay · openai-compatible · inline-media · web-ui · tool
Give DeepSeek Harness the ability to generate an image from a sentence and edit an image from a reference — pointed at your own OpenAI-compatible image relay, with the result rendered inline in the conversation.

Highlights
| Capability | What it means |
|---|---|
| One-line install | The standard dsh plugin --profile <profile> add dsh-image2-tool; after a restart image2_generate shows up in the tool list |
| Your own relay | Text-to-image goes to POST /images/generations, image-to-image goes to POST /images/edits; both b64_json and image-URL responses are supported |
| Reference-guided | Pass a local PNG/JPEG/WebP as image and character consistency, style and palette hold far better than with text alone |
| Graphical config | A built-in settings row on the sidebar Plugins page (including a masked apiKey field); cordis.patch.yml works just as well |
| Visual self-check | After generating, the agent is expected to inspect the real file with the native read_image tool — "the API returned 200" is not "the image is right" |
| Inline preview | Pulls in @wisdoverse/dsh-inline-media-viewer so images render right below the reply, no card to open |
| Restrained default | autoGenerateAssets defaults to false, so ordinary coding work never silently burns image credits; output is confined to the session directory |
Usage examples
Both images below come from one real session: the agent was asked to "generate a GPT-styled version of the dragon instructor", picked its own reference image, compared iterations and converged on the result.
Inside the conversation — the generation steps, the reference image and the version comparison all sit in the reply, with images rendered by the inline preview (tall image, click to expand):
The result — what that session produced (864 × 1152):
To reproduce: install the plugin and simply ask the agent to "generate an image of …". With
autoGenerateAssetsleft at its defaultfalse, nothing is generated unless you ask for it.
Reference-guided generation (image-to-image)
As soon as image is present in the call, the plugin switches to POST /images/edits:
{
"prompt": "Keep this character design but give her normal proportions, a regular seven-head figure, not chibi",
"image": "imagegen-output/reference.jpg", // relative to the session directory, or absolute
"aspectRatio": "3:4",
"filename": "result.jpg"
}
| Parameter | Description |
|---|---|
prompt |
Required. What to generate or what to change |
image |
Optional. Path to a local reference image (PNG/JPEG/WebP, ≤ 20 MB). Present ⇒ image-to-image; absent ⇒ text-to-image |
filename |
Optional. Output file name, without a directory |
size |
Optional. Of the form 1024x1024. Relays that only honour aspect_ratio ignore it |
aspectRatio |
Optional. Of the form 3:4 or 16:9, sent as the aspect_ratio field. Use it when the relay ignores size |
Details:
- The reference image's real type is decided by magic bytes, never by its extension. A missing file, a non-regular file, anything over 20 MB, or an unsupported image format fails before the request is sent, so no credits are spent.
- Upload uses
multipart/form-data;Content-Typeand the boundary are left toFormData. - If your relay rejects
response_format, setresponseFormatto an empty string and the field is omitted entirely.
Installation
The official generic way (recommended)
dsh plugin --profile <profile> add dsh-image2-tool
Replace <profile> with the profile you actually use (for example web or default). Restart DSH afterwards and image2_generate appears in the tool list.
Equivalent alternatives
# A tgz downloaded from a GitHub release
dsh plugin --profile <profile> add ./dsh-image2-tool-0.4.1.tgz
# Straight from the GitHub repository
dsh plugin --profile <profile> add github:544244857/dsh-image2-plugin
# A local source checkout (for development)
dsh plugin --profile <profile> add ./plugins/deepseek-harness-image2
To create a separate profile for trying it out:
dsh --profile image2-demo --from-default-profile web --dump-config
Configuration
The two routes are equivalent — pick one.
① Graphical: sidebar → Plugins → dsh-image2-tool → the image2 row, fill in the fields (the apiKey field is masked) and save; it is written back to the current profile's Cordis patch.
② Configuration file: $DSH_HOME/profiles/<profile>/cordis.patch.yml (or ~/.dsh/profiles/<profile>/cordis.patch.yml when DSH_HOME is unset):
- id: image2
name: dsh-image2-tool
config:
baseUrl: https://your-image-relay.example.com/v1
model: grok-imagine-image-2.0
apiKeyEnv: IMAGE2_API_KEY
autoGenerateAssets: false
outputDir: imagegen-output
timeoutMs: 180000
responseFormat: b64_json
| Field | Description |
|---|---|
baseUrl |
Relay base URL (OpenAI-compatible, including /v1) |
model |
Model name. It must exist on that relay's /v1/models, otherwise calls return 404 |
apiKeyEnv |
The environment variable name holding the API key (not the key itself) |
apiKey |
The masked field on the settings page. When non-empty it wins over apiKeyEnv, which then serves as the fallback |
autoGenerateAssets |
Whether the agent may auto-fill genuinely missing bitmap assets during software work. Default false |
outputDir |
Output directory, resolved against the session directory and clamped so it cannot escape it |
timeoutMs |
Per-request timeout |
responseFormat |
Format requested from the relay. Default b64_json (image bytes come back inline). url makes the plugin download the link the relay returns. An empty string omits the field entirely, for relays that reject it |
The API key belongs to the process that launches DSH:
$env:IMAGE2_API_KEY = 'your-image-relay-api-key'
dsh --profile web
An already-running desktop app will not pick up a newly set environment variable — relaunch it from a terminal that has it. Never commit the key.
Inline preview
Installing this plugin also installs @wisdoverse/dsh-inline-media-viewer 1.0.12. That package ships its own dsh.bundle patch, which the profile manager enables automatically, so an image path mentioned in a reply is rendered as an actual image.
It is maintained upstream under the MIT licence; this plugin neither vendors nor modifies it. Removing that line from dependencies does not affect image2 at all — only the inline preview disappears. Upstream notes its inline image cards were verified on host 0.1.7-rc.2; this plugin targets 0.2.1-rc.1, where every host API it uses still exists, though the rendering path has not been re-tested upstream.
Behaviour and boundaries
autoGenerateAssetsis off by default. When enabled, the agent may — during web, mobile, desktop or game development, and only after confirming that neither the project nor external sources has a suitable asset — generate the genuinely missing bitmap. A direct user request to generate an image is unaffected by the switch. It is a tool-level guideline, not a server-side authorisation gate.- One image per call. Without
imagethe request goes toPOST /images/generations; withimageit goes toPOST /images/editsas a multipart upload. - Accepts both base64 and image-URL results; keeps existing files of the same name (adding a numeric suffix on conflict); confines output to the session directory; supports cancellation and request timeouts.
- The relay key is never forwarded when downloading an image.
- After saving, the native
read_imagetool must be used to check the actual file against the request; until that happens the tool reports visual verification as pending. - Retry budget: one initial generation plus at most five further requests (failures included). This is guidance, not a persistent counter.
- Reference material is input, never instructions.
FAQ
| Symptom | Cause and fix |
|---|---|
HTTP 404: Model "xxx" is not available for this group |
That model does not exist on the relay. Check GET /v1/models and correct model (volatile fields take effect on save, no restart needed) |
Error: fetch failed |
Network flakiness towards the relay; just retry (a very different failure from a 404) |
Image download failed or ConnectTimeoutError while downloading |
The relay returned a temporary link on its own CDN that this machine cannot reach. Set responseFormat to b64_json so the bytes come back inline |
Image-to-image reports Source image not found or contained no supported PNG, JPEG or WebP image bytes |
The reference path is wrong, or the file is not actually an image (type is decided by magic bytes — renaming does not help) |
Image-to-image reports HTTP 400: model is required |
That relay has no /images/edits route. Text-to-image still works; image-to-image needs a relay that supports it |
image2_generate is missing from the tool list |
The profile install did not succeed or DSH was not restarted; check that dsh.profile.bundles in the profile's package.json contains dsh-image2-tool |
The settings page shows unavailable |
That profile has no settings service; use the manual cordis.patch.yml row above |
| Images are not rendered inline | Make sure @wisdoverse/dsh-inline-media-viewer is also in dsh.profile.bundles, then restart DSH |
Compatibility
- Host: DeepSeek Harness desktop
0.2.1-rc.1(tested);0.2.0-rc.2and0.1.7-rc.2are also declared compatible - Node.js
>= 22.15(image-to-image relies on the globalFormData/Blob) - The plugin shares the host's Cordis / Schemastery / tool runtime through
peerDependencies; do not drop an incompatible physical copy into the plugin directory (you would end up with two instances)
How it works
flowchart LR
U[User: generate / edit an image] --> A[Agent]
A -->|image2_generate| T[dsh-image2-tool]
T -->|no image: POST /images/generations| R[Your image relay]
T -->|with image: POST /images/edits| R
R -->|b64_json or url| T
T --> F[Session directory / outputDir]
F --> V[read_image visual check]
V --> P[Inline preview under the reply]
- Tool surface:
image2_generate(host tool registry) - Client surface:
lib/client.jsinjects theimage2settings row into the Plugins page - Bundle surface:
cordis.patch.ymlinserts the plugin rowid: image2 - Tests:
test/smoke.jscovers both channels against a local fake relay — no network, no credits
License
MIT © 2026 544244857. Depends on @wisdoverse/dsh-inline-media-viewer (MIT, copyright its authors).
中文文档:README.md