ComfyUI 装 FLUX 模型:safetensors 损坏与下拉框空白怎么修

先说结论:这套排查能用,从装好到出图 30 分钟内完成,前提是三个文件必须配对。ComfyUI 加载失败绝大多数与显卡无关,报错停在读文件那一步,说明问题在文件本身或者加载器选错。下面所有结论来自一台 32GB 内存的 Windows 机器实测,ComfyUI 版本 0.43.0,前端 1.57.4,桌面版安装。

报错原文对照:四种症状对应四个根因

先看现象。下表按我这次实际撞到的顺序排列,左边是你屏幕上看到的东西,右边是真正原因。对照上了就不用再往下猜显卡。

症状 界面表现或报错原文 根因 修复动作
CLIPLoader 节点变红 The safetensors header is too large 文件不是合法 safetensors,或被截断 按第三节脚本验头长度,重下原文件
下拉框空白或只列出几个文件 放进 models\unet 后在界面里找不到 文件落在没有扫描的目录 查 /internal/folder_paths 的真实路径
type 里没有 flux3 DualCLIPLoader 的 type 只有 12 项 单塔编码器用错加载器 换成 CLIPLoader,type 选 flux3
Checkpoint 下拉框 0 项 ckpt_name 列表为空 只装了分离权重,没有整合包 属正常状态,改走 UNET + CLIP + VAE

第四条要单独解释,因为它最容易让人以为安装失败。分离权重流行之后,checkpoint 列表为空是完全正常的,三个文件分别对应三段加载,任何一个环节选错都会拖垮整条链路。

第一步:问清 ComfyUI 在哪些目录找模型

官方文档只写了一句把文件放进 models 目录,桌面版的实际情况复杂得多。它默认挂了不止一个根目录,一条接口就能全部列出来。

curl -s http://127.0.0.1:8000/internal/folder_paths

返回的 text_encoders 这一项在我这台机器上有 7 条:Comfy-Desktop\ComfyUI-Shared\models\clip、同根下的 text_encoders、Documents\ComfyUI\models 下的 text_encoders 与 clip、D 盘的 ComfyUIDate 下两条,外加一条 output\clip。四条根目录混在一起,文件放在哪个都不会报错,只是有的会被先扫到。

这里有个细节值得单独讲。最后那条 output\clip 也在搜索范围内。我这次复现报错时,异常信息给的路径是 C:\Users\admin\Documents\ComfyUI\output\clip\qwen3vl_4b_int8_convrot.safetensors,而同名文件我当时以为放在 models 下。报错路径和你放文件的位置对不上,几乎都是同名旧副本被先命中。看到这种情况,直接去报错里那个目录删文件,别在 models 里反复翻。

查具体某个加载器当前认到哪些文件,用这条:

curl -s http://127.0.0.1:8000/object_info/CLIPLoader | python3 -m json.tool

clip_name 数组就是实际可选项。它的长度如果比你目录里的文件数少,说明有文件落在了没被扫描的位置,或者后缀不是 safetensors 被过滤掉了。

第二步:认出加载器,单塔模型不能走 DualCLIPLoader

ComfyUI 有两个 CLIP 加载器,名字只差一个双字,能装的模型完全不同。同一台机器上实测,CLIPLoader 的 type 下拉有 32 项,DualCLIPLoader 只有 12 项:sdxl、sd3、flux、hunyuan_video、hidream、hunyuan_image、hunyuan_video_15、kandinsky5、kandinsky5_image、ltxv、newbie、ace。

flux3、flux2、qwen_image、minimax、moss_image、ideogram4 这些新单塔编码器都不在里面。手上是 FLUX 3 或 Qwen-Image 的权重,却只打开了 DualCLIPLoader,就会卡在 type 找不到对应项。换成单塔 CLIPLoader,clip_name 指向同一份文件,type 手动选 flux3,链路就通了。

判断标准很直接:一个编码器文件配一个加载器。需要 clip_l 加 t5xxl 两个文件同时喂进去的旧架构,才用 DualCLIPLoader;FLUX 3 这类单文件架构,用 DualCLIPLoader 永远配不对。

第三步:验文件头,20 秒判断文件坏没坏

safetensors 的结构很固定,前 8 个字节是一个小端序的 64 位整数,写的是头部 JSON 的长度,第 9 个字节开始才是 JSON,所以第 9 个字节必然是左花括号。读取器对这个长度设了 100 MB 上限,超过就直接抛 header is too large。正常权重的头部只有几十 KB 到几 MB,远在这个上限之下,一旦触发就说明这 8 个字节根本不是长度。

