149 lines
5.8 KiB
Markdown
149 lines
5.8 KiB
Markdown
# ComfyUI Workflow Setup for OpenMAIC
|
||
|
||
## Where to store workflows
|
||
|
||
Place all workflow JSON files in your Next.js `public/` folder:
|
||
|
||
```
|
||
your-project/
|
||
public/
|
||
comfyui-workflow.json → displays as "Workflow"
|
||
comfyui-anime-style.json → displays as "Anime Style"
|
||
comfyui-line-art.json → displays as "Line Art"
|
||
comfyui-portrait.json → displays as "Portrait"
|
||
```
|
||
|
||
### Naming convention
|
||
- Filenames **must** start with `comfyui-` or contain `workflow`
|
||
- Use hyphens to separate words — they become the display name in the UI
|
||
- The `comfyui-` prefix is stripped automatically
|
||
- Example: `comfyui-anime-style.json` → **"Anime Style"** in the dropdown
|
||
|
||
---
|
||
|
||
## Required nodes in your workflow
|
||
|
||
The adapter finds nodes **by their title** (the `_meta.title` field in the JSON).
|
||
To set a node's title in ComfyUI: right-click the node → **Title** → type the name.
|
||
|
||
### Required
|
||
|
||
| Node Title | Recommended Type | Purpose |
|
||
|------------|-----------------|---------|
|
||
| `Input Prompt` | `PrimitiveStringMultiline` | The image description from OpenMAIC is injected here |
|
||
|
||
### Recommended (automatically patched if present)
|
||
|
||
| Node Title | Recommended Type | Purpose |
|
||
|------------|-----------------|---------|
|
||
| `Width` | `PrimitiveInt` | Output width in pixels — set from the requested aspect ratio |
|
||
| `Height` | `PrimitiveInt` | Output height in pixels — set from the requested aspect ratio |
|
||
| `KSampler` | `KSampler` | Seed is randomised on every generation for varied outputs |
|
||
| `Enable prompt enhancement?` | `PrimitiveBoolean` | Set to `false` to skip LLM prompt enhancement (recommended for speed) |
|
||
|
||
### Fallback behaviour
|
||
|
||
If `Width` and `Height` nodes are **not found**, the adapter automatically falls
|
||
back to patching the `Empty Flux 2 Latent` node's `width` and `height` inputs
|
||
directly — so existing workflows without dedicated dimension nodes still work.
|
||
|
||
Both `Width` and `Height` must be present for the explicit node approach to
|
||
activate — if only one is found the adapter falls back to the latent node method
|
||
and logs a warning.
|
||
|
||
### Prompt node fallback
|
||
|
||
If `Input Prompt` is not found, the adapter falls back to a node titled
|
||
`String (Multiline - Prompt)` — so existing workflows still work without
|
||
renaming anything.
|
||
|
||
---
|
||
|
||
## Connecting the nodes
|
||
|
||
### Input Prompt
|
||
Connect the output of the `Input Prompt` node to wherever your prompt text
|
||
enters the pipeline — typically the `text` input of a `CLIPTextEncode` node,
|
||
or a `StringReplace` node if you use prompt templating.
|
||
|
||
### Width and Height
|
||
Connect the output of each node to the corresponding `width` and `height`
|
||
inputs of your `Empty Flux 2 Latent` (or equivalent empty latent) node.
|
||
|
||
Example wiring:
|
||
```
|
||
[Input Prompt] ──→ CLIPTextEncode (text)
|
||
[Width] ──→ EmptyLatentImage (width)
|
||
[Height] ──→ EmptyLatentImage (height)
|
||
```
|
||
|
||
---
|
||
|
||
## How to export in API format
|
||
|
||
The workflow JSON must be in **ComfyUI API format** (not the default save format).
|
||
|
||
1. In ComfyUI, go to **Settings** → enable **Dev Mode Options**
|
||
2. A new **Save (API Format)** button appears in the toolbar
|
||
3. Click **Save (API Format)** — this produces the correct JSON
|
||
4. Place the file in your `public/` folder
|
||
|
||
> ⚠️ The regular **Save** button produces a different format that will not work.
|
||
|
||
---
|
||
|
||
## Settings in OpenMAIC
|
||
|
||
1. Go to **Settings → Image Generation**
|
||
2. Select **ComfyUI Image** as the provider
|
||
3. Set **Base URL** to your ComfyUI address (default `http://localhost:8188`)
|
||
4. Select your workflow from the **Workflows** list
|
||
5. Click **Test Connection** to verify ComfyUI is reachable
|
||
|
||
### Default workflow selection
|
||
|
||
If no workflow is explicitly selected — for example on the autonomous
|
||
classroom-media generation path, or before you've clicked a workflow in
|
||
Settings — the adapter falls back to the **first workflow file discovered in
|
||
`public/`** (alphabetically by display name). It does **not** rely on any
|
||
hard-coded filename, so you don't need a file called `comfyui-workflow.json`;
|
||
any single `comfyui-*.json` you ship will be used as the default. If `public/`
|
||
contains **no** workflow files at all, generation fails with a clear error
|
||
asking you to add one.
|
||
|
||
---
|
||
|
||
## Deployment topology (important for hosted/production)
|
||
|
||
The default Base URL `http://localhost:8188` assumes **OpenMAIC and ComfyUI run
|
||
on the same host** (the typical local / self-hosted setup).
|
||
|
||
When OpenMAIC runs with `NODE_ENV=production`, a **client-supplied** Base URL
|
||
(`x-base-url`) that points at `localhost`, `127.0.0.1`, or a private/internal IP
|
||
range is rejected with HTTP 403 by the SSRF guard (`validateUrlForSSRF`). This
|
||
is deliberate and matches the behaviour of the other local providers — it stops
|
||
a browser client from steering server-side requests at internal services.
|
||
|
||
Practical implications:
|
||
|
||
- **Same-host / self-hosted:** works out of the box. Server-resolved defaults
|
||
are not subject to the client-URL SSRF check, so the `localhost:8188` default
|
||
is fine when OpenMAIC and ComfyUI share a host.
|
||
- **ComfyUI on a different machine in production:** point OpenMAIC at ComfyUI
|
||
over a **routable, non-private** address (or terminate it behind a reverse
|
||
proxy on a public hostname). A `localhost`/private URL sent from the browser
|
||
in production will be refused.
|
||
- **Local development** (`NODE_ENV` ≠ `production`): the SSRF check is skipped,
|
||
so `localhost` works normally.
|
||
|
||
---
|
||
|
||
## Performance tips
|
||
|
||
- **Disable prompt enhancement** — if your workflow has an LLM-based prompt
|
||
enhancer, set its enable node to `false`. Enhancement can add 3–5 minutes
|
||
per image. The prompts generated by OpenMAIC are already descriptive enough.
|
||
- The adapter randomises the KSampler seed on every generation automatically.
|
||
- Output dimensions are calculated from the aspect ratio requested by OpenMAIC
|
||
and capped at the `maxResolution` set in `image-providers.ts` (default `1920×1920`).
|