接入 ComfyUI workflow
ArcReel 可以把一份 ComfyUI API 格式 workflow 接成图像或视频调用端点。workflow 决定模型、节点和固定参数;节点绑定告诉 ArcReel 应把提示词、尺寸、素材等请求数据写到哪里,以及从哪个节点取回产物。
如果你只需要配置云端模型,请先阅读供应商与模型配置。本页适用于由你维护 ComfyUI 服务和 workflow 的场景。
1. 准备工作与连通性检查
开始前请准备:
- 一台 ArcReel 服务端能通过 HTTP 访问的 ComfyUI;
- 已在 ComfyUI 中成功运行、所需模型和自定义节点均已安装的 workflow;
- 从 ComfyUI 导出的 API 格式 JSON;
- 如 ComfyUI 位于反向代理之后,准备对应的 Base URL 和 API Key。
ArcReel 与 ComfyUI 之间只有 HTTP。素材经 POST /upload/image 传到 ComfyUI 的输入区,产物经 /history 与下载接口取回,不需要两台机器共享文件系统,也不需要把 ArcReel 的媒体目录挂给 ComfyUI。ComfyUI 跑在本机还是另一台机器上,走的是同一条代码路径,配置方式没有区别——本机部署只是把 Base URL 填成本地地址。
1.1 新建 comfyui 供应商
在「设置 → 供应商」新增供应商,协议选 comfyui,填写 Base URL。ComfyUI 本身通常不鉴权,API Key 可以留空;只有反向代理需要凭据时才填。这条协议没有模型发现步骤:一份 workflow 就是一个型号,模型行由你为它挑选调用端点(见第 2 节)。
保存时的连通性检查以 API Key 作 Bearer 裸打 /system_stats,留空则不带任何凭据,读到的 ComfyUI 版本会回显在设置页。
若你的反向代理用的是自定义请求头(而不是 Authorization: Bearer)鉴权,这条探针会被代理挡下、报成不可达——它不支持端点定义 auth 节里的自定义头。这种情况下探针的结论没有参考价值,请以端点的「预览请求」和「测试连接」为准:那两条路径才会按 auth 节把 API Key 注入请求头或查询参数。
2. 导出并导入 workflow
ComfyUI 的导出菜单有两项,只有其中一项能用:
- Export:画布存档,带
nodes数组与links,记的是节点在画布上的位置和连线。它没有class_type,ComfyUI 的/prompt接口不收这种形状,因此 ArcReel 直接拒绝并提示改用另一项。 - Export (API):以节点 id 为键的节点表,正是提交给
/prompt的形状。导入这一份。
导入步骤:
- 在「设置 → 调用端点」导入 API workflow JSON。
- 给端点填写能区分用途的名称,并确认媒体类型是图像还是视频。
- 检查自动识别的节点绑定(见第 3 节)。
- 确认正向提示词与产物节点。这两项必须有落点,且不同语义不能占用同一个字段。
- 保存端点,再到「供应商」为 ComfyUI 供应商的模型行选择这份端点。
一行模型对应一份 workflow。workflow 中使用的 checkpoint、LoRA、采样器等固定值不会出现在模型行里;要修改它们,请在 ComfyUI 中修改 workflow、重新导出,再用「重新导入」更新端点。重导入会尝试按节点身份重新匹配既有绑定,标为「需确认」的项目必须人工复核。
3. 节点绑定
ComfyUI 没有统一的参数化约定,导出物里每个节点只有 inputs、class_type 和标题,哪个节点收提示词、哪个产出成片只能推断。ArcReel 把推断收在导入这一步,并且只产出候选:唯一最高分的候选标为「自动识别」,多个候选同分时不自动选、交你挑,一个候选都没有时你可以从全部节点入口里手选。这份 workflow 确实没有的能力请标为「不支持」,ArcReel 之后不再为它推断,也不会往图上写这一项。
3.1 常用绑定
| 绑定 | ArcReel 的行为 |
|---|---|
| 正向提示词 | 写入不含 Avoid: 行的提示词正文;必填 |
| 负向提示词 | 把正文中的 Avoid: 排除项追加到该节点的原有字面值 |
| 首帧、尾帧、参考图 | 上传本次提供的素材,再把 ComfyUI 返回的引用名写入读图节点 |
| 宽、高 | 根据画幅比例和分辨率档换算,并按各自步长向下对齐 |
| 帧数 | 根据秒数与帧率换算,并对齐到 步长 × n + 1 |
| 帧率 | 只读绑定;ArcReel 从 workflow 读取字面值用于换算,不会改写它 |
| 种子 | 按该条目的策略决定是否改写 |
| 产物节点 | 从该节点输出中取回最终图像或视频;必填 |
3.2 让 ArcReel 认准某个节点
推断认错节点、或同分候选太多时,有两种办法不必每次手选:
-
标题约定。 在 ComfyUI 里把节点标题改成
ARCREEL:<语义键>(如ARCREEL:prompt、ARCREEL:seed、ARCREEL:output),ArcReel 会把它当成仅次于手动绑定的最强信号,压过任何按输入名或节点类型得出的猜测。前缀大小写不敏感,冒号之后取第一个词作语义键,后面可以继续写你自己看的说明。这份标记留在 workflow 里,重新导出、重新导入后依然有效。 -
外部约定节点族。 若 workflow 已经用了下面这几家的输入节点来声明对外参数,ArcReel 直接按它们的声明认领,不必再改标题:
节点族 节点类型前缀 参数名取自 ComfyUI-Deploy ComfyUIDeployExternalinput_id输入comfy-pack CPackInput节点标题 ComfyUI-Serving-Toolkit ServingInputargument输入参数名规范化(转小写、非字母数字并成下划线)后与语义键相同才算命中,例如
Reference Images与reference_images等价。
两种办法都只是把候选的分数抬高,最终仍以你在导入界面上确认并保存的绑定为准。
4. 尺寸、时长与种子
4.1 固定尺寸
只有宽和高都已绑定时,ArcReel 才按画幅比例和分辨率档改写尺寸。只绑一侧不算:派生出的宽高只写得进绑了的那一侧,出片比例既不是 workflow 原生的也不是你选的,比两侧都不绑更糟。因此缺任一侧即整维判为「尺寸固定」,界面禁用分辨率选择器,尺寸跟随 workflow 自己的值。
两侧都绑定时,若每个绑定入口都读得出同一个正整数字面值,分辨率选择器的空值占位会显示由它推出的原生档位(如「workflow 原生(480p)」),让你看得见「不选档位会得到什么」;字面值读不出或彼此不一致时不显示。尺寸判为固定的那一支没有这个值——那一支由界面直接说明尺寸由 workflow 决定。
图像档位为 512px、1K、2K、4K,视频档位为 480p、720p、1080p、4K。它们是换算目标,不保证任意 workflow 或显存配置都能跑得动。
4.2 固定时长与空档位
视频时长档位为空有三种原因,界面会分别说明:
- 未绑定
frames:ArcReel 没有任何指针指向帧数所在的输入,时长完全由 workflow 固定,提交时不写帧数。 - 绑了
frames,但读不到帧率来源:既没有fps只读绑定,也没有在帧数条目上手填帧率,秒数换算不出来。这不是这份 workflow 天生时长固定,而是一份可修的定义——补一个fps绑定或在帧数条目上手填帧率,ArcReel 才换算得出时长档位(补齐之后仍可能落进下一支)。 - 绑了
frames、帧率也读得到,但换算不出一档能原样写回这份 workflow 的整秒时长:例如 81 帧 @ 24fps 折成 3 秒,而按 3 秒换算回去是 73 帧;帧数入口接的是链接、或写着1这类占位值读不出片长时,同样凑不出这一档。一个名为「原生」、选中却会改动原图的档位比没有档位更坏,所以这一档不给出。这一支里只有「每个帧数入口都写着自己的片长」这一种形态提交时不改写帧数;另两种没有片长可保,帧数仍按规划层借来的秒数写入。
三支之外,帧数与帧率都可用且能原样写回时,ArcReel 按 原生秒数 = round((字面帧数 − 1) ÷ 帧率) 推出该 workflow 的原生时长作为默认档位;「能原样写回」判的是它的逆向换算 frames = round(秒数 × 帧率) + 1 按步长对齐后是否还等于字面帧数。默认档位你可以在模型行里增删。
档位为空不是「模型未配置可用时长」这类通用错误。剧本规划仍会借一份篇幅参考档位以免卡住,但实际出片时长始终由 workflow 决定。
4.3 三种种子策略
策略记在每个种子条目上,一份 workflow 里可以混用:
- 未绑定种子:ArcReel 不碰 workflow 的种子字段;
random:有请求种子时用它,否则每次提交生成一个新种子。同一份 workflow 里所有random条目写同一个值——双采样器各随机一次会让同一次生成不可复现;keep:一个字节都不动,请求自带的种子也顶不掉它。
视频结果记录的是本次实际生效的种子(全是 keep 时即 workflow 的字面值)和实发 workflow 的指纹,据此可以核对某一版是照哪份图、用哪个种子出的。
4.4 素材没给满时的改图
首尾帧和参考图都是「绑定了但这次没给值」就要改图:读图节点留在图里会按 workflow 里写死的文件名去读上一张图,模型照着它出片,而你根本没选过那张图。
- 首帧、尾帧:这次没给值就删掉对应的读图节点,以及因此不再可达的下游支路。
- 参考图:按张数依次填,多出来的格子删掉。前提是 ArcReel 认得这个格子接到的入口是可选的或来自两两合并节点;认不出来时不删,而是把最后一张重复填进多余的格子——宁可构图偏一点,也不凭猜测摘掉一个必需输入、让 ComfyUI 在提交时报错。一张都没给时读图节点保持底稿字面值。
若待删支路连到产物链路,任务会以 comfyui_image_drop_unsupported 拒绝;请补齐图片,或换一份能接受该输入组合的 workflow。
5. 提示词
提示词按原文直发,ArcReel 不翻译,也不改写。因此请选用读得懂你所写语言的模型:中文提示词要配能读中文的模型才有效,否则模型只会对着一段它读不懂的文字出片。就视频而言 Wan 系列官方即推荐中文提示词;图像侧 Qwen-Image、Kolors 为中英双语。其余模型多以英文训练,用中文下达的构图与动作往往被忽略——把提示词改写成英文比反复调参更有效。
提示词正文里的 Avoid: 行不随正文发给模型。绑定了负向提示词节点时,这些排除项会追加到该节点的原有字面值之后;没有绑定就只是丢弃——正文里看不见它们,workflow 里也不会出现。workflow 有独立负向提示词节点的,请务必绑上。
6. 预览与测试连接
端点详情页提供两张测试卡,参数、凭证与素材由两卡共用——中间换掉任何一项,两卡说的就不是同一件事了:
- 预览请求只渲染将要发往
/prompt的 workflow、鉴权和换算说明,不访问 ComfyUI。预览中的凭据会被打码;素材位置显示的是占位描述而非真实上传后的引用名。 - 测试连接视频端点与图像端点都提供。它真实上传素材、提交 workflow、轮询执行并下载产物,会占用 ComfyUI 的队列和 GPU。点之前请先在预览里核对节点、尺寸、帧数、种子和本次被删的节点。
测试任务在 ComfyUI 队列中显示为 endpoint-test-…(后缀是一段随机串,以免连测几次时上传的素材互相覆盖)。取消或超时时,ArcReel 会尽力同时叫停远端:新版 ComfyUI 按任务 ID 取消;旧版则先查队列,排队中的删掉,正在执行的只在确认当前运行项就是本任务时才打断——/interrupt 不认 id,认错会停掉别人的活。网络故障可能让远端叫停失败,因此取消后仍应回 ComfyUI 队列看一眼。
7. 运行与存储
- 上传素材保存在 ComfyUI 的
input/arcreel/下,与你自己传的图分开。ArcReel 不会自动清理这些文件,它们会随使用累积;请按自己的留存要求监控磁盘,需要时直接删除该目录下的内容。 - 默认并发数为 1。一台只有一张 GPU 的 ComfyUI 提高并发通常只会让更多任务在远端排队;仅在机器容量允许时调高。
- 视频任务的轮询超时可配:「设置 → 视频轮询超时(秒)」,最低 60 秒,改动对之后开始处理的任务生效。ComfyUI 跑在你自己的显卡上又要排队,默认值对大图未必够,按实际出片耗时调。图像任务这一维没有可配项,取一个够宽的固定上限。
- 视频任务提交后会保存 ComfyUI 的
prompt_id。ArcReel 重启后可继续轮询同一任务,不会重新上传或重复提交。 - 图像任务不支持重启后续跑:
prompt_id无处持久化,生成中重启会把该任务标为丢失,避免让你的显卡把同一张图再跑一遍。 - 一次执行产出多个文件时,两条通道都按端点媒体类型的扩展名白名单取第一个匹配的产物;视频任务额外在结果上挂一条提示,图像任务只写日志。
- 产物容器白名单:视频端点收
.mp4/.mov/.m4v,图像端点收.png/.jpg/.jpeg/.webp。成片按固定的.mp4资源路径入库、字节原样保存,故只收得下 ISO BMFF 这一族;SaveWEBM之类导出的.webm会被判产物类型不符,请在保存节点上改选 mp4(SaveVideo选h264-mp4)。落盘后 ArcReel 还会按文件头核一遍真实容器:名字写着.mp4、内容却是别的容器时同样拒收,不留一份打不开的成片。
8. 常见失败
| 失败码 | 含义与处理 |
|---|---|
comfyui_upload_failed | 素材未上传成功。检查地址、凭据、网络和 ComfyUI 磁盘后重试 |
comfyui_node_errors | ComfyUI 拒收 workflow。通常是缺模型、节点不存在或参数越界;到 ComfyUI 修复后重新导入 |
comfyui_job_lost | 队列和历史都找不到 prompt_id,通常是 ComfyUI 重启;重新生成 |
comfyui_execution_error | 某个节点执行失败;按报出的节点在 ComfyUI 检查模型、节点和输入 |
comfyui_interrupted | 执行被人工或其他客户端中断;确认队列状态后重试 |
comfyui_output_missing | 绑定的产物节点没有输出文件;检查产物节点及其上游链路 |
comfyui_output_type_mismatch | 产物扩展名不在该端点的容器白名单内;改绑实际导出最终媒体的那个节点,或在保存节点上改选受支持的格式 |
comfyui_output_container_mismatch | 扩展名对得上,但文件内容不是该端点应产出的容器;在保存节点上改选受支持的格式 |
comfyui_image_drop_unsupported | 缺少素材时要删的支路影响了产物;补齐素材或改用另一份 workflow |
comfyui_upload_failed、comfyui_job_lost 与 comfyui_interrupted 是一时的环境问题,失败码卡与项目页据此给出「再试一次」;其余六项指向端点配置,要回端点详情改绑定,或在 ComfyUI 里修好 workflow 再重新导入。
如果任务显示多个产物但只保留了一个,这是当前通道的选择规则,不代表 ComfyUI 少生成了文件。先在预览中确认产物节点,再到 ComfyUI 历史记录核对完整输出。
9. 费用与执行时长
ComfyUI 跑在你自己的机器上,ArcReel 不知道这次出片值多少钱,因此默认把每次调用的费用记为 0;测试连接同样记 0。执行时长照常记录,用量页上这些调用有完整的耗时与次数,只是金额那一列是 0。
若要把自建 GPU 的成本分摊进 ArcReel 的用量统计,可以在该供应商的模型行上填一个你自己核算出的单价和币种:图像按每次调用计,视频按每秒乘以时长计。填了之后调用照常记账,金额按这个单价算出来。这个数字完全由你决定,ArcReel 不会替你估算,也不会因此改变任何生成行为。
费用记 0 不等于不花钱——它花的是电、显卡占用和排队时间。不要在其他重要任务占用同一张 GPU 时反复测试。