本文封面图不是设计师画的,也不是我在 ComfyUI 网页里手动点的——它是 Claude Code 写好提示词、调参数、排队提交,直接驱动本地 ComfyUI 生成的。全程我只需要说一句:"帮我画一张体现 Claude Code 和 ComfyUI 关系的封面。"
一、为什么要让 Claude Code 连上 ComfyUI
先看两边的能力边界:
- Claude Code 擅长的是"想":理解需求、拆解任务、写提示词、编排流程、批量调度。但它不产生像素。
- ComfyUI 擅长的是"画":工作流式图像生成,从文生图到图生图再到视频,模型随便换。但它听不懂人话里的意图,只知道执行节点。
传统上做一张连环画、一组漫画分镜,你的流程是这样的:想剧本 → 拆镜头 → 手写每格的提示词 → 在 WebUI 里一格一格地调参数、点生成 → 检查、重抽、挑选。每一步都是手工活,画 4 格就要重复 4 遍。
把两者连起来之后,流程变成:你给 Claude Code 一句话需求 → Claude 拆剧本、写每格提示词、设定参数 → 批量提交给 ComfyUI → 自动取回结果 → 你只负责挑。本文的封面和 4 格分镜,全部是这条流水线的产物。
二、环境准备
1. 装一个 ComfyUI
本地用的是 ComfyUI 桌面版(Comfy-Desktop),启动后服务跑在 127.0.0.1:8188。验证一下:
curl http://127.0.0.1:8188/system_stats
2. 准备一个工作流
文生图最速方案是 Z-Image Turbo:qwen_3_4b 做文本编码、z_image_turbo_bf16 做扩散、ae 做解码,8 步 turbo 采样、CFG 1,单张图十几秒出结果。在网页里搭好或导入现成工作流,保存成 JSON 备用。
3. 选一种连接方式
| 方式 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| MCP 插件 | Claude Code 通过 MCP server 调 comfy-cli 再调 ComfyUI | 工具化封装,带校验和模板库 | 依赖链路长(MCP + CLI),任一环坏了都难排查 |
| HTTP API(本文) | Claude Code 直接 POST 请求 ComfyUI | 零依赖,三个接口搞定全部 | 需要自己写调度代码 |
我选 HTTP API 的原因很简单:ComfyUI 本质上就是一个 HTTP 服务。提交任务用 POST /prompt,查状态用 GET /history,取图用 GET /view——三个接口,整个生成闭环就齐了。而且自己写的那段调度代码,正好成为文章的主角之一。
三、实战一:生成文章封面
第一步:设计提示词。 封面要体现"Claude Code ↔ ComfyUI 的连接",我把它翻译成三个画面要素:左边程序员敲终端(代码侧)、右边机械臂画笔在画布上作画(图像侧)、中间一条发光的代码数据流连接两者(连接关系)。风格上选动漫漫画风,和本文"漫画"主题呼应:
anime comic style, clean lineart, bright colors. A young programmer with short hair, green hoodie and round glasses types on a terminal on the left, the screen glowing with a starburst AI logo. On the right, a robotic arm with a paintbrush paints on a canvas, turning lines of code into a vivid picture. A glowing data stream of code connects the terminal to the robotic arm across the middle of the scene. Comic panel composition, dynamic, joyful mood.
第二步:调整画布。 工作流默认 1024×1024,封面要 16:9,改成 1280×720。
第三步:多种子出候选。 同一个提示词,换种子就是换一张图。一次跑 4 个种子(42 / 7 / 123 / 2024),挑最顺眼的一张——这是 AI 出图最基本的效率技巧:
最终选定种子 2024。整条命令长这样:
python comfy_run.py workflows/z_image_tur.json \
--prompt "anime comic style, clean lineart, ..." \
--width 1280 --height 720 --seed 2024 \
--prefix cover_2024 --out images/cover_2024.png
四、实战二:4 格连环画分镜
单张封面只是热身。连环画的难点在于:把一个故事拆成镜头,还要让每一格的"主角是同一个人"。
第一步:剧本拆镜头。 我让分镜讲一个元故事——主角用 Claude Code 驱动 ComfyUI 画封面:
| 格 | 镜头 | 内容 |
|---|---|---|
| 1 | 远景 | 程序员对空白画布发愁,灵感灯泡熄灭 |
| 2 | 中景 | 打开终端启动 Claude Code,气泡:"help me draw a cover" |
| 3 | 近景 | 机械臂画笔飞速作画,旁边屏幕显示节点工作流 |
| 4 | 特写 | 成品封面诞生,程序员竖起大拇指 |
第二步:角色一致性。 所有格共用同一个角色前缀,这就是保证"是同一个人"的土办法:
anime comic style, clean lineart, bright colors. A young programmer with short hair, green hoodie and round glasses.
第三步:逐格写提示词、逐格生成。 每格在角色前缀后接镜头描述,例如第 3 格:
…green hoodie and round glasses. Close-up: a robotic arm with a paintbrush paints rapidly on the canvas, a screen beside it showing a node-based workflow graph, motion lines and speed effects.




