Hidream O1 Image Edit
Playground
Try it on WaveSpeedAI!HiDream-O1-Image (Edit) is a unified, native image-editing model that takes a source image plus a text instruction and produces high-resolution edits up to 2K — no external components required. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
HiDream-O1-Image is a unified, next-generation image model. The same native model that handles text-to-image also handles prompt-driven image editing and subject-driven personalization — no external adapters, controllers, or pipelines required. Provide an input image and an instruction, and the model edits it while preserving identity, composition, and lighting at resolutions up to roughly 2K (2048×2048).
Why Choose This?
- Unified native model — One model, multiple modes (text-to-image / edit / personalization). Consistent quality across every mode.
- Identity-preserving edits — Keeps the subject, pose, and overall composition stable while applying the requested change.
- High-resolution output — Edits delivered at up to ~2048×2048 with sharp detail and natural lighting.
- Strong instruction following — Faithfully interprets edit instructions (wardrobe, scene tweaks, object swaps, style changes, on-image text).
- Flexible aspect ratios — Custom output dimensions; the model snaps to the closest supported resolution.
- Multiple output formats — JPEG, PNG, or WEBP.
- Reproducibility — Use a fixed
seedto recreate exact results.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Text instruction describing the edit you want to make. |
| images | Yes | Source images to edit (public URL or base64 data URI). PNG, JPEG, JPG, or WebP, up to 50MB, aspect ratio between 1:4 and 4:1. |
| size | No | Output image size as WIDTH*HEIGHT (default: 2048*2048). The model snaps to the closest supported resolution. |
| output_format | No | Output format: jpeg, png, or webp (default: jpeg). |
| seed | No | Random seed for reproducible generation. |
| enable_sync_mode | No | API only — wait for the result and return it inline. |
| enable_base64_output | No | API only — return the image as a base64 string instead of a URL. |
How to Use
- Upload your image — drag and drop or paste a publicly accessible URL.
- Write your edit instruction — describe both the change and what to keep (e.g., “Change the jacket to black leather. Keep the person, pose, and background unchanged.”).
- Choose
size(optional) — keep the source aspect ratio or pick a new one. - Set
output_format— JPEG for compact files, PNG for lossless, WEBP for balance. - Set
seed(optional) — pin a number to reproduce the same edit. - Run — submit the request and download the edited image.
Pricing
Flat rate per edit.
| Output | Cost |
|---|---|
| Per image edit | $0.04 |
Best Use Cases
- Wardrobe & accessory edits — Swap clothing color/style, add/remove glasses, hats, jewelry.
- E-commerce variations — Generate multiple colorways or styling options from a hero shot.
- Background & scene tweaks — Replace backgrounds or swap props while keeping the subject pixel-stable.
- Object add / remove / replace — Cleanly modify specific elements without disturbing the rest of the scene.
- Style transfer — Apply a new look while preserving the subject’s identity.
- Marketing iteration — Quickly produce multiple creative variants from one source image.
Prompting Guide
For clean results, specify both the change and what to preserve:
Template: > Keep the same person, pose, and background. Change [target edit]. Keep lighting natural and consistent.
Examples:
- “Keep the same person and pose. Change the outfit to a light gray sweater and add gold thin-rimmed glasses. Keep the background and lighting unchanged.”
- “Keep identity and composition. Replace the jacket with a black leather jacket; keep realistic fabric texture and natural shadows.”
- “Keep the subject unchanged. Remove the object on the table and keep the scene lighting consistent.”
- “Keep the person and pose. Change the background to a sunlit beach at golden hour.”
Pro Tips
- Always state what should stay the same — it dramatically improves identity preservation.
- Reference elements explicitly: “the text on the shirt”, “the background”, “the person on the left”.
- Pin a
seedwhile iterating so you can compare prompt variants against a fixed baseline. - For multi-step edits, prefer sequential single-purpose prompts over one long compound instruction.
- Use
pngfor lossless edits when output will be re-edited downstream.
Notes
- If using a URL for the source image, ensure it is publicly accessible.
- The
enable_base64_outputandenable_sync_modeoptions are only available through the API. - Higher resolutions may slightly increase processing time.
- Ensure prompts comply with content guidelines.
Related Models
- HiDream-O1-Image · Text-to-Image — Same unified model, in text-to-image mode.
- HiDream-E1 Full — Previous-generation prompt-driven image editor.
- HiDream-I1 Full — Previous-generation 17B text-to-image foundation model.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"images": [
"https://interactive-examples.mdn.mozilla.net/media/cc0-images/painted-hand-298-332.jpg"
],
"size": "2048*2048",
"output_format": "jpeg"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/hidream-o1-image/edit" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "${TASK}" | jq -r '.urls.get // empty')
if [ -z "${RESULT_URL}" ]; then RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"; fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body \
"${RESULT_URL}" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}")
RESULT=$(printf '%s' "${RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
case "${STATUS}" in
completed) printf '%s\n' "${RESULT}" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "${STATUS}" >&2; exit 1 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Text prompt for image generation. | |
| images | array<string> | Yes | - | 0 ~ 3 items | Reference images for image editing or subject-driven personalization. |
| size | string | No | 2048*2048 | 256 ~ 4096 | Specify the width and height pixel values of the generated image.Total pixel value range: [2560*1440, 4096*4096] |
| output_format | string | No | jpeg | png, jpeg, webp | Output image format. |
| enable_sync_mode | boolean | No | false | - | If set to `true`, the request attempts to wait for the generated result and return outputs in the same response. If the result is not ready within the sync wait window, the API can return a timeout body while the task continues processing. This option is only available via the API and is supported only by some models. |
| enable_base64_output | boolean | No | false | - | If set to `true`, the prediction's `output` strings are returned as **naked base64** (no `data:<mime>;base64,` prefix). When `false` (default), outputs are returned as URLs pointing to our CDN. |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |