232 lines
13 KiB
Markdown
232 lines
13 KiB
Markdown
# Workflow Recipes and Parameter Notebooks
|
|
|
|
Read this document for recipe schemas, cards/detail behavior, package handling,
|
|
result galleries, Parameter Notebooks, prompt roles, and the recipe-powered Node
|
|
Assistant.
|
|
|
|
## Package import/export availability
|
|
|
|
Recipe package import and export are temporarily closed pending validation.
|
|
Topbar/card/detail buttons are disabled with a localized explanation. The registered
|
|
`POST /anomalous/export_recipe_package` route returns HTTP 503 with code
|
|
`recipe_export_disabled` before reading request JSON or recipe files.
|
|
`RECIPE_PACKAGE_EXPORT_ENABLED` in `api/recipe_packages.py` is a release gate,
|
|
not a user setting. `RECIPE_PACKAGE_IMPORT_ENABLED` likewise gates both
|
|
`POST /anomalous/import_recipe_package_inspect` and
|
|
`POST /anomalous/import_recipe_package_commit`: each returns HTTP 503 with code
|
|
`recipe_import_disabled` before reading uploaded bytes, request JSON, inspection
|
|
tokens or writing files. Package format helpers remain for compatibility tests;
|
|
local saves are unaffected.
|
|
|
|
Reopening requires an explicit release decision, package round-trip and failure
|
|
validation, then restoring the frontend export action and enabling the backend
|
|
gates together. Do not reopen package transfers as a side effect of UX work. Workflow
|
|
share-code import/export is a separate, verified feature available from Toolbox.
|
|
|
|
## Product and data model
|
|
|
|
Workspace contains Prompt Notes, Workflow Recipes, and the Material Library.
|
|
Recipe Parameter Notebooks are presented as Parameter Sets (参数方案). Internal
|
|
notebook route and property names may remain stable for compatibility even when
|
|
the user-facing presentation changes.
|
|
|
|
A Workflow Recipe stores the authoritative serialized graph plus bounded
|
|
metadata for browsing and comparison. Summary adapters expose common model,
|
|
LoRA, prompt, and sampling semantics; generic bounded widget summaries cover
|
|
other nodes, including third-party nodes. Summaries are presentation only. Edit,
|
|
apply, structural validation, and detailed values resolve from the contained
|
|
serialized workflow by node ID and widget index.
|
|
|
|
The card API stays lightweight. Full workflow and history payloads are loaded on
|
|
demand. Every update archives the previous full recipe locally, bounded to 20
|
|
versions. The structural fingerprint (`sha256-structural-v1`) is an integrity
|
|
and version-comparison value, not model identity evidence.
|
|
|
|
Backend ownership is split by responsibility: `workflow_schema.py` owns graph
|
|
validation, fingerprints, signatures and integrity receipts; `recipe_schema.py`
|
|
owns recipe/model-reference normalization; `recipe_images.py` owns source images,
|
|
covers and output-gallery inspection; `recipe_store.py` owns directory, record and
|
|
history I/O. `recipes.py` maps HTTP requests and errors and retains narrow
|
|
compatibility exports only. `recipe_packages.py`, `parameters.py`, and materials
|
|
import those owners directly rather than reaching through the route facade.
|
|
|
|
The current persisted recipe schema is v7. Earlier schema steps introduced the
|
|
structural fingerprint, explicit model-reference identity records, and optional
|
|
recipe-owned preview descriptors; v5 separates model identity from editable
|
|
official-origin fields. V6 records whether the saved graph is a partial or
|
|
complete recipe. V7 adds bounded recipe-scoped model notes and makes Hash
|
|
synchronization across local matching and partial append an explicit invariant.
|
|
Normal save/update paths preserve compatible imported
|
|
records rather than rebuilding identity from the current machine. An explicit
|
|
save-time verification choice may replace missing identity with a freshly
|
|
computed SHA-256 for supported model categories.
|
|
|
|
Recipe model references separate saved identity from current-machine
|
|
availability and official origin metadata. Origin refresh is an explicit
|
|
enrichment mode. A refresh-only request clones the stored recipe before
|
|
enrichment so it cannot be rejected by complete-recipe validation or discard the
|
|
workflow. Normal updates preserve imported identity/origin records when the
|
|
current machine cannot resolve them.
|
|
|
|
## Save, edit, and presentation
|
|
|
|
Save captures the live graph exactly once before opening the dialog; that fixed
|
|
snapshot is the graph sent to the backend. The dialog records recipe identity,
|
|
notes, tags, and cover/source image. It does not ask users to select presentation
|
|
pins or a per-recipe snapshot policy. Existing `params.pinned` values survive an
|
|
edit, while new recipes use an empty list.
|
|
|
|
Before the dialog opens, an advisory check reads only the captured workflow hash
|
|
records and cached local metadata. Recognized model references without verified
|
|
identity appear as an optional action. The checkbox is off by default; enabling
|
|
it computes the exact full-file SHA-256 in a worker thread during persistence.
|
|
Foundation components such as VAE and text encoders are included because Model
|
|
Doctor requires their hash for automatic recovery and treats size-only evidence
|
|
as a manual candidate at most.
|
|
Inspection failure never blocks the workflow snapshot from being saved.
|
|
|
|
The detail view contains Overview, Parameters, Gallery, and Versions as
|
|
applicable. Compact cards may ellipsize bounded values while preserving their
|
|
full copy value. Detail rows provide visible expand/collapse and copy controls
|
|
for long values and prompts; they do not silently truncate authoritative data.
|
|
|
|
`ui_recipe_detail.js` coordinates the detail session, active tab, and model composition.
|
|
`ui_recipe_overview.js` owns the overview; `ui_recipe_parameters.js` owns prompt roles,
|
|
parameter editing, raw nodes, and preset saving; and `ui_recipe_model_matching.js`
|
|
owns preview resolution plus explicit local matching. Inline persistence is centralized
|
|
in `ui_recipe_metadata.js`, with pure ordering/value helpers in
|
|
`ui_recipe_parameter_utils.js`. The catalog shell lives in `ui_recipe_catalog.js`,
|
|
cards and card actions in `ui_recipe_cards.js`, save/edit dialogs in
|
|
`ui_recipe_dialogs.js`, and shared cover helpers in `ui_recipe_media.js`.
|
|
`ui_recipe_versions.js` owns version comparison and restore, while
|
|
`ui_recipe_gallery.js` owns result rendering and opens `ui_gallery_detail.js`
|
|
directly for image inspection. Shared detail DOM/copy primitives live in
|
|
`ui_recipe_detail_dom.js`; the subviews return refresh/finish decisions through
|
|
callbacks instead of redrawing one another.
|
|
|
|
Model names in compact recipe presentation use a basename or official model
|
|
name, never a full filesystem path. Saved paths and hashes belong behind advanced
|
|
information. A preview or exact path can locate current-machine presentation
|
|
only after the reference is already understood; it cannot establish identity.
|
|
|
|
Import matching is a separate explicit recovery action. Unresolved references
|
|
are sent to the hash/size/category resolver. A discovered candidate remains
|
|
presentation-only until the user chooses Apply match; that action updates the
|
|
authoritative workflow widget, model reference, and node-scoped Hash index
|
|
through the full-recipe update path and archives the previous recipe. The
|
|
author's saved filename or path is never match evidence. Model-reference
|
|
`user_note` is recipe-scoped presentation metadata and never match evidence.
|
|
|
|
Recipe-owned model preview snapshots are bounded, content-addressed WebP files
|
|
below `.assets/<recipe-stem>/`. They are at most 320 px or 96 KiB each, limited
|
|
to 12 images and 1.25 MiB per save/update. Static local preview files are
|
|
accepted; original videos are never packaged, though a bound local video may
|
|
contribute a bounded first-frame thumbnail. Deleting a recipe removes only its
|
|
contained assets after the recipe file is deleted. History may share an asset
|
|
ID.
|
|
|
|
## Canvas actions
|
|
|
|
Recipe cards and details expose a scope-aware canvas action. A live graph with
|
|
an active output node and no unconnected required inputs is saved as a complete
|
|
recipe and opens as a new workflow canvas. A graph without an output node or
|
|
with required connection boundaries is saved as a partial recipe and appends to
|
|
the current canvas. Append clones saved nodes, assigns collision-free IDs,
|
|
remaps links, places/selects the inserted content, treats groups as first-class
|
|
items, remaps node-scoped model Hash records, and rolls back nodes/groups/Hash
|
|
records together on failure. Legacy recipes without
|
|
scope metadata are complete recipes because earlier releases only documented
|
|
and captured complete workflows.
|
|
|
|
Structural editing is separate from composition. It may load a recipe into a new
|
|
canvas after explicit confirmation and saves back through the full-recipe update
|
|
path. It is not presented as an ambiguous “Open to canvas” recipe action.
|
|
|
|
All list/detail actions await the shared transaction before reporting success or
|
|
restoring controls. A failure must leave the button usable and the host graph in
|
|
its prior state.
|
|
|
|
## Result galleries
|
|
|
|
Recipe result discovery uses `sha256-node-types-v1`: the sorted node class
|
|
composition and count. It intentionally ignores seeds, prompts, model values,
|
|
and other parameters, so ordinary generation variations can match. This is
|
|
separate from the structural integrity fingerprint.
|
|
|
|
Opening detail scans at most the newest 200 PNG files below the ComfyUI output
|
|
directory and reads only bounded embedded `workflow` or API `prompt` metadata.
|
|
There is no persistent output index or background polling. A chosen result may
|
|
become the recipe-owned compressed cover; its original output path remains a
|
|
local convenience reference rather than package content or identity evidence.
|
|
|
|
The main output Gallery performs its page-one scan when opened and exposes a
|
|
manual Refresh action. It does not poll in the background and preserves scroll
|
|
position across manual refresh.
|
|
|
|
## Parameter Notebooks
|
|
|
|
Parameter Notebooks are immutable generation-value snapshots owned by a recipe.
|
|
Saving or updating a recipe creates a new snapshot. The Parameters tab uses a
|
|
two-pane history browser: the left pane selects a notebook and the right pane
|
|
prominently identifies the active name and timestamp. Selection requests carry a
|
|
token so an older gallery response cannot overwrite a newer selection. Parameter
|
|
result matching uses the separate `sha256-params-v1` signature.
|
|
|
|
“New parameter note” clones the selected recipe/snapshot into an editable draft
|
|
and saves a new immutable snapshot. Rename uses the dedicated parameter endpoint
|
|
and atomic persistence. Delete accepts only the validated notebook filename,
|
|
invalidates in-flight requests, reloads the list, and selects the newest remaining
|
|
note when necessary. The recipe's current baseline is not a deletable stored row.
|
|
|
|
Runtime-volatile values such as sampler seeds remain visible by field name but
|
|
their values are excluded from summaries, copying, editing, matching, and apply.
|
|
The serialized workflow retains the slots for compatibility.
|
|
|
|
“Read current and create” and “Apply to current workflow” share a skeleton
|
|
preflight. Every saved node must match a local node by type and shape, preferring
|
|
stable ID/title evidence; extra local nodes are allowed. Read-current refuses to
|
|
create a draft if the skeleton is incomplete. Apply validates all widget slots
|
|
before mutation, resolves serialized records to live nodes, invokes ComfyUI
|
|
callbacks, and rolls values back if a callback fails.
|
|
|
|
The Node Assistant queries bounded notebook presets by selected node type. Its
|
|
cache is invalidated by save/delete and bypassed by an explicit refresh. Applying
|
|
a preset is a single-node transaction; it does not apply the full workflow.
|
|
|
|
## Prompt roles
|
|
|
|
Automatic prompt roles are conservative. `recipe_parser.js` traces backward
|
|
from allowlisted official sampler/Guider conditioning inputs through allowlisted
|
|
conditioning pass-through nodes to native `CLIPTextEncode` nodes. Unknown
|
|
third-party nodes are opaque; titles, type-name guesses, prompt content, and a
|
|
default-positive rule are not semantic evidence.
|
|
|
|
Saved role metadata joins to assistant records by string-safe node ID. Legacy
|
|
recipes may recover a role only from an exact, unambiguous full prompt value in
|
|
the saved positive/negative arrays. The same value in both arrays remains
|
|
unknown.
|
|
|
|
Manual overrides live in `params.promptRoleOverrides`, keyed by string-safe node
|
|
ID and guarded by saved node type. Values are `positive`, `negative`, `both`,
|
|
`ignored`, or `unknown`. An override wins over automatic/legacy metadata; removing
|
|
it restores the saved automatic result. Updates retain it only while ID and type
|
|
still match.
|
|
|
|
## Recipe-to-model navigation
|
|
|
|
Opening a resolved local model from Recipe Overview keeps the outer browser open
|
|
and temporarily replaces all main content surfaces with model detail. A compact
|
|
return token retains the recipe payload, active tab, scroll position, and prior
|
|
Workspace return state.
|
|
|
|
Model-detail Back, or reopening Workspace and selecting Workflow Recipes,
|
|
consumes that token and reconstructs the exact recipe detail. Navigating directly
|
|
to another main panel or closing Workspace abandons the transition and clears
|
|
stale media/DOM/return state. Opening Workspace during the transition must not
|
|
overwrite the earlier outer-panel return state.
|
|
|
|
Workflow Recipes and recipe-powered Assistant parameter presets remain beta
|
|
surfaces until an explicit stability decision changes that status. Localized
|
|
notices identify their data directories and distinguish single-node preset apply
|
|
from full-skeleton Parameter Notebook apply.
|