Files
Anil MatchaandClaude Opus 4.7 024aeb1513 Add MuAPI_Skill_ColorAnalysisBoard example workflow
Portrait → gpt-image-2-image-to-image editorial "Color Analysis Board" at
3840x2160 (palette swatches, undertone panel, makeup guide, capsule wardrobe).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 19:20:24 +05:30

1723 lines
78 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Generates example ComfyUI workflow JSON files for the MuAPI node pack.
Run: python workflows/_generate_workflows.py
Outputs *.json files into the same directory.
Each spec describes nodes by display-friendly handles; the generator
expands them into the full ComfyUI graph format with proper links.
"""
import json
import os
from pathlib import Path
OUT_DIR = Path(__file__).parent
# ── Node widget signatures ────────────────────────────────────────────────────
# Order MUST match INPUT_TYPES iteration in muapi_nodes.py:
# required first, then optional.
WIDGETS = {
"MuAPIApiKey": ["api_key"],
"MuAPITextToImage": ["model", "prompt", "aspect_ratio",
"api_key", "negative_prompt", "custom_endpoint", "extra_params_json"],
"MuAPIImageToImage": ["model", "prompt",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPITextToVideo": ["model", "prompt", "aspect_ratio", "quality", "duration",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIImageToVideo": ["model", "prompt", "aspect_ratio", "quality", "duration",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIExtendVideo": ["model", "request_id", "quality", "duration",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIImageEnhance": ["model",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIVideoEdit": ["model", "video_url",
"api_key", "prompt", "custom_endpoint", "extra_params_json"],
"MuAPILipsync": ["model", "video_url", "audio_url",
"api_key", "audio_file_path", "custom_endpoint", "extra_params_json"],
"MuAPIAudio": ["model", "prompt",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIImageTo3D": ["model", "prompt",
"api_key", "custom_endpoint", "extra_params_json"],
"MuAPIGenerate": ["endpoint", "payload_json",
"api_key", "file_path_1", "file_path_2"],
"MuAPIVideoSaver": ["video_url", "save_subfolder", "filename_prefix",
"frame_load_cap", "skip_first_frames", "select_every_nth"],
# built-in nodes
"LoadImage": ["image", "upload"],
"PreviewImage": [],
"SaveImage": ["filename_prefix"],
}
# Connection-only inputs (IMAGE type, etc.) that are NOT widgets.
IMG_INPUTS = {
"MuAPIImageToImage": ["image"],
"MuAPIImageToVideo": ["image_1", "image_2", "image_3", "image_4"],
"MuAPIImageEnhance": ["image", "swap_image"],
"MuAPIVideoEdit": ["secondary_image"],
"MuAPIImageTo3D": ["image_1", "image_2", "image_3"],
"MuAPIGenerate": ["file_1", "file_2", "file_3", "file_4"],
"PreviewImage": ["images"],
"SaveImage": ["images"],
"MuAPIVideoSaver": [],
}
# Output slots in order.
OUTPUTS = {
"MuAPIApiKey": [("api_key", "STRING")],
"MuAPITextToImage": [("image", "IMAGE"), ("image_url", "STRING"), ("request_id", "STRING")],
"MuAPIImageToImage": [("image", "IMAGE"), ("image_url", "STRING"), ("request_id", "STRING")],
"MuAPITextToVideo": [("video_url", "STRING"), ("first_frame", "IMAGE"), ("request_id", "STRING")],
"MuAPIImageToVideo": [("video_url", "STRING"), ("first_frame", "IMAGE"), ("request_id", "STRING")],
"MuAPIExtendVideo": [("video_url", "STRING"), ("first_frame", "IMAGE"), ("new_request_id", "STRING")],
"MuAPIImageEnhance": [("image", "IMAGE"), ("image_url", "STRING"), ("request_id", "STRING")],
"MuAPIVideoEdit": [("video_url", "STRING"), ("first_frame", "IMAGE"), ("request_id", "STRING")],
"MuAPILipsync": [("video_url", "STRING"), ("first_frame", "IMAGE"), ("request_id", "STRING")],
"MuAPIAudio": [("audio_url", "STRING"), ("request_id", "STRING")],
"MuAPIImageTo3D": [("model_url", "STRING"), ("request_id", "STRING")],
"MuAPIGenerate": [("output_url", "STRING"), ("preview", "IMAGE"),
("request_id", "STRING"), ("raw_result_json", "STRING")],
"MuAPIVideoSaver": [("frames", "IMAGE"), ("filepath", "STRING"), ("frame_count", "INT")],
"LoadImage": [("IMAGE", "IMAGE"), ("MASK", "MASK")],
"PreviewImage": [],
"SaveImage": [],
}
def build(spec):
"""spec = {nodes: [...], links: [(src_handle, src_slot, dst_handle, dst_slot), ...]}"""
nodes_out, links_out = [], []
handles = {}
nid = 0
lid = 0
x = 40
for n in spec["nodes"]:
nid += 1
handle = n["handle"]
ntype = n["type"]
widgets = n.get("widgets", {})
widget_order = WIDGETS.get(ntype, [])
widget_vals = [widgets.get(w, _default(ntype, w)) for w in widget_order]
inputs = []
for inp_name in IMG_INPUTS.get(ntype, []):
inputs.append({"name": inp_name, "type": _input_type(ntype, inp_name), "link": None})
outputs = []
for out_name, out_type in OUTPUTS.get(ntype, []):
outputs.append({"name": out_name, "type": out_type, "links": [], "slot_index": len(outputs)})
node = {
"id": nid,
"type": ntype,
"pos": [x, 60 + (nid % 3) * 320],
"size": [340, 240],
"flags": {},
"order": nid - 1,
"mode": 0,
"inputs": inputs,
"outputs": outputs,
"properties": {"Node name for S&R": ntype},
"widgets_values": widget_vals,
}
nodes_out.append(node)
handles[handle] = node
x += 380
for src_h, src_slot, dst_h, dst_slot in spec.get("links", []):
lid += 1
src = handles[src_h]
dst = handles[dst_h]
out = src["outputs"][src_slot]
inp = dst["inputs"][dst_slot]
out["links"].append(lid)
inp["link"] = lid
links_out.append([lid, src["id"], src_slot, dst["id"], dst_slot, out["type"]])
return {
"last_node_id": nid,
"last_link_id": lid,
"nodes": nodes_out,
"links": links_out,
"groups": [],
"config": {},
"extra": {"ds": {"scale": 1.0, "offset": [0, 0]}},
"version": 0.4,
}
def _input_type(ntype, name):
if name in ("file_1", "file_2", "file_3", "file_4",
"image", "image_1", "image_2", "image_3", "image_4",
"swap_image", "secondary_image", "images"):
return "IMAGE"
return "STRING"
# Reusable nano-banana-2 (Gemini-3 style) brief used in many skill examples.
NANO_REASONING_BRIEF = (
"Subject: a single product hero shot. Action: floating with subtle rotation. "
"Context: minimalist studio with seamless cyclorama. Composition: 85mm lens, f/2.8, "
"centered. Lighting: soft volumetric key from upper-left, gentle rim light. "
"Style: cinematic, photorealistic, 4K commercial."
)
def _default(ntype, w):
defaults = {
"api_key": "", "custom_endpoint": "", "extra_params_json": "{}",
"negative_prompt": "", "filename_prefix": "muapi", "save_subfolder": "muapi_videos",
"frame_load_cap": 0, "skip_first_frames": 0, "select_every_nth": 1,
"audio_file_path": "", "audio_url": "", "video_url": "",
"request_id": "", "file_path_1": "", "file_path_2": "",
"image": "example.png", "upload": "image",
}
return defaults.get(w, "")
# ── Workflow specs ─────────────────────────────────────────────────────────────
WORKFLOWS = {
"MuAPI_Basic_TextToImage_Flux.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "flux-dev-image",
"prompt": "A photorealistic portrait of an astronaut on Mars, cinematic lighting, 35mm film",
"aspect_ratio": "1:1",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_TextToImage_Imagen4.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "google-imagen4-ultra",
"prompt": "Macro photo of a dewdrop on a red maple leaf, sunrise",
"aspect_ratio": "16:9",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "imagen4"}},
],
"links": [("t2i", 0, "save", 0)],
},
"MuAPI_TextToImage_Seedream5.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "seedream-5.0",
"prompt": "Studio Ghibli inspired countryside village at golden hour",
"aspect_ratio": "3:2",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_TextToImage_GPT_Image.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-1.5",
"prompt": "Vintage travel poster of Tokyo, bold typography, retro print textures",
"aspect_ratio": "9:16",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_TextToImage_HiDream.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "hidream_i1_full_image",
"prompt": "Hyperrealistic cyberpunk samurai under neon rain, ultra detail",
"aspect_ratio": "9:16",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_ImageToImage_FluxKontext.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2i", "type": "MuAPIImageToImage", "widgets": {
"model": "flux-kontext-pro-i2i",
"prompt": "Make this a moody black-and-white film still",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("load", 0, "i2i", 0), ("i2i", 0, "preview", 0)],
},
"MuAPI_ImageToImage_Seededit.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2i", "type": "MuAPIImageToImage", "widgets": {
"model": "bytedance-seededit-image",
"prompt": "Replace the background with snowy mountains at sunrise",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("load", 0, "i2i", 0), ("i2i", 0, "preview", 0)],
},
"MuAPI_ImageToImage_GPT4o_Edit.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2i", "type": "MuAPIImageToImage", "widgets": {
"model": "gpt4o-edit",
"prompt": "Add a cat sitting on the chair in the foreground",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("load", 0, "i2i", 0), ("i2i", 0, "preview", 0)],
},
"MuAPI_TextToVideo_Seedance.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "seedance-v2.0-t2v",
"prompt": "Aerial shot flying over a misty rainforest at dawn",
"aspect_ratio": "16:9", "quality": "basic", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "seedance",
}},
],
# Wire video_url (out 0) into the saver's video_url widget — convert widget to input.
# For simplicity here, the saver also has video_url as its first widget; user can paste manually
# or right-click → convert to input. Most workflows wire it via the link below.
"links": [], # handled with a note below
},
"MuAPI_TextToVideo_Veo3.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "veo3.1-text-to-video",
"prompt": "A cinematic tracking shot of a wolf walking through a snowy forest",
"aspect_ratio": "16:9", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "veo3",
}},
],
"links": [],
},
"MuAPI_TextToVideo_Kling.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "kling-v2.6-pro-t2v",
"prompt": "A dragon soaring above a medieval castle, epic cinematic shot",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "kling",
}},
],
"links": [],
},
"MuAPI_ImageToVideo_Seedance.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-v2.0-i2v",
"prompt": "The character in @image1 starts dancing under spotlight",
"aspect_ratio": "9:16", "quality": "basic", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "seedance_i2v",
}},
],
"links": [("load", 0, "i2v", 0)],
},
"MuAPI_ImageToVideo_Veo3.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Slow cinematic push-in. Subject smiles and turns toward the camera.",
"aspect_ratio": "16:9", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "veo3_i2v",
}},
],
"links": [("load", 0, "i2v", 0)],
},
"MuAPI_ImageToVideo_4References.json": {
"nodes": [
{"handle": "img1", "type": "LoadImage"},
{"handle": "img2", "type": "LoadImage"},
{"handle": "img3", "type": "LoadImage"},
{"handle": "img4", "type": "LoadImage"},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-2.0-new-omni",
"prompt": "Combine the characters from @image1 and @image2 in the setting from @image3, styled like @image4. Cinematic shot.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "omni_4ref",
}},
],
"links": [
("img1", 0, "i2v", 0),
("img2", 0, "i2v", 1),
("img3", 0, "i2v", 2),
("img4", 0, "i2v", 3),
],
},
"MuAPI_ExtendVideo.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "seedance-v2.0-t2v",
"prompt": "Time-lapse of clouds rolling over mountain peaks",
"aspect_ratio": "16:9", "quality": "basic", "duration": 5,
}},
{"handle": "extend", "type": "MuAPIExtendVideo", "widgets": {
"model": "seedance-v2.0-extend",
"quality": "basic", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "extended",
}},
],
# request_id (out 2) → extend.request_id widget — left as widget; user pastes.
"links": [],
},
"MuAPI_FaceSwap.json": {
"nodes": [
{"handle": "base", "type": "LoadImage"},
{"handle": "face", "type": "LoadImage"},
{"handle": "swap", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-image-face-swap",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [
("base", 0, "swap", 0),
("face", 0, "swap", 1),
("swap", 0, "preview", 0),
],
},
"MuAPI_Upscale_Topaz.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "up", "type": "MuAPIImageEnhance", "widgets": {
"model": "topaz-image-upscale",
"extra_params_json": '{"scale": 4}',
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "topaz_4x"}},
],
"links": [("load", 0, "up", 0), ("up", 0, "save", 0)],
},
"MuAPI_BackgroundRemover.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "rm", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-background-remover",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "no_bg"}},
],
"links": [("load", 0, "rm", 0), ("rm", 0, "save", 0)],
},
"MuAPI_Ghibli_Style.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "ghibli", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-ghibli-style",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("load", 0, "ghibli", 0), ("ghibli", 0, "preview", 0)],
},
"MuAPI_ProductShot.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "ps", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-product-shot",
"extra_params_json": '{"prompt": "on a marble countertop with soft window light"}',
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("load", 0, "ps", 0), ("ps", 0, "preview", 0)],
},
"MuAPI_VideoUpscale_Topaz.json": {
"nodes": [
{"handle": "edit", "type": "MuAPIVideoEdit", "widgets": {
"model": "topaz-video-upscale",
"extra_params_json": '{"scale": 2}',
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "topaz_video",
}},
],
"links": [],
},
"MuAPI_VideoEdit_Effects.json": {
"nodes": [
{"handle": "edit", "type": "MuAPIVideoEdit", "widgets": {
"model": "video-effects",
"prompt": "Apply a vintage film grain and warm color grade",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "vfx",
}},
],
"links": [],
},
"MuAPI_Lipsync_Sync.json": {
"nodes": [
{"handle": "lip", "type": "MuAPILipsync", "widgets": {
"model": "sync-lipsync",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "lipsync",
}},
],
"links": [],
},
"MuAPI_Audio_Suno.json": {
"nodes": [
{"handle": "audio", "type": "MuAPIAudio", "widgets": {
"model": "suno-create-music",
"prompt": "Upbeat indie pop with bright synths and a catchy chorus",
}},
],
"links": [],
},
"MuAPI_Generic_RawJSON.json": {
"nodes": [
{"handle": "img", "type": "LoadImage"},
{"handle": "gen", "type": "MuAPIGenerate", "widgets": {
"endpoint": "ai-image-face-swap",
"payload_json": json.dumps({
"image_url": "__file_1__",
"swap_url": "__file_2__",
"target_index": 0
}, indent=2),
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [
("img", 0, "gen", 0),
("gen", 1, "preview", 0),
],
},
"MuAPI_Chain_T2I_to_I2V.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "flux-2-pro",
"prompt": "Hero portrait of a knight in glowing armor, cinematic key light",
"aspect_ratio": "9:16",
}},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "The knight slowly raises their sword. Cinematic camera dolly-in.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "t2i_to_i2v",
}},
],
"links": [("t2i", 0, "i2v", 0)],
},
"MuAPI_Chain_I2I_then_Upscale.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2i", "type": "MuAPIImageToImage", "widgets": {
"model": "flux-kontext-max-i2i",
"prompt": "Convert to a watercolour painting on textured paper",
}},
{"handle": "up", "type": "MuAPIImageEnhance", "widgets": {
"model": "topaz-image-upscale",
"extra_params_json": '{"scale": 2}',
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "watercolour_4k"}},
],
"links": [
("load", 0, "i2i", 0),
("i2i", 0, "up", 0),
("up", 0, "save", 0),
],
},
# ──────────────────────────────────────────────────────────────────────────
# Skill-based workflows — mirror the agent skills under
# muapiapp/skills/library/ (visual, motion, social, edit).
# Each example wires the exact endpoint(s) the skill uses, so dragging
# the JSON onto ComfyUI gives you a working starting point.
# ──────────────────────────────────────────────────────────────────────────
# ── Visual / image-only skills ────────────────────────────────────────────
"MuAPI_Skill_NanoBanana.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": NANO_REASONING_BRIEF,
"aspect_ratio": "1:1",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_Skill_NanoBanana2.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Reasoning brief: a stoic robot barista with exposed copper wiring, "
"pouring a latte art leaf with mechanical precision, inside a neon-lit "
"cyberpunk cafe at midnight, 85mm lens, f/1.8, volumetric blue rim light.",
"aspect_ratio": "3:2",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_Skill_LogoGenerator.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "flux-2-pro",
"prompt": "Minimalist geometric logo for a tech startup named 'NORTH'. "
"Single solid color, flat design, isolated on white, perfectly centered, "
"negative space hides an upward arrow. Vector style.",
"aspect_ratio": "1:1",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_Skill_LogoBranding_Ideogram.json": {
"nodes": [
{"handle": "logo", "type": "MuAPITextToImage", "widgets": {
"model": "ideogram-v3-t2i",
"prompt": "Wordmark logo reading 'AURORA' in clean geometric sans-serif. "
"Monochromatic deep navy, flat vector, isolated on pure white, centered.",
"aspect_ratio": "1:1",
}},
{"handle": "monogram", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Monogram of the letter 'A' as a geometric lockup, single color, "
"flat vector, isolated white background, centered, scalable.",
"aspect_ratio": "1:1",
}},
{"handle": "save1", "type": "SaveImage", "widgets": {"filename_prefix": "logo_primary"}},
{"handle": "save2", "type": "SaveImage", "widgets": {"filename_prefix": "logo_monogram"}},
],
"links": [("logo", 0, "save1", 0), ("monogram", 0, "save2", 0)],
},
"MuAPI_Skill_YouTubeThumbnail.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "YouTube thumbnail, 16:9, bold expressive face on the left looking "
"shocked, large readable text on the right reading \"INSANE RESULT!\" in "
"thick yellow outlined sans, dark vignetted background, high contrast.",
"aspect_ratio": "16:9",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_Skill_BlogHeader.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "Professional blog header image, 1200x628, abstract illustration of "
"data flowing through circuits, deep blue and electric purple palette, "
"modern flat design with subtle gradients, plenty of negative space.",
"aspect_ratio": "16:9",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "blog_header"}},
],
"links": [("t2i", 0, "save", 0)],
},
"MuAPI_Skill_InstagramPost.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Aesthetic Instagram post, square 1:1, flat lay of ceramic coffee cup, "
"fresh croissant, and an open notebook on a beige linen background, "
"warm morning light from the upper-left, leave breathing room for caption.",
"aspect_ratio": "1:1",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "ig_post"}},
],
"links": [("t2i", 0, "save", 0)],
},
"MuAPI_Skill_RedNoteCover.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "bytedance-seedream-v4.5",
"prompt": "Xiaohongshu/RedNote cover, 3:4 portrait, vibrant lifestyle aesthetic, "
"girl holding a matcha drink, soft pastel palette, bold Chinese-style "
"title block at the top with crisp hand-drawn typography.",
"aspect_ratio": "3:4",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "rednote"}},
],
"links": [("t2i", 0, "save", 0)],
},
"MuAPI_Skill_KeyboardArt.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "ideogram-v3-t2i",
"prompt": "Top-down photograph of pristine mechanical-keyboard keycaps arranged "
"to spell \"HELLO WORLD\" centered on a clean wooden desk, soft natural "
"light, precisely aligned, real keycap legends.",
"aspect_ratio": "16:9",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
},
"MuAPI_Skill_AdCreative.json": {
"nodes": [
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "High-converting ad creative, 4:5 portrait, product hero of a "
"premium skincare bottle on glossy marble, dewdrops, soft natural "
"highlight, headline space reserved at the top reading \"GLOW DAILY\".",
"aspect_ratio": "4:5",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "ad_creative"}},
],
"links": [("t2i", 0, "save", 0)],
},
"MuAPI_Skill_BrandKit.json": {
"nodes": [
{"handle": "logo", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Logo concept for 'LUMEN' — minimalist sun + arc mark, single color, "
"vector flat, isolated on white, centered.",
"aspect_ratio": "1:1",
}},
{"handle": "palette", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "Brand color palette moodboard, 5 swatch chips horizontally, hex codes "
"under each, premium magazine style, soft paper texture.",
"aspect_ratio": "16:9",
}},
{"handle": "type", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Typography pairing sheet — large display sans-serif heading 'LUMEN', "
"elegant serif subheading beneath, on cream paper, editorial layout.",
"aspect_ratio": "4:3",
}},
{"handle": "save1", "type": "SaveImage", "widgets": {"filename_prefix": "brand_logo"}},
{"handle": "save2", "type": "SaveImage", "widgets": {"filename_prefix": "brand_palette"}},
{"handle": "save3", "type": "SaveImage", "widgets": {"filename_prefix": "brand_type"}},
],
"links": [
("logo", 0, "save1", 0),
("palette", 0, "save2", 0),
("type", 0, "save3", 0),
],
},
"MuAPI_Skill_Storyboard.json": {
"nodes": [
{"handle": "k1", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Storyboard frame 1: wide establishing shot of a futuristic city at "
"sunrise, golden glow, cinematic 2.39:1 letterbox feel.",
"aspect_ratio": "16:9",
}},
{"handle": "k2", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Storyboard frame 2: medium shot, lone hero in long coat walking "
"down empty street, neon reflections, same city, same time of day.",
"aspect_ratio": "16:9",
}},
{"handle": "k3", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Storyboard frame 3: close-up of the same hero, determined expression, "
"warm key light from the left, neon bokeh background.",
"aspect_ratio": "16:9",
}},
{"handle": "s1", "type": "SaveImage", "widgets": {"filename_prefix": "sb_01"}},
{"handle": "s2", "type": "SaveImage", "widgets": {"filename_prefix": "sb_02"}},
{"handle": "s3", "type": "SaveImage", "widgets": {"filename_prefix": "sb_03"}},
],
"links": [("k1", 0, "s1", 0), ("k2", 0, "s2", 0), ("k3", 0, "s3", 0)],
},
"MuAPI_Skill_AmazonListing.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "hero", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-product-shot",
"extra_params_json": '{"prompt": "Pure white seamless background, soft studio key, '
'gentle floor shadow, centered, e-commerce hero shot"}',
}},
{"handle": "lifestyle", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-product-photography",
"extra_params_json": '{"prompt": "Lifestyle context — product on a marble kitchen '
'counter, morning light from window, soft natural shadow"}',
}},
{"handle": "save1", "type": "SaveImage", "widgets": {"filename_prefix": "amazon_hero"}},
{"handle": "save2", "type": "SaveImage", "widgets": {"filename_prefix": "amazon_lifestyle"}},
],
"links": [
("load", 0, "hero", 0),
("load", 0, "lifestyle", 0),
("hero", 0, "save1", 0),
("lifestyle", 0, "save2", 0),
],
},
"MuAPI_Skill_MultiAngleShots.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "front", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Re-render the exact same product from a straight-on front view, "
"white seamless background, soft studio light.",
}},
{"handle": "side", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Re-render the exact same product from a 90° side profile view, "
"white seamless background, same lighting.",
}},
{"handle": "top", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Re-render the exact same product from a top-down bird's-eye view, "
"white seamless background, same lighting.",
}},
{"handle": "s1", "type": "SaveImage", "widgets": {"filename_prefix": "angle_front"}},
{"handle": "s2", "type": "SaveImage", "widgets": {"filename_prefix": "angle_side"}},
{"handle": "s3", "type": "SaveImage", "widgets": {"filename_prefix": "angle_top"}},
],
"links": [
("load", 0, "front", 0), ("load", 0, "side", 0), ("load", 0, "top", 0),
("front", 0, "s1", 0), ("side", 0, "s2", 0), ("top", 0, "s3", 0),
],
},
"MuAPI_Skill_MultiAngleReshoot.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "fish", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-pro-edit",
"prompt": "Re-render the same scene with a fish-eye lens, dramatic curvature, "
"preserve subject identity exactly.",
}},
{"handle": "low", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-pro-edit",
"prompt": "Re-render the same scene from a low-angle hero shot, looking up, "
"subject identity preserved.",
}},
{"handle": "preview1", "type": "PreviewImage"},
{"handle": "preview2", "type": "PreviewImage"},
],
"links": [
("load", 0, "fish", 0), ("load", 0, "low", 0),
("fish", 0, "preview1", 0), ("low", 0, "preview2", 0),
],
},
"MuAPI_Skill_PhotoPackGenerator.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "pack", "type": "MuAPIImageToImage", "widgets": {
"model": "photo-pack",
"extra_params_json": '{"category": "linkedin"}',
"prompt": "Generate a professional LinkedIn-style headshot pack. "
"Preserve the exact facial identity from the reference image. "
"Do not modify eye shape, nose, jawline, cheekbones, or face proportions.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "photo_pack"}},
],
"links": [("load", 0, "pack", 0), ("pack", 0, "save", 0)],
},
"MuAPI_Skill_ActionFigure.json": {
"nodes": [
{"handle": "load", "type": "LoadImage"},
{"handle": "i2i", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Convert the person in the reference image into a 6-inch collectible "
"action figure on a blister-pack card with logo and tagline. Preserve "
"the face exactly. Studio product-shot lighting.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "action_figure"}},
],
"links": [("load", 0, "i2i", 0), ("i2i", 0, "save", 0)],
},
"MuAPI_Skill_FashionTryOn.json": {
"nodes": [
{"handle": "person", "type": "LoadImage"},
{"handle": "outfit", "type": "LoadImage"},
{"handle": "tryon", "type": "MuAPIImageToImage", "widgets": {
"model": "qwen-image-edit-plus",
"prompt": "Dress the person in @image1 with the outfit shown in @image2. "
"Preserve identity and pose. Natural fit and folds, realistic shadows.",
}},
{"handle": "animate", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-v1.5-pro-i2v",
"prompt": "The model takes one elegant turn revealing the outfit. Studio runway feel.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "fashion_tryon",
}},
],
"links": [
("person", 0, "tryon", 0),
("tryon", 0, "animate", 0),
],
},
"MuAPI_Skill_UGCLifestyleTryOn.json": {
"nodes": [
{"handle": "person", "type": "LoadImage"},
{"handle": "edit", "type": "MuAPIImageToImage", "widgets": {
"model": "ai-dress-change",
"prompt": "Dress the subject in a casual streetwear outfit (cream knit sweater, "
"dark wide-leg jeans). Preserve identity exactly.",
}},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-pro-image-to-video",
"prompt": "Natural UGC lifestyle clip. Subject smiles at the camera and "
"casually adjusts the sleeve. Soft handheld feel.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "ugc_tryon",
}},
],
"links": [
("person", 0, "edit", 0),
("edit", 0, "i2v", 0),
],
},
"MuAPI_Skill_SelfieWithCelebrity.json": {
"nodes": [
{"handle": "user", "type": "LoadImage"},
{"handle": "celeb", "type": "LoadImage"},
{"handle": "selfie", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Generate a realistic BTS selfie of the person in @image1 with the "
"person in @image2, arms-length camera angle, warm event lighting. "
"Preserve both facial identities exactly.",
}},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Both subjects laugh and turn slightly toward each other. "
"Subtle handheld motion.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "celeb_selfie",
}},
],
"links": [
("user", 0, "selfie", 0),
("selfie", 0, "i2v", 0),
],
},
"MuAPI_Skill_FloorPlanRendering.json": {
"nodes": [
{"handle": "plan", "type": "LoadImage"},
{"handle": "render", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Convert the 2D floor plan in @image1 into a realistic 3D isometric "
"architectural rendering with furniture, plants, and warm interior light.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "floor_3d"}},
],
"links": [("plan", 0, "render", 0), ("render", 0, "save", 0)],
},
"MuAPI_Skill_InteriorDesign.json": {
"nodes": [
{"handle": "room", "type": "LoadImage"},
{"handle": "redesign", "type": "MuAPIImageToImage", "widgets": {
"model": "flux-kontext-pro-i2i",
"prompt": "Redesign this room in Japandi style — light oak floor, off-white walls, "
"low linen sofa, large floor lamp, indoor plant. Keep the geometry.",
}},
{"handle": "i2v", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-pro-image-to-video",
"prompt": "Slow architectural dolly through the redesigned space. Soft daylight.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "interior",
}},
],
"links": [("room", 0, "redesign", 0), ("redesign", 0, "i2v", 0)],
},
"MuAPI_Skill_InteriorVisualizer.json": {
"nodes": [
{"handle": "empty", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "Empty modern living room, large window with soft morning light, "
"matte beige walls, light oak parquet floor, photo-realistic.",
"aspect_ratio": "16:9",
}},
{"handle": "furnish", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Furnish this room: low linen sofa, oak coffee table, soft rug, "
"indoor plant, floor lamp, framed art on the wall. Preserve geometry.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "interior_viz"}},
],
"links": [
("empty", 0, "furnish", 0),
("furnish", 0, "save", 0),
],
},
"MuAPI_Skill_CoupleGrid.json": {
"nodes": [
{"handle": "ref", "type": "LoadImage"},
{"handle": "grid", "type": "MuAPIImageToImage", "widgets": {
"model": "qwen-image-edit-plus",
"prompt": "Create a 6-cell grid (2 rows × 3 cols) of the couple in @image1 in "
"six romantic poses and outfits. Preserve both identities exactly. "
"Consistent style across cells.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "couple_grid"}},
],
"links": [("ref", 0, "grid", 0), ("grid", 0, "save", 0)],
},
"MuAPI_Skill_ColorAnalysisBoard.json": {
"nodes": [
{"handle": "ref", "type": "LoadImage"},
{"handle": "board", "type": "MuAPIImageToImage", "widgets": {
"model": "gpt-image-2-image-to-image",
"prompt": "Create a high-end editorial \"Color Analysis Board\" from this portrait "
"in a luxury fashion magazine style (Dior / Ralph Lauren aesthetic). "
"Clean beige/ivory background, warm tones, soft diffused lighting, "
"ultra-detailed photorealistic quality, consistent lighting, minimal "
"elegant typography, grid-based layout.\n\n"
"Main portrait: enhanced natural beauty (same identity, smooth skin, "
"soft glow, realistic texture). Top section: \"Your Best Colors\" with "
"fabric swatches. Undertone panel: warm / neutral / cool with marked "
"result. Colors to avoid. Neutrals that work. Prints that flatter. "
"Makeup guide: eyeshadows, blush, lips, highlighter. \"You in your "
"colors\": multiple outfit variations. Hair colors: best. Jewelry. "
"Style notes. Capsule wardrobe: coordinated outfits, shoes, bags, "
"accessories.",
"extra_params_json": "{\"image_size\": \"3840x2160\", \"background\": \"auto\", \"output_format\": \"png\", \"quality\": \"auto\", \"moderation\": \"low\"}",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "color_analysis_board"}},
],
"links": [("ref", 0, "board", 0), ("board", 0, "save", 0)],
},
"MuAPI_Skill_Brochure.json": {
"nodes": [
{"handle": "cover", "type": "MuAPITextToImage", "widgets": {
"model": "bytedance-seedream-v4.5",
"prompt": "Brochure cover for a coastal real-estate brand — large hero photo of "
"an ocean villa at sunset, brand name 'AZURE STAYS' set in elegant serif "
"at the bottom, premium magazine layout.",
"aspect_ratio": "3:4",
}},
{"handle": "spread", "type": "MuAPITextToImage", "widgets": {
"model": "bytedance-seedream-v4.5",
"prompt": "Brochure inner spread (landscape), two pages, left page: full-bleed "
"lifestyle photo. Right page: paragraph copy block, headline, three "
"small spot photos. Same brand palette.",
"aspect_ratio": "16:9",
}},
{"handle": "save1", "type": "SaveImage", "widgets": {"filename_prefix": "brochure_cover"}},
{"handle": "save2", "type": "SaveImage", "widgets": {"filename_prefix": "brochure_spread"}},
],
"links": [("cover", 0, "save1", 0), ("spread", 0, "save2", 0)],
},
"MuAPI_Skill_UrlToDesign.json": {
"nodes": [
{"handle": "screenshot", "type": "LoadImage"},
{"handle": "redesign", "type": "MuAPIImageToImage", "widgets": {
"model": "gpt4o-edit",
"prompt": "Redesign this website screenshot with modern UI: cleaner hierarchy, "
"8pt spacing, generous whitespace, modern type, vibrant accent color.",
}},
{"handle": "save", "type": "SaveImage", "widgets": {"filename_prefix": "url_redesign"}},
],
"links": [("screenshot", 0, "redesign", 0), ("redesign", 0, "save", 0)],
},
"MuAPI_Skill_DesignGuide.json": {
"nodes": [
{"handle": "g1", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "Page 1: color palette page — 5 large swatches with hex codes and names, "
"premium design-system layout.",
"aspect_ratio": "3:2",
}},
{"handle": "g2", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Page 2: typography pairings — H1/H2/H3 + body samples, two type "
"families displayed side-by-side, editorial layout.",
"aspect_ratio": "3:2",
}},
{"handle": "g3", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Page 3: UI component preview — buttons, input fields, cards, navbar, "
"all on a soft neutral background.",
"aspect_ratio": "3:2",
}},
{"handle": "s1", "type": "SaveImage", "widgets": {"filename_prefix": "guide_palette"}},
{"handle": "s2", "type": "SaveImage", "widgets": {"filename_prefix": "guide_type"}},
{"handle": "s3", "type": "SaveImage", "widgets": {"filename_prefix": "guide_components"}},
],
"links": [("g1", 0, "s1", 0), ("g2", 0, "s2", 0), ("g3", 0, "s3", 0)],
},
"MuAPI_Skill_SocialPack.json": {
"nodes": [
{"handle": "hero", "type": "LoadImage"},
{"handle": "ig", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Reframe to 1:1 Instagram square, preserve subject and brand layout, "
"extend the background naturally.",
}},
{"handle": "tt", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Reframe to 9:16 TikTok vertical, preserve subject, extend background.",
}},
{"handle": "tw", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Reframe to 16:9 Twitter/X landscape, preserve subject, extend background.",
}},
{"handle": "s1", "type": "SaveImage", "widgets": {"filename_prefix": "social_ig"}},
{"handle": "s2", "type": "SaveImage", "widgets": {"filename_prefix": "social_tt"}},
{"handle": "s3", "type": "SaveImage", "widgets": {"filename_prefix": "social_tw"}},
],
"links": [
("hero", 0, "ig", 0), ("hero", 0, "tt", 0), ("hero", 0, "tw", 0),
("ig", 0, "s1", 0), ("tt", 0, "s2", 0), ("tw", 0, "s3", 0),
],
},
# ── Motion / video skills ─────────────────────────────────────────────────
"MuAPI_Skill_Seedance2_T2V.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "seedance-2-text-to-video",
"prompt": "Aerial drone push-in over a moonlit desert canyon. Subject: lone "
"figure on the cliff edge. Lens: 24mm. Move: low-altitude orbital. "
"Lighting: silver moon key, warm fill from torch.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "seedance2_t2v",
}},
],
"links": [],
},
"MuAPI_Skill_Seedance2_OmniReference.json": {
"nodes": [
{"handle": "img1", "type": "LoadImage"},
{"handle": "img2", "type": "LoadImage"},
{"handle": "img3", "type": "LoadImage"},
{"handle": "omni", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-2.0-omni-reference",
"prompt": "Combine character from @image1, prop from @image2, setting from "
"@image3 into a cinematic medium shot. Smooth dolly.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "seedance2_omni",
}},
],
"links": [
("img1", 0, "omni", 0),
("img2", 0, "omni", 1),
("img3", 0, "omni", 2),
],
},
"MuAPI_Skill_Seedance2_FirstLastFrame.json": {
"nodes": [
{"handle": "first", "type": "LoadImage"},
{"handle": "last", "type": "LoadImage"},
{"handle": "interp", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-2-first-last-frame",
"prompt": "Smoothly interpolate between the two frames with naturalistic motion "
"and consistent lighting.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "first_last",
}},
],
"links": [
("first", 0, "interp", 0),
("last", 0, "interp", 1),
],
},
"MuAPI_Skill_CinemaDirector.json": {
"nodes": [
{"handle": "ref", "type": "LoadImage"},
{"handle": "shot", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-pro-image-to-video",
"prompt": "Director brief: Lens 35mm. Move: slow dolly-in. Subject holds gaze. "
"Lighting: warm key, cool rim. Atmosphere: rain mist particles.",
"aspect_ratio": "21:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "cinema",
}},
],
"links": [("ref", 0, "shot", 0)],
},
"MuAPI_Skill_DroneStyleVideo.json": {
"nodes": [
{"handle": "t2v", "type": "MuAPITextToVideo", "widgets": {
"model": "veo3.1-text-to-video",
"prompt": "Aerial drone footage. Subject: turquoise coastline with cliffs. "
"Move: sweeping orbit at 80m altitude. Time: golden hour. "
"Lens: 24mm wide. Stabilized cinematic feel.",
"aspect_ratio": "16:9", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "drone",
}},
],
"links": [],
},
"MuAPI_Skill_OneShotVideo.json": {
"nodes": [
{"handle": "start", "type": "LoadImage"},
{"handle": "shot", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Continuous one-shot: camera glides through the doorway, follows "
"the subject down the corridor, ends on their face in close-up. "
"No cuts, no edits, single take.",
"aspect_ratio": "21:9", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "oneshot",
}},
],
"links": [("start", 0, "shot", 0)],
},
"MuAPI_Skill_3DLogoAnimation.json": {
"nodes": [
{"handle": "logo2d", "type": "LoadImage"},
{"handle": "logo3d", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Convert this flat 2D logo into a premium 3D version — beveled edges, "
"soft metallic shading, on a deep gradient background.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-fast-image-to-video",
"prompt": "The 3D logo rotates slowly, sweeping specular highlight passes "
"across the bevel. Premium product reveal feel.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "logo_3d",
}},
],
"links": [("logo2d", 0, "logo3d", 0), ("logo3d", 0, "anim", 0)],
},
"MuAPI_Skill_AnimalVideoGenerator.json": {
"nodes": [
{"handle": "vlogger", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Photorealistic anthropomorphic golden retriever in a hoodie, sitting "
"at a desk like a YouTube vlogger, ring light, microphone in front.",
"aspect_ratio": "9:16",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-fast-image-to-video",
"prompt": "The dog speaks expressively into the microphone, paws gesturing. "
"Subtle camera bob.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "animal_vlog",
}},
],
"links": [("vlogger", 0, "anim", 0)],
},
"MuAPI_Skill_CartoonDance.json": {
"nodes": [
{"handle": "person", "type": "LoadImage"},
{"handle": "toon", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Convert the person in @image1 into a Pixar-style 3D cartoon "
"character. Preserve identity cues (hair color, outfit). "
"Stylized but recognizable.",
}},
{"handle": "dance", "type": "MuAPIVideoEdit", "widgets": {
"model": "kling-v2.6-std-motion-control",
"prompt": "Apply lively dance motion to the character. Energetic and fluid.",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "cartoon_dance",
}},
],
"links": [("person", 0, "toon", 0)], # toon → motion-control wired via video_url widget
},
"MuAPI_Skill_CharacterStoryVideo.json": {
"nodes": [
{"handle": "char", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Establish the hero character: young explorer in worn leather jacket, "
"amber eyes, soft natural light. Reference sheet, neutral background.",
"aspect_ratio": "1:1",
}},
{"handle": "scene1", "type": "MuAPIImageToImage", "widgets": {
"model": "flux-kontext-pro-i2i",
"prompt": "Place the same character in scene 1: standing at the edge of a "
"misty forest at dawn. Preserve identity exactly.",
}},
{"handle": "shot1", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-pro-image-to-video",
"prompt": "Camera dollies forward as the character steps into the forest. "
"Cinematic, naturalistic motion.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "char_story",
}},
],
"links": [
("char", 0, "scene1", 0),
("scene1", 0, "shot1", 0),
],
},
"MuAPI_Skill_GiantProductShowcase.json": {
"nodes": [
{"handle": "product", "type": "LoadImage"},
{"handle": "giant", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Re-render the product from @image1 at a colossal building-size scale, "
"placed in the middle of a busy city plaza, cinematic low-angle shot, "
"people for scale, dramatic light.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-fast-image-to-video",
"prompt": "Camera slowly rises tilting up to reveal the full giant product. "
"City sounds, crowd reactions.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "giant_product",
}},
],
"links": [("product", 0, "giant", 0), ("giant", 0, "anim", 0)],
},
"MuAPI_Skill_JewelryProductVideo.json": {
"nodes": [
{"handle": "ring", "type": "LoadImage"},
{"handle": "studio", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2-edit",
"prompt": "Place the jewelry on black velvet, dramatic spotlight, macro studio "
"shot, hyper-detailed.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "grok-imagine-image-to-video",
"prompt": "Slow macro orbit around the jewel, light catches each facet, "
"luxury commercial feel.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "jewelry",
}},
],
"links": [("ring", 0, "studio", 0), ("studio", 0, "anim", 0)],
},
"MuAPI_Skill_MusicVideo.json": {
"nodes": [
{"handle": "kf1", "type": "MuAPITextToImage", "widgets": {
"model": "nano-banana-pro",
"prompt": "Music video keyframe 1: synthwave city skyline at night, neon "
"horizon, lone figure on rooftop.",
"aspect_ratio": "16:9",
}},
{"handle": "shot1", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Slow camera dolly toward the figure as neon lights pulse with the beat.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "audio", "type": "MuAPIAudio", "widgets": {
"model": "suno-create-music",
"prompt": "Retro synthwave instrumental, 80 BPM, lush analog pads, driving "
"arpeggio, cinematic build.",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "music_video",
}},
],
"links": [("kf1", 0, "shot1", 0)],
},
"MuAPI_Skill_ProductAdCinematic.json": {
"nodes": [
{"handle": "shot", "type": "LoadImage"},
{"handle": "hero", "type": "MuAPIImageToImage", "widgets": {
"model": "nano-banana-2",
"prompt": "Cinematic product hero shot — marble surface, sweeping volumetric "
"light, depth-of-field background, premium commercial look.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-standard-image-to-video",
"prompt": "Cinematic 8s product ad: slow rotate revealing the silhouette, "
"dramatic backlight bloom, dust particles drifting.",
"aspect_ratio": "16:9", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "product_ad",
}},
],
"links": [("shot", 0, "hero", 0), ("hero", 0, "anim", 0)],
},
"MuAPI_Skill_ProductShowcaseVideo.json": {
"nodes": [
{"handle": "product", "type": "LoadImage"},
{"handle": "edit", "type": "MuAPIImageToImage", "widgets": {
"model": "bytedance-seedream-v4.5-edit",
"prompt": "Surround the product with an explosive splash of its key ingredients "
"frozen mid-air. High-end commercial macro.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-v1.5-pro-i2v-fast",
"prompt": "Macro motion: ingredients orbit the product, ending on a centered "
"hero shot.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "product_showcase",
}},
],
"links": [("product", 0, "edit", 0), ("edit", 0, "anim", 0)],
},
"MuAPI_Skill_ProductVideoAdMaker.json": {
"nodes": [
{"handle": "product", "type": "LoadImage"},
{"handle": "edit", "type": "MuAPIImageToImage", "widgets": {
"model": "flux-2-pro-edit",
"prompt": "Re-render the product on a polished black surface with theatrical "
"rim light. Studio commercial feel.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "wan2.5-image-to-video",
"prompt": "High-end ad shot: slow camera arc around the product, soft particle "
"drift, premium commercial tone.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "product_video_ad",
}},
],
"links": [("product", 0, "edit", 0), ("edit", 0, "anim", 0)],
},
"MuAPI_Skill_TalkingBabyVideo.json": {
"nodes": [
{"handle": "baby", "type": "MuAPITextToImage", "widgets": {
"model": "wan2.5-text-to-image",
"prompt": "Photorealistic 1-year-old baby wearing a tiny astronaut costume, "
"studio backdrop, dramatic key light. Family-friendly.",
"aspect_ratio": "9:16",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "grok-imagine-image-to-video",
"prompt": "The baby grins and speaks expressively to the camera, hands moving "
"in cute gestures. Soft handheld feel.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "talking_baby",
}},
],
"links": [("baby", 0, "anim", 0)],
},
"MuAPI_Skill_AiFightScene.json": {
"nodes": [
{"handle": "board", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "16-cell storyboard grid (4×4) of an action scene: two warriors duel "
"across a rainy rooftop, each cell a unique cut — dodge, slash, parry, "
"kick, fall, recover. High-density frame design.",
"aspect_ratio": "1:1",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-v2.0-i2v",
"prompt": "Animate the storyboard into a high-cut-density fight sequence, "
"rapid action, motion blur, impact frames.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "fight_scene",
}},
],
"links": [("board", 0, "anim", 0)],
},
"MuAPI_Skill_FreezeEffectVideo.json": {
"nodes": [
{"handle": "photo", "type": "LoadImage"},
{"handle": "freeze", "type": "MuAPIImageToVideo", "widgets": {
"model": "seedance-v2.0-i2v",
"prompt": "Ultra-realistic, shot on Arri Alexa Mini, 35mm lens, moody sports "
"bar interior with neon accents, volumetric haze, shallow DOF. "
"The person from @image1 walks confidently through a packed crowd "
"and snaps their fingers — a spherical shockwave ripples outward and "
"everything freezes mid-motion: golden arcs of beer suspended in air, "
"popcorn floating, people locked mid-cheer. Only the subject moves, "
"tracking backward through the frozen scene, plucks a kernel from "
"midair, whispers 'perfect', then snaps again — a reverse shockwave "
"resumes motion and the celebration explodes back to life. "
"Sound: cheer → snap → bass drop → silence → footsteps → snap → cheer.",
"aspect_ratio": "16:9", "quality": "high", "duration": 15,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "freeze_effect",
}},
],
"links": [("photo", 0, "freeze", 0)],
},
"MuAPI_Skill_UGCAdsWorkflow.json": {
"nodes": [
{"handle": "scene", "type": "MuAPITextToImage", "widgets": {
"model": "gpt-image-2-text-to-image",
"prompt": "Authentic UGC selfie scene — young woman in cozy kitchen holding a "
"branded snack bar, natural window light, slightly imperfect framing.",
"aspect_ratio": "9:16",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Subject takes a bite, reacts with genuine delight, talks to camera "
"for a beat. Handheld feel.",
"aspect_ratio": "9:16", "quality": "high", "duration": 8,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "ugc_ad",
}},
],
"links": [("scene", 0, "anim", 0)],
},
"MuAPI_Skill_SocialMediaVideo.json": {
"nodes": [
{"handle": "hero", "type": "MuAPITextToImage", "widgets": {
"model": "google-imagen4-ultra",
"prompt": "Brand-aware social hero frame, vertical 9:16, energetic and "
"on-brand for a wellness app — sunrise yoga silhouette over ocean.",
"aspect_ratio": "9:16",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "veo3.1-image-to-video",
"prompt": "Subtle parallax push-in, waves move, sun rises slightly. "
"Calm pacing for social.",
"aspect_ratio": "9:16", "quality": "high", "duration": 5,
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "social_video",
}},
],
"links": [("hero", 0, "anim", 0)],
},
"MuAPI_Skill_AiClipping.json": {
"nodes": [
{"handle": "clip", "type": "MuAPIVideoEdit", "widgets": {
"model": "ai-clipping",
"prompt": "Detect the most viral 9:16 moments from this long video — "
"hooks, punchlines, peak emotion. Auto-crop vertical.",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "shorts",
}},
],
"links": [],
},
"MuAPI_Skill_YoutubeShorts.json": {
"nodes": [
{"handle": "clip", "type": "MuAPIVideoEdit", "widgets": {
"model": "ai-clipping",
"extra_params_json": '{"num_clips": 5, "min_duration": 15, "max_duration": 60}',
"prompt": "Generate 5 viral 9:16 YouTube Shorts from this long-form video. "
"Each clip: tight hook, single payoff, vertical auto-crop.",
}},
{"handle": "save", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "yt_shorts",
}},
],
"links": [],
},
"MuAPI_Skill_ProductCampaign.json": {
"nodes": [
{"handle": "product", "type": "LoadImage"},
{"handle": "hero", "type": "MuAPIImageEnhance", "widgets": {
"model": "ai-product-shot",
"extra_params_json": '{"prompt": "Premium hero shot, white seamless, soft '
'studio light, gentle floor shadow"}',
}},
{"handle": "lifestyle", "type": "MuAPIImageToImage", "widgets": {
"model": "bytedance-seedream-v4.5-edit",
"prompt": "Place the product in an aspirational lifestyle scene — modern "
"kitchen counter, morning sunlight, plants in soft focus background.",
}},
{"handle": "anim", "type": "MuAPIImageToVideo", "widgets": {
"model": "kling-v3.0-pro-image-to-video",
"prompt": "Slow cinematic dolly across the lifestyle scene, ending on the "
"product hero close-up.",
"aspect_ratio": "16:9", "quality": "high", "duration": 5,
}},
{"handle": "save_hero", "type": "SaveImage", "widgets": {"filename_prefix": "campaign_hero"}},
{"handle": "save_life", "type": "SaveImage", "widgets": {"filename_prefix": "campaign_lifestyle"}},
{"handle": "save_vid", "type": "MuAPIVideoSaver", "widgets": {
"save_subfolder": "muapi_videos", "filename_prefix": "campaign_video",
}},
],
"links": [
("product", 0, "hero", 0),
("product", 0, "lifestyle", 0),
("lifestyle", 0, "anim", 0),
("hero", 0, "save_hero", 0),
("lifestyle", 0, "save_life", 0),
],
},
# ── 3D skills ─────────────────────────────────────────────────────────────
"MuAPI_Skill_ImageTo3D_Tripo.json": {
"nodes": [
{"handle": "ref", "type": "LoadImage"},
{"handle": "to3d", "type": "MuAPIImageTo3D", "widgets": {
"model": "tripo3d-p1-image-to-3d",
"prompt": "",
"extra_params_json": '{"texture": true, "face_limit": 30000}',
}},
],
"links": [("ref", 0, "to3d", 0)],
},
"MuAPI_Skill_TextTo3D_Meshy.json": {
"nodes": [
{"handle": "to3d", "type": "MuAPIImageTo3D", "widgets": {
"model": "meshy-6-text-to-3d",
"prompt": "A stylized treasure chest, low-poly, fantasy game-ready asset, "
"wood and brass, PBR textures.",
"extra_params_json": '{"topology": "quad", "target_polycount": 30000, "enable_pbr": true}',
}},
],
"links": [],
},
"MuAPI_ApiKey_Hub.json": {
# Standalone reference workflow showing the API Key node wired to a T2I.
# In ComfyUI you'll need to right-click the T2I 'api_key' widget → 'Convert to input'
# for the link to take effect; this file ships with that conversion already applied
# via the inputs list.
"nodes": [
{"handle": "key", "type": "MuAPIApiKey", "widgets": {"api_key": ""}},
{"handle": "t2i", "type": "MuAPITextToImage", "widgets": {
"model": "flux-dev-image",
"prompt": "Sunset over a desert canyon, ultra-wide cinematic shot",
"aspect_ratio": "16:9",
}},
{"handle": "preview", "type": "PreviewImage"},
],
"links": [("t2i", 0, "preview", 0)],
# api_key wiring handled in post-process
"post": "wire_api_key",
},
}
def post_wire_api_key(graph):
"""Convert the api_key widget on the T2I node into an input wired from the API Key node."""
key_node = next(n for n in graph["nodes"] if n["type"] == "MuAPIApiKey")
t2i_node = next(n for n in graph["nodes"] if n["type"] == "MuAPITextToImage")
# Find api_key widget index for T2I.
widget_names = WIDGETS["MuAPITextToImage"]
ak_idx = widget_names.index("api_key")
# Add as input with widget reference.
graph["last_link_id"] += 1
lid = graph["last_link_id"]
new_input = {"name": "api_key", "type": "STRING", "link": lid,
"widget": {"name": "api_key"}}
t2i_node["inputs"].append(new_input)
key_node["outputs"][0]["links"].append(lid)
graph["links"].append([lid, key_node["id"], 0, t2i_node["id"],
len(t2i_node["inputs"]) - 1, "STRING"])
# Blank the widget value (still keep the slot in widgets_values).
t2i_node["widgets_values"][ak_idx] = ""
POST = {"wire_api_key": post_wire_api_key}
def main():
written = []
for name, spec in WORKFLOWS.items():
graph = build(spec)
if "post" in spec:
POST[spec["post"]](graph)
path = OUT_DIR / name
path.write_text(json.dumps(graph, indent=2))
written.append(name)
print(f"Wrote {len(written)} workflows to {OUT_DIR}")
for n in written:
print(f" - {n}")
if __name__ == "__main__":
main()