feat(workflows): add fully-wired canvas-format LTX pipeline

ltx-i2v-pipeline.json (API-format) can't be reliably drag-and-dropped into
ComfyUI: its generic API->graph importer never triggers the callbacks
ChatCompletion (structured-output sockets) and FormatString (per-template-
variable sockets) need to create their dynamic inputs/outputs, so every
link touching one silently drops on load.

ltx-i2v-pipeline-canvas.json is the fix: loaded against a live ComfyUI+
Ollama instance, repaired node-by-node by calling each node's own dynamic-
socket route directly, replayed all 39 links from the API-format file by
name (zero errors), added a shared Model Name node (one edit instead of
six) and a User Intent node, then saved via ComfyUI's own serializer.
Verified programmatically post-save: 52 links, zero missing connections
beyond the intentionally-blank optional fields.

README updated to point users at the canvas file for UI loading and keep
the API-format file for direct /prompt POSTs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YArD9ZjBWKsAvazmS48amA
This commit is contained in:
James Veitch
2026-07-26 09:07:31 +01:00
co-authored by Claude Sonnet 5
parent 2724f535f5
commit f8114f01f4
2 changed files with 39 additions and 18 deletions
+38 -18
View File
@@ -8,22 +8,28 @@ new node code was needed; this is a wiring exercise, not a feature.
## Loading it
This is a ComfyUI **API-format** workflow (`{node_id: {class_type, inputs}}`),
not the canvas/UI export format. Recent ComfyUI frontends accept this format
directly via drag-and-drop onto the graph (it auto-lays-out the nodes), or you
can `POST` it straight to `/prompt`. This format was chosen deliberately over
hand-authoring the litegraph UI-export format: the latter requires exact
per-node-type widget-value ordering and link/slot bookkeping that's easy to
get subtly wrong by hand and impossible for me to verify without a live
ComfyUI+Ollama instance. Every template, schema, and link index in this file
*was* verified against the actual node source (see "How this was verified"
below) — only the outer graph-serialization format is unverified against a
real ComfyUI load.
Two files, two purposes:
If you'd rather have the literal draggable canvas file, load this one once,
arrange the nodes, and use ComfyUI's own "Save (API Format)" vs. regular
"Save" to produce one — that guarantees a format your ComfyUI build actually
round-trips.
- **`ltx-i2v-pipeline-canvas.json`** — the canvas/UI format. Load this one
via drag-and-drop or File > Open in ComfyUI. It's fully wired (20 nodes,
52 links) and ready to run — no manual reconnecting required. It also
includes two small conveniences not in the API-format file below: a
shared **"Model Name"** `PrimitiveString` node feeding all 6
`ChatCompletion` agents (edit the model in one place), and a **"User
Intent"** `PrimitiveString` node holding the literal starting request
text.
- **`ltx-i2v-pipeline.json`** — the ComfyUI **API-format** workflow
(`{node_id: {class_type, inputs}}`). Use this to `POST` straight to
`/prompt` for headless/scripted runs. **Do not drag-and-drop this one
onto the canvas** — confirmed live: ComfyUI's generic API→graph importer
doesn't trigger the dynamic-socket callbacks `ChatCompletion` (structured
outputs) and `FormatString` (per-template-variable inputs) rely on, so
nodes load with only their static fields and every dynamic link is
silently dropped. `ltx-i2v-pipeline-canvas.json` was produced by loading
this file, live-repairing exactly that gap against a real ComfyUI+Ollama
instance (calling each node's own dynamic-socket routes directly, then
replaying every link from this file by name), and saving the result —
see "How this was verified" below.
## Prerequisites
@@ -187,9 +193,23 @@ FormatString→ChatCompletion (Agent 1: Intent Compiler) [no image] │
## How this was verified
Everything except the outer graph-serialization format was checked against
this repo's actual node code (not just read — executed), with mocked
`comfy`/`server`/`folder_paths` modules the way `tests/conftest.py` does:
`ltx-i2v-pipeline-canvas.json` was produced against a live ComfyUI+Ollama
instance: loaded `ltx-i2v-pipeline.json` via the frontend's own
`app.loadApiJson`, then for every `ChatCompletion` node called its real
`/dv/ollama/update_structured_outputs` route (and for every `FormatString`
node its real `updateNodeConfig()`) with that node's own schema/template to
get its actual dynamic sockets, then replayed all 39 links from
`ltx-i2v-pipeline.json` by input name — zero errors — before saving. Every
expected connection was re-checked programmatically (not just visually)
against the saved file: 52 links total, and the only unconnected input
sockets are the intentionally-blank optional ones (`headers`, `history`,
the two non-vision agents' unused `image` input, and the Director's unset
shot-constraint overrides).
Everything in `ltx-i2v-pipeline.json` itself (the API-format source) was
separately checked against this repo's actual node code (not just read —
executed), with mocked `comfy`/`server`/`folder_paths` modules the way
`tests/conftest.py` does:
- Every `[node_id, index]` link target resolves to a real node.
- Every `FormatString` template's variables (via the same
File diff suppressed because one or more lines are too long