dsh-image-gen 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.en.md +148 -133
  2. package/README.md +148 -133
  3. package/docs/assets/readme/canvas-edit.webp +0 -0
  4. package/docs/assets/readme/canvas-sketch.webp +0 -0
  5. package/docs/assets/readme/chat-batch.webp +0 -0
  6. package/docs/assets/readme/config.webp +0 -0
  7. package/docs/assets/readme/hero-batch.webp +0 -0
  8. package/docs/assets/readme/hero-canvas.webp +0 -0
  9. package/docs/assets/readme/studio-ref.webp +0 -0
  10. package/docs/assets/readme/studio.webp +0 -0
  11. package/lib/client.js +10848 -6335
  12. package/lib/index.js +2625 -145
  13. package/lib/types/capabilities.d.ts +10 -6
  14. package/lib/types/client/browser-image-utils.d.ts +6 -0
  15. package/lib/types/client/conversation-image-revisions.d.ts +3 -0
  16. package/lib/types/client/conversation-regenerate.d.ts +9 -1
  17. package/lib/types/client/datalist-scroll-fix.d.ts +32 -0
  18. package/lib/types/client/gallery-batch-bar.d.ts +8 -0
  19. package/lib/types/client/gallery-card.d.ts +21 -0
  20. package/lib/types/client/gallery-format.d.ts +7 -0
  21. package/lib/types/client/gallery-i18n.d.ts +236 -0
  22. package/lib/types/client/gallery-media.d.ts +58 -0
  23. package/lib/types/client/gallery-merge.d.ts +15 -0
  24. package/lib/types/client/gallery-store.d.ts +23 -2
  25. package/lib/types/client/gallery-thumbs.d.ts +24 -0
  26. package/lib/types/client/gallery-view.d.ts +0 -207
  27. package/lib/types/client/gif-card.d.ts +67 -0
  28. package/lib/types/client/gif-comments.d.ts +95 -0
  29. package/lib/types/client/gif-controls.d.ts +22 -0
  30. package/lib/types/client/gif-edit.d.ts +87 -0
  31. package/lib/types/client/gif-filmstrip.d.ts +23 -0
  32. package/lib/types/client/gif-gallery.d.ts +39 -0
  33. package/lib/types/client/gif-i18n.d.ts +159 -0
  34. package/lib/types/client/gif-menus.d.ts +36 -0
  35. package/lib/types/client/gif-player.d.ts +131 -0
  36. package/lib/types/client/gif-sheet.d.ts +116 -0
  37. package/lib/types/client/gif-style.d.ts +2 -0
  38. package/lib/types/client/image-result-node.d.ts +19 -1
  39. package/lib/types/client/image-result-view.d.ts +26 -0
  40. package/lib/types/client/index.d.ts +1 -20
  41. package/lib/types/client/plugin-i18n.d.ts +375 -0
  42. package/lib/types/client/plugin-style.d.ts +1 -0
  43. package/lib/types/client/provider-pill.d.ts +9 -0
  44. package/lib/types/client/studio-helpers.d.ts +63 -0
  45. package/lib/types/client/studio-session.d.ts +54 -0
  46. package/lib/types/client/studio-style.d.ts +1 -1
  47. package/lib/types/client/studio-view.d.ts +6 -7
  48. package/lib/types/client/tl/gallery-image-transfer.d.ts +1 -1
  49. package/lib/types/config.d.ts +12 -0
  50. package/lib/types/gif-info.d.ts +32 -0
  51. package/lib/types/import-route.d.ts +11 -0
  52. package/lib/types/multipart.d.ts +29 -0
  53. package/lib/types/openai-compatible.d.ts +8 -0
  54. package/lib/types/openai-output.d.ts +20 -1
  55. package/lib/types/request-cache.d.ts +41 -0
  56. package/lib/types/shared.d.ts +57 -3
  57. package/lib/types/storage-stats.d.ts +34 -0
  58. package/lib/types/studio-route.d.ts +2 -0
  59. package/lib/types/studio.d.ts +9 -0
  60. package/lib/types/subscription/vendors/codex.d.ts +4 -3
  61. package/lib/types/thumb-route.d.ts +25 -0
  62. package/lib/types/vault-registry.d.ts +66 -0
  63. package/lib/types/vault-route.d.ts +8 -0
  64. package/lib/types/vault-store.d.ts +33 -0
  65. package/lib/types/zip-progress.d.ts +18 -0
  66. package/lib/types/zip-route.d.ts +25 -0
  67. package/lib/types/zip-stream.d.ts +43 -0
  68. package/package.json +2 -2
  69. package/lib/types/client/tl/tl-trace-bridge.d.ts +0 -55
  70. package/lib/types/client/tl/trace-playback.d.ts +0 -101
  71. package/lib/types/trace-drawing.d.ts +0 -102
  72. package/lib/types/trace-route.d.ts +0 -12
  73. package/lib/types/trace-sketch.d.ts +0 -26
  74. package/lib/types/trace-store.d.ts +0 -23
  75. package/lib/types/vendor/drawai/raster.d.ts +0 -43
  76. package/lib/types/vendor/drawai/trace-image.d.ts +0 -257
package/README.en.md CHANGED
@@ -8,9 +8,9 @@
8
8
 
9
9
  # 🎨 dsh-image-gen
10
10
 
