""" 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()