Image generation workbench and agent tool for DSH: one tool (ark9_generate_image) paints text-to-image and image-to-image via any OpenAI-compatible API. Channels are entirely user-configured - no bundled endpoint, you bring your own baseURL, key and model name (manual input supported). Agent-initiated generations are approval-gated by default: requests queue in the floating panel and nothing bills until you approve; approval is non-blocking (the agent replies "awaiting your approval" immediately, and results, denials or timeouts are injected back so the agent reports them in the next turn). Floating glass workbench with five tabs (Generate / Approvals / Prompts / History / About), aspect-ratio grid with quality-budget + 16px-alignment sizing, transparent background, batch up to 10 images as aggregated sub-tasks, prompt library with custom JSON sources fetched through a host proxy, persistent generation logs with one-click retry, multi-channel aggregation with per-channel model fetching, bilingual UI (zh/en), stroke-SVG icon set, config import/export. Registers as a Better Sidebar tab when dsh-better-sidebar is installed; stacks above the dsh-cua FAB when both are present.
Install
# from npm (prebuilt)
dsh plugin --profile web add @a9i5k4/dsh-ark9canvas
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:Aik358/dsh-ark9canvas
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
v0.4.0 UPDATE — Bilingual UI (Chinese/English, one-tap switch in the panel header and Settings) and a full stroke-SVG icon set replacing emoji, matching the DeepSeek Harness visual language. Evolution roadmap: docs/ROADMAP.md. — The image workbench is now feature-complete against the reference design: aspect-ratio grid with the same quality-budget + 16px-alignment formula, transparent background, batch generation up to 10 images (independent sub-tasks, partial success still returns what finished), a prompt library with custom JSON sources, multi-channel aggregation, persistent generation logs with retry, and config import/export.
An image-generation plugin for the DeepSeek Harness Web GUI: the agent paints on request via one tool, you paint on demand in a floating workbench — and every agent-initiated generation waits for your approval by default, so nothing bills without a human nod.
The problem it solves: image APIs bill per call, yet agent-initiated generation usually runs blind — a bad prompt retries itself, a loop burns your balance. This plugin puts a human gate in the loop: the tool blocks until you approve in the panel (or denies/timeouts with a clear message and zero cost), while the workbench itself stays one click away for your own un-gated use.
Highlights in 30 seconds
| Approval gate by default | Every agent generation waits in the panel's Approvals tab — approve, deny, or let it time out; denial and timeout never bill |
| One workbench, two homes | Floating FAB + glass panel out of the box; auto-registers as a Better Sidebar tab when dsh-better-sidebar is installed; stacks above dsh-cua's FAB when both exist |
| Full size system | Aspect-ratio grid (12 presets + auto) computed with the quality-budget + 16px-alignment formula; manual W×H with 16-multiple snapping; gpt-image models auto-snap to the three native sizes |
| Batch up to 10 | Each image runs as an independent sub-task aggregated into one batch — partial success still returns what finished, with per-batch ok/fail counts |
| Transparent background | One toggle sends background:"transparent" (supported by gpt-image family) |
| Prompt library | Local favorites (☆) + custom JSON sources fetched through a host-side proxy — no CORS, no bundled third-party content |
| Multi-channel aggregation | Keep several OpenAI-compatible relays (baseURL + key + model each), switch the active one, fetch model lists per channel |
| Persistent generation logs | Every batch is recorded with params and outcomes; failed batches retry with one click; multi-select delete |
| Bilingual UI | One-tap Chinese/English switch (panel header + Settings), initialized from your browser language |
| AI-friendly by design | Tool results return saved file paths + dimensions — never base64 blobs — unless you explicitly ask for them; references accept dataURLs or previous output paths for iterative editing |
Feature tour
Approval gate — human in the loop, by default
When the agent calls ark9_generate_image, the request appears in the panel's Approvals tab with the prompt, parameters, and elapsed wait time. Approve → generation starts and bills; Deny → the tool returns a clear "user denied" message and the agent asks what to change instead of retrying; Timeout (configurable, 5–600 s) → cancelled, nothing billed. Set Settings → Ark9 生图 → 安全 to never if you want unattended auto-generation.
Workbench — five tabs
- 生成 Generate: prompt, reference images (upload or clipboard paste), model dropdown with per-channel fetch, aspect-ratio grid / manual W×H, quality, transparent toggle, 1–10 count
- 审批 Approvals: pending agent requests with one-click approve/deny
- 提示词 Prompts: search, click to apply, ☆ to favorite locally; custom JSON sources (
[{title, prompt, tags?}]) proxied through the host to bypass browser CSP/CORS - 记录 Logs: every generation with status pills (成功 / 部分成功 / 失败), retry, multi-select delete, click-to-preview
- 说明 About: quick reference
Size system — faithful to the reference formula
Ratios compute their pixel dimensions from a quality budget (low 1K² / medium 2K² / high 4K²) with 16-pixel alignment, exactly like the reference workbench. Because the gpt-image family only accepts three native sizes (1024×1024, 1536×1024, 1024×1536), gpt-image models automatically snap the computed size to the nearest native one; other models send the raw computed size. Manual W×H with a 16-multiple alignment toggle is always available.
Iterative editing — paths, not blobs
ark9_generate_image returns saved file paths with dimensions. Pass any previous output path back via images and the plugin reads the file and runs an /images/edits multipart call — multi-turn "make the robot red" works without ever stuffing base64 into the conversation. returnDataUrl: true opts into inline base64 when a client truly needs it.
Channels — aggregate your relays
Configure multiple OpenAI-compatible channels (name + baseURL + key + default model), mark one active, fetch each channel's model list from its own /models. The active channel serves both the agent tools and the workbench; single-channel setups from older versions migrate automatically.
Engineering core (restraint by design)
- Zero runtime dependencies beyond Node built-ins
- Batch aggregation: count N → N independent sub-tasks (n:1 each), merged into one batch view with ok/fail counts — one slow image never blocks the others
- Durable state: tasks and logs persist to
~/.dsh/ark9-canvas-*.json; a server restart never orphans a poll - Loopback-only routes: every API route rejects non-localhost callers; file routes are name-sanitized against path traversal
- No third-party prompt content bundled: sources are user-provided URLs
Install (one command)
Prerequisite: install DeepSeek Harness and start
dsh webat least once.
Run in the profile directory (~/.dsh/profiles/web):
cd ~/.dsh/profiles/web
pnpm add @a9i5k4/dsh-ark9canvas
Then edit package.json in that directory and append to the dsh.profile.bundles array:
"@a9i5k4/dsh-ark9canvas"
Restart dsh web — the 🖼️ floating button appears (or a sidebar tab, with Better Sidebar installed). Open Settings → Ark9 生图 once to add a channel (baseURL with /v1, API key, model such as gpt-image-2).
No pnpm?
npm install @a9i5k4/dsh-ark9canvasworks the same. pnpm v11 blocks packages published <1 day ago: setminimumReleaseAge: 0in pnpm-workspace.yaml or pin an explicit version for same-day updates.
AI-era installation
Copy this to the AI assistant you're already using:
Install the npm package @a9i5k4/dsh-ark9canvas in the DeepSeek Harness web profile
directory ~/.dsh/profiles/web (pnpm add or npm install),
append "@a9i5k4/dsh-ark9canvas" to the dsh.profile.bundles array in package.json,
then restart dsh web. After that, open Settings → Ark9 生图 and add an
OpenAI-compatible image channel (baseURL with /v1, API key, model).
Updating
cd ~/.dsh/profiles/web && pnpm up @a9i5k4/dsh-ark9canvas
Configuration
Config file ~/.dsh/ark9-canvas.json (everything adjustable in the Settings GUI):
{
"baseURL": "https://your-relay.example/v1",
"apiKey": "sk-...",
"model": "gpt-image-2",
"quality": "high",
"size": "1536x1024",
"count": 1,
"agentApproval": "always",
"approvalTimeoutSec": 120,
"channels": [
{ "id": "c1", "name": "relay-a", "baseURL": "https://your-relay.example/v1", "apiKey": "sk-...", "model": "gpt-image-2" }
],
"activeChannelId": "c1",
"promptSources": [
{ "id": "ps1", "name": "my prompts", "url": "https://example.com/prompts.json" }
],
"outputDir": ""
}
| Key | Meaning |
|---|---|
agentApproval |
always (default) — agent generations need panel approval; never — unattended |
approvalTimeoutSec |
5–600 s; timeout cancels without billing |
channels / activeChannelId |
Multi-channel aggregation; falls back to the top-level baseURL/apiKey/model when empty |
outputDir |
Where images are saved; empty = ~/Pictures/ark9-canvas |
Tasks persist to ~/.dsh/ark9-canvas-tasks.json, generation logs to ~/.dsh/ark9-canvas-logs.json.
Structure
lib/index.js— Host half: two agent tools, eleven routes, OpenAI-compatible image proxy (async task protocol + batch aggregation), approval queue, persistent logs (zero runtime deps, Node built-ins only)lib/client.js— Browser half: floating FAB + glass workbench (shared vanilla-DOM implementation for floating panel and sidebar tab), settings pagecordis.patch.yml— plugin registration rowdocs/ROADMAP.md— evolution roadmap: DSH-host synergies (AI prompt enhancement, memory-driven styles), cost dashboard, capability registry, mask editingsmoke-test.mjs— offline integration test (tools / routes / approval paths, no API calls)e2e-approval-test.mjs— real end-to-end generation test (bills!)
Known limitations
- Video generation, mask/inpainting painting UI, Gemini-format calls, the infinite-canvas node editor, and WebDAV sync are out of scope (backend has no video model; config import/export stands in for sync).
- The prompt library ships without any third-party content — add your own sources.
- Panel-initiated (manual) generations are never approval-gated: pressing the button is the approval, and it bills.
- Plugin-set changes require a dsh restart.
Credits
This project is built human-machine collaboratively:
- Aik358 — project owner: product direction and engineering.
- ZCode (GLM, Z.ai) — autonomous engineering agent: plugin implementation, protocol reverse-engineering of the async-task/media-upload relay protocol, test suites.
Release
- GitHub: https://github.com/Aik358/dsh-ark9canvas
- npm:
@a9i5k4/dsh-ark9canvas - License: BSD-3-Clause · Independent implementation, contains no WorldCodes Canvas code or branding
Links
More in this category
Tencent/WeKnora#dsh-weknora★ 34626
Four read-only tools over a WeKnora knowledge base: list knowledge bases, hybrid passage search, reassemble one document's chunks in order, and WeKnora's own cited RAG or ReAct-agent answer with a resumable session id.
superdesigndev/treg★ 5760
Tool catalog for agents: search ~2,600 external endpoints (SEO and SERP, backlinks, social, people and company enrichment, ad libraries, scraping) by the task you want done, read each one's parameters and per-call price, then call it with the credential injected server-side. Ships the skill plus an MCP row that stays disabled until TREG_TOKEN is set.
T-Auto/dsh-ops★ 3102
Provides bash, PowerShell 7, and high-performance Rust tools for DSH on Windows to reduce token usage.
TencentCloudBase/CloudBase-AI-Toolkit#dsh-plugin★ 1139
Tencent CloudBase backend for DeepSeek Harness — scaffold and deploy full-stack apps from chat, render query results as table cards with paging, sorting and CSV export, preview a deployment on its domain, and call the CloudBase MCP toolset (`mcp__cloudbase__*`) with device-code login.
sixtysevenlf/dsh-blender-plugin★ 599
Lets a DSH agent drive a local Blender over a direct TCP channel with 16 tools: viewport frames, custom-angle renders, Python execution, headless and job offload, transaction rollback, and a planning layer of 186 ops across 28 families.
anysearch-team/anysearch-dsh★ 537
AnySearch-powered real-time web and vertical search provider for DeepSeek Harness.
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.