这个判断不用打开 ComfyUI,命令行一行就够:

python -c "import struct;f=open(r'C:\Users\admin\Documents\ComfyUI\models\text_encoders\your_model.safetensors','rb');print(struct.unpack('<Q',f.read(8))[0], f.read(1))"

输出应该是两个值,第一个是头长度,第二个是 b'{'。第一个数超过 100000000,或者第二个不是左花括号,这个文件就不是合法 safetensors。最常见的情况有两个:下载被登录墙或限流拦下,落盘的是个 HTML 页面;或者下回来的是 ckpt、pt 改了后缀。

顺手补一句,报错原文里那句 Make sure this is actually a safetensors file and not a ckpt or pt or other filetype 就是读取器给出的提示,它已经把答案写在屏幕上了,只是没人注意后半句。

实测对照:同一套图,只换一个文件名

为了确认这条报错真的只跟 CLIP 有关,我搭了一个最小工作流:UNETLoader 加载 flux3_image_klein_int8_convrot.safetensors,CLIPLoader 的 type 固定 flux3,VAE 用 flux2-vae.safetensors,512×512,2 步,cfg 1.0,采样器 euler 配 simple 调度。只换 clip_name 这一个参数,跑两次。

对照组 clip_name 结果 耗时
A qwen3vl_4b_int8_convrot.safetensors CLIPLoader 抛 header is too large,节点 2 中断 秒级失败
B cc4d5e9614a92cd534f08583204f87632c0072dfd8e89457eaf511207feb19fe.safetensors 成功,输出 512×512 PNG 48 秒(含首次加载)

UNET、VAE、采样参数两次完全一致,差别只有一个文件名。结论很干脆:这条报错跟显存、驱动、torch 版本都没有关系,是那个文件不能用。B 组 48 秒里大头是权重首次读盘和加载,同一会话内再跑一次会明显更快,出图本身的耗时不在这个量级。

反过来推也有用。如果你换文件后仍然在同一节点报同样的错,那问题不在文件,在搜索路径命中了另一份坏副本,回到第一步查目录。

三个会反复踩的点

第一个是带 (1) 后缀的同名副本。浏览器下载中断后再点一次,会生成 xxx (1).safetensors,两份并列躺在目录里,下拉框都能选到,选错了就是上面那条报错。清理时优先删带括号的那份,它几乎总是残件。

第二个是哈希命名。现在不少权重发布时文件名就是一长串 sha256,看不出对应哪个模型。这类文件恰恰常是原版,别因为名字像缓存就删掉。我这次能跑通的 B 组就是这种哈希名,反倒是名字规整的 A 组坏了。

第三个是报错路径和放置位置不一致。ComfyUI 的搜索根有多条,前面的命中就不再往后看,所以同名文件放在两个根里,实际加载的可能是你早忘了的那份。养成习惯:每次换模型前先跑一遍 folder_paths,确认命中的到底是哪一条。

跑通之后顺手做的两件事

把三个文件的实际绝对路径记进自己的笔记。换机器、重装、迁移盘符的时候,这一行字能省掉半小时的重新排查。

本地出图链路跑通后,接法不止手动点生成。ComfyUI 已经支持 MCP,可以让助手直接调用这套工作流,接法见我此前写的 ComfyUI 正式支持 MCP。同一台机器上如果还要跑语言模型,目录与后端的配置思路相通,可对照 DeepSeek Harness 接本地 Ollama 里的路径部分。

如果手上的权重是 Qwen-Image 系列,编码器配对规则和 FLUX 3 不同,两者不能混用,组件构成见 Qwen-Image 2.1 开源 那篇。FLUX 3 Klein 的 4K 版本对显存要求更高,建议先在小分辨率验通再往上加,参见 FLUX 3 Klein 4K。

常见问题

模型该放哪个目录才对?

放 folder_paths 返回的第一条路径最稳,也就是 Comfy-Desktop\ComfyUI-Shared\models 下对应的 text_encoders、unet、vae。往已有目录里新增文件不用重启,刷新浏览器就能在下拉框看到;改了目录配置才需要重启进程。

报 header too large 是显存不够吗?

不是。这条报错发生在读文件头的阶段,模型还没进显存,显存不足会在采样阶段以 out of memory 的形式出现。区分办法就一条命令,验头长度。

Checkpoint 列表为空,是不是装坏了?

是正常的。分离权重本来就不会出现在 checkpoint 列表里,它拆成 UNET、CLIP、VAE 三个文件,各走各的加载器。整合包只是把三份打成一个,画质上没有额外收益。