---
title: Workflows
description: "Multi-step work on Nolgia: presets that assemble a prompt, sets that fan out, compositions that render, and edit sessions that chain — each with its own status."
---

# Workflows

There is no single endpoint to chain arbitrary models and no workflow event stream; each of these workflows has its own status you poll.

Choose the surface that matches your outcome. A preset prepares a request, a set coordinates several image jobs, a composition turns a timeline into a deliverable, and an edit session keeps the history of successive image edits.

| Kind | What it connects | Start with | What you poll | How it bills |
| --- | --- | --- | --- | --- |
| Preset | Intake answers, a prompt and its target model | `POST /presets/{slug}/assemble`, then the returned generate endpoint | The generated `Job` through `GET /jobs/{id}` | Slot filling is free; doctrine assembly has a one-credit hold and meters writer cost. The generation bills separately. |
| Set | Two to eight image jobs using shared references and settings | `POST /generate/set` | `GET /sets/{id}`; each member also has a `Job` | Each member has its own credit hold, settlement and refund. |
| Composition | Timeline media, edits, grades and text into an MP4 or still | `POST /compositions/{id}/render` | `GET /renders/{id}` | Renders currently take no credit hold. Generating source media is billed separately. |
| Edit session | An existing image and a sequence of new image edits | `POST /edit-sessions`, then `POST /edit-sessions/{id}/steps` | `GET /edit-sessions/{id}` or the step's `GET /jobs/{id}` | Each step is priced as an image generation; failed or canceled steps are refunded and excluded from `chain_credits`. |

## Presets

![Read a preset, assemble its prompt, submit to its model and follow the job](../assets/diagrams/workflow-presets.svg)

| Property | Value |
| --- | --- |
| Input | A catalog preset slug, its intake answers, optional chips and a brief |
| Preparation | Read `GET /presets/{slug}/intake/context`, then call `POST /presets/{slug}/assemble` |
| Output | `prompt`, optional `negative_prompt`, `params`, `endpoint` and the assembly charge |
| Execution | Submit the assembled fields to the returned generate endpoint; assembly itself creates no media |
| Progress | Follow the returned generation job, not the preset catalog record |

Public presets describe an outcome and the model or Studio lane that makes it. For `create_image`, `create_video` and `create_audio` targets, assembly validates the answers against the preset's intake and model limits. It keeps the target model fixed. Studio-intent targets do not use this assembly path; their agent turns and generated media bill separately.

> [!NOTE]
> Receiving an assembled prompt is not an accepted generation. Submit it explicitly and store the resulting job id before waiting for media.

:::cards
- [Presets](./presets.html): Discover the catalog, resolve intake and assemble a runnable prompt.
:::

## Sets

![A set fans out into independent image jobs and collects their outputs](../assets/diagrams/workflow-sets.svg)

| Property | Value |
| --- | --- |
| Input | Two to eight labelled prompts plus a shared image model and visual settings |
| Kinds | `pack` for a coordinated collection; `variants` for an axis such as emotion or concept |
| Submit response | `202` with an `OutputSet`, not a single `Job` |
| Progress | `generating`, then `ready`, `partial` or `failed`; inspect each member's job |
| Refused members | `problems` records refused labels; accepted jobs continue and further members are not submitted |

Keep the set id to display the group and each member's job id to investigate an individual failure. The set is a collection of independent generation outcomes; a failure or refusal does not roll back outputs that already succeeded.

:::cards
- [Sets](./sets.html): Submit a pack or variants, poll its members and handle partial outcomes.
:::

## Compositions

![Render a composition, poll the render record and read its output asset](../assets/diagrams/workflow-compositions.svg)

| Property | Value |
| --- | --- |
| Input | A stored HTML timeline composition and its edits overlay |
| Start | `POST /compositions/{id}/render` |
| Output | MP4 by default; `target: still` produces one PNG frame |
| Progress | The separate render record at `GET /renders/{id}` |
| Inspection | Read `warnings` as well as the produced asset; unsupported timeline features can be skipped |
| Other operations | Clone through `POST /compositions/{id}/clone`; import through `POST /compositions/{id}/imports/figma`; export an editor ZIP through `GET /compositions/{id}/export` |

A render uses the composition's effective timeline, including supported placement, edits, grades, masks, media motion and text. It does not execute arbitrary page scripts. Follow the render id until completion, then read the produced asset for a fresh download URL. Editor export accepts `format=fcpxml` or `format=aejsx` and is separate from server rendering.

:::cards
- [Compositions and Studio export](./compositions.html): Render an MP4 or still and export a timeline for a desktop editor.
:::

## Edit sessions

![Create an edit session, estimate the next edit, append a step and follow its job](../assets/diagrams/workflow-edit-sessions.svg)

| Property | Value |
| --- | --- |
| Start | `POST /edit-sessions` with `source_asset_id` for an image in your library |
| Next edit | `POST /edit-sessions/{id}/steps` queues an image edit from the current head |
| Read | `GET /edit-sessions/{id}` returns the ordered steps, their job ids and their statuses |
| Quote | `GET /edit-sessions/{id}/estimate` returns `next_step_credits`, the resolved settings and `chain_credits` |
| Revert | `POST /edit-sessions/{id}/revert` with an earlier `step_id`, or `null` to use the source |
| Narrow tweaks | `GET /tweak-scopes` lists measured scopes, including unavailable scopes and their reasons |

An edit step can use a freeform `prompt`, or a supported `scope` plus `detail` for a local change. A scoped edit cannot also carry `style_id`; its input and prompt are constrained to preserve the selected image. Read the available scope and model choices before submitting.

<!-- gen:fields schema=EditSession only=id,source_asset_id,head_step_id,head_asset_id,steps,chain_credits -->
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes |  |
| `source_asset_id` | string | Yes |  |
| `head_step_id` | string, nullable | No | Null means the source is the head. |
| `head_asset_id` | string | Yes | The head output, or the source as a fallback while the output is unavailable. |
| `steps` | array of `EditSessionStep` | Yes | Steps in position order. |
| `chain_credits` | integer | Yes | Sum of queued, running and succeeded step quotes. Failed and canceled steps are refunded and excluded. |
<!-- /gen -->

<!-- gen:fields schema=EditSessionEstimate -->
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `model` | string | Yes |  |
| `quality` | string | Yes |  |
| `render_quality` | string | Yes |  |
| `next_step_credits` | integer | Yes |  |
| `chain_credits` | integer | Yes |  |
| `steps` | array of object | Yes |  |
<!-- /gen -->

> [!WARNING]
> Wait for the current head before adding another step. An append returns `409` when the head is still generating, failed or its image is unavailable; `402` means the account cannot cover the edit. Reverting moves the head without deleting steps or assets, so it does not undo a charge for an earlier successful edit.

Each step has its own job status. The session itself is the history and head pointer; it has no aggregate `status` field. Estimates show the cost of the next step and the chain total. Failed and canceled steps are excluded from that total.

:::cards
- [Edit sessions API](../api/): Create an edit history, append steps, estimate the next edit and revert the head.
:::

## Next steps

:::cards
- [Presets](./presets.html): Assemble a prompt for an outcome-named workflow.
- [Sets](./sets.html): Coordinate a pack or explore labelled variants.
- [Compositions and Studio export](./compositions.html): Turn the resulting media into a finished timeline.
:::