11
- ### Native AI image creation suite for DeepSeek Harness
11
+ ### Draw by talking, right inside DeepSeek Harness
12
12
 
13
- <p><b>AI Creative Canvas · In-chat generation and editing · Studio batch creation · Multi-model comparison · 500+ prompt inspirations · Gallery management · Local ComfyUI · Subscription no-key</b></p>
13
+ <p><b>Batch generation from one message · Animated GIFs · A canvas the AI can actually read · Agent-picked prompts from 500+ examples · Subscription sign-in, no API key</b></p>
14
14
 
15
15
  <p>
16
16
  <a href="https://www.npmjs.com/package/dsh-image-gen"><img src="https://img.shields.io/npm/v/dsh-image-gen?style=flat-square&color=4f6ef7" alt="npm version" /></a>
@@ -27,6 +27,7 @@
27
27
  </p>
28
28
 
29
29
  <p>
30
+ <a href="#just-say-it">Just say it</a> ·
30
31
  <a href="#quick-start">Quick Start</a> ·
31
32
  <a href="#core-capabilities">Core Capabilities</a> ·
32
33
  <a href="#provider-support">Provider Support</a> ·
@@ -35,25 +36,22 @@
35
36
 
36
37
  <br />
37
38
 
38
- <img src="docs/assets/readme/canvas-generate.webp" alt="Sketching on the infinite canvas and generating a final image through conversation" width="46%" />
39
- <img src="docs/assets/readme/canvas-edit.webp" alt="Continuing to edit and iterate through conversation based on existing results" width="46%" />
40
- <br />
41
- <sub>Left: Sketch and place reference images on the canvas, then generate through conversation. · Right: Keep iterating on existing results through conversation.</sub>
42
-
43
- <br />
44
-
45
- <img src="docs/assets/readme/chat-generate.webp" alt="Generating images directly in conversation" width="46%" />
46
- <img src="docs/assets/readme/other-features.webp" alt="Studio batch creation, inspiration library, gallery and more" width="46%" />
47
- <br />
48
- <sub>Left: Describe and generate images right in the conversation. · Right: Studio batch creation, inspiration library, gallery, and more.</sub>
39
+ <table>
40
+ <tr>
41
+ <td width="50%" align="center"><b>🔁 One message, a whole set</b><br /><sub>5 scenes in one message, generated one by one</sub></td>
42
+ <td width="50%" align="center"><b>✏️ Sketch it, circle it, done</b><br /><sub>Circle the sword → an axe · stick figure → finished art</sub></td>
43
+ </tr>
44
+ <tr>
45
+ <td><a href="#chat-batch"><img src="docs/assets/readme/hero-batch.webp" alt="One message with 5 scenes; the Agent generates each and collects them in the Gallery" width="100%" /></a></td>
46
+ <td><a href="#ai-canvas"><img src="docs/assets/readme/hero-canvas.webp" alt="Circling a sword on the canvas to turn it into an axe, then turning a stick figure into an anime swordswoman" width="100%" /></a></td>
47
+ </tr>
48
+ </table>
49
49
 
50
50
  </div>
51
51
 
52
- **A complete AI image creation workflow for DeepSeek Harness.**
53
-
54
- `dsh-image-gen` goes far beyond basic in-chat image generation. It brings **in-chat generation with continuous editing**, an **AI creative canvas**, **Studio batch creation**, **side-by-side multi-model comparison**, a **prompt inspiration library**, and **local ComfyUI** workflows into DSH.
52
+ <br />
55
53
 
56
- It supports mainstream cloud image models and private local workflows, works with BYOK (bring your own key) or subscription accounts, and can isolate generated assets by workspace.
54
+ `dsh-image-gen` is a native image creation plugin for DeepSeek Harness. Instead of bolting an image button onto the chat, it **teaches the Agent itself to make images**: it can plan and generate a whole set in one go, read your sketches and selections on the canvas, and pull the right style template from the inspiration library on its own. When you want fine-grained control, Studio, multi-model comparison, and the Gallery are one click away.
57
55
 
58
56
  > **Already paying for ChatGPT, Grok, or Google? Just sign in and start generating—no separate API key purchase needed.**
59
57
 
@@ -63,21 +61,25 @@ Supports: Gemini · OpenAI / Compatible · Seedream · DashScope · Grok Imagine
63
61
  pnpm dsh plugin --profile web add dsh-image-gen@latest