四格连起来看,就是一个完整的"AI 画封面"小故事。
五、把一切交给一个脚本
上面所有操作,Claude Code 都是靠一个脚本完成的。核心逻辑只有两段:工作流转换,和排队取图。
工作流转换——网页保存的工作流是前端格式(带节点坐标、连线),提交给 API 前要转成"节点名 + 输入值"的图格式,顺便把提示词、分辨率、种子覆盖进去:
def frontend_to_api(wf):
"""前端格式工作流 JSON -> API 格式图 {node_id: {class_type, inputs}}。"""
links = {l[0]: (l[1], l[2]) for l in wf["links"]}
graph = {}
for n in wf["nodes"]:
inputs = {}
named = n.get("widgets_values_named", {})
for inp in n.get("inputs", []):
name = inp["name"]
if "widget" in inp:
inputs[name] = named[name]
elif inp.get("link") is not None:
from_node, from_slot = links[inp["link"]]
inputs[name] = [str(from_node), from_slot]
graph[str(n["id"])] = {"class_type": n["type"], "inputs": inputs}
return graph
排队与取图——提交后轮询历史记录,完成即下载:
def queue_prompt(server, graph):
body = json.dumps({"prompt": graph, "client_id": str(uuid.uuid4())}).encode()
req = urllib.request.Request(server + "/prompt", data=body,
headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req, timeout=30) as resp:
return json.load(resp)["prompt_id"]
def wait_for_prompt(server, prompt_id, timeout=600):
deadline = time.monotonic() + timeout
while time.monotonic() < deadline:
with urllib.request.urlopen(server + f"/history/{prompt_id}") as resp:
h = json.load(resp).get(prompt_id)
if h and h.get("status", {}).get("status_str") == "success":
return h["outputs"]
time.sleep(1)
raise TimeoutError(f"等待生成超时 {timeout}s")
完整脚本(含参数覆盖、CLI、取图下载)见 comfy_run.py。整个生成过程就是:Claude Code 写提示词和参数 → 调这个脚本 → ComfyUI 出图。没有网页,没有手动点击。
六、技巧与踩坑
- 气泡里的文字用英文。模型画中文文本几乎必乱码,英文短句的成功率高得多(看第 2 格的气泡)。
- turbo 模型就是快。8 步采样 + CFG 1,1280×720 单张十几秒,批量出候选毫无压力。
- 种子是你的免费彩票。同一提示词跑 4~6 个种子再挑,比反复改提示词高效得多。
- 角色一致性靠"统一前缀"。每格提示词都用同一段角色描述打头,是目前不用 LoRA 最简单有效的手段。
- 别碰极端比例。模型在原生比例附近画质最好,封面要 16:9 就出 16:9,别硬要 2.35:1 的窄条。
七、从一张封面到一本漫画
封面有了,分镜有了,接下来把思路拉直:Claude Code 负责"故事",ComfyUI 负责"像素"。 写剧本、拆镜头、生成提示词、批量调度、命名归档,这些文字侧的活交给 Claude;每格的构图、色彩、细节,交给 ComfyUI 里的工作流。你站在中间,只做两件事:定方向,挑结果。
这套流水线再往前一步,就是整本漫画:Claude 写出完整脚本 → 按格批量生成 → 你挑选满意分镜 → 拼版排版。今晚可以先把你的下一张公众号封面交给它。
总结
通过claude code链接comfy-ui,确实实现了画图自由,但画图的质量还是和模型有关,和自己具体的硬件有关。其次,有时候生成一个确定的图片还是之间使用comfy-ui比较方便,不过你可以通过claude code来优化你的提示词。