LeemanCheung
dsh-image-gen
GPT Image 2 generation with progressive Codex-style previews for DeepSeek Harness
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 15, 2026
- Updated
- Aug 15, 2026
Introduction
dsh-image-gen
Generate images in DeepSeek Harness with OpenAI gpt-image-2, using a signed-in Codex subscription by default or an API key when explicitly configured.
The illustration mirrors the shipped card states. API-key mode can replace the light field with real streamed drafts; Codex subscription mode animates until its non-streaming response arrives.
Highlights
- Registers the Codex-compatible model tool name
image_gen. - Reuses the refreshable OAuth login owned by
dsh-codex-connect; noOPENAI_API_KEYis required for Codex subscription mode. - Streams up to three real provider partial images when the API-key Images endpoint is selected; Codex subscription mode keeps the developing animation active until its non-streaming response arrives.
- Cross-fades each partial over one animated developing plate, then sharpens into the final image.
- Stores the final image in DSH's immutable attachment store and supports replay, lightbox preview, and download.
- Keeps model-facing tool output text-only, so image generation does not make a text-only model route reject conversation history.
- Supports native tool calls and nested Code Mode calls with the same durable card.
- Resolves credentials per operation, rejects redirects, limits response sizes, validates image bytes through DSH, and retries only transient failures.
- Includes Chinese and English UI copy plus
prefers-reduced-motionsupport.
Codex parity and improvements
OpenAI Codex's built-in image_gen tool hardcodes gpt-image-2, calls the ChatGPT Codex Images endpoint with subscription OAuth, records one working state, and saves the completed image under Codex's generated-images directory. Its public backend currently requests a non-streaming JSON response and its UI does not expose a distinctive diffusion animation.
dsh-image-gen keeps the compatible image_gen name and model while improving the visible process:
| Experience | Codex | dsh-image-gen |
|---|---|---|
| GPT Image 2 | Yes | Yes |
| Progressive provider frames | Subscription path is currently non-streaming | Subscription animation; API-key mode supports up to 3 live frames |
| Before first frame | Generic working state | Animated developing plate, scan, and light field |
| Frame transition | Generic activity | In-place cross-fade and focus development |
| Final result | Saved image | Durable DSH attachment, replay, lightbox, download |
| Text-only model compatibility | Not applicable to DSH history | Model receives text; image reference stays in UI metadata |
| Reduced motion | Platform dependent | Explicitly supported |
Primary references:
Compatibility
Verified against:
- DeepSeek Harness
0.1.0-rc.6 dsh-codex-connect0.1.0-alpha.4.4- Node.js
24.15.0 - DSH Web profile on Windows 11
- Real Codex subscription generation, durable replay, Blob preview, and download controls
Verification date: 2026-08-15.
Install
Review third-party source before installation and pin release tags or commits. For the default keyless subscription path, install Codex Connect, sign in once, then install this plugin:
dsh plugin --profile web add dsh-codex-connect
dsh openai-codex login
dsh plugin --profile web add github:LeemanCheung/dsh-image-gen#v0.2.0
For local development:
git clone https://github.com/LeemanCheung/dsh-image-gen.git
cd dsh-image-gen
npm install
npm run check
dsh plugin --profile web add .
The repository commits lib/index.js and lib/client.js, so a pinned Git install does not need to run a dependency build script. Restart the DSH Host after installation and refresh the Web page.
Authentication
authMode: auto is the default. It first asks the installed dsh-codex-connect package for its DSH-owned, refreshable ChatGPT OAuth credential and sends it only to the fixed first-party endpoint https://chatgpt.com/backend-api/codex/images/generations. If Codex sign-in is unavailable, it falls back to the OPENAI_API_KEY DSH credential reference.
Use authMode: codex-subscription to forbid API-key fallback, or authMode: api-key to use only the configured Images API account. Never put an OAuth token or API key in cordis.patch.yml, chat messages, Git, or screenshots. The plugin resolves authentication for every generation and does not retain it after the request.
Use
Ask naturally in a DSH conversation, for example:
Generate a cinematic 16:9 product photograph of a translucent mechanical keyboard on a dark glass desk, violet rim light, no text.
The model calls image_gen. While it runs, the card shows the developing animation. API-key mode replaces the light field with each real streamed partial; Codex subscription mode reveals the final image when its JSON response arrives. DSH's existing interrupt control cancels the request. The settled card supports preview and download.
Tool options:
prompt: detailed generation instructions, 1–32,000 characters and at most 64,000 UTF-8 bytes.size:autoor arbitraryWIDTHxHEIGHTaccepted by GPT Image 2: each edge divisible by 16, no edge above 3840, aspect ratio 1:3–3:1, and 655,360–8,294,400 total pixels.quality:auto,low,medium, orhigh.output_format:png,jpeg, orwebpin API-key mode. Codex subscription mode currently returns PNG.output_compression: 0–100 for API-key JPEG/WebP only.background:autooropaque. GPT Image 2 does not support transparent output.
Configure
The bundle inserts the image-gen row with safe defaults. Override it in the selected profile's cordis.patch.yml:
- id: image-gen
name: dsh-image-gen
config:
authMode: auto # auto | codex-subscription | api-key
apiKeyEnv: OPENAI_API_KEY
baseUrl: https://api.openai.com/v1
model: gpt-image-2
defaultSize: auto
defaultQuality: auto
defaultOutputFormat: png
defaultOutputCompression: 90
defaultBackground: auto
moderation: auto
partialImages: 3
requestTimeoutMs: 120000
maxRetries: 2
retryBaseMs: 1000
maxConcurrent: 2
baseUrl, model, moderation, partialImages, output compression, and API pricing apply only to API-key mode. Codex subscription mode fixes the model to gpt-image-2, uses the fixed first-party Codex endpoint, returns PNG, and never sends OAuth to baseUrl. Configuration fails at load for an invalid provider URL or default image size. Plain HTTP is accepted only for loopback development endpoints. Every credential-bearing request uses redirect: "error".
Cost note
Codex subscription calls consume the image-generation allowance associated with the signed-in ChatGPT plan. API-key calls are billed by the selected quality and size; each requested partial costs additional image-output tokens according to the provider guide. partialImages does not apply to subscription mode.
Data, network, and permissions
- Network: subscription mode sends the prompt and supported options only to
https://chatgpt.com/backend-api/codex/images/generations; API-key mode sends them tobaseUrl. - Credentials: subscription mode asks
dsh-codex-connectfor its DSH-owned OAuth credential; API-key mode resolves the configured DSH credential reference. Neither secret is stored in plugin state, logs, metadata, or session history. - Storage: stores only completed images through the DSH attachment service. Partial frames stay in bounded Host memory while the call is active and are then discarded.
- Browser access: uses a loopback-only private RPC. A final image is returned only after the Host finds the exact attachment reference in the requested session and call record.
- Workspace files: does not read or write the session workspace.
- User data: prompts and tool arguments follow DSH's normal session logging. OpenAI receives the prompt under the terms governing the selected ChatGPT subscription or API account.
Troubleshooting
OpenAI Codex is signed out
Install dsh-codex-connect, sign in from its DSH settings page or run dsh openai-codex login, then retry. Never paste the OAuth token into chat.
No credential is configured for OPENAI_API_KEY
This appears in explicit API-key mode, or after automatic Codex fallback. Configure the credential for the DSH Host process or switch to a signed-in Codex subscription. Never send the key in chat.
Image generation was blocked
Revise the prompt. The plugin does not retry provider moderation or user-input errors.
Preview unavailable after success
Refresh the page. If the card still cannot load, inspect Host logs and verify that the profile still mounts dsh-image-gen and its attachment store is available.
dsh plugin --profile web why dsh-image-gen
dsh --profile web --dump-config
Requests time out
Increase requestTimeoutMs within its 10–300 second range or select a lower quality. API-key mode can also use JPEG. DSH interruption still aborts the upstream request.
Roll back or remove
Before changing a production profile, take a DSH config snapshot when the undo plugin is installed. To uninstall:
dsh plugin --profile web remove dsh-image-gen
Restart the DSH Host and refresh the page. Existing image records remain in session history; their custom card requires the plugin to be installed.
Development
npm install
npm run typecheck
npm test
npm run build
npm pack --dry-run
The keyless suite uses deterministic mocked SSE/JSON responses and a local redirect server. It covers both authentication modes without reading real secrets. Real-provider checks are manual because they consume a Codex subscription allowance or bill an API account. The 0.2.0 release was manually verified with one signed-in Codex subscription generation and cold-session browser replay.
The build emits:
lib/index.js: Host Cordis plugin.lib/client.js: browser module-loader bundle.lib/client.js.map: browser source map.
Known limitations
- Version 0.2 generates new images. Codex-style reference-image editing is not yet exposed because a safe DSH attachment selector and explicit external-upload consent are needed.
- Final previews are intentionally loopback-only. Remote Web clients receive a clear unavailable state rather than image bytes.
- Current DSH credential resolution and attachment saving do not accept cancellation signals. The plugin checks cancellation before and after those stages and waits for them during teardown, but cannot interrupt a provider implementation that stalls inside either service.
- OpenAI may evolve arbitrary-size limits or event fields. The plugin fails closed on incompatible responses instead of guessing.
Security
See SECURITY.md for private reporting. Do not include OAuth tokens, API keys, private prompts, or generated private images in a public issue.