64
62
  ```
65
63
 
66
- > **Update notice:** This release includes major changes. Existing users should update to the latest version.
67
-
68
- <img src="docs/assets/readme/workflow-overview-en.webp" alt="dsh-image-gen complete AI image creation workflow" width="100%" />
64
+ > See [Releases](https://github.com/shanliuling/dsh-image-gen/releases) for what changed in each version.
69
65
 
70
66
  ---
71
67
 
72
- ## One plugin, the complete AI image creation workflow
68
+ ## Just say it
69
+
70
+ No parameters to learn, no pages to switch. Just say it in a DSH chat:
73
71
 
74
- | Entry | Best for | What you can do |
75
- | :--- | :--- | :--- |
76
- | 💬 **Chat** | Expressing ideas quickly | Text-to-image, image-to-image, continuous editing, and revision iteration |
77
- | ✏️ **Canvas** | Expressing visual creativity | Sketch-to-image, reference composition, spatial creation, and continuous refinement |
78
- | 🎛️ **Studio** | Fine-grained control over creation parameters | Batch generation, multi-image reference, and advanced parameter tuning |
79
- | ✨ **Inspiration** | Finding creative direction | Prompt examples, style exploration, and one-click reuse |
80
- | 🖼️ **Gallery** | Managing generated results | Search, favorite, download, and reuse |
72
+ | You say | What the plugin does |
73
+ | :-- | :-- |
74
+ | "Make 4 illustrations for my *Coffee Shop Grand Opening* post, consistent flat style, 16:9" | 🔁 **Batch generation in chat**: the Agent splits the request into 4 prompts and generates them one by one, all delivered in a single reply |
75
+ | "Draw a coffee shop menu in hand-drawn style #123" | ✨ **Inspiration on autopilot**: the Agent searches the 500+ example library for that style, then applies the template |
76
+ | "Turn the sketch I drew on the canvas into a finished illustration" | ✏️ **Reads the canvas**: the Agent looks at your canvas selection and turns the draft into an image |
77
+ | "Turn the sword I circled into an axe, keep everything else" | 🎯 **Edit what you circle**: only the marked area changes |
78
+ | "Keep this character exactly the same, but put them in a snowy scene" | 🎭 **Identity consistency**: edits keep the same person or object instead of a lookalike |
79
+ | "Same prompt, one from GPT and one from Gemini, side by side" | ⚖️ **Multi-model comparison**: runs several models concurrently and lays the results out on one canvas |
80
+ | "Turn this character into a looping GIF of them waving" | 🎞️ **Animated GIFs**: generates a looping animation that plays in the card, with speed control and per-frame edit notes |
81
+
82
+ <img src="docs/assets/readme/workflow-overview-en.webp" alt="dsh-image-gen complete AI image creation workflow" width="100%" />
81
83
 
82
84
  ---
83
85
 
@@ -119,18 +121,18 @@ After restarting DSH, click the **Plugins** icon in the left sidebar, then click
119
121
 
120
122
  **Plugins panel → Installed → dsh-image-gen**
121
123
 
122
- <div align="center">
123
- <img src="docs/assets/readme/plugins-entry.webp" alt="Click Plugins in the left sidebar, then dsh-image-gen under Installed" width="100%" />
124
- <br />
125
- <sub>Click the Plugins icon in the left sidebar, then dsh-image-gen under Installed to open its detail page.</sub>
126
- </div>
127
-
128
124
  > DSH 0.1.5 and earlier have no Plugins panel; the entry there is **Settings → Plugins → Plugin Configuration → Image Generation**. The same plugin build supports both.
129
125
 
130
- Choose a Provider, enter your API key, and adjust the model, Endpoint / Base URL, and workspace-save options as needed. Once the key is stored, click **Test connection** to verify it, or **Fetch models** to pull every image-capable model the provider offers—no manual lookups needed. For ComfyUI, enter an address reachable by the DSH Host and import an **API Format Workflow JSON** file.
126
+ Choose a Provider, enter your API key, and adjust the model, Endpoint / Base URL, and workspace-save options as needed. Once the key is stored, click **Test connection** to verify it, or **Fetch models** to pull every image-capable model the provider offers—no manual lookups needed. For ComfyUI, enter an address reachable by the DSH Host and import an **API Format Workflow JSON** file. With several workflows imported, switch between them from the image button next to the chat input.
131
127
 
132
128
  Already paying for ChatGPT, Grok, or Google? No API key needed: expand the matching subscription Provider row, click **Sign in** and complete the authorization in your browser, then start generating (and editing) right away.
133
129
 
130
+ <div align="center">
131
+ <img src="docs/assets/readme/config.webp" alt="Choosing the default Provider on the plugin detail page, checking channel status, and switching channels from the chat input" width="100%" />
132
+ <br />
133
+ <sub>Pick a default Provider → check each channel's key / sign-in status → switch channels right from the chat input.</sub>
134
+ </div>
135
+
134
136
  ### 3. Start creating
135
137
 
136
138
  Describe the image you want directly in chat:
@@ -139,6 +141,12 @@ Describe the image you want directly in chat:
139
141
  Create a cinematic cyberpunk cat on a neon street at night, 16:9.
140
142
  ```
141
143
 
144
+ Want a whole set? Just say how many and what should stay consistent:
145
+
146
+ ```text
147
+ Make 5 images for my "Weekend Camping Checklist" post: tent, stove, sleeping bag, lights, snacks. Consistent Japanese hand-drawn style, 3:4.
148
+ ```
149
+
142
150
  You can also upload a reference image directly for style transfer or editing:
143
151
 
