
最近有人问我OpenClaw和ComfyUI这两个东西到底能不能在本地串成一个完整的工作流。答案是能而且只要搭好了体验比来回切界面舒服得多。OpenClaw这种本地智能体框架负责理解你的自然语言指令ComfyUI负责把指令变成一张张图你在中间加一层桥接服务两边就能互相听懂对方的话。这篇文章就是我实际搭这套OpenClaw x ComfyUI本地桥接部署服务的完整记录包含环境准备、组件安装、桥接设计、实测链路和踩坑复盘适合想把AI绘图和智能体真正落到本地、不想把数据都交给云端的朋友参考。1. 为什么非要把OpenClaw和ComfyUI桥接起来先交代一下这两个角色。OpenClaw本质上是跑在本地的智能体执行框架它能理解任务、调用技能、操作本地环境很多玩法都围绕给LLM接上手脚展开。ComfyUI则是基于节点的图像生成工作流引擎扩散模型在不同节点之间流转最终输出成图。两者的共同点是都适合本地部署但毛病也很明显ComfyUI那一堆节点连线对普通用户不友好OpenClaw又不会直接操作ComfyUI的画布。把它们桥接起来解决的就是ComfyUI操作繁琐和OpenClaw缺图像能力这两个问题。桥接之后你对OpenClaw说一句画一只戴帽子的猫512分辨率它就直接把ComfyUI的工作流跑完再把图片路径回传给你全程不用打开绘图界面。这不是简单的命令行调用而是把ComfyUI变成了OpenClaw的一个可编程技能语言指令、参数映射、工作流模板选择全部走本地HTTP服务。这个方案适合几类人已经在用ComfyUI、但觉得手动拖节点太慢的人想把图像生成接入自己智能体工作流、又不想用云端绘图API的人做本地知识库、自动化脚本、甚至机器人仿真需要一套可复用的语言到图像能力的人。还有一点很实际本地桥接能省下云端API的费用同时训练数据、提示词、模型权重都留在自己的机器里。对重视数据隐私的工作室和研究者来说这个价值比省几块钱大得多。2. 部署前置先把两个地基打好我默认你是在Windows上操作这也是大多数人的环境。OpenClaw官方对Windows的支持依赖WSL2所以第一步不是装OpenClaw而是先把WSL2环境搞定。这一步很多人翻车热搜里那个openclaw无法安全验证sl2环境请在powershell中运行wsl -- status的报错我实操时也遇到过。2.1 WSL2环境校验失败的完整排查链路这个报错看起来吓人其实就是WSL的版本或默认发行版不满足要求。我在PowerShell里按顺序执行这几步wsl --status wsl --update wsl --set-default-version 2wsl --status会显示默认版本如果还是Version 1那OpenClaw启动时的自检肯定过不去。wsl --update是把WSL内核更新到最新解决无法安全验证那条异常的最常见方法。更新完再执行一次wsl --status确认Default Version变成2然后再wsl --list查看发行版状态。如果之前装过发行版但版本不对用这条强制转换wsl --set-version 发行版名称 2整套做完那个安全验证报错基本就消失了。这个阶段容易被忽略的是PowerShell必须以管理员权限运行否则WSL更新和版本设置都会失败。别问我怎么知道的我第一次跑wsl --update的时候就是忘了提权看起来执行成功实际上是无效操作。2.2 Node.js和Python这两根拐杖OpenClaw是典型的Node.js项目装它之前先把Node.js环境弄好。搜索引擎热词里node.js官网下载openclaw这种描述其实不太准确更合理的路径是先去Node.js官网下载LTS版本安装包装完确认版本号node -v npm -v桥接服务我建议用Python写因为ComfyUI的API交互用Python更顺手。Python版本至少3.10以上装完后直接装依赖pip install fastapi uvicorn requests pydanticFastAPI负责起本地HTTP接口requests负责和ComfyUI通信这一套就是桥接层的地基。ComfyUI本身不依赖这个环境但如果你用的是秋叶整合包里面已经内置了一个Python运行时注意别把系统Python和整合包里的Python搞混。我见过有人把包装到整合包的Python里又用系统Python启动桥接服务结果requests找不到白白排查了半天。2.3 ComfyUI安装和国内镜像的思路ComfyUI的安装路径有两条。一条是直接Git仓库克隆另一条是秋叶整合包后者对新手更友好自带启动器和常用节点适合不想被环境问题折磨的人。秋叶整合包下载后解压双击启动脚本就能跑起来默认地址是http://127.0.0.1:8188。如果是手动部署核心就三步拉取ComfyUI仓库、安装依赖、放置模型。模型放哪很关键。常见checkpoint模型放在models/checkpointsLoRA放在models/lorasVAE放在models/vae。很多新手卡在comfyui不能下载缺失模型本质不是ComfyUI的问题而是网络不通或镜像源配置有问题。最稳妥的办法是用自己已有的模型文件直接拷进对应目录。如果一定要下载优先用镜像站下载完校验文件名注意ComfyUI加载模型时对文件名完全匹配多一个空格都可能报错。启动ComfyUI时还有一个参数建议加上否则后面桥接访问不到python main.py --listen 127.0.0.1 --port 8188--listen决定了允许谁连接。默认情况下ComfyUI可能只允许本机回路访问加了这个参数再配合防火墙放行8188端口桥接服务才能真正稳定连上。3. 本地推理和大模型接入给OpenClaw配上大脑OpenClaw本身不带模型它的智能来自背后的大语言模型这个推理后端决定了它能不能理解你的指令并规划行动。很多人问openclaw只能用接入api的方式使用算力吗答案并不是。OpenClaw既支持接入云端API也支持通过Ollama接本地模型。3.1 为什么本地桥接场景推荐Ollama Qwen2.5-3B如果你搭建这套服务的目的是本地化、隐私优先那云端API就算效果再好也不合适因为图像提示词、工作流参数这些数据都会经过第三方。我选择的组合是Ollama部署Qwen2.5-3B。Qwen2.5-3B属于小参数模型显存和内存压力小理解简单指令完全够用。ComfyUI那套东西本来就不需要模型做太复杂的推理它只需要正确抽取画什么、多大尺寸、什么负面提示词这些字段再丢给ComfyUI执行3B模型绰绰有余。Ollama安装很简单装完拉取模型ollama pull qwen2.5:3b启动Ollama服务ollama serve然后在OpenClaw的配置里把推理地址指向Ollama的本地接口。默认情况下Ollama监听在http://127.0.0.1:11434配置里模型名写qwen2.5:3b即可。这里有个取舍值得说清楚。3B模型的好处是资源占用小、响应快、离线可用缺点是复杂多步推理容易拉胯。比如让它同时规划生成三张不同风格的图再对比一下这种复合任务小模型可能只执行一半。如果机器显存充足可以考虑7B甚至14B的量化版本效果会好很多。但我建议先从小模型跑通全链路再逐步升级不然环境问题加模型问题混在一起排查起来很痛苦。3.2 云端API和本地模型的对比我在实测中对比过OpenClaw接云端API和接本地模型两种模式。云端API的理解能力确实更强指令哪怕写得含糊也能猜对意图但有两个硬伤一是每次调用都有延迟来回几次对话就慢得明显二是成本会随调用量线性上涨跑工作流时动不动就十几个请求一天下来账单很可观。本地模型虽然笨一点但请求走本地网络延迟极低跑多少都不花钱还不用把提示词发到外面。实操建议是如果你只是想要一句话出图的效果本地模型足够如果你想叠加复杂技能、多角色规划和上下文理解那至少要上7B以上的本地模型或者干脆换API。注意本地模型的选择会影响整个链路的稳定性所以先把基础链路跑通再调模型才是正确顺序。3.3 OpenClaw本体和Windows Companion的关系OpenClaw在Windows上部署时一般会伴随一个Companion组件你可以把它理解成控制面板或前端界面用来管理任务、查看日志、检查技能调用情况。我一开始没搞懂它和主程序的关系以为要单独开两个服务后来才发现Companion本质上是Optional的前端主程序在WSL里跑Companion在Windows侧提供可视化交互。配置Companion的关键是让它能连上WSL里运行的OpenClaw服务。启动后看日志里打印的端口然后在Companion设置里填上对应的WebSocket或HTTP地址。如果填完一直连不上优先检查WSL和Windows之间的网络互通尤其是Windows防火墙。这个环节和ComfyUI端口问题高度相似我的习惯是先把防火墙全部放行内网访问等链路通了再逐步收紧否则排查网络问题会花掉大量时间。4. 核心环节写一个comfyui_bridge技能把语言变成工作流桥接方案的核心是一个独立运行的本地服务它负责三件事接收OpenClaw传来的意图参数、把这些参数组装成ComfyUI能识别的API格式请求、把生成结果返回给OpenClaw。整个链路可以理解成一个翻译器OpenClaw说的是自然语言驱动的技能调用ComfyUI说的是JSON节点工作流桥接层把两者互换。4.1 ComfyUI的API格式和界面工作流不是一回事这是最大的坑。你在ComfyUI画布上看到的节点连线是UI格式的工作流JSON节点坐标、连线信息都记录在里面但通过HTTP方式提交工作时ComfyUI需要的是API格式的JSON节点输入是扁平化字符串引用比如3: {inputs: {seed: 0, steps: 20}, class_type: KSampler}。手动写这种JSON非常痛苦所以第一步是在ComfyUI界面里把工作流通过导出API格式功能保存成api_workflow.json桥接服务直接拿这个文件做模板。这一步如果省略后面所有代码都会变得不可维护。我第一版就是想省事直接手写API JSON结果节点ID稍微对不上就报错查了半天才知道ComfyUI有内置的导出能力界面里点一下就行。以最简单的文生图工作流为例模板里通常有这几个节点class_type作用桥接时需要注入的字段CheckpointLoaderSimple加载大模型ckpt_nameCLIPTextEncode正面提示词编码textEmptyLatentImage设定画布尺寸width, height, batch_sizeKSampler采样参数seed, steps, cfgVAEDecode解码潜空间为像素图无SaveImage保存图片并返回文件名filename_prefix桥接服务要做的就是在加载模板后遍历这些节点按class_type找到目标再修改对应inputs字段。4.2 桥接服务代码实战我用FastAPI写了一个最小可用的桥接服务启动在9000端口。核心逻辑是接收OpenClaw发来的生成请求读入api_workflow.json模板注入提示词和参数POST到ComfyUI的/prompt接口拿到prompt_id轮询/history/{prompt_id}等队列跑完再从响应里提取图片文件名。# bridge_service.py import json import time import uuid import requests from fastapi import FastAPI from pydantic import BaseModel COMFYUI_URL http://127.0.0.1:8188 WORKFLOW_FILE api_workflow.json app FastAPI() class GenerateRequest(BaseModel): prompt: str negative_prompt: str blurry, low quality, bad anatomy width: int 512 height: int 512 seed: int | None None ckpt_name: str v1-5-pruned-emaonly.safetensors def inject_workflow(payload: GenerateRequest) - dict: with open(WORKFLOW_FILE, r, encodingutf-8) as f: wf json.load(f) for node_id, node in wf.items(): cls node[class_type] if cls CLIPTextEncode: title node.get(_meta, {}).get(title, ) if positive in title.lower(): node[inputs][text] payload.prompt elif negative in title.lower(): node[inputs][text] payload.negative_prompt elif cls CheckpointLoaderSimple: node[inputs][ckpt_name] payload.ckpt_name elif cls EmptyLatentImage: node[inputs][width] payload.width node[inputs][height] payload.height elif cls KSampler: node[inputs][seed] payload.seed if payload.seed is not None else uuid.uuid4().int return wf app.post(/generate) def generate(req: GenerateRequest): prompt inject_workflow(req) client_id str(uuid.uuid4()) resp requests.post(f{COMFYUI_URL}/prompt, json{prompt: prompt, client_id: client_id}) data resp.json() prompt_id data.get(prompt_id) if not prompt_id: raise Exception(fsubmit failed: {data}) for _ in range(300): hist requests.get(f{COMFYUI_URL}/history/{prompt_id}).json() if prompt_id in hist: outputs hist[prompt_id].get(outputs, {}) for node_out in outputs.values(): if images in node_out: img node_out[images][0] return { prompt_id: prompt_id, image: img[filename], subfolder: img.get(subfolder, ), type: img.get(type, output), } time.sleep(1) raise Exception(timeout waiting for comfyui)有几处细节值得注意。client_id是ComfyUI用来区分会话的轮询history时如果不携带一致的client_id可能查到的是别人队列里的结果模板节点注入时我用了_meta.title里的关键字来区分正面和负面提示词节点前提是你在ComfyUI里给节点命名时带了 positivenegative 字样。如果没命名就按CLIPTextEncode出现顺序处理第一个当正面、第二个当负面但那样容易出错还是建议用命名法。启动桥接服务uvicorn bridge_service:app --host 127.0.0.1 --port 9000然后手动测试一下接口curl -X POST http://127.0.0.1:9000/generate -H Content-Type: application/json -d {\prompt\: \a cute cat with hat\, \width\: 512, \height\: 512}如果此时ComfyUI队列开始运转说明桥接服务已经打通了。这一步务必在接入OpenClaw之前做否则后面报错你都不知道是OpenClaw的问题还是桥接层的问题。4.3 把桥接服务注册为OpenClaw技能服务通了的下一步就是让OpenClaw学会调用它。OpenClaw的技能机制类似给智能体装插件每个技能包含描述文件和处理脚本。我的目录结构是这样的skills/ comfyui_bridge/ manifest.json handler.pymanifest.json里写清楚技能名称、描述和入参OpenClaw就是靠这份描述来决定什么时候调用这个技能{ name: comfyui_bridge, description: Generate image by calling local ComfyUI bridge service. Use this when user wants to draw/create/generate an image., inputs: { prompt: {type: string, description: positive prompt}, negative_prompt: {type: string, description: negative prompt, default: blurry, low quality}, width: {type: int, default: 512}, height: {type: int, default: 512} } }handler.py负责真正的调用把入参POST到桥接服务再把结果整理成OpenClaw能读懂的文本import requests def run(inputs): json_body { prompt: inputs.get(prompt), negative_prompt: inputs.get(negative_prompt, blurry, low quality), width: inputs.get(width, 512), height: inputs.get(height, 512), seed: inputs.get(seed) } resp requests.post(http://127.0.0.1:9000/generate, jsonjson_body, timeout600) resp.raise_for_status() data resp.json() return { message: f图像生成完成文件名为 {data[image]}位于 {data.get(subfolder, )}, data: data }这里有个关键点timeout一定要给足。ComfyUI跑一张图可能只要十几秒但复杂工作流、视频模型可能要几分钟。我把timeout设成600秒避免OpenClaw那边报超时而ComfyUI这边还在排队。技能注册完成后重启或刷新OpenClaw让技能生效再到对话里说帮我画一张星空下的女孩观察日志确认它选中的是comfyui_bridge技能。5. 实测一遍从一句话到一张图以及踩过的坑整套搭好之后我完整跑了一遍这条链路从用户自然语言输入到最终拿到图片文件涉及四个进程的协同Ollama提供理解能力、OpenClaw调度技能、FastAPI桥接服务翻译请求、ComfyUI执行图像生成。5.1 完整链路实测过程启动顺序也讲究。我的顺序是先启动ComfyUI确认8188端口有响应再启动Ollama服务然后启动桥接服务最后启动OpenClaw。启动OpenClaw后打开Companion面板在对话框里输入请生成一张雾中山林的图片画面要有层次感512分辨率负面提示词默认OpenClaw会把这段话交给Qwen2.5-3B解析小模型判断出这是一个图像生成需求于是匹配到comfyui_bridge技能自动抽取prompt为雾中山林 层次感width和height分别是512和512然后把请求POST到桥接服务。桥接服务加载api_workflow.json模板注入参数再调用ComfyUI的/prompt接口。ComfyUI队列开始跑几十秒后完成生成。OpenClaw的返回值里会有图片文件名直连ComfyUI的output目录就能看到成图。整个过程中OpenClaw的日志最有意思它会打印出每一步的决策理由比如用户请求涉及图像创建调用comfyui_bridge技能。这些日志是排查问题的第一抓手。5.2 我实测中遇到的三个典型坑第一个坑是Windows和WSL的图片路径互相看不懂。ComfyUI在Windows原生环境跑得比较多WSL里的OpenClaw如果想直接访问Windows的图片目录路径格式完全不一样。我一开始在OpenClaw回传路径时写的是WSL风格路径结果是Windows侧程序打不开。解决方式很简单统一用Windows格式路径或者在桥接服务里加一个路径转换函数把/mnt/c/...转成C:\\...否则每次都要手动改路径非常蠢。第二个坑是comfyui生成视频时爆内存。我有个视频生成工作流在桥接调用时直接崩溃日志显示CUDA out of memory。排查后发现两个原因一是视频模型本身就吃显存分辨率稍微高一点就爆二是ComfyUI默认会缓存多个模型在显存里桥接连环切换工作流时旧模型没释放。解决方法是降低分辨率、batch_size改成1同时给ComfyUI加--lowvram启动参数实在不行再装Sage Attention这类显存优化节点。装了Sage Attention之后视频类的长序列任务显存占用下降明显属于这个场景下的刚需优化。第三个坑是端口冲突和防火墙反复拦截。ComfyUI的8188、Ollama的11434、桥接服务的9000、OpenClaw的dashboard端口四个端口同时要通。Windows防火墙经常静默拦截来自WSL的请求表面上看服务都启动了但就是连不上。我的排查习惯是先用curl在Windows侧分别测三个本地端口再进WSL里测哪一步不通就集中处理哪一步。特别是从WSL里访问Windows的ComfyUI时不能用127.0.0.1要用Windows主机的局域网IP否则WSL的loopback和Windows的loopback不是同一个概念这也是很多为什么桥接服务在WSL里跑不通ComfyUI的根因。5.3 问题排查速查表把常见问题整理成一张表方便遇到时对照现象可能原因处理办法OpenClaw启动报WSL2环境校验失败WSL未更新或默认版本为1wsl --updatewsl --set-default-version 2桥接服务连不上ComfyUI监听地址不对或防火墙拦截ComfyUI加--listen 127.0.0.1放行8188端口提交提示词报ckpt_name not found模板里模型名和目录不一致确认models/checkpoints文件名完全匹配生成时显存爆掉分辨率过高、模型堆积降分辨率、--lowvram、装Sage Attention图片生成了但路径打不开WSL/Windows路径混用统一转换成Windows格式路径OpenClaw不调用comfyui_bridge技能技能描述不清晰或manifest格式错误检查技能描述确保包含图像生成等触发关键词这张表是我这次踩坑的浓缩版后面再搭类似桥接项目直接照这个思路排查能省很多时间。6. 进阶玩法知识库、ROS2、手机端桥接还能往哪里扩展基础链路跑通后这套架构的价值边界会明显拓宽因为它本质上是智能体技能 本地HTTP服务 第三方引擎的通用模式。ComfyUI只是其中一个被接管的引擎同样的骨架还能接知识库、接机器人仿真、接手机端远程控制。6.1 接本地知识库让OpenClaw学会选工作流热搜里搭建本地知识库 使用openclaw或者trae和codex调用指的就是把文档、提示词、工作流模板组成向量库让OpenClaw检索后自动决策。比如我有十几种ComfyUI工作流分别对应写实、插画、像素风以前是手动拖模型换模板现在我可以把每种工作流的描述和适用场景写进知识库OpenClaw根据用户需求检索到合适的模板再通过桥接服务切换api_workflow.json。这相当于给图像生成加了一个记忆层不再是单一模板硬跑。实现上不复杂。用Ollama的embedding模型给文本切片做向量化存进本地向量库OpenClaw对话时先做相似度检索把命中的工作流名称作为参数传给桥接服务。实际效果就是你说要一张像素风角色图它自动加载像素风模板再调用ComfyUI整个切换过程不需要人干预。6.2 ROS2方向从画图到机器人仿真热搜里rosclaw openclaw ros2 humble gazebo把我吸引住了这是OpenClaw在ROS2环境里的扩展配合Gazebo仿真平台使用。我目前只是初步试了一下方向很有意思OpenClaw在机器人场景里充当高层决策者通过ROS2话题感知仿真环境再调用技能完成任务。桥接服务的思路在这里完全复用只不过把ComfyUI换成了机器人动作执行器。比如仿真里检测到障碍物OpenClaw决策后发布ROS2话题Gazebo里的机器人执行避障动作。如果想要仿真环境里根据语义描述生成目标场景图桥接服务只需要把ROS2话题的文本消息翻译成ComfyUI请求这套代码几乎不用改。ROS2这套环境比单纯绘图复杂得多依赖的包也更多不建议新手一上来就玩。但如果你本身有机器人背景会发现OpenClaw加桥接层的架构和ROS2的节点通信天然契合值得单独开一个项目深入。6.3 Termux手机端把指令带到口袋最后是手机端。热搜里如何用termux安装openclaw手机版下载步骤说明问的人不少。Termux是Android上的终端模拟器理论上可以跑OpenClaw这种纯Node.js框架。我的建议是手机端适合做远程遥控器不适合本地跑ComfyUI因为手机根本没那个算力。正确姿势是手机Termux里装OpenClaw桥接服务的请求通过网络指向你电脑上运行的ComfyUIpkg update pkg install nodejs python git -y git clone https://example.com/openclaw # 换成实际仓库地址 cd openclaw npm install node openclaw.js然后配置OpenClaw的桥接技能把http://127.0.0.1:9000改成电脑的局域网IP比如http://192.168.1.100:9000。手机发出的指令经过OpenClaw解析再跨网络调用电脑上的桥接服务最终由ComfyUI出图图片再通过网络传回手机端预览。我在手机和电脑同一WiFi下测试过延迟比想象中低唯一的瓶颈是手机端网络不稳定时请求容易超时。这不是OpenClaw的问题是移动网络环境的通病。6.4 扩展时先想清楚边界做这些扩展时有几条经验值得记住。第一桥接服务保持单一职责只做协议翻译业务逻辑全部交给OpenClaw技能层否则后面每接一个引擎桥接服务就膨胀一点最后变成没法维护的大泥球。第二所有外部服务的地址和端口统一放配置文件不要散落在代码里我的第一版就是硬编码换个场景就得改代码重部署后来改成config文件才舒服。第三日志要带请求IDComfyUI、桥接服务、OpenClaw三层日志通过同一个ID串起来这样报错了才能从OpenClaw的决策日志一直追到ComfyUI的执行日志不然三套日志各看各的问题定位基本靠猜。这套OpenClaw x ComfyUI本地桥接部署服务从原理到代码我都跑通了架构不复杂真正的复杂度全部集中在环境细节和路径转换上。如果你也想搭建议严格按先单独测ComfyUI、再单独测桥接、最后接OpenClaw的顺序推进每层都验证通过再往上一层。我在实际操作中的体会是这类本地智能体加绘图引擎的组合一定会越来越多尽早把桥接层的设计模式沉淀下来后面接什么新引擎都不慌。最后再分享一个小技巧把生成好的图片路径同时写到OpenClaw能直接读取的本地目录里配合Companion面板的预览功能整个出图体验会接近专业绘图工具那种一句话直接交付图片的顺畅感试过的人基本都回不去了。