---
title: Iterative editing — Ideogram 4.5 Precise Edit | Runware Docs
url: https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing
description: How to run a chain of edits with Ideogram 4.5 Precise Edit, one change per round, while every pixel the instruction leaves alone is restored from the source.
---
### [Introduction](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#introduction)

Most image models **redraw the whole frame on every edit**. Ask for a new sign and the brickwork next to it shifts by a few pixels and comes back in slightly different colors. One round of that is invisible. Ten rounds later the image has drifted away from the version the client approved, and nobody can say which edit did it.

Ideogram 4.5 Precise Edit is built for that loop. It applies one instruction to a source image and then **restores every pixel the edit left untouched** from that source, so the parts of the frame nobody asked about come back as they went in. The shop front below went through ten rounds, each one taking the previous result as its source.

**Original**:

![A small shop front with a dark gray facade, a blank sign board, an empty display window and a gray metal door, between two red brick buildings](https://runware.ai/docs/assets/source-storefront.B4Yz8mN4_ZkaG46.jpg)

> **Prompt**: Photorealistic street-level photograph of a small independent shop front on a quiet city street, shot straight-on from across the sidewalk with a 35mm lens at eye level. The shop has a plain dark gray painted facade, a blank flat fascia sign board above a large white-framed display window, an empty window display with bare white shelves, and a plain gray metal door on the right. A clean concrete sidewalk runs along the front, and red brick buildings with sash windows stand on either side. Overcast daylight, soft even light, natural colors, crisp detail.

**1 · Paint**:

![The same shop front with the facade and sign board repainted deep forest green](https://runware.ai/docs/assets/step-01.CP6bVnY0_Z1a8MNn.jpg)

> **Prompt**: Repaint the shop facade and the blank fascia sign board a deep forest green. Keep the display window, the door, the sidewalk and the neighboring brick buildings exactly the same.

**2 · Sign**:

![The green shop front with FERN & FIELD painted in gold serif capitals on the sign board](https://runware.ai/docs/assets/step-02.BRVkYiK6_Z154KCE.jpg)

> **Prompt**: Paint the shop name "FERN & FIELD" across the fascia sign board in large gold serif capitals, centered on the board. Keep everything else in the image exactly the same.

**3 · Awning**:

![The shop front with a green and cream striped awning above the display window](https://runware.ai/docs/assets/step-03.8pXj174K_1yDPBy.jpg)

> **Prompt**: Add a green and cream striped fabric awning above the display window, below the fascia sign. Keep everything else in the image exactly the same.

**4 · Window**:

![The display window filled with stacks of folded blankets in cream, rust and olive and a few ceramic vases](https://runware.ai/docs/assets/step-04.BXw3EGM-_21ogyT.jpg)

> **Prompt**: Fill the empty display window with neatly stacked folded wool blankets in cream, rust and olive, and a few matte ceramic vases on the white shelves. Keep everything else in the image exactly the same.

**5 · Planters**:

![Two white ceramic planters with olive trees standing on the sidewalk on either side of the door](https://runware.ai/docs/assets/step-05.BPjRdpwA_ZgPxRq.jpg)

> **Prompt**: Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same.

**6 · Door**:

![The gray metal door replaced by a glass-paneled oak door with a long brass handle](https://runware.ai/docs/assets/step-06.C936o5LQ_1IR2eI.jpg)

> **Prompt**: Replace the plain gray metal door with a glass-paneled door in natural oak with a long brass pull handle. Keep everything else in the image exactly the same.

**7 · Logo**:

![A small white round fern logo decal in the lower left corner of the display window](https://runware.ai/docs/assets/step-07.4Pl2qPL3_1p3yDN.jpg)

> **Prompt**: Apply the round fern logo from the reference image as a small white vinyl decal in the lower left corner of the display window glass. Keep everything else in the image exactly the same.

**8 · Chalkboard**:

![A wooden chalkboard A-frame sign reading NEW WINTER BLANKETS on the sidewalk to the left of the window](https://runware.ai/docs/assets/step-08.C8aYfQAG_15UIbV.jpg)

> **Prompt**: Add a wooden chalkboard A-frame sign on the sidewalk to the left of the display window that reads "NEW WINTER BLANKETS" in white chalk lettering. Keep everything else in the image exactly the same.

**9 · Lights**:

![A string of bulb lights hanging along the front edge of the striped awning](https://runware.ai/docs/assets/step-09.DJPY0w8y_2e4K1L.jpg)

> **Prompt**: Hang a single string of warm white bulb lights along the front edge of the awning. Keep everything else in the image exactly the same.

**10 · Dusk**:

![The finished shop front at dusk under a deep blue sky, with the window display lit warm and the string lights glowing](https://runware.ai/docs/assets/step-10.BZC6eZYQ_j1syt.jpg)

> **Prompt**: Change the time of day to early evening at dusk: a deep blue sky above the buildings, warm interior light glowing in the display window, and the string lights switched on. Keep every object, sign and color in the same place.

Step through the rounds, and go back to Original to compare. The brick buildings on either side were never mentioned in any instruction, and they are still the same bricks at round nine.

This guide covers the loop itself, what restoration protects, how to write each instruction, the order that keeps restoration working, branching and choosing a quality tier per round.

### [The loop](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#the-loop)

Each round is **an ordinary edit**. The source goes in `inputs.seedImage`, the instruction goes in `positivePrompt`, and the result comes back at the source's own dimensions, up to 2048 pixels on the longer side, so there is no `width` or `height` to set. What makes it a chain is where the source comes from: the image the previous round returned.

**TypeScript**:

```typescript
import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'ideogram:4.5@precise-edit',
  positivePrompt: 'Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same.',
  inputs: {
    seedImage: 'a3f07d2e-5b1c-4e8f-9a64-0c7d2b9e1f58',
    referenceImages: [
      'e91b4c6d-7a20-4f35-8d1e-2b5c9f0a7e46'
    ]
  }
})
```

**Python**:

```python
import asyncio
import os

from runware import Runware

async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "ideogram:4.5@precise-edit",
            "positivePrompt": "Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same.",
            "inputs": {
                "seedImage": "a3f07d2e-5b1c-4e8f-9a64-0c7d2b9e1f58",
                "referenceImages": [
                    "e91b4c6d-7a20-4f35-8d1e-2b5c9f0a7e46"
                ]
            }
        })

asyncio.run(main())
```

**cURL**:

```bash
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "imageInference",
      "taskUUID": "6c1e8a42-3f9d-4b7a-9e05-d28b4c7f1a93",
      "model": "ideogram:4.5@precise-edit",
      "positivePrompt": "Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same.",
      "inputs": {
        "seedImage": "a3f07d2e-5b1c-4e8f-9a64-0c7d2b9e1f58",
        "referenceImages": [
          "e91b4c6d-7a20-4f35-8d1e-2b5c9f0a7e46"
        ]
      }
    }
  ]'
```

**CLI**:

```bash
runware run ideogram:4.5@precise-edit \
  positivePrompt="Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same." \
  inputs.seedImage=a3f07d2e-5b1c-4e8f-9a64-0c7d2b9e1f58 \
  inputs.referenceImages.0=e91b4c6d-7a20-4f35-8d1e-2b5c9f0a7e46
```

**JSON**:

```json
{
  "taskType": "imageInference",
  "taskUUID": "6c1e8a42-3f9d-4b7a-9e05-d28b4c7f1a93",
  "model": "ideogram:4.5@precise-edit",
  "positivePrompt": "Place two of the white ceramic planters with olive trees from the reference image on the sidewalk, one on each side of the door. Keep everything else in the image exactly the same.",
  "inputs": {
    "seedImage": "a3f07d2e-5b1c-4e8f-9a64-0c7d2b9e1f58",
    "referenceImages": [
      "e91b4c6d-7a20-4f35-8d1e-2b5c9f0a7e46"
    ]
  }
}
```

The source is the `imageUUID` the previous round returned, which is **the cheapest way to chain**: nothing to download or upload between rounds. References ride along in `inputs.referenceImages`, up to four of them, and they guide the edit without being edited themselves.

```typescript
let current = source.imageUUID

for (const instruction of rounds) {
  const [result] = await client.run({
    model: 'ideogram:4.5@precise-edit',
    positivePrompt: instruction,
    inputs: { seedImage: current },
  })

  current = result.imageUUID
}
```

### [What restoration protects](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#what-restoration-protects)

After each edit, every pixel that did not meaningfully change is **restored from the source**, and the edited region is blended into its surroundings. That is why the untouched part of the frame does not drift from round to round. There is no parameter for it, and nothing to switch on.

The left-hand building is the honest place to check. No instruction in the chain mentions it, so any difference between the original and round nine is drift.

![The original shop front, with a magnified inset of the brickwork and sash window on the building to the left](https://runware.ai/docs/assets/source-storefront.B4Yz8mN4_ZkaG46.jpg)

*Original*

> **Prompt**: Photorealistic street-level photograph of a small independent shop front on a quiet city street, shot straight-on from across the sidewalk with a 35mm lens at eye level. The shop has a plain dark gray painted facade, a blank flat fascia sign board above a large white-framed display window, an empty window display with bare white shelves, and a plain gray metal door on the right. A clean concrete sidewalk runs along the front, and red brick buildings with sash windows stand on either side. Overcast daylight, soft even light, natural colors, crisp detail.

![The shop front after nine edits, with a magnified inset of the same brickwork and sash window on the building to the left](https://runware.ai/docs/assets/step-09.DJPY0w8y_2e4K1L.jpg)

*After nine rounds*

> **Prompt**: Hang a single string of warm white bulb lights along the front edge of the awning. Keep everything else in the image exactly the same.

The mortar lines and the panes of the sash window match in both insets. Nine renders passed over that building and none of them left a mark on it.

> [!WARNING]
> Results come back at most 2048 pixels on the longer side. A larger source is scaled down to fit, so the 2560 × 1440 original above returned at 2048 × 1152, and every round after it stayed at that size. Start from a source that is 2048 pixels or less on its longer side when the output has to match the source's dimensions.

### [Writing each instruction](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#writing-each-instruction)

Precise Edit turns a plain-language instruction into a structured edit on its own, so there is no special syntax to learn. What matters is that each instruction **names one target and one change**, and then says what stays.

**[Change]** Place two of the white ceramic planters with olive trees from the reference image, **[Placement]** on the sidewalk, one on each side of the door., **[Preserve]** Keep everything else in the image exactly the same.

The change names the object precisely enough that the model cannot pick the wrong one: not "a plant" but the planter from the reference. The placement anchors it to something already in the frame. The closing sentence costs nothing and **tells the model the edit is local**, which is what restoration needs to do its job.

**One change per round** is the rule the whole chain rests on. A round that does one thing can be approved or rejected on its own. A round that repaints the facade, adds the awning and fills the window at once gives you one result to accept or reject, and no way to keep the paint while re-asking for the awning.

### [Local edits first, global edits last](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#local-edits-first-global-edits-last)

Restoration protects what the instruction leaves alone. An instruction that **relights the whole frame** leaves very little alone.

**Round 9**:

![The finished shop front in overcast daylight](https://runware.ai/docs/assets/step-09.DJPY0w8y_2e4K1L.jpg)

> **Prompt**: Hang a single string of warm white bulb lights along the front edge of the awning. Keep everything else in the image exactly the same.

**Round 10**:

![The same shop front relit at dusk, with a deep blue sky, a glowing window and the string lights on](https://runware.ai/docs/assets/step-10.BZC6eZYQ_j1syt.jpg)

> **Prompt**: Change the time of day to early evening at dusk: a deep blue sky above the buildings, warm interior light glowing in the display window, and the string lights switched on. Keep every object, sign and color in the same place.

The dusk round keeps every object where it was, but the sky, the brick, the glass and the pavement are all relit. That is the right result, and it is why lighting, weather and time of day belong **at the end of the chain**, after the local edits are approved. Relight in round three and every later round inherits that light, so changing your mind about it means redoing every round after it.

### [Branching from an earlier round](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#branching-from-an-earlier-round)

Every round returns its own `imageUUID`. Keep all of them, and any round becomes a place to **branch from**: the chain after it stays intact while you try alternatives.

**Striped**:

![The shop front with a green and cream striped awning](https://runware.ai/docs/assets/step-03.8pXj174K_1yDPBy.jpg)

> **Prompt**: Add a green and cream striped fabric awning above the display window, below the fascia sign. Keep everything else in the image exactly the same.

**Terracotta**:

![The same shop front with a solid terracotta awning in place of the striped one](https://runware.ai/docs/assets/branch-terracotta.B1uD8SEq_2fi54G.jpg)

> **Prompt**: Replace the striped awning with a solid terracotta fabric awning of the same size and shape. Keep everything else in the image exactly the same.

**Navy**:

![The same shop front with a solid navy blue awning in place of the striped one](https://runware.ai/docs/assets/branch-navy.BcrIibpF_Z1VwM85.jpg)

> **Prompt**: Replace the striped awning with a solid navy blue fabric awning of the same size and shape. Keep everything else in the image exactly the same.

Both alternatives start from round three, so the paint and the sign carry over and only the awning changes. Because restoration holds the rest of the frame, the three versions **line up pixel for pixel** outside the awning, which is what makes them easy to put side by side in front of a client.

### [Quality per round](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#quality-per-round)

`settings.quality` takes `very_low`, `low`, `medium` or `high`, and `high` is the default. At `high` the model **picks the best of five candidates** for each result, which makes it the slowest and most expensive tier. `very_low` is the fastest and cheapest.

**Very low**:

![The shop name edit at very low quality, with FERN & FIELD set on the lower band of the green fascia](https://runware.ai/docs/assets/quality-very-low.Bl8XZQLv_ZCVv7e.jpg)

> **Prompt**: Paint the shop name "FERN & FIELD" across the fascia sign board in large gold serif capitals, centered on the board. Keep everything else in the image exactly the same.

**Low**:

![The shop name edit at low quality, with FERN & FIELD in gold serif capitals on the sign board](https://runware.ai/docs/assets/quality-low.CVOHLRsL_Z1xTUF4.jpg)

> **Prompt**: Paint the shop name "FERN & FIELD" across the fascia sign board in large gold serif capitals, centered on the board. Keep everything else in the image exactly the same.

**Medium**:

![The shop name edit at medium quality, with FERN & FIELD in gold serif capitals on the sign board](https://runware.ai/docs/assets/quality-medium.y-ttyhhm_1opj4D.jpg)

> **Prompt**: Paint the shop name "FERN & FIELD" across the fascia sign board in large gold serif capitals, centered on the board. Keep everything else in the image exactly the same.

**High**:

![The shop name edit at high quality, with evenly spaced gold serif capitals reading FERN & FIELD on the sign board](https://runware.ai/docs/assets/step-02.BRVkYiK6_Z154KCE.jpg)

> **Prompt**: Paint the shop name "FERN & FIELD" across the fascia sign board in large gold serif capitals, centered on the board. Keep everything else in the image exactly the same.

All four ran the same instruction on the same source, and all four spell the name correctly. `very_low` set it on the lower band of the fascia instead of the sign board. From `low` up, the name sits on the board, and `high` spaces the capitals most evenly. The cheap tiers **show whether an instruction lands** where you meant it to, which is the question a draft round is asking.

That points to a simple split: **draft each round at a low tier**, and once the instruction is right, run it again at `high` for the version that goes into the chain. The cheap rounds are the ones that get thrown away.

### [Tips](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/iterative-editing#tips)

1. **One change per round.** A round that does one thing can be approved or rejected on its own, and a rejected round costs one call.
    
2. **Close every instruction with what stays.** "Keep everything else in the image exactly the same" tells the model the edit is local.
    
3. **Keep every `imageUUID`.** Any earlier round is a branch point, and the next call needs nothing else from the response.
    
4. **Relight last.** A change of light touches most of the frame, so put it after the local edits are settled.
    
5. **Draft low, finish high.** Settle the instruction at `very_low` or `low`, then run the approved version at `high`.
    
6. **Keep sources at 2048 pixels or less on the longer side.** A larger source is scaled down, and the whole chain continues at the smaller size.
    

For edits limited to one region, see [Masked edits](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/masked-edits). For changing the words in a finished design, see [Text and localization](https://runware.ai/docs/models/ideogram-4-5-precise-edit/guides/text-localization).