【AI智能体】用 Claude Code 驱动 ComfyUI 创作漫画

本文封面图不是设计师画的,也不是我在 ComfyUI 网页里手动点的——它是 Claude Code 写好提示词、调参数、排队提交,直接驱动本地 ComfyUI 生成的。全程我只需要说一句:"帮我画一张体现 Claude Code 和 ComfyUI 关系的封面。"

· 8 min read
【AI智能体】用 Claude Code 驱动 ComfyUI 创作漫画
本文封面图不是设计师画的,也不是我在 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 出图。没有网页,没有手动点击。

六、技巧与踩坑

  1. 气泡里的文字用英文。模型画中文文本几乎必乱码,英文短句的成功率高得多(看第 2 格的气泡)。
  2. turbo 模型就是快。8 步采样 + CFG 1,1280×720 单张十几秒,批量出候选毫无压力。
  3. 种子是你的免费彩票。同一提示词跑 4~6 个种子再挑,比反复改提示词高效得多。
  4. 角色一致性靠"统一前缀"。每格提示词都用同一段角色描述打头,是目前不用 LoRA 最简单有效的手段。
  5. 别碰极端比例。模型在原生比例附近画质最好,封面要 16:9 就出 16:9,别硬要 2.35:1 的窄条。

七、从一张封面到一本漫画

封面有了,分镜有了,接下来把思路拉直:Claude Code 负责"故事",ComfyUI 负责"像素"。 写剧本、拆镜头、生成提示词、批量调度、命名归档,这些文字侧的活交给 Claude;每格的构图、色彩、细节,交给 ComfyUI 里的工作流。你站在中间,只做两件事:定方向,挑结果。

这套流水线再往前一步,就是整本漫画:Claude 写出完整脚本 → 按格批量生成 → 你挑选满意分镜 → 拼版排版。今晚可以先把你的下一张公众号封面交给它。

总结

通过claude code链接comfy-ui,确实实现了画图自由,但画图的质量还是和模型有关,和自己具体的硬件有关。其次,有时候生成一个确定的图片还是之间使用comfy-ui比较方便,不过你可以通过claude code来优化你的提示词。