Midjourney Edits (Ace Data Cloud)
Remix and Inpaint From Inside the Graph
- status
- task_id
- media_urls_json
- first_media_url
- result_json
- trace_id
What it is
The mutation node. Where Imagine makes something from text, Edits takes an existing image, a prompt, and optionally a mask, and changes it - the same territory Midjourney's web editor covers: remix a variation, swap out one element, regenerate a region. In a ComfyUI graph it's the "I like this, adjust it" step, which is also how most real projects actually proceed: generate, then iterate on what came out, then hand the final frame to your local upscaler.
It's the Midjourney half of a workflow people usually run the other way around locally, with Qwen-Image-Edit or an inpainting checkpoint. The trade is the same one you make with any API node here: less control, less fiddling, and a call you pay for instead of a sampler you wait on.
How it works
Same machinery as the rest of the pack: widgets plus parameters_json are merged into one request body, checked against the published /midjourney/edits contract locally (the validator runs before any network call, so a typo costs nothing), then POSTed with async: true. What comes back is a task_id and status: pending - the job runs on Midjourney's side. You then poll Midjourney Retrieve Task with that ID until it reports succeeded, and read the result.
One structural detail to notice: the shipped contract lists no required fields for midjourney_edits. Nothing client-side will stop an empty submission from reaching the service. Send at least a prompt and an image, or you're paying for a request that can't do anything.
Inputs and outputs
prompt(multiline) - what you want changed. This is the field that does the work.image_url- the source image, as a publicly reachable link. There's no upload node in this pack, so the frictionless path is an Ace CDN URL from an earlier task in the same graph.mask- a URL to a mask for the region you're editing. Same disclaimers asimage_url: the service fetches it, so it has to be publicly reachable.mode-fast,relax, orturbo; the contract defaults tofast.split_images- boolean; the useful one when you want the returned variants broken out rather than as one composite.callback_url- a webhook for completion. Just poll instead.
Outputs are the standard six STRINGs: status, task_id, media_urls_json, first_media_url, result_json, trace_id. Feed first_media_url to Midjourney Load Image if the edited result needs to re-enter the graph as pixels.
Install
Manager: search Midjourney, confirm publisher acedatacloud / package Midjourney by Ace Data Cloud (Registry ID midjourney), install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/MidjourneyComfyUI
cd MidjourneyComfyUI
python -m pip install -r requirements.txt
Set ACEDATACLOUD_API_KEY (or ACEDATACLOUD_API_TOKEN) in the environment ComfyUI runs in, then restart the app. requests and jsonschema are the only dependencies; there's nothing to download.
Common issues
The mask does nothing. A mask URL that the service can't fetch, or that isn't in a format it accepts, tends to behave like an ordinary edit rather than erroring loudly. If your edit changes the whole frame instead of one region, suspect the mask first.
Resubmitting after a crash. This is a paid, async submit - the same rule as Imagine. If the graph died after the request went out, the job still exists. Grab the task_id from the node's output (or from ComfyUI's console) and retrieve it. Don't hit Queue again and assume nothing happened.
"pending" with no error, and you're impatient. The tool nodes don't wait. Add or reuse the retrieve node and give it a wait_seconds budget - up to 240 - rather than running the edit three more times.
Editing a local file. The node takes a URL string, not an IMAGE wire - it can't accept the tensor coming out of your Load Image node. That's a genuine limitation of the URL-based contract: to edit something the pack produced, pass the CDN link it produced; to edit something of your own, you need it hosted somewhere the service can reach.
Moderation. Edits run through Midjourney's filter like every other call. Refusals are inconsistent and there's no local bypass - the model is closed, so there are no weights to patch, and no reseller-style trick applies to the vendor's own endpoint.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| parameters_json | STRING | {} | — |
| mask | STRING | — | |
| mode | STRING | — | |
| prompt | STRING | — | |
| image_url | STRING | — | |
| callback_url | STRING | — | |
| split_images | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |
| task_id | STRING | — |
| media_urls_json | STRING | — |
| first_media_url | STRING | — |
| result_json | STRING | — |
| trace_id | STRING | — |