- Every node value under the details' "every node's values" has a star; marked values show at
the top of the workflow's own values and of each set as tiles (node, value, a note, and on a
set the default when it differs). Set rows list them first; the comparison window leads its
key values with them and their note.
- Kept in the recipe's params as focusParams [{node, type, widget, note}]; the server refuses
any other shape (at most 12, short strings, notes up to 120 characters). Kept while the node
of that id and type is there, also when the workflow is updated from the canvas.
- compareParams' isKey now also receives the node ids, so a mark holds for one node only.
- Tests: tests/recipe_focus.mjs, focus values in test_recipe_roundtrip.py.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
58 lines
1.6 KiB
Python
58 lines
1.6 KiB
Python
"""Shared bounded constants for Workflow Recipe domains."""
|
|
|
|
import re
|
|
|
|
MAX_NAME_LENGTH = 120
|
|
MAX_TAGS = 20
|
|
MAX_TAG_LENGTH = 60
|
|
MAX_NOTES_LENGTH = 3000
|
|
MAX_MODEL_NOTE_LENGTH = 1000
|
|
MAX_FOCUS_PARAMS = 12
|
|
MAX_FOCUS_NOTE_LENGTH = 120
|
|
MAX_FOCUS_NAME_LENGTH = 200
|
|
MAX_THUMBNAIL_LENGTH = 1_500_000
|
|
MAX_SOURCE_SUBFOLDER_LENGTH = 500
|
|
MAX_RECIPE_BYTES = 12 * 1024 * 1024
|
|
MAX_HISTORY_VERSIONS = 20
|
|
MAX_PREVIEW_SNAPSHOTS = 12
|
|
MAX_PREVIEW_SNAPSHOT_BYTES = 96 * 1024
|
|
MAX_PREVIEW_SNAPSHOT_TOTAL_BYTES = 1_250_000
|
|
MAX_PREVIEW_SOURCE_BYTES = 20 * 1024 * 1024
|
|
MAX_WORKFLOW_NODES = 5_000
|
|
MAX_WORKFLOW_LINKS = 30_000
|
|
MAX_WORKFLOW_GROUPS = 2_000
|
|
MAX_WIDGET_VALUES_PER_NODE = 2_048
|
|
MAX_RECIPE_GALLERY_SCAN = 200
|
|
MAX_RECIPE_GALLERY_RESULTS = 200
|
|
MAX_EMBEDDED_WORKFLOW_BYTES = 3 * 1024 * 1024
|
|
MAX_RECIPE_COVER_SOURCE_BYTES = 64 * 1024 * 1024
|
|
MAX_RECIPE_COVER_BYTES = 256 * 1024
|
|
SAFE_THUMBNAIL_PREFIXES = (
|
|
"data:image/jpeg;base64,",
|
|
"data:image/png;base64,",
|
|
"data:image/webp;base64,",
|
|
)
|
|
MODEL_FILE_SUFFIXES = (".safetensors", ".ckpt", ".pt", ".bin", ".sft")
|
|
STATIC_PREVIEW_EXTENSIONS = (".png", ".jpg", ".jpeg", ".webp", ".gif", ".avif")
|
|
STATIC_PREVIEW_SUFFIXES = tuple(f".preview{extension}" for extension in STATIC_PREVIEW_EXTENSIONS)
|
|
SHA256_PATTERN = re.compile(r"^[0-9a-f]{64}$", re.IGNORECASE)
|
|
VOLATILE_WORKFLOW_KEYS = frozenset({
|
|
"seed",
|
|
"noise_seed",
|
|
"random_seed",
|
|
"variation_seed",
|
|
"batch_size",
|
|
"batch_index",
|
|
"batch_num",
|
|
"last_seed",
|
|
})
|
|
VERIFIABLE_RECIPE_MODEL_CATEGORIES = frozenset({
|
|
"checkpoint",
|
|
"lora",
|
|
"unet",
|
|
"controlnet",
|
|
"vae",
|
|
"text_encoder",
|
|
"clip_vision",
|
|
})
|