144
152
  ```text
@@ -148,10 +156,9 @@ Keep the character and composition unchanged, then add black sunglasses to the c
148
156
  <br />
149
157
 
150
158
  <div align="center">
151
- <img src="docs/assets/readme/plugin-detail.webp" alt="Provider settings form on the dsh-image-gen detail page" width="46%" />
152
- <img src="docs/assets/readme/chat-example.webp" alt="Chat generation and editing example" width="46%" />
159
+ <img src="docs/assets/readme/chat-example.webp" alt="Chat generation and editing example" width="60%" />
153
160
  <br />
154
- <sub>Left: Provider settings on the plugin detail page · Right: In-chat generation, editing, and continuous refinement.</sub>
161
+ <sub>In-chat generation, editing, and continuous refinement.</sub>
155
162
  </div>
156
163
 
157
164
  <br />
@@ -162,9 +169,54 @@ For more precise parameter control, open **Gallery** from the conversation heade
162
169
 
163
170
  ## Core Capabilities
164
171
 
172
+ <a id="chat-batch"></a>
173
+
174
+ ### 🔁 Batch generation in chat: one message, a whole set
175
+
176
+ Post illustrations, storyboards, series art, or several variations on a theme—without asking for them one at a time.
177
+
178
+ - Describe how many images you want and what they share. The Agent plans the set of prompts itself, **up to 10 images per call**, attached in order to a single reply.
179
+ - Aspect ratio, resolution, model, and Provider can be set once for the whole set to keep it consistent.
180
+ - Images generate one after another, and **one failure never stops the rest**: the reply reports "X of Y generated" and lists what failed and why.
181
+ - Works with local ComfyUI and subscription channels too.
182
+
183
+ <div align="center">
184
+ <img src="docs/assets/readme/chat-batch.webp" alt="One message asks the Agent for 5 anime illustrations; a failed one is retried and the set lands in the Gallery" width="100%" />
185
+ <br />
186
+ <sub>One message with 5 scenes → the Agent plans two batches → images arrive one by one, the failed one is retried on its own → the whole set lands in the Gallery. (Waiting sped up.)</sub>
187
+ </div>
188
+
189
+ > **How is this different from Studio batches?** Chat batches are a **set of different images** the Agent plans for you (say, 4 illustrations of different scenes). Studio batches are **several candidates for the same prompt**, and you keep the ones you like.
190
+
191
+ <br />
192
+
193
+ <a id="ai-canvas"></a>
194
+
195
+ ### ✏️ A canvas the AI can actually read
196
+
197
+ Sketch on an infinite canvas, lay out references, circle what should change, then just tell the AI what you want. **The Agent sees what is on the canvas and what you have selected**, so there is no need to screenshot, upload, or describe positions.
198
+
199
+ - **Sketch → image**: draw a rough outline, select it, and say "make this a cartoon character".
200
+ - **Edit what you circle**: mark an area on an existing image and say "turn this into an axe"; only the circled part changes.
201
+ - **Combine references**: drag images from Recent generations or the Gallery onto the canvas, or click Send to canvas on a thumbnail, then select several together as references. Repeated imports of the same history item are deduplicated.
202
+ - Every result stays on the canvas, so you can keep iterating from any version.
203
+
204
+ <div align="center">
205
+ <img src="docs/assets/readme/canvas-edit.webp" alt="Circle the sword on the canvas, say one sentence, and the Agent swaps only the sword for an axe" width="100%" />
206
+ <br />
207
+ <sub><b>Edit what you circle</b>: circle the swordswoman's blade, ask for an axe, and the Agent confirms what you marked, then changes only that.</sub>
208
+ <br /><br />
209
+ <img src="docs/assets/readme/canvas-sketch.webp" alt="Draw a stick-figure sketch on the canvas and the Agent turns it into an anime swordswoman with the same pose" width="100%" />
210
+ <br />
211
+ <sub><b>Sketch → image</b>: doodle a stick figure holding a sword, select it, ask for "the previous style", and the pose and framing follow your sketch. (Waiting sped up.)</sub>
212
+ </div>
213
+
214
+ <br />
215
+
165
216
  ### 💬 In-chat generation, editing, and revision switching
166
217
 
167
218
  - Use natural language for text-to-image, image-to-image, multi-image reference, and style transfer.
219
+ - **Identity consistency**: when you ask to keep a person, character, or object the same, the plugin tells the model to reuse the subject from the references and change only the scene, clothing, pose, or style, rather than drawing a similar-looking replacement.
168
220
  - Edit the original prompt to regenerate, then switch between revisions on the same image card.
169
221
 
170
222
  <br />
@@ -178,66 +230,67 @@ For more precise parameter control, open **Gallery** from the conversation heade
178
230
 
179
231
  <br />
180
232
 
181
- ### ✏️ From sketch to image: AI creative canvas
233
+ ### 🎞️ Animated GIFs: generate, play, edit by frame
182
234
 
183
- Express your ideas on an infinite canvas and turn drafts, compositions, and thoughts into real images through conversation.
235
+ With a GIF-capable model such as GPT Image 2.6, just ask for a "GIF" or "animation" in chat to get a looping animation, including animating the character from a reference image. Frame count and timing can be set with `frame_count` (2–16) and `frame_duration_ms` (20–2000 ms).
184
236
 
185
- - Freely sketch, add reference materials, and organize your ideas on the canvas.
186
- - Drag images from Recent generations or the Gallery onto the canvas, or click Send to canvas on a thumbnail. Open the infinite canvas and wait for the image to load first; repeated imports of the same history item are deduplicated.
187
- - Talk to the AI in natural language to turn a draft into a finished piece.
188
- - Keep editing, refining, and exploring new directions from existing results—your creative process is preserved so every exploration stays iterable.
237
+ - When a result is a GIF, the chat card plays it: set the speed (0.2×–2×) from its corner, and the toolbar's download menu saves the GIF at the current or the original speed, or the frame on screen as PNG. The enlarged view adds a play button and a frame timeline (hover to preview a frame, click to stop on it) next to the speed. In the Gallery, GIF tiles carry a badge and play on hover, and the enlarged view plays and downloads them the same way. The GIF file can be dragged straight out, and regenerating keeps it a GIF (the clipboard only takes still images, so copying gives a single frame).
238
+ - A GIF card's **Edit** chip (or **Edit frames** in the enlarged view) takes notes on frames: click a spot on the picture to leave a note, which shows only on its own frame, or switch to **All frames** to see them together; send once to redraw the whole animation from your notes, kept as a new version that plays (OpenAI and compatible channels only, and the relay must support image editing; otherwise one click turns the notes into a plain regeneration).
239
+ - Supported channels: official OpenAI and OpenAI-compatible relays (the model and relay must support GIF). The Codex images endpoint behind the ChatGPT subscription does not offer GIF output upstream yet.
189
240
 
190
241
  <br />
191
242
 
192
- <div align="center">
193
- <img src="docs/assets/readme/canvas-generate.webp" alt="Sketching on the infinite canvas and generating a final image through conversation" width="46%" />
194
- <img src="docs/assets/readme/canvas-edit.webp" alt="Continuing to edit and iterate through conversation based on existing results" width="46%" />
195
- <br />
196
- <sub>Left: Sketch and place reference images on the canvas, then generate through conversation. · Right: Keep iterating on existing results through conversation.</sub>
197
- </div>
198
-
199
- <br />
243
+ ### ✨ 500+ prompt inspirations, and the Agent finds them for you
200
244
 
201
- ### 🎛️ Studio batch creation
245
+ Ships with a hand-drawn style cookbook (styles / layouts / theme colors) and the awesome-gpt-image-2 example set: 500+ ready-to-reuse prompts.
202
246
 
203
- - Support multiple reference images, and generate multiple candidates at a time.
204
- - Control the Provider, model, aspect ratio, and quality, then save only the results you want.
247
+ - **Name it in chat**: say "use style #123", "make it an infographic layout", or "Morandi palette", and the Agent searches the library first, then applies the template to your topic. Styles, layouts, and theme colors can be combined.
248
+ - **Browse in the UI**: filter, favorite, copy, or send a prompt straight to Studio (see the Studio demo below).
249
+ - Images are cached locally, so browsing and learning consume no tokens or generation quota.
205
250
 
206
251
  <br />
207
252
 
208
253
  <div align="center">
209
- <img src="docs/assets/readme/studio-workbench.webp" alt="dsh-image-gen Studio workbench" width="100%" />
254
+ <img src="docs/assets/readme/inspiration-library.webp" alt="Prompt inspiration library" width="100%" />
210
255
  <br />
211
- <sub>Import references, control parameters, generate batches, select results, and save—all within one Studio.</sub>
256
+ <sub>Find inspiration first, then send a prompt to Studio. Browsing and copying from the local cache consume no generation quota.</sub>
212
257
  </div>
213
258
 
214
259
  <br />
215
260
 
216
- ### ⚖️ Side-by-side multi-model comparison
261
+ ### 🎛️ Studio: hands-on control, no chat needed
217
262
 
218
- Run the same prompt and reference images across multiple models, then compare and save the results on one canvas.
263
+ When you want precise control, open **Gallery → Studio** from the conversation header and every parameter is right there.
264
+
265
+ - **Start from inspiration**: click "Send to Studio" in the inspiration library and the prompt is filled in.
266
+ - **Every parameter in view**: pick the Provider, model, aspect ratio, quality, and watermark separately; generate 1–4 candidates and save only the ones you like.
267
+ - **Keep editing past results**: drag an image in from Recent generations and click "Continue editing" to make it the image-to-image reference (up to 5).
268
+ - Switch between single model and multi-model comparison in one click.
219
269
 
220
270
  <br />
221
271
 
222
272
  <div align="center">
223
- <img src="docs/assets/readme/multi-model-compare.webp" alt="Comparing the same prompt across multiple image models" width="100%" />
273
+ <img src="docs/assets/readme/studio.webp" alt="Picking a prompt from the inspiration library, sending it to Studio, and generating a poster" width="100%" />
224
274
  <br />
225
- <sub>Compare results from different models on one canvas, then save the images you prefer in a batch.</sub>
275
+ <sub>Pick a prompt from the library → send it to Studio → set parameters and generate → decide what to keep. (Waiting sped up.)</sub>
276
+ <br /><br />
277
+ <img src="docs/assets/readme/studio-ref.webp" alt="Dragging an image in from Recent generations and clicking Continue editing to use it as a reference" width="100%" />
278
+ <br />
279
+ <sub>Drag an image in from Recent generations → "Continue editing" → Studio switches to image-to-image with it as the reference.</sub>
226
280
  </div>
227
281
 
228
282
  <br />
229
283
 
230
- ### ✨ 500+ prompt inspiration examples
284
+ ### ⚖️ Side-by-side multi-model comparison
231
285
 
232
- - Browse and filter **500+ prompt examples**, then favorite, copy, or send them directly to Studio.
233
- - Images are cached locally, so browsing and learning consume no tokens or generation quota.
286
+ Run the same prompt and reference images across multiple models concurrently, then compare and save the results on one canvas.
234
287
 
235
288
  <br />
236
289
 
237
290
  <div align="center">
238
- <img src="docs/assets/readme/inspiration-library.webp" alt="Prompt inspiration library" width="100%" />
291
+ <img src="docs/assets/readme/multi-model-compare.webp" alt="Comparing the same prompt across multiple image models" width="100%" />
239
292
  <br />
240
- <sub>Find inspiration first, then send a prompt to Studio. Browsing and copying from the local cache consume no generation quota.</sub>
293
+ <sub>Compare results from different models on one canvas, then save the images you prefer in a batch.</sub>
241
294
  </div>
242
295
 
243
296
  <br />
@@ -262,7 +315,7 @@ Run the same prompt and reference images across multiple models, then compare an
262
315
  Bring private image generation on your local GPU directly into Agent conversations.
263
316
 
264
317
  - Import and manage multiple named workflows with prompt presets and common placeholders.
265
- - Let the Agent select a workflow by name for text-to-image or image-to-image generation in chat.
318
+ - Let the Agent select a workflow by name for text-to-image, image-to-image, or batch generation in chat.
266
319
 
267
320
  > ComfyUI is not yet integrated into Studio or multi-model comparison.
268
321
 
@@ -280,70 +333,26 @@ Bring private image generation on your local GPU directly into Agent conversatio
280
333
 
281
334
  ## Provider Support
282
335
 
283
- | Provider | Chat generation | Chat editing | Studio | Multi-model comparison |
284
- | :--- | :---: | :---: | :---: | :---: |
285
- | **Google Gemini** | ✅ | ✅ Multiple | ✅ | ✅ |
286
- | **OpenAI Images** | ✅ | ✅ Multiple | ✅ | ✅ |
287
- | **OpenAI Compatible (relay)** | ✅ | ✅ Multiple | ✅ | ✅ |
288
- | **ByteDance Seedream / Volcengine Ark** | ✅ | ✅ Multiple | ✅ | ✅ |
289
- | **Aliyun DashScope / Qwen Image** | ✅ | ✅ Multiple | ✅ | ✅ |
290
- | **xAI Grok Imagine** | ✅ | ⚠️ Limited | ✅ | ✅ |
291
- | **Zhipu GLM-Image** | ✅ | — | ✅ | ✅ |
292
- | **Local ComfyUI** | ✅ | ✅ Single | — | — |
293
- | **ChatGPT subscription (key-free)** | ✅ | ✅ Multiple | ✅ | ✅ |
294
- | **Grok subscription (key-free)** | ✅ | ✅ Multiple | ✅ | ✅ |
295
- | **Google subscription (key-free)** | ✅ | ✅ Multiple | ✅ | ✅ |
336
+ | Provider | Chat generation | Chat batch | Chat editing | Studio | Multi-model comparison | GIF |
337
+ | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
338
+ | **Google Gemini** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
339
+ | **OpenAI Images** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | ✅ |
340
+ | **OpenAI Compatible (relay)** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | ✅ |
341
+ | **ByteDance Seedream / Volcengine Ark** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
342
+ | **Aliyun DashScope / Qwen Image** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
343
+ | **xAI Grok Imagine** | ✅ | ✅ | ⚠️ Limited | ✅ | ✅ | — |
344
+ | **Zhipu GLM-Image** | ✅ | ✅ | — | ✅ | ✅ | — |
345
+ | **Local ComfyUI** | ✅ | ✅ | ✅ Single | — | — | — |
346
+ | **ChatGPT subscription (key-free)** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
347
+ | **Grok subscription (key-free)** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
348
+ | **Google subscription (key-free)** | ✅ | ✅ | ✅ Multiple | ✅ | ✅ | — |
296
349
 
297
350
  > Studio and multi-model comparison currently support cloud Providers only (subscription channels included). Multi-model comparison uses the model configured for each Provider in Settings.
298
351
  > Zhipu GLM-Image does not support image-to-image upstream. xAI image editing goes through the OpenAI-compatible protocol (multipart); some gateways may need further adaptation.
299
- > Subscription channels work through account sign-in (no API key). They support in-chat text-to-image / image-to-image, Studio batch generation, and multi-model comparison; edits ride each channel's edit endpoint (up to 5 reference images), with aspect ratio and quality selectable directly in Studio.
352
+ > Subscription channels work through account sign-in (no API key). Edits ride each channel's edit endpoint (up to 5 reference images), with aspect ratio and quality selectable directly in Studio.
353
+ > Chat generation and editing on OpenAI and compatible channels can produce an animated GIF directly, for example animating the character in a reference image (the model and relay must support it; editing also needs the relay to support image edits); frame count and timing options are in the [Provider configuration reference](docs/providers.en.md). The endpoint the ChatGPT subscription uses does not offer GIF output yet.
300
354
 
301
- <details>
302
- <summary><strong>Current default models and endpoints (all configurable)</strong></summary>
303
-
304
- | Provider | Default model | Default Endpoint / Base URL |
305
- | :--- | :--- | :--- |
306
- | Google Gemini | `gemini-3.1-flash-image` | `https://generativelanguage.googleapis.com/v1beta/interactions` |
307
- | OpenAI Images | `gpt-image-2` | `https://api.openai.com/v1` |
308
- | OpenAI Compatible | Custom | Custom Base URL |
309
- | ByteDance Seedream | `doubao-seedream-5-0-260128` | `https://ark.cn-beijing.volces.com/api/v3` |
310
- | Aliyun DashScope | `qwen-image-3.0` | `https://dashscope.aliyuncs.com/api/v1` |
311
- | xAI Grok Imagine | `grok-imagine-image` | `https://api.x.ai/v1` |
312
- | Zhipu GLM-Image | `glm-image` | `https://open.bigmodel.cn/api/paas/v4` |
313
- | Local ComfyUI | Imported API Workflow | `http://127.0.0.1:8188` |
314
- | ChatGPT subscription | `gpt-image-2.5-flare` (channel-fixed) | Account sign-in, no configuration |
315
- | Grok subscription | `grok-imagine-image-2.0` (channel-fixed) | Account sign-in, no configuration |
316
- | Google subscription | `gemini-3.1-flash-image` (channel-fixed) | Account sign-in, no configuration |
317
-
318
- </details>
319
-
320
- <details>
321
- <summary><strong>Aspect ratios and quality tiers per Provider</strong></summary>
322
-
323
- | Provider | Aspect ratios | Quality tiers |
324
- | :--- | :--- | :--- |
325
- | Google Gemini | 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 4:5 · 5:4 · 16:9 · 9:16 · 21:9 | 1K / 2K / 4K |
326
- | OpenAI Images | gpt-image-2 family: 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 | Resolution: 1K / 2K (also 4K for landscape/portrait widescreen); separate quality: auto / low / medium / high |
327
- | OpenAI Compatible | Driven by `openaiCompatSizes` (default 1:1 · 3:2 · 2:3) | Resolution from the size table; separate configurable quality, omitted by default |
328
- | ByteDance Seedream | auto · 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 | 2K / 3K / 4K |
329
- | Aliyun DashScope | 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 | standard |
330
- | xAI Grok Imagine | auto · 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 | 1K / 2K |
331
- | Zhipu GLM-Image | 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 | hd |
332
- | ChatGPT subscription | auto · 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 | auto / low / medium / high / xhigh / max |
333
- | Grok subscription | auto · 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 16:9 · 9:16 · 21:9 | 1K / 2K |
334
- | Google subscription | auto · 1:1 · 3:2 · 2:3 · 4:3 · 3:4 · 4:5 · 5:4 · 16:9 · 9:16 · 21:9 | standard / HD (4K) |
335
-
336
- > An `auto` ratio lets the model pick the framing from the prompt; tiers the upstream dropped (e.g. Seedream 5.0's 1K) are never exposed.
337
- > Google subscription discovers account projects with valid platform enums and includes the ordinary daily endpoint as a compatibility fallback. When discovery returns no project with `UNSUPPORTED_CLIENT`, it retries using the Antigravity client identity without automatically onboarding the account. If discovery still returns no project, the legacy compatibility project is still tried but is not cached as an actual account project. Generation failures retain redacted discovery, eligibility, and per-endpoint diagnostics instead of only the last 429. The subscription “Test connection” checks stored sign-in status; successful generation verifies image access for that account. A Code Assist `UNSUPPORTED_CLIENT` response alone does not establish that image generation is unavailable.
338
- > Studio exposes separate aspect ratio, resolution, and generation quality controls for OpenAI and compatible providers. Resolution labels show pixel dimensions. Comparison and regeneration preserve these separate parameters.
339
- > Official OpenAI size presets can be customized with `openaiSizes`, shaped as ratio → tier → pixels, e.g. `{ "16:9": { "2K": "2048x1152", "4K": "3840x2160" } }`. For the gpt-image-2 family, dimensions must be multiples of 16, the longest edge at most 3840, aspect ratio within 1:3–3:1, and total pixels within 655360–8294400. Outputs above 3686400 pixels have experimental upstream support. See the [official API reference](https://developers.openai.com/api/reference/resources/images/methods/generate). Older GPT Image models retain their three standard sizes.
340
- > Compatible providers use `openaiCompatSizes` in the same format; an empty table retains the legacy sizes. `openaiCompatQuality` sets the default generation quality (empty means omitted), and `openaiCompatQualityOptions` sets Studio choices. Choosing “Provider default (omit)” omits quality for that request. Conversation tools also accept independent `size` and `quality` parameters.
341
- > “Generation extra fields” maps to `openaiCompatExtraBody`, e.g. `{ "watermark": false }`. These fields apply only to generation, merge after standard fields, and can override matching keys; `false` and nested objects are preserved. Editing continues to use `openaiCompatEditExtra`. For JSON image URL array edits, `openaiCompatEditSizeMode` defaults to `auto`; set it to `selected` to send the selected dimensions. EditExtra can still override size.
342
- > Compatible channels can set a separate editing model with `openaiCompatEditModel`; empty reuses the generation model, and an explicit conversation-tool `model` still overrides one edit. Official SiliconFlow `/v1` endpoints automatically use `siliconflowJson`; relays implementing the same contract can select it manually. Edits post an `image` string to `/images/generations`. `Qwen/Qwen-Image-Edit` supports one reference; `Qwen/Qwen-Image-Edit-2509` supports up to three using `image`, `image2`, and `image3` in order. Generic size and quality fields are omitted; `size`, `image_size`, or `quality` in editing extras produce an actionable error, and the plugin fills reference fields. See the [SiliconFlow API reference](https://docs.siliconflow.cn/docs/api/images-generations-post).
343
- > Ordinary conversation requests should omit provider and model to use the saved default. The model receives live default-provider and parameter instructions. Omit unused optional fields; blank dimensions are treated as absent, while two nonempty `size` / `aspect_ratio` values still conflict. ChatGPT subscription does not accept `image_size`; use `size` or `aspect_ratio` rather than a tier such as `1K`.
344
- > The workbench shows “Visible watermark: Channel default / Off / On” beside ratio and resolution, checking generation and editing separately. Seedream, native DashScope Qwen Image, and recognized official SenseNova and Qwen compatible endpoints enable it automatically; recognized compatible endpoints also select their JSON edit contracts automatically. SenseNova matches `https://token.sensenova.cn/v1` and `sensenova-u1.5-lite`; Qwen matches official workspace hosts under `/compatible-mode/v1` with Qwen Image 3.0/3.0 Pro or 2.1 Pro/Turbo. Other compatible channels can bind a boolean `watermark`, `watermark_enabled`, or `parameters.watermark` through the matching operation's extra fields; editing requires a JSON format. Unknown channels and Zhipu display a disabled “Support unconfirmed” control; interfaces without a confirmed switch also show an explanation. A model name alone does not identify an unknown relay. Channel default preserves configured fields or omits the parameter; an explicit choice overrides only the watermark field and is retained for batches, comparison models supporting the operation, and regeneration.
345
-
346
- </details>
355
+ 📖 **For default models and endpoints, per-Provider aspect ratios and quality tiers, size tables, watermarks, relay edit formats, and other advanced settings, see the [Provider configuration reference](docs/providers.en.md).**
347
356
 
348
357
  ---
349
358
 
@@ -352,9 +361,12 @@ Bring private image generation on your local GPU directly into Agent conversatio
352
361
  - **BYOK:** API keys are stored through the DSH Credentials service and are never displayed in plaintext on the settings page.
353
362
  - **Subscription sign-in:** Subscription tokens are saved in DSH Credentials after your authorized sign-in, fully isolated from API keys; the browser side never touches a token.
354
363
  - **Cloud requests:** The prompt and reference images used for a request are sent to the selected Provider. Follow that Provider's terms of service.
364
+ - **Provider image downloads:** Downloads use the host's existing network and proxy configuration without additional Fake-IP, private-address or loopback blocking. Complete SSRF target restrictions are not currently provided.
355
365
  - **Local ComfyUI:** Requests are sent to the configured ComfyUI address.
356
366
  - **Workspace files:** When workspace saving is enabled, chat results are written to disk; Studio saves only the candidates you select.
367
+ - **GIF originals:** The original file of an animated result is also kept in the raw-image vault (`vaultEnabled` turns it off) so the card can play and export it; it is removed together with the gallery entry.
357
368
  - **Gallery and favorites:** Gallery metadata and favorite state are stored in the current browser's local storage.
369
+ - **Deleted records:** Normal deletion retains a small image ID marker, including after 30 days, so reopening an old conversation does not silently restore the image to the gallery.
358
370
  - **Inspiration cache:** Example metadata ships with the plugin. Images load on demand and are cached locally, and the cache can be cleared at any time.
359
371
 
360
372
  ## FAQ
@@ -374,6 +386,13 @@ If `dsh-image-gen` is absent from the output, run the installation command again
374
386
 
375
387
  </details>
376
388
 
389
+ <details>
390
+ <summary><strong>How many images can one batch generate?</strong></summary>
391
+
392
+ Up to 10 per batch call; beyond that, the plugin tells the Agent to split the request into several calls. Images generate one at a time, a single failure does not stop the others, and any failures are listed with their reasons.
393
+
394
+ </details>
395
+
377
396
  <details>
378
397
  <summary><strong>Where are generated images saved?</strong></summary>
379
398
 
@@ -393,7 +412,7 @@ The configuration field is `googleNative: true`. It defaults to `false`, keeping
393
412
  <details>
394
413
  <summary><strong>Why is ComfyUI not available in Studio?</strong></summary>
395
414
 
396
- Studio and multi-model comparison currently support cloud Providers only; ComfyUI is not yet integrated. ComfyUI supports text-to-image, single-image editing, and multiple named workflows through Agent chat.
415
+ Studio and multi-model comparison currently support cloud Providers only; ComfyUI is not yet integrated. ComfyUI supports text-to-image, single-image editing, batch generation, and multiple named workflows through Agent chat.
397
416
 
398
417
  </details>
399
418
 
@@ -431,11 +450,7 @@ pnpm run pack:check
431
450
  pnpm run test:package
432
451
  ```
433
452
 
434
- Saving settings on modern DSH requires the actually loaded `@deepseek-ai/schemastery >=3.18.4 <4`. The card distinguishes loading, missing host forms, remote connections that cannot persist, and incompatible schemas. Legacy DSH settings interfaces are retained. Check the dependencies resolved in the plugin profile when updating, as well as those in the source checkout.
435
-
436
- `test:package` requires network access. It installs the current build's tarball and pinned published DSH 0.2 settings services in a temporary directory, then uses real React rendering to verify card state, the bundled save handler, profile file persistence, a fresh form, host restart, and actionable refusal with old schemastery. Image APIs, browser DOM, and RPC transport are outside this test. CI runs it on Windows and Linux.
437
-
438
- Feedback is welcome through [Issues](https://github.com/shanliuling/dsh-image-gen/issues). Read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a Pull Request.
453
+ Maintainer notes on dependency requirements and the scope of `test:package` are in [CONTRIBUTING.md](CONTRIBUTING.md). Feedback is welcome through [Issues](https://github.com/shanliuling/dsh-image-gen/issues); read the contributing guide before opening a Pull Request.
439
454
 
440
455
  ## Acknowledgements
441
456