diff --git a/mcp/mcp-image-gen/lumen_profiles/20260404_140236_2409122067.png b/mcp/mcp-image-gen/lumen_profiles/20260404_140236_2409122067.png new file mode 100644 index 0000000..2ac1fe7 Binary files /dev/null and b/mcp/mcp-image-gen/lumen_profiles/20260404_140236_2409122067.png differ diff --git a/mcp/mcp-image-gen/lumen_profiles/20260404_140258_764633840.png b/mcp/mcp-image-gen/lumen_profiles/20260404_140258_764633840.png new file mode 100644 index 0000000..0a1a737 Binary files /dev/null and b/mcp/mcp-image-gen/lumen_profiles/20260404_140258_764633840.png differ diff --git a/mcp/mcp-image-gen/lumen_profiles/20260404_140319_1367851518.png b/mcp/mcp-image-gen/lumen_profiles/20260404_140319_1367851518.png new file mode 100644 index 0000000..b9cdcfc Binary files /dev/null and b/mcp/mcp-image-gen/lumen_profiles/20260404_140319_1367851518.png differ diff --git a/mcp/mcp-image-gen/lumen_profiles/20260404_140337_3135233944.png b/mcp/mcp-image-gen/lumen_profiles/20260404_140337_3135233944.png new file mode 100644 index 0000000..23a2f51 Binary files /dev/null and b/mcp/mcp-image-gen/lumen_profiles/20260404_140337_3135233944.png differ diff --git a/mcp/mcp-image-gen/lumen_profiles/20260404_140358_568659042.png b/mcp/mcp-image-gen/lumen_profiles/20260404_140358_568659042.png new file mode 100644 index 0000000..88496b1 Binary files /dev/null and b/mcp/mcp-image-gen/lumen_profiles/20260404_140358_568659042.png differ diff --git a/mcp/mcp-image-gen/src/server.py b/mcp/mcp-image-gen/src/server.py index 8451b7d..9920525 100644 --- a/mcp/mcp-image-gen/src/server.py +++ b/mcp/mcp-image-gen/src/server.py @@ -40,7 +40,9 @@ class ComfyUIClient: async def queue_prompt(self, workflow: dict) -> str: """Submit a workflow to ComfyUI and return the prompt_id.""" - payload = {"prompt": workflow} + # Strip internal metadata keys (e.g. "_meta") — they are not ComfyUI nodes + clean_workflow = {k: v for k, v in workflow.items() if not k.startswith("_")} + payload = {"prompt": clean_workflow} async with httpx.AsyncClient(timeout=30.0) as client: resp = await client.post(f"{self.base_url}/api/prompt", json=payload) resp.raise_for_status() @@ -115,7 +117,8 @@ def build_flux_workflow( wf["27"]["inputs"]["height"] = height wf["13"]["inputs"]["steps"] = steps wf["13"]["inputs"]["seed"] = actual_seed - wf["30"]["inputs"]["ckpt_name"] = model + # Node 32 = UNETLoader (flux1-schnell.safetensors is UNet-only, not all-in-one checkpoint) + wf["32"]["inputs"]["unet_name"] = model # Attach the actual seed as metadata so callers can retrieve it wf["_meta"] = {"actual_seed": actual_seed} diff --git a/mcp/mcp-image-gen/src/workflows/flux_schnell.json b/mcp/mcp-image-gen/src/workflows/flux_schnell.json index e809015..d06e6ef 100644 --- a/mcp/mcp-image-gen/src/workflows/flux_schnell.json +++ b/mcp/mcp-image-gen/src/workflows/flux_schnell.json @@ -2,7 +2,7 @@ "6": { "class_type": "CLIPTextEncode", "inputs": { - "clip": ["30", 1], + "clip": ["30", 0], "text": "PROMPT_PLACEHOLDER" } }, @@ -10,7 +10,7 @@ "class_type": "VAEDecode", "inputs": { "samples": ["13", 0], - "vae": ["30", 2] + "vae": ["31", 0] } }, "9": { @@ -26,7 +26,7 @@ "cfg": 1.0, "denoise": 1.0, "latent_image": ["27", 0], - "model": ["30", 0], + "model": ["32", 0], "negative": ["33", 0], "positive": ["6", 0], "sampler_name": "euler", @@ -44,15 +44,31 @@ } }, "30": { - "class_type": "CheckpointLoaderSimple", + "class_type": "DualCLIPLoader", "inputs": { - "ckpt_name": "flux1-schnell.safetensors" + "clip_name1": "t5xxl_fp8_e4m3fn.safetensors", + "clip_name2": "clip_l.safetensors", + "type": "flux", + "device": "default" + } + }, + "31": { + "class_type": "VAELoader", + "inputs": { + "vae_name": "ae.safetensors" + } + }, + "32": { + "class_type": "UNETLoader", + "inputs": { + "unet_name": "flux1-schnell.safetensors", + "weight_dtype": "fp8_e4m3fn" } }, "33": { "class_type": "CLIPTextEncode", "inputs": { - "clip": ["30", 1], + "clip": ["30", 0], "text": "NEGATIVE_PLACEHOLDER" } } diff --git a/mcp/mcp-image-gen/tests/test_server.py b/mcp/mcp-image-gen/tests/test_server.py index 33c3626..2fd1785 100644 --- a/mcp/mcp-image-gen/tests/test_server.py +++ b/mcp/mcp-image-gen/tests/test_server.py @@ -44,7 +44,9 @@ def test_build_flux_workflow_structure(): assert wf["9"]["class_type"] == "SaveImage" assert wf["13"]["class_type"] == "KSampler" assert wf["27"]["class_type"] == "EmptySD3LatentImage" - assert wf["30"]["class_type"] == "CheckpointLoaderSimple" + assert wf["30"]["class_type"] == "DualCLIPLoader" + assert wf["31"]["class_type"] == "VAELoader" + assert wf["32"]["class_type"] == "UNETLoader" assert wf["33"]["class_type"] == "CLIPTextEncode" @@ -65,7 +67,7 @@ def test_build_flux_workflow_params_injected(): assert wf["27"]["inputs"]["height"] == 768 assert wf["13"]["inputs"]["steps"] == 8 assert wf["13"]["inputs"]["seed"] == 12345 - assert wf["30"]["inputs"]["ckpt_name"] == "sdxl.safetensors" + assert wf["32"]["inputs"]["unet_name"] == "sdxl.safetensors" def test_negative_prompt_included():