接一台 ComfyUI:存着的工作流变成生成模型和工具,还能在 Mosael 里管它的模型和工作流。
把一台 ComfyUI(本机或局域网里的另一台)接进 Mosael。随 Mosael 一起发,装好就在插件页里,不用去市场找。 一个连接带来两样东西:模型(保存的每张工作流都是一个图像 / 视频生成模型)和工具(智能体和工作流直接用)。
插件页 → ComfyUI → 「新建连接」,填服务器地址(本机默认 http://127.0.0.1:8188)。放在要登录的反向代理或
ComfyUI-Login 后面的,把 用户名:密码(Basic)或令牌(Bearer)填进凭据「访问凭据」,HTTP 和 WebSocket 都带上。
授予它要的权限,打开连接(如实申报九项):
network:comfyui:连这台 ComfyUI;network:huggingface、network:civitai、network:modelscope:模型库解析链接、下载模型时连这几个站;network:github、network:pypi、network:pytorch(1.15.0):让 Mosael 装本机 ComfyUI 时下 ComfyUI 源码和 pysssss(GitHub)、
装依赖(PyPI)和 CUDA 版 PyTorch(PyTorch 源);选目录那一种的「补装 pysssss」也要连 GitHub;network:comfy-registry(1.17.0):工作台的「助手」找节点包、装之前分析一个节点包时问 Comfy 官方注册表(api.comfy.org,只读);filesystem:write:ComfyUI 和 Mosael 在同一台电脑上时,把下载的模型写进它的 models 目录。从旧版本升级:升上来的连接会先停用,等你授予新增的那几项 —— 从 1.16 升上来的多一项 network:comfy-registry(1.17.0),
从 1.14 升上来的再多三项(network:github、network:pypi、
network:pytorch,1.15.0),从 1.9 升上来的再多一项 network:modelscope(1.10.0),从 1.8 及更早升上来的再多四项。连接卡片最上面写着多要了哪几项,点「授予这 N 项」马上恢复,之前授予的
不受影响;插件列表上它标着「待授权」。
它在 ComfyUI 里保存的每张工作流会作为一个模型出现在 AI 工作台、画板、工作流「AI 生成素材」节点的 模型选择器里;新存的工作流一分钟内出现(宿主每分钟问一次清单的指纹),等不及就在插件页点「刷新模型」。
多台服务器就建多个连接,各自一串模型。
连不上时(1.9.2),报错的第一行只说该做什么 ——「连不上这台 ComfyUI,确认它在运行、地址填对」;地址和原文
([Errno 61] Connection refused 这类)在下一行,Mosael 收进「详情」或悬停说明里。
从 1.12.1 起,失败原因中英两种都交给 Mosael:连接卡片上的出错原因按你此刻的界面语言显示 —— 哪怕是在另一种语言下、
或者后台(启动时、目录变了)刷新出来的。
| 工作流里的东西 | 在 Mosael 里 |
|---|---|
采样器 / 引导器上游写提示词的节点(CLIPTextEncode 及 Flux、SDXL 的变体,MiniMax H3 这类把提示词放在条件节点 prompt 上的,连进来的一段文字节点) | 主提示词、反向提示词 |
没有认得的采样器时(合作方 API 节点:MiniMax / 海螺、Kling、Veo…,WanVideoWrapper 这类自带采样器的包):接到产出上的节点里多行的 prompt / prompt_text / positive_prompt(1.6.0) | 主提示词;同一个节点上的 negative_prompt 是反向提示词 |
| 采样器的 seed、RandomNoise 的 noise_seed | 「随机种子」(不填每次随机) |
| 生成画布的节点(EmptyLatentImage、Wan / Hunyuan 的视频潜空间节点…)的宽高 | 「尺寸」(不选就用工作流自己的;工作流自己的尺寸和几档常用尺寸只是推荐,任意「宽x高」都收,每边四舍五入到 8 的倍数、至少 16,和工具的宽高同一个规矩,1.7.0) |
| 画布节点的 batch_size | 一遍出几张:按工作流原样,存着 4 就是一遍 4 张(1.12.3 起不再被「张数」改写) |
| 有种子的出图工作流(有没有画布都一样) | 「跑几遍」(参数键仍是 num_images,最多 4,没选就是 1,1.12.3):循环提交 N 次,一遍跑完再提交下一遍,每遍按工作流原样、换一个种子 —— 给了种子就从它开始依次 +1,没给就每次随机;每份产出带着它那一遍的种子(进生成记录 / 工具结果的 seeds)。一共交回「跑几遍 × 一遍几张」。取消时剩下的不再提交、在跑的那遍中断;某一遍失败,出来的照样交回,并说明「跑了 N 遍、出来几遍、第几遍为什么没出来」;Mosael 重启时接着等在跑的那一遍、再把剩下的跑完。表单上这一格叫「跑几遍」,下面写着一遍出几张、这次一共几张。没有种子的(放大)跑几遍都是同一张,没有这一格;视频图也没有 |
| 这一种的保存节点(一个都没存就是预览节点) | 跑一遍交回几张(outputs_per_run = 缺省交回的那几个节点各自收到的批量加起来,判不出批量的按 1;宿主乘上跑几遍一次摆好占位);不止一个时「参数」里有一项「结果取自」(节点标题),选了一个就只交回它的,别的保存节点不跑(1.6.0),每一项跑一遍交回几张写在 x-outputs-per-run 上。缺省「全部」;预览节点里有中间一步、控制图时缺省「最终结果」(1.12.2,见下) |
| 其余可调的字面量输入 | 参数表里的一项:认得的输入用人话起名(labels.py:采样器、步数、LoRA…),撞名才带上节点名或「第 2 个 K 采样器」;不认得的叫「节点名 · ComfyUI 给这一格的名字」;这样还撞的(几个节点标题一样)各带上节点号,如「#730」,和画布上的号对得上;常用的在前,其余(和 ComfyUI 标了 advanced 的)收进「高级」,ComfyUI 标了 hidden 的不列;原始的「节点 · 输入名」在说明里 |
| LoadImage 节点 | 参考图;视频图里接到 start_image / first_frame / start_frame / first_frame_image…的是首帧,end_image / last_frame / end_frame…的是尾帧(先过一道缩放、裁切再接进去的也算;图生视频的首帧必须给,1.6.1);一个角色几个读图节点时(或者给节点起过名),每个槽位按顺序带名字(节点标题,没起名的是「加载图像 #10」这种节点名加节点号),AI 工作台、画板、工作流节点上标着(1.13.0) |
| LoadImageMask,或只用了 LoadImage 蒙版那一路的 | 蒙版(mask) |
| LoadVideo / VHS_LoadVideo | 待编辑的视频(source_video,模式 video-edit);接在 ref_videos.* 这类参考口上的是参考视频 |
| LoadAudio / VHS_LoadAudioUpload | 驱动音频(视频图)/ 参考音频;接在参考口上的是参考音频 |
| 视频输出节点(VHS_VideoCombine、SaveVideo…;CreateVideo 只是把帧合成一段交下去,不算) | 这是一个视频模型 |
没有提示词、也没有画布的图(放大、抠图):图是必须给的,模式只有 image-to-image。文件名前缀这类
ComfyUI 那一侧的输入不列出来。
只看 ComfyUI 真会跑的那部分图(1.6.1):能跑的输出节点和它们的上游。悬空的画布节点不是「尺寸」「张数」, 下游全被旁路的读图节点不是一格输入,上游被静音断了线的预览不算进「一次交回几份」;rgthree 的 Relay / Repeater 这类前端虚拟节点不进图。
只预览预处理结果的预览节点不是产出(1.7.0):图里有解码节点(类名带 Decode:VAEDecode、VAEDecodeTiled、
WanVideoDecode…,说明这是一张会生成东西的图),而一个 PreviewImage / PreviewAudio 的上游一个解码节点都没经过 ——
它看的是 LoadImage 读进来的原图,或预处理器(OpenPose 骨架、Canny 线稿、深度图)从它算出来的东西,采样没参与。
它不算输出,不跑,它上游那条预处理的支路(和只喂给它的读图节点)也随之不在图里。只看连线,不看节点标题;整张图
都没有解码节点的(放大、抠图、合作方 API 节点)不判,预览照旧是产出。
缺省只交回最终结果(1.12.2):只接了预览节点、图里有解码节点的工作流,「结果取自」缺省「最终结果(节点标题)」, 只交回最后那一个结果节点的图(几路各有最后一个时是那几个),一遍几张按它收到的批量。不是最终结果的有两种,在选项里标着:
ControlNet Preprocessors)
算出来的骨架、深度图、线稿 —— MeshGraphormer 没认出手时那张手部深度图整张是黑的 —— 以及把一张蒙版(MASK)画成的图。
它们从不当结果,也不让成图变成「中间一步」:从成图里抠一张蒙版、算一张深度图拿去看,成图照样是结果。只看连线和节点定义(类别、插口类型),不看节点标题。中间一步、控制图、蒙版缺省不跑;要每个都交回就选「全部」,只要其中一个
就选它。目录里的 outputs_per_run 说的是缺省那一项的份数,没带「结果取自」的请求(AI 工作台只发动过的参数、智能体、
工作流节点)按同一个判据交回,摆的占位和「N×」对得上。保存节点不挑(工作流作者明说要存的,第一遍也存着的照样
交回),存下来的照旧压过预览;整张图都没有解码节点的(放大、预处理工具、合作方 API 节点)不挑。工作流工具
(「工作流 · 名字」)照旧原样交回全部输出节点。
另有一个模型:内置文生图(服务器上至少有一个 checkpoint 时)。连接上粘一份「导出 (API)」的 JSON 当模型的「API 模板」 在 1.17.0 撤掉了:转换认不出的工作流,把导出的 API 格式 JSON 导进工作流库就行 —— 导入时转成界面格式,是一张普通的保存的 工作流。升级时存着的连接配置里那一格由宿主的迁移摘掉。
每个入口一个工具(wf_<id>、表单入口 wf_<id>_<表单 id>,「工作流 · 名字」,见 tools/tooling.py;入口见下面「表单是工作流的
入口」):插件在 op: tools 里报给宿主
(宿主能力 tools,和 generation 由同一个 comfyui_generation 认领),入参、输出都从那张图推 ——
提示词、每个读素材的节点(image_10、mask_11、video_1…)、每个可调参数(steps_3…,和生成参数同一套名字)、
种子 / 尺寸 / 跑几遍(高级;入参键仍是 num_images,缺省一遍,和生成同一个意思:每遍按工作流原样、换一个种子,1.12.3);输出按输出节点(image_9、text_40…),外加给工作流连线用的 asset_id / asset_ids /
texts / summary / prompt_id(声明成 wiring_outputs:画板上只落每个输出节点自己的产出,board_outputs)。
一个输出节点的口上是它交出的全部(1.17.0):一份就是那一个素材 id,一批(batch_size 2、跑几遍)就是按顺序的一串 ——
一次出两张的工作流,那个口上、节点上、画板上都是两张;asset_id(「第一份产出」)照旧是第一张,给只收一份素材的下一步接。
工具名取 ComfyUI 写在工作流文件里的 id(改名、挪目录不变),没有的退到路径哈希;内置文生图是 wf_builtin_txt2img。表单入口的
工具名是完整工作流的名字接 _<表单 id>(1.20.0)。显示的名字和模型下拉里同一个:表单入口叫「工作流 · 表单标题」,完整工作流叫
「工作流 · 文件名」;来自哪张工作流在 group 里,宿主摆成第二行(1.20.0)。改标题只换名字,工具名不变。有表单的工作流,它的
完整工作流工具带 agent: false:不进智能体的工具表(表单就是给别人用的那张),工作流节点、画板、插件页照常有它(1.20.0)。
每个工具说清跑的是哪张(1.19.0):多报一个 workflow: {path, name}(工作流库里的路径,内置文生图是 builtin:txt2img;
名字和模型下拉里同一个 —— 一张工作流的几个入口 path 相同、name 各是各的主名)。Mosael 的工作台据此只把用得上的那几张交给
智能体(画布上开着的、这段对话里用过或点过名的),别的那几张它先列出工作流再按路径跑;入参照旧,工作流节点、画板上什么都不变。
版本在目录指纹里,升级后工具清单自己重拉一遍。
和生成模型是同一件事的图声明 mirrors:模型目录里有的每张工作流(交得出文件的,graph.media_outputs)的工具都带着
{"generation_model": <模型 id>, "kind": …} 和入参到生成表单的对照(提示词、素材角色、alpha 的蒙版 → mask、
steps_3 → 3.steps 这类参数键;宽高对不过去)。宿主据此在画板上只留生成那一个入口(图片 / 视频格的模型下拉里),
「…」里不再列「工作流 · 名字」、存着的工具格改写成生成格;工作流、智能体里这个工具照旧在(它多做的 —— 交回全部输出
节点、显示出来的文字、预览 —— 留在那边)。1.6.0 起几个保存节点的图(生成那一路有「结果取自」)、拿 alpha 当蒙版的图
(模型有蒙版槽)也声明;1.5.x 只在「一个存下来的输出节点、没有文字、没拿 alpha 当蒙版」时才声明,两个保存节点的图于是
画板上两个入口。只交出一段字的图(打标签、反推提示词)不进模型目录,只是工具,画板上照旧是格子的一项能力。
以前还有一个通用的 run_workflow(按 id 跑,入参是写死的一张表):它不知道要跑哪张图,表单却要人填参数,
1.4.0 删掉了。它能跑的每一种图在上面都有自己的工具;每个工具带着 replaces,宿主据此把存着的 run_workflow
节点和画板工具格改写过来(values 按节点 id 或节点标题写的都认;新工具里没有位置的几格丢掉,记进修订说明)。
固定的那几个:
| 工具 | 只读 | 流式 | 默认开 | 做什么 |
|---|---|---|---|---|
list_workflows | ✓ | ✓ | 每张工作流收什么(哪个节点读哪种素材)、能调什么、交出什么、features(upscale / inpaint / img2img / remove-background / …),以及跑它的工具(tool);转不过来的也列,带原因;工作流目录里的压缩包这类非 .json 文件也列出来,说为什么用不了(1.6.1) | |
import_outputs | ✓ | ✓ | 按任务号(可等 wait_seconds)或最近 last 次,把历史里的产出收进素材库。任务号声明成 format: "external_id":这是按 ComfyUI 里的编号取东西,不是内容变换,只在工作流和对话里用,不上画板 | |
server_status | ✓ | ✓ | 版本、显卡与空闲显存、内存、队列 | |
list_models | ✓ | ✓ | /models 下的模型文件;老版本没有这个接口时看加载节点的下拉 | |
interrupt | ✓ | 停下正在跑的;给了 prompt_id 只停那一个 | ||
clear_queue | 清掉排队中的(别人的也会被清) | |||
free_memory | /free:卸载模型、释放显存 |
工作流的工具一次最多跑 30 分钟(timeout_seconds: 1800),交回全部产出(artifacts → 宿主换成 assets /
asset_ids)、文字产出、按节点分的摘要;占的是显卡,标 effects: "paid" —— 智能体调它先开确认卡,批准后在后台跑,
不占智能体那一次调用的等待时间。更久的走生成(6 小时、有回执、能续等)。
插件页上这个连接的「模型库」:这台 ComfyUI 上的全部模型文件,左边一列按目录、按底模筛、能搜;有预览图的用预览图(同名的 png / jpg / webp,或 safetensors 里的封面),没有的是按目录分的占位。点开一个看完整的元数据、触发词、哪几张工作流在用。 决策见 Mosael 仓库的 ADR 0034。
底模家族怎么认(界面上写明凭的是什么;规矩在 tools/families.py,权重结构那张表在 tools/weights.py):
ss_base_model_version(kohya 训练脚本写的,最具体)。训练脚本不认识的底模(实测有 anima、
krea2)它照写,modelspec.architecture 却照默认写成 stable-diffusion-v1 —— 所以先看它;没有时看
modelspec.architecture;都没有、又是 kohya 训的(有 ss_network_*)老 LoRA 只写了 ss_v2:False 是 SD 1,True
是 SD 2。写法规整成家族名(anima → Anima、krea2 → Krea 2、qwen_image_2 → Qwen-Image 2);self_attn.q 和
ffn.0,Z-Image 和 Lumina 同一种结构、宽度不同(3840 / 2304)……LoRA 照抄底模的层名,kohya、diffusers / peft、
ComfyUI、LyCORIS 几种写法都认;GGUF 读张量表,认不出时看 general.architecture。和元数据对得上(一样,或元数据更细:
权重只看得出 SDXL,元数据说 Pony)用元数据;对不上架构时信权重(实测有 Flux 的 LoRA 写着 sd_1.5)。分不清的少说:
Wan 14B 的 2.1 和 2.2 结构一样,就说 Wan;AuraFlow(Pony V7 用的结构)的 diffusers 式 LoRA 也有
single_transformer_blocks,认得出不是 Flux;ss_sd_model_name,Civitai 在线训练写的是
底模的版本号,Illustrious、Pony、NoobAI 的官方版本认得)、标题,再是文件名里的 illustrious / IL / ILL →
Illustrious、noob → NoobAI、pony → Pony、kolors → Kolors、wan2.2 / high noise / low noise → Wan 2.2、kontext →
Flux Kontext、pony v7 → Pony V7;novaAnimeXL_ilV160 里的 XL、il 才算单独出现):illustrious / 单独的
IL → Illustrious、noob → NoobAI、pony → Pony、kontext → Flux Kontext、flux → Flux、krea2 → Krea 2、
单独的 anima → Anima(animagine 不算)、minimax_h3 → MiniMax H3、qwen_image_2 / qwen21 → Qwen-Image 2、
qwen → Qwen-Image、kolors → Kolors、wan2.2 → Wan 2.2、wan2.1 → Wan 2.1、z_image / 单独的 ZIT → Z-Image、
hunyuan_video → HunyuanVideo、ltx → LTX-Video、sdxl / 单独的 xl → SDXL、sd15 / v1-5 → SD 1.5……只在放「给某个底模用的东西」
的目录里按名字猜(checkpoints、loras、diffusion_models、controlnet、embeddings、vae……);vosr2)、检测 / 分割这类目录里的文件不是给某一个底模做的:不猜,标「不适用」(family_source
是 not_applicable),和「认不出」分开。text_encoders、clip、clip_gguf、t5)也不是给某一个底模做的 —— T5-XXL 给 Flux、SD 3、HiDream 都用,
叫 qwen3vl_4b 的配的是 Krea 2,不是 Qwen-Image —— 所以底模照旧不适用,但说它是哪一种、常配哪几种底模(1.17.0,规矩在
tools/encoders.py,每个文件多一格 encoder: {kind, label, source, pairs}):
general.architecture 和键值里的宽度、词表大小,只读开头一段
(词表本身在后面,几 MB,不读)。这些文件不在元数据里写自己是哪一种,所以先后就是「权重 > 文件名」:读不到 / 认不出文件头
时才按文件名猜(clip_l、t5xxl、umt5_xxl、qwen_3_4b、qwen3vl_8b……,界面写「按文件名猜的,不一定准」);认不出就是
认不出;load_text_encoder_state_dicts,CLIPLoader / DualCLIPLoader /
TripleCLIPLoader / QuadrupleCLIPLoader 的 type),只列 Mosael 认作家族的底模,家族名和上面同一套:T5-XXL → Flux、SD 3、HiDream、
LTX-Video、Flux Kontext、Chroma;CLIP-L → SDXL、SD 1.5、Flux、SD 3、HiDream、HunyuanVideo……;CLIP-G → SDXL、SD 3、HiDream;
UMT5-XXL → Wan;Qwen2.5-VL 7B → Qwen-Image、HunyuanVideo;Qwen3-VL 4B → Krea 2、Flux.2;Qwen3-VL 8B → Qwen-Image 2、Flux.2;
Qwen3 4B → Z-Image、Flux.2;Qwen3 0.6B → Anima;Qwen3-VL 32B → MiniMax H3;Pile-T5-XL → AuraFlow、Pony V7……
按底模筛时常配它的编码器一起列出、标「常配」(不算那个底模的)。
VAE 不这样做:它的结构只说得出潜空间的形状,说不出是哪一个潜空间(SD 3 和 Flux 的 VAE 结构一样、潜空间不通),照旧按元数据和
文件名认底模。读文件头:走 ComfyUI-Custom-Scripts 的 /pysssss/view/,按 Range 只读开头(safetensors 的头一般几十到几百 KB,
超过 8 MB 不读),一个文件几十毫秒、几个并发。没装它(404)或那台不认 Range(回 200 要整个发)时,第一个文件试过就不再试、
立刻挂断,退回 ComfyUI 的 /view_metadata 只拿元数据 —— 那样就认不了权重结构,装上之后下次打开会补认。
同一个文件只列一次:ComfyUI-GGUF 把 unet_gguf / clip_gguf 登记在和 diffusion_models / text_encoders 同一批文件夹
上,Impact Pack 的 ultralytics 包着 ultralytics_bbox / ultralytics_segm —— 按磁盘上的位置认,留在先登记的目录
(ComfyUI 自己的先登记);只有别名目录列着的(.gguf)照旧在那儿。
触发词:作者写在文件头里的(modelspec.trigger_phrase / ss_trigger_words);没有时取训练标签(ss_tag_frequency)
里出现最多的几个,并标明「不一定是作者指定的触发词」。在用的工作流:保存的工作流里,节点输入写着这个文件名的。
工作流缺的模型:工作流声明了下载地址(节点 properties.models,或新格式的顶层 models)、节点当前真在用、这台服务器
上又没有的;只认 https://huggingface.co/、https://civitai.com/(ComfyUI 官方前端的白名单)和 ModelScope 的
https://modelscope.cn/、https://modelscope.ai/ 的地址(1.10.0)。
Civitai 的另外几个域名(civitai.red、civitai.green)是同一个站:贴进来的链接、工作流里写的地址都先换成 civitai.com
再解析和下载,令牌也只交给 civitai.com(1.9.1);ModelScope 带 www. 的同样先去掉。
逐个读到的原料(认底模、触发词、标题要用的那几项元数据,权重认成的家族,文本编码器认成的种类,GGUF 的架构名)按「服务器 + 目录 + 名字 + 大小 + 改动时间」记在插件的持久目录里:第一次几百个文件要十来秒,之后只读目录。家族、常配每次列出时现推,认的规矩改了马上生效;权重那张表、文本编码器那几张表一改,记着的整份作废、重读。
下载:贴一个链接 —— HuggingFace 的文件(/blob/ 或 /resolve/)、Civitai 的模型页(带不带 modelVersionId)或
下载链接、ModelScope(魔搭)的模型页或文件、别的直链 —— 先解析出文件名、大小、建议放进哪个目录(Civitai 按模型类型定;
ModelScope AIGC 专区的模型按登记的类型定;HuggingFace / ModelScope 文件路径里正好有这台服务器上的某个目录名时建议它;
别的自己选),确认后下到那台 ComfyUI 上。
ModelScope(1.10.0):认模型页 /models/{仓库}(及「模型文件」这些页签)、目录页 /tree/{版本}/{目录}、文件页
/file/view/{版本}/{路径}、直链 /resolve/{版本}/{路径},以及官方 SDK 的下载地址 /api/v1/models/{仓库}/repo?FilePath=。
贴的是模型页或目录页时,里面只有一个模型文件(.safetensors、.ckpt、.gguf、.pt、.pth、.bin)就是它;有好几个
就列出候选、请你贴具体那个文件的地址。AIGC 专区的模型:类型 Checkpoint / LoRA / VAE → checkpoints / loras / vae,登记的
底模类型(VisionFoundation)和底模仓库(BaseModel)按上面同一张家族表认,作者写的触发词、中文名一并带上;普通仓库
不猜家族。国际站 modelscope.ai 是另一个站(接口一样,模型和账号各是各的),各问各的,不互相改写。下载走 /resolve/
直链(大文件它会跳到签好名的 CDN 地址,那一跳不带令牌)。
下载按优先级走:
名字.mosael-part、
下完挂上正式的名字;按字节报进度、能取消(只删自己的半截文件);开始前查剩余空间,不够就不下。装了 ComfyUI-Manager
也先走这条(1.13.2):Manager 那条路看不到进度、停不下,令牌还得拼进它的下载地址;user/__manager/config.ini 里
network_mode = personal_cloud 时才放行 —— 用 --listen 0.0.0.0 开着的局域网 ComfyUI 默认不让,插件把日志里的原因说成
人话,并记下来,下次在模型库里提前提醒;pip install -r manager_requirements.txt、
启动加 --enable-manager;改 network_mode;或手动把直链下到 models/<目录>/)。不覆盖任何已有文件:同名的先要求换名(给一个 名字 (1).扩展名 的建议),写盘时再查一遍(硬链接挂正式名字,目标已在就失败)。
不删、不改名、不移动模型文件;不装自定义节点、不改 Manager 的配置。
生成表单里选模型文件(1.9.0):工作流里选大模型、LoRA、VAE、文本编码器……的那一格,模型参数上写明是哪个模型目录的
文件(x-model-folder,按输入名认,同名输入按节点分:CLIPLoader 的 clip_name 是 text_encoders,CLIPVisionLoader 的
是 clip_vision)。AI 工作台、画板、工作流节点据此从这个连接的模型库取:下拉里每一项有缩略图(没有就是按目录分的
占位)、底模和前几个触发词,也能按它们搜;选中带触发词的 LoRA,下面一行列出触发词,点「加进提示词」接在提示词末尾
(已经有的不重复加)。
经 ComfyUI-Manager 下载时,下载框里先说清楚:要带 Civitai 令牌时它会拼进下载地址、留在那台机器的 Manager 任务 记录里;HuggingFace、ModelScope 的令牌带不过去(Manager 不收请求头,这两个站的令牌又没有放进地址的用法), 要令牌才能下的文件会失败;看不到按字节的进度;开始之后取消,那台机器上的下载还会继续。Manager V4 装模型不挑站点 (只看它的安全策略),ModelScope 的直链它照样下。解析 Civitai、ModelScope 链接时先不带令牌问(公开的模型不用登录),对方说要登录才再带上 (ModelScope 对看不到的私有模型回 404,所以 404 时也带上再问一次)。
凭据:要同意条款或私有的 HuggingFace 仓库,在连接上填「HuggingFace 令牌」;要登录的 Civitai 模型填「Civitai 令牌」;
私有或要授权的 ModelScope 模型填「ModelScope 令牌」(在 modelscope.cn/my/myaccesstoken 拿;按 Authorization: Bearer
和会话 cookie m_session_id 两样发,和官方 SDK 一样;国际站的账号和令牌另算)。令牌只发给它自己那个站(ModelScope 的
发给 modelscope.cn / modelscope.ai;跳转到别处的存储时不带),不进结果和报错;经 Manager 下 Civitai 时只能拼进下载地址,
会留在那台机器的 Manager 任务记录里。
决策见 Mosael 仓库 ADR 0038 §9。插件这一头交原料,宿主合成判断、取图、缓存、写回前确认。
nsfw_signals,tools/nsfw.py):元数据推断 —— 训练标签(ss_tag_frequency)里成人标签占到训练图的
一成才算(偶然一两张不算),文件名、标题里的词(驼峰拆开)也算;Civitai —— 按哈希对上、或经 Mosael 从 Civitai 下的
版本,模型标着 nsfw。宿主再加上手动标记和本机识别(都在 Mosael 那边),任一种说是就算是,手动的压过全部。source,tools/provenance.py):经 Mosael 下载时记下的来源页(HuggingFace / ModelScope 的文件页、Civitai 的
版本页),否则文件元数据里写着的、在 Civitai 上按哈希对上的。按「服务器 + 目录 + 名字 + 大小」记在持久目录里;文件换了
(大小变了)就不算数。不按文件名猜一个链接。{"op": "lookup"},tools/lookup.py):装了 ComfyUI-Custom-Scripts 时让那台机器算 SHA256
(GET /pysssss/metadata/<目录>%2F<名字>,第一次要把整个文件读一遍,它把结果记在模型旁边的 .sha256 里),问 Civitai
/api/v1/model-versions/by-hash/{SHA256} —— 对上的精确到版本;没装时在 Civitai 上按文件名搜,只认「Civitai 记的原始
文件名一字不差、大小差不过 1 KB」恰好一个版本(标 filename,存回之前要用户确认),几个都像不认。查不到也记一笔,
一阵子内不再让那台机器算一遍。对上的交来源页、模型的 NSFW 标记、Civitai 登记的底模(把只认到 SDXL / Wan / Flux 这一层的
家族细分成 Illustrious、Wan 2.2……,凭的写 civitai)和几张示例(remote_previews:512 宽的图;示例只有视频的交
transcode=true,width=512 的转码视频)。Civitai 的公开接口不要 API Key,请求带浏览器式的 User-Agent(默认的会被 403)。{"op": "save_preview", "folder", "name", "path"},tools/previews.py):宿主把要存的那张(缩成
512 宽的 PNG,或那段 512 宽的 mp4)放在 path,插件经 /upload/image 传进 temp,再 POST /pysssss/save/<目录>%2F<名字>
{"filename", "type": "temp"} —— pysssss 把它拷到模型旁边,名字是模型的名字换上传那一份的扩展名(x.png / x.mp4)。
这条路会覆盖同名的文件,所以宿主只在那台服务器上没有预览图时才调;那台 ComfyUI 没装 ComfyUI-Custom-Scripts 时
preview_tools.save 是 false、save_note 说缺什么,界面置灰。看装没装:GET /extensions 里有没有它的
betterCombos.js(写回、按名字读)和 modelInfo.js(算哈希)。sidecars):和模型同名的 .mp4 / .webm 预览视频,以及文件名带 [ ] 时的那几种图(ComfyUI 的
预览接口按通配符找,带方括号的名字找不到)—— 列成相对 sidecar_base(/pysssss/view/)的一段,宿主在预览接口说没有
之后按名字直接读。没装 pysssss 时不列。插件页上这个连接的「工作流库」:这台 ComfyUI 上存着的全部工作流(ADR 0035),和模型库同一套界面 —— 左边按子目录, 上面搜索、按种类筛、排序、三档显示方式。每张一张卡:节点图的缩略预览(照工作流里节点的位置和连线画,不截 ComfyUI 的图; API 格式的图没有位置,按依赖自动排)、识别出的输入 / 参数 / 输出、用到的模型(在不在)、缺的节点(和它出自哪个节点包, Manager 的映射查得到就列)、声明了下载地址又缺的模型。
缺节点的判据:节点类型不在这台 ComfyUI 的 object_info 里,且不是只在前端的节点(Note、Reroute、PrimitiveNode、 KJNodes 的 Set / Get、rgthree 的 Fast Groups Bypasser / Label / Bookmark 这类,后端永远没有),子图实例也不算。
在 Mosael 里能直接改那台机器上的工作流文件,都经 ComfyUI 自己的 userdata 接口、不覆盖:
.mosael-trash/workflows/<删除时刻 UTC>/<原路径>,
在 workflows/ 外面,ComfyUI 的侧栏和插件的模型清单都不列它;Mosael 的「回收站」能恢复,原处被占了就要求换名。真要
删掉,在那台机器上删这个目录;文件夹(1.13.0):左边那一列是 workflows/ 里的子目录树 —— 和 ComfyUI 自己的工作流侧栏同一份,不另记。列出时插件多报一份
folders(相对 workflows/ 的全部子目录,GET /api/v2/userdata?path=workflows 列得出空的;老版本 ComfyUI 没有这个接口,
就只有装着文件的那几个)。三个 op 改它们,都不覆盖、改之前现查那台机器:
make_folder:ComfyUI 没有建目录的接口 —— 往里面写一个隐藏的占位文件 .mosael-folder(写文件时 ComfyUI 建出父目录;
ComfyUI 的侧栏和插件都不列隐藏文件)。已经有了(不分大小写比,那台机器可能是 Windows)回撞名和建议名;rename_folder:整个目录一次 move(ComfyUI 那边是 shutil.move,目录也挪得动),里面的工作流跟着换路径;目标已经有了
回撞名,不合并进去;不能挪进自己里面;只改大小写时先挪到一个临时名字再挪过去(不分大小写的磁盘上目标「已经存在」);trash_folder:只删空的(里面没有一个看得见的文件,空的子文件夹不算),挪进回收目录 —— ComfyUI 删不了目录,插件也
不硬删;里面还有文件回 {"not_empty": true, "count": 几个},什么都不动。要删的文件夹里有工作流,先挪走或一张张删
(各自确认、各自能恢复):一下子带走整个文件夹太容易误伤,里面不是工作流的文件(压缩包)进了回收目录,回收站也列不出来。挪一张工作流到别的文件夹就是 rename_workflow(目标文件夹没有会被建出来);那张已经不在了(ComfyUI 回 404)说清楚,不报一句
HTTP 404。
「在编辑器里打开」(1.11.1):列出时插件顺带报这台 ComfyUI 的网页地址。Mosael 桌面版在这个连接自己的内嵌浏览器里打开 它的界面,页面就绪后经 ComfyUI 前端自己的工作流列表打开那一张(ComfyUI 的地址只认模板、分享和图 id,打不开一张存着的 工作流);网页版开一个新标签页,说清楚在左边「工作流」里点开哪一张。在 ComfyUI 里存好、回到 Mosael,工作流库和这个连接 的模型、工具清单跟着重拉。ComfyUI 放在要登录的反向代理后面时,第一次要在那个内嵌浏览器里登一次。
工作流库里的「导入」:拖进来、选文件、贴 JSON 或链接都行。
workflows/ 不覆盖(撞名给建议名),换一个新的
图 id(和原来那张的工具名不撞)。network_mode = personal_cloud;重启要 security_level 不比 normal 严 —— 被拒时会说怎么改、或者怎么手动装。此前有表单的工作流,表单整个替掉了它:模型下拉、工具、画板里只有表单那几项、只叫表单的名字 —— 认不出是哪张工作流,也拿不到 全部参数。现在一张工作流有一个完整工作流入口(全部能填的项,永远在)和它上面每张表单各一个表单入口:
| 完整工作流 | 表单 | |
|---|---|---|
| 模型 id | 路径(krea2-text-2-image.json,和以前一样) | <路径>#<表单 id>(krea2-text-2-image.json#app) |
| 工具名 | wf_<id>(和以前一样) | wf_<id>_<表单 id>(wf_0ef16828a002_app) |
| 主名 | 文件名去掉 .json | 表单标题(没起叫「表单」;1.21.0 起叫「未命名表单」) |
group | {"id": 路径, "label": 文件名, "entry": "full"} | {…, "entry": "form"} |
group 里(宿主摆成第二行「来自 krea2-text-2-image · 连接名」,
有表单时完整工作流写「完整工作流 · 连接名」)。app(取它在 extra.mosael 里的键名);以后一张工作流能有几张表单时,改写文件时
这一张就写成 {"id": "app"},存着的引用不用再改。moved):1.20 之前,有表单的工作流,它的路径和工具名指的是那张表单;从这一版起它们指完整工作流。op: models、
op: tools 的回答里带着 moved: [{"key": "form-entries", "from": 旧名字, "to": 表单入口的名字}],宿主每个连接只做一次,把存着的
老引用(画板格子、工作流节点、AI Studio 会话、默认模型、生成记录……)改到表单入口 —— 升级后跑的、看到的和以前一样。list_workflows 一张工作流一项,说的是完整工作流;它上面的表单列在 forms 里(表单 id、标题、模型 id、工具)。工作流库的
「识别出的输入 / 参数」也说完整工作流,表单在「表单」那一节里说。同一张图常想要几种用法(「快速出图」只露提示词,「精调」再露尺寸和步数)。现在一张工作流可以有几张表单,每张各是它的一个入口:
模型 <路径>#<表单 id>、工具 wf_<id>_<表单 id>,在模型下拉、工作流节点、画板里挨在完整工作流后面,按作者排的顺序(group.order:
完整工作流 0,表单从 1 起)。
extra.mosael = {"version": 2, "forms": [{"id", "title", "description", "graph_items"}, …]}(顺序就是
列出来的顺序,最多 20 张);节点上 properties.mosael = {"forms": {<表单 id>: {<输入名>: {label, order, main?, choices?}}}, "result"?: true}。
「以后只要这张」(result)按工作流记,不属于哪一张表单。节点上指着不在的表单、forms 里 id 重复或不合规的不进任何表单,
下次保存时清掉。app(1.20 起存下的 #app / _app 不用再改);新建的由插件起 6 位随机小写字母和数字 ——
不按标题(会改)、不按序号(删一张再加一张,存着的引用会悄悄指到另一张)。annotate、工作台的 app_marks 收全部表单(forms: [{id?, title, description, items}],没给 id 的是新表单)和结果标记,
整个重写 mosael 那几处;工作台写完重新读一遍画布,拿到插件起的 id。unsupported
(upgradable: true),它的表单入口在升级之前都不在;指着 #app 的格子、会话跑的时候说「表单是旧格式,到工作流库里升级」,不说
「模型不存在」(宿主问 explain,见下一节)。目录还报这台上有几张要升级(library_upgrades),宿主据此发一次通知、工作流库顶上
挂一条横幅。upgrade_marks:{"op": "upgrade_marks", "paths": [{path, modified}]} 逐张读、改写成第 2 版、带着读到时的改动时间覆盖写回 ——
和 annotate 同一套:只动 mosael 那几处、键留在原来的位置、照原来的排版写回(别的字节一个不变);那台机器上在这之间改过的那张
跳过(stale),已经不是第 1 版的不动(skipped)。改写之后 id 为 app 的那张照旧报 form-entries 的一次性改名 —— 从 1.20 之前
直接升上来的人,宿主在这个连接上没做过就做一次。app 的回答里每张表单带着它的模型 id 和工具名(model、tool;工作台带着 path 来问画布上那张也说得出):宿主据此数
「Mosael 里有几处在用它」,删表单之前说给作者听。annotate、工作台的 app_marks 遇到图上 extra.mosael 是第 1 版、更新版插件写的、
认不出版本的,一个字都不改,说清楚去「查看并升级」或升级 Mosael。此前它们被读成「没有表单」,工作台「表单」页签照常给写、
「只要这个节点的图」照常标,桥照空的那份改画布,一存盘作者的表单就永久没了。extra.mosael 根本不是对象(手改坏的)照常覆盖。/view_metadata 对 0 字节、没下完、截断的 safetensors 回 5xx,此前插件把它原样抛出,整个
模型库(连同生成表单里带缩略图的模型选择器)都打不开。现在这个文件列出来带 broken: true(界面写「文件读不了」),别的照常;
记成读过了,文件没变就不再让那台机器为它报错,下完、换了一份(大小、改动时间变了)会重新读。会话、画板格子、工作流节点存着的模型 id 后来可能不在目录里了。宿主照常显示记着的那个、说原因、不让跑(不拿默认模型顶上),原因问插件:
{"op": "explain", "ids": [...]} → {"models": [{"id", "label", "group", "reason", "upgrade"}]}。只读,一次最多 50 个;
不是这台 ComfyUI 的 id、还在的入口不回。分开说:
upgrade: true;label 是这个入口的主名 —— 表单这时多半读不到标题,写「X 的表单」(不读上一版的表单内容);group 和目录里同一个形状。
目录不再带 unavailable(1.21.0 那一格),说原因的只有这一处。
workflows / list_workflows 报的 kind
此前被 kind_of 兜成 image,现在是 text(graph.shown_kind:输出节点全是文字的)。跑、接素材仍看 kind_of。CLIPLoader 这类下拉不用等别的变化就跟着刷新。labels.numbered,能填的项和参数表同一套)。英文的第几个写成 2nd KSampler,不再是 KSampler #2。list_workflows 不给完整工作流的 tool:它不进智能体的工具表(agent: false),此前照给,智能体拿着一个调不到的
名字;跑它用 forms[].tool,要全部参数走生成、带完整工作流的模型 id。生成失败时,插件除了那句失败原因,再交一份失败的样子(failure,见 docs/PLUGIN_MANIFEST「失败的样子」),宿主据此在 AI Studio 的
失败卡、画板格子上说人话、给对的动作:
remote):ComfyUI 报了执行错误、任务被中断、那边已经没有这个任务、跑完了却没有产出文件 —— failed,
再取一次只会拿到同一个错误,宿主不摆「重新取回」;任务交出去之后连不上 ComfyUI、取产出文件时断了 —— pending,ComfyUI 可能照样
跑完,宿主摆「重新取回」(带着回执接着等,不重新提交)。此前不分,ComfyUI 已经报了「KSampler 出错」,失败卡上照样摆「重新取回」。summary):节点执行出错说成「ComfyUI 执行到「KSampler」这一步出错」(节点在图里的名字,没起就是类名),ComfyUI 的
原话(detail,「KSampler: …」)收进失败卡的「详情」。缺模型文件、checkpoint 里没有 CLIP / VAE 这几种原来就说人话的,一句话和
该怎么办拆成 summary 和 hint。hint,known_failures.py):原话里带着一段已知的话,就给一句该去哪修。现在认得 hostbuf_file_reader_read failed
—— 那台 ComfyUI 的 comfy-kitchen 或 comfyui-workflow-templates 太旧(要 ≥ 0.2.37 / ≥ 0.11.77)。加一种就在 KNOWN 里加一行。error)不变:任务中心、日志、智能体读的还是它。Connection: close;
有的转发碰上这种请求大约一半会把连接提前断掉(「连不上这台 ComfyUI」,Remote end closed connection without response),
大的 /object_info 有时读到一半就断(IncompleteRead),同一个地址在浏览器里却一切正常。现在改用 http.client、保持连接
(一次调用里每个线程一条,用完关掉),不带那个头。hint 不再是一整句话,而是 cause(一句原因)加 steps(修的步骤,
一步一句;要敲的命令单独放在那一步的 command 里)。宿主在失败卡上把原因、步骤分开摆,命令用等宽字摆成一块、带复制 —— 此前
pip install -U comfy-kitchen comfyui-workflow-templates 埋在一大段话的中间。升级命令现在带上版本下限
("comfy-kitchen>=0.2.37" "comfyui-workflow-templates>=0.11.77")。缺模型文件、checkpoint 里没有 CLIP / VAE 也照这个形状说。known_failures.py 加一种认得出的错误:Known(pattern, cause, steps),步骤用 Step(text, command)。app_form.Marks.forms_await_upgrade):op: models / op: tools 都不报它的
完整入口,直接点名跑也说先升级。老引用(画板格子、会话、工作流节点、定时任务记着的 <路径> / wf_<id>)那时指的是表单,报出来就是
按完整工作流跑;不报,它们落进宿主「记着的用不了 · 需要升级」那条路。只有结果标记的上一版文件照常报。升级之后照旧报两个入口和那条改名。op: explain 多一半 tools:{"op": "explain", "tools": ["wf_…"]} → {"tools": [{name, label, group, reason, upgrade}]},工作流里用不了的
插件节点为什么用不了(表单是旧格式要升级、表单删了、工作流不在了、跑不起来);ids 那一半也认得空档里的完整入口 id。moved:rename_workflow / rename_folder 改成了,报这张图(文件夹里每一张)每个入口的模型 id 改成了什么、工具名变了的那几个
(按图的 id 起的不变;退到路径哈希的才变;上一版格式还没升级的那张表单也算)。宿主在同一个请求里把存着的引用改过去,不记一次性改名的账。generation_noun({"zh": "工作流", "en": "workflows"}):插件页上它那一行、清单弹窗、搜索框、刷新按钮
叫「工作流」,不叫「模型」—— 交出来的是工作流和表单。pluginErr_outputTooLarge,插件页那一行是「插件输出超过大小限制 (1MB)」),
工具清单留在上一份。重复的表现在只在回答顶层 shared_tables 里搬一次,每一格指过去(x-shared-table);宿主收的时候
展平回每一格,所以存下来的那份 input_schema —— 工作流节点、画板、插件页「试一下」读的就是它 —— 和以前一个字节都不差,
下拉照样是整张。只有宿主在请求里说了它收得下(accepts)时才这么交(见 docs/PLUGIN_MANIFEST):旧版宿主收到的还是
逐格写全的那一份,照旧响亮地报错,而不是悄悄少几张下拉。模型清单走同一条路(维护者那台 89 万 → 37 万)。outputs[].links: null 的输出口新连线时,会在计划阶段报 AttributeError: 'NoneType' object has no attribute 'append';
根图和子图现在走同一个规整入口,原画布仍只在整批获批之后才改。set_position 可把根图或子图的多个节点作为一批移动,所以助手现在能按连接关系整理布局,
整批仍只占一步撤销。add_group、set_group、remove_group 新建、重命名、移动、缩放和删除
根图或子图中的分组;分组与节点移动共用同一批确认和一次撤销,删除分组不会删除框内节点。对应 RunningHub 的「AI 应用」(ADR 0038 第一刀):作者从一张工作流全部能填的项里挑出要给别人填的几项、起名、排序、 收窄可选值,标哪个输出节点是结果,存成这张工作流的一张精简表单。AI Studio、画板、工作流节点选这张工作流、智能体调用它时都用这张表; 没有精简表单的工作流照旧全自动列出全部能填的项。
labels.node_name,1.13.0):用户在 ComfyUI 里起的标题;没起就是 ComfyUI 给这类节点的名字 —— /i18n 里按语言的
翻译(自定义节点包带的 locales)、常见核心节点的中文名(CORE_NODE_ZH,ComfyUI 的接口不带核心节点的中文)、object_info 的
display_name;都没有才是类名。读 object_info 时顺手取一次 /i18n 并进去(labels.with_i18n),所以能填的项、撞名的提示、
读素材的槽位、「结果取自」里的节点、工具的输出名说的是同一个名字。能填的项另带 node_label(编辑器按节点分组)和 hint
(ComfyUI 给这一格的 tooltip,按语言)。title 和 node_label 按 {"zh", "en"} 一对交回 —— 插件把名字按语言交上去、
自己不挑一种,由宿主按读的人的语言挑好一句(和 hint、schema 里那两个给人看的字段走同一条路)。不走的那条路是
把这一对一路透到前端、由界面自己挑、好让搜索比得了每一种语言:那样试过,维护者撤掉了(「为了 ComfyUI 和 Mosael 的
语言不匹配问题特地兼容做一套方案是不合理的」)。于是搜索比的是挑好的那一句:中文界面显示「加载图像」时,画布上另起的
Load Image (as Mask) 搜不到 —— 除非别的字段里带着它(用户给节点起了标题时 node_title 就是那串)。节点号、类名只给
悬停的排错细节。graph.items):此前生成目录、工具入参各推各的那几步收成一份。每项的锚点是 <节点 id>.<输入名>(图级的种子、
尺寸、跑几遍没有节点),参数键和此前一样,画板、工作流节点里存着的值不用迁。子图里面的节点也能放进表单:写法是执行时
那一套(105:9.步数 —— 根图 105 号那个子图里面的 9 号),值写进的是子图内部那个节点自己的输入(不改外面那个子图节点
上的格子);标记写在那份子图定义里那个节点自己的 properties 上,所以一份子图在这张图里用了不止一处时,里面的节点只有
第一处那条路径说得清(20:9 与 105:9 说的是同一条),那时插件把它标成不能填、说清为什么、该怎么办。form,
见插件清单文档);主提示词可以不写时带着工作流里存的那句(prompt_default)。AI Studio 的「引擎参数」就照这张表摆:表上的项、
表上的顺序、表上的名字;主提示词那一项说明它就是下面的输入框,摆出不写时用的那句,点一下能填进输入框改。source_node)。properties.mosael(expose:名字、顺序、主提示词、收窄的可选值;result)、
图上 extra.mosael(version、应用名、说明、种子 / 尺寸 / 跑几遍)。ComfyUI 前端照原样存回这些扩展数据,所以复制、改节点号、
导出、拷到另一台 ComfyUI 时表单跟着走,节点删了标记一起没;连同一台 ComfyUI 的每个人看到的是同一张表。annotate):只改 mosael 那几处标记,别的扩展写的键、节点、连线
一个字都不动;每次都先确认,写明哪台服务器上的哪个文件;带着读到时的改动时间去,那张在这之间被改过(在 ComfyUI 里存过)就
不写,说「它刚在 ComfyUI 里改过,重新打开再改」。它要是正开在 ComfyUI 里、又有没存的改动,在那边存的时候会盖掉这次改的。extra.mosael.version 只认 1。别的版本按「没有应用表单」处理并提示;形状以后要变时,插件随新版本带一个改写那台
机器上工作流文件的操作、确认一次改写 —— 读的一侧不认旧版。没有 extra.mosael 的图,节点上的标记不算(从别的工作流拷过来的
节点带着的)。ADR 0038 的第二刀:Mosael 桌面版在这个连接自己的内嵌浏览器里全屏打开 ComfyUI 自己的画布(每个自定义节点照常能用),Mosael 的 面板停在右边 —— 模型库、缺失项、应用、运行与结果。和画布通话的是 Mosael 主进程注入的一段写死的脚本(只拉不推),插件这一侧 只多了几个不碰那台机器上文件的 op:
node_folders:画布上选中的节点那几格(节点类型 + 输入名)各选的是哪个模型目录的文件 —— 和生成表单的 x-model-folder
同一张对照(labels.model_folder),只查表。每一格带着这个节点上下拉格子现在的值;选文本编码器的那一格再回 encoders
(1.17.0):CLIP 加载节点现在的 type 配哪几种编码器(fits)、哪几种 ComfyUI 认出来就不看 type(any_type,比如 Anima 的官方
模板是 stable_diffusion 配 Qwen3 0.6B)—— 面板把合用的排前面、不在配方里的标出来。search_sources:缺的模型工作流里没写下载地址时,按文件名(完整的名字 → 去掉扩展名 → 再去掉精度后缀)去 Civitai、HuggingFace、
ModelScope 搜,交回候选(哪家、仓库、确切的文件名、大小、底模、能交给下载的链接);文件名一致的在前、标 exact,相近的从不标。
一家没搜成放进 failed,别的照常;结果在插件数据目录里记 10 分钟。不碰那台 ComfyUI。app 带 content:读的是画布上现在这张(含没存的改动),回答和读文件一样,没有路径和改动时间。app_marks:应用表单 / 结果标记写进画布要改成的那几处(每个带标记的根图节点上的 properties.mosael、图上的 extra.mosael)。
和 annotate 写文件是同一个函数(app_form.apply),标记的格式只在一处;改画布、存盘是 ComfyUI 自己的保存。generate 带 graph(prompt / workflow / client_id):跑画布上现在这张,不读文件、不填参数;提交前照样查一遍缺的节点
和模型;client_id 用前端的那个(画布上照常亮起正在跑的节点),extra_pnginfo.workflow 带上界面格式(产出拖回 ComfyUI 有布局);
只按历史轮询跟到完成,不开 WebSocket —— ComfyUI 一个 client_id 只留一条连接,后连的会把画布那条挤掉。交回这一种的全部产出,
各带来自哪个节点(source_node),工作台按节点分组、给「只要这个节点的图」。重启后接着等照旧按任务号。测过的前端版本:ComfyUI 0.38.0 / 前端 1.53.10(只读核对:桥的注入、探测、选中、导出、graphToPrompt、脏标记,以及「触控板 /
鼠标」那个设置的键名和它要写回服务器的两条请求;没有排任务、没有存任何东西)。前端缺了桥要用的哪一样,对应的面板说「不支持」,
画布照常能用。
装过 ComfyUI 的,不用再开终端:新建连接时(或在连接页上)「在哪跑」选「用我自己装的」,填它的目录(ADR 0041)。
main.py 和
comfy/ 的那一层;Windows 便携版选外层的 ComfyUI_windows_portable 或里面的 ComfyUI 都行。解释器按顺序找:你指定的、
便携版自带的 python_embeded\python.exe、目录里或上一层的 venv / .venv(Windows 是 Scripts\python.exe)。试跑一次
import torch(30 秒上限),摆出 ComfyUI 版本、Python、PyTorch、显卡(MPS / CUDA / 只有 CPU)和显存、Manager(pip 包 /
没装;只有 custom_nodes 里老的 Manager 时提醒不支持,给出换成 pip 版的命令,1.15.0)、pysssss;导入不了 torch 就不让用。torch 能导入还不够:ComfyUI 的 requirements.txt 里必需的包
缺哪几个也查(只认装没装,不比版本),缺了同样不让用,写明在哪个环境里 pip install -r requirements.txt。python main.py --listen 127.0.0.1 --port <端口>,装了 Manager 的 pip 包(comfyui_manager)才加
--enable-manager(custom_nodes 里的老 Manager 不看,照样起),便携版照它自己的启动脚本加 -s;「高级」里的附加参数接在后面(端口、监听地址不许写在那里)。不改它的任何文件。
端口 Mosael 建的时候选(8189 往上第一个空的)、写进服务器地址;改端口时插件把按旧地址存的本地数据(模型库缓存、工具对照)搬过去。609f3af,按 sha256 校验)解到
custom_nodes/ComfyUI-Custom-Scripts,下次启动生效。/system_stats,有 ComfyUI 就提示「要连上吗」——
建的是「连一台服务器」那一种。没装过的,新建连接时(或在连接页上)「在哪跑」选「让 Mosael 装」(ADR 0041 §4):
nvidia-smi 的驱动
版本和显卡算力:20 系及以上装 CUDA 13.0 版、要 580 以上的驱动;10 系及更老装 CUDA 12.6 版、要 560.76 以上);Intel Mac、AMD、只有 CPU
这一版不装,说清楚原因(Linux 服务器在 1.16.0 补上,见下一节) —— 装哪种 PyTorch、至少要多少空间(Mac 5 GB、Windows 8 GB)、装在哪、分几步、会从哪几处下载。确认框写明
在哪台机器上运行下载来的代码。.venv、PyTorch 2.14.1 /
torchvision 0.29.1 / torchaudio 2.11.0(CUDA 版从「管理 → 下载源」的「PyTorch 源」装,Mac 的走 pip 源)、requirements.txt 和
manager_requirements.txt(pip 版 ComfyUI-Manager,起的时候加 --enable-manager)、pysssss(609f3af)。装在 Mosael 数据目录的
local-services/<连接>/ 里,不放插件目录 —— 卸载插件不会把模型带走。mosael-install.json),取消、断网、关机之后
「接着装」从没做完的那一步开始,下过的包在共用的 pip 缓存里不重下。没装成说人话,并说该换哪个源;「安装日志」是每一步的完整输出。
最后由 Mosael 试起一次,健康检查通过才算装好。不替你下模型:装好之后去模型库挑。.venv 和装进去的包,源码和模型不动。ADR 0041 第三步:
models(选 ComfyUI 目录也认)、
A1111 / Forge 的 webui 目录或它的 models、卸载时保留下来的那一份;不拷第二份。认得出才存:ComfyUI 的子目录同名对上(clip、unet
这些老名字并到 text_encoders、diffusion_models),A1111 / Forge 照 ComfyUI 自带的对照表。走 ComfyUI 自己的
--extra-model-paths-config,那份配置写在 Mosael 的数据目录里(local-services/<连接>/extra_model_paths.yaml),不写进你的
ComfyUI 目录。连接页上每一处写明认成什么、在跑的话它加载了没有、从那里看到几个模型(刚加的重启后生效)。只读:模型库下载的新文件
落在它自己的 models;共用那几处的模型不往旁边存预览图、不按哈希找(那会写一份 .sha256),改按文件名和大小找。/queue),有在跑、在排的任务就不停,问不到也不停;工作台、内嵌编辑器开着算在用。pip freeze)、换上新源码(models、custom_nodes、user、input、output 跟着走)、装新依赖、试起一次;
哪一步没成、试起不通过都换回原来那一版(源码搬回去,变了版本的包按那份记录装回去)。成了以后上一版留着,「回到上一版」不重下,
下一次更新时换掉。Mosael 被强行关掉、换到一半的,起不来并说明,点「换回 x」收拾好。钉死的版本:0.38.0、0.39.0(新装装 0.39.0)。local-services/kept-models/<连接的名字>,
以后在「共用的模型文件夹」里一键加回来)。只删 Mosael 数据目录里的那个安装目录,不跟着链接出去;「用我自己装的」那个目录从来不碰。ADR 0042 第一步。工作台右边那一列多了第五个页签「助手」(Mosael 那一侧):智能体能读画布上这张、找出问题、找官方模板、查节点和节点包 (改和新建是第二步,见下一节)。插件这一侧多了几个只读的 op(都在「工作流库」那个工具里,宿主经它问):
canvas_summary:界面格式的整图(含 definitions.subgraphs)压成给智能体看的摘要 —— 每一层(根图、每份子图定义)的节点、
控件的值、谁连着谁("in": {"model": "4.MODEL"})、子图用在哪几处;节点按从根图往里走的写法(12、子图里的 12:5)。不交原文。check_graph:按节点列的问题单(严重程度、原因、改法)—— 缺的节点类型(连同出自哪个节点包)、缺的模型(在别的子目录、工作流写了
下载地址)、连线类型对不上、必填的输入没连(上游被静音 / 旁路的说出来)、值不在下拉里、缺输入文件、数超出范围、宽高不是倍数、底模
和 LoRA / ControlNet 不配(用模型库认出的家族)、上一次运行的报错拆到节点(#3 Value 0 smaller than min of 1: steps、
Model in folder … not found 这些)。V3 的输入类型(COMFY_MATCHTYPE_V3、COMFY_AUTOGROW_V3、COMFY_DYNAMICCOMBO_V3)也认。
只按图里用到的节点类型逐个问 /object_info/<类>,不拉整份。templates:读官方模板包的 index.mcp.json(和界面语言那份 index.<语言>.json 合起来)、节点包自带的模板(/workflow_templates),
按任务、模型、关键词找;每条带它要的模型这台机器上有没有(同一个文件在别的子目录、同一个模型的另一种精度都算找到)、合计大小、
最低 ComfyUI 版本。目录按 installed_templates_version 和语言记在插件数据目录里。template:取一张模板,先照这台机器改好能改的(同名文件在别的子目录、同一个模型的另一种精度换上,改了什么照实交代),还缺的问清
多大(HEAD,不下载);回改好的整图和它的摘要(宿主只把摘要交给智能体)。node_types:节点类型的输入(类型、必填、下拉选项、缺省值、范围)和输出。点名问的逐个取;按名字、说明找要整份 /object_info
—— 只在 node_catalog.catalog 这一处取,按 HEAD /object_info 的长度认变没变(装了节点包、重启了就重取),记在插件数据目录里。node_packs:这台装了哪些节点包(ComfyUI-Manager V4 的 /v2/customnode/installed)、各提供哪些节点(getmappings?mode=cache),
给了图就说图里的节点各来自哪个包、缺的谁能补。node_pack_search:按关键词或「缺的这几个节点类型」找 —— 先查 Manager 的映射,再查 Comfy 官方注册表(/nodes/search)。node_pack_info:装之前看清楚 —— 注册表里最新一版的状态(被标记 Flagged、封禁 Banned、弃用)和最近一个正常的版本、发布者、
许可证、下载量、星数、最近一次发版;依赖会不会动到 torch(直接要 torch / torchvision / torchaudio / xformers / triton 是高风险);
系统、加速(CUDA / MPS)、ComfyUI 版本和这台合不合;装了的话装的是哪一版、之后的版本改了什么;能补上图里缺的哪几个。连注册表走
宿主给的出网代理。插件还带一份技能 skills/comfyui-workflows/SKILL.md(「ComfyUI 工作流」):先找官方模板、照这台机器的模型改、改之前先读图、缺东西先说
多大、不替你存盘、提到节点写 #12(界面把它变成能点的「定位」)。随 Mosael 一起发的插件带的技能默认开着。
实测:沙盒 ComfyUI 0.39.0 / 前端 1.53.10、维护者那台 0.39.0 + Manager V4.2.1(只读 GET)、Comfy 注册表(rgthree-comfy 最新一版此刻
是 Flagged)。
ADR 0042 第二步。「助手」能改画布上开着的这张、能在新标签页里开一张。改当前这张一定先摆出改动清单,你在确认卡上点「应用」才改到 画布上,一次 Ctrl+Z 就退回去;新开一张不动开着的那几张。两样都不存盘 —— 存不存、存在哪由你在 ComfyUI 里点保存。插件这一侧:
edit_plan:智能体写的一批改动对着画布上这张和这台 ComfyUI 的节点定义逐条查,在一份拷贝上照着改一遍。能写的改动:add_node(临时
名字 $a、控件的值、放在谁旁边)、remove_node、connect / disconnect(按输入输出的名字,不按槽位号;接进一格已经连着的
输入会换掉原来那根)、set_widget、set_title、set_position(绝对画布坐标,可整批整理节点)、add_group / set_group /
remove_group(原生空间分组)、bypass / mute;子图里的节点按 12:5 写 —— 改的是那份子图的定义,这张图里用
它的每一处都会变;子图边界的口 add_subgraph_input / add_subgraph_output / remove_subgraph_io,里面连到边界用 @in.<名字> /
@out.<名字>;promote_widget / unpromote_widget(照前端 1.53 自己的做法:边界上加一个同名的输入口接到里面那一格);to_subgraph
/ unpack_subgraph(只改结构,只能放在一批的最后)。查的是:节点在不在、口叫不叫这个名字、类型配不配、下拉里有没有、数在不在
范围、连着线的那一格不能直接改值。有一条说不通整批不交,每一条的原因(中英)都列出来。都过了交回:规整过的那一批(给画布的桥)、
结构化的改动清单(换掉了哪根线、改前改后的值、子图在这张图里用了几处)、改前改后各一次 check_graph、会修好的和会多出来的。check_graph 多收一个 baseline(改之前那一份问题单):改完说修好了哪几个、多出来哪几个(同一种问题按个数比,不按节点号认 ——
打包、拆开以后节点号会变)。宿主那一侧:改完会多出错误的一批不开卡(说给智能体让它重改);批准之后对着现在的画布再算一遍,换了一张或者清单对不上了(批之前画布 又改过)就一样不改;对得上才交给工作台的桥 —— 桥在页面里先把每一条再查一遍,都对才改,一批只记一步撤销。新标签页是前端用名字开的临时 工作流(和打开模板同一条路),桥从不执行保存。
技能 comfyui-workflows 跟着改了:先读再改、一件事一批、用户点「应用」才改、被拒在开卡之前就照原因改了再提、子图改的是定义、新建模板
优先(在新标签页打开,缺什么、多大先说)。下载模型、装节点包、试跑还在后面那一步。
实测:沙盒 ComfyUI 0.39.0 / 前端 1.53.10 —— 一批七条改动一次 Ctrl+Z 全退;有一条说不通的一批画布一点没动;模板在新标签页打开是临时的、 workflows 目录里没多文件;子图里加节点、加输出口接出来、提升 / 收回控件、删输入口、打包、拆开都改到了定义上。
progress_state 也认。tools/ 只用 Python 标准库:
convert.py —— 保存的工作流(UI 图)→ /prompt 吃的 API 图,照 ComfyUI 前端 graphToPrompt 的语义:widget 值按
节点定义排(老版本前端存的图也认)、静音的断开、旁路的直通、Reroute / PrimitiveNode / Get·Set 这些前端节点消掉、
子图展开成「外层 id:里层 id」;graph.py —— 看出提示词 / 种子 / 尺寸 / 槽位 / 输出节点,收成一份能填的项(items)和表单(Form)、描述成模型、填图、收产出;app_form.py —— 应用表单:读、核对、写工作流里 mosael 那几处标记;workbench.py —— 工作台要插件回答的:选中节点那一格是哪个模型目录、应用表单写进画布要改的那几处标记;canvas.py / diagnose.py / templates.py / node_types.py / node_packs.py / node_catalog.py —— 工作台里的智能体(1.17.0):
整图的摘要和节点的写法、问题单、官方模板(找、照这台机器改)、节点类型、节点包(装了哪些、找、装之前分析)、节点定义(按类取,
整份只在一处取、按指纹缓存);canvas_edit.py —— 改画布的计划(1.17.0):一批改动逐条查、在拷贝上改一遍、交给桥的那一批、改动清单、改前改后的诊断;labels.py —— 可调输入的人话名字、顺序、常用与否、不在 Mosael 里调的那几个;models.py —— 有哪些模型、一个模型 id 背后是哪张图、清单的指纹;run.py —— 传素材、提交、跟进度、取消、取回(生成与工作流的工具共用);workflows.py —— list_workflows / import_outputs,以及交回产出的那一段;tooling.py —— 每张工作流一个工具:从图推入参和输出、按当前的图跑;tool_registry.py —— 工具叫什么(tool_names、path_name、output_key)、这张图跑不跑得起来:tooling.py
与 workflows.py 共用的注册表只读面;layouts.py —— 一个装好的 ComfyUI 摆在哪(Layout、find_layout)、那两种样子叫什么;service.py 与
shared_models.py 共用,所以住在两者下面;service.py —— 本机服务:认目录(便携版、venv、试跑 torch)、给出启动命令、补装 pysssss、本机发现、改端口时搬数据;managed.py / versions.py / pinned.py —— 让 Mosael 装:安装计划、装(或接着装)、卸载前说模型在哪;换版本(更新、回到上一版、
被打断之后收拾);钉死的压缩包(下载、按 sha256 校验、解开不越界);shared_models.py —— 共用的模型文件夹:认 ComfyUI / A1111 / Forge 的样子、写 extra_model_paths.yaml、数每一处加载了几个模型;server.py —— server_status / list_models / interrupt / clear_queue / free_memory;library.py / families.py / weights.py / model_files.py —— 模型库:列出模型文件、读文件头(元数据、张量表)、认底模家族(元数据、权重结构、文件名)、找在用的和缺的;sources.py / install.py —— 解析 HuggingFace / Civitai / ModelScope / 直链,按 同一台机器 → Manager → 说清楚 的顺序下载;civitai_urls.py —— Civitai 的地址形状(下载 / 接口 / 模型页链接里的版本号、版本页的地址):纯解析,不连网;civitai.py / lookup.py / nsfw.py / provenance.py / previews.py —— 模型信息:Civitai 的接口和回答的形状、按哈希或
文件名找、NSFW 依据、出处、旁边的预览文件和写回预览图;json_style.py —— 照工作流原来的排版写回(annotate 只改 mosael 那几处标记,别的字节一个不变);comfy_http.py / ws.py —— 和 ComfyUI 说话。协议见 Mosael 仓库的 docs/PLUGIN_MANIFEST.md「替宿主做生成」「流式工具」「一次交出几份」。
comfyui_generation替 Mosael 在这台 ComfyUI 上列出模型与工具(每张工作流一个)、做一次生成,以及模型库(列出模型文件、解析链接、下载模型);本机服务的那几个操作(认出一个装好的目录、给出启动命令、补装节点、让 Mosael 装一份)也在这里。只给宿主调。
list_workflows这台 ComfyUI 上的每张工作流(连同内置文生图):能喂什么(图 / 蒙版 / 视频 / 音频各接在哪个节点)、能调什么、会交出什么、看起来在做什么(放大、局部重绘、抠图…),以及跑它用哪个工具(tool,「工作流 · 名字」,入参就是它自己的节点);有表单的工作流,工具在每张表单上(forms[].tool),要全部参数走生成、带完整工作流的模型 id(id)。
import_outputs把 ComfyUI 历史里的产出收进素材库:给任务号就取那一个(还在跑可以等一会儿),不给就取最近几次。在 ComfyUI 界面里跑出来的东西也能这样拿回来。
server_statusComfyUI 的版本、显卡与空闲显存、内存,以及队列里在跑 / 排队的任务数。
list_models服务器上装了哪些模型文件,按目录分:checkpoints、loras、vae、upscale_models、controlnet、diffusion_models…
interrupt停下 ComfyUI 正在跑的任务。给了任务号就只停那一个(在跑的中断,排队的删掉),不会误伤别人的任务。
clear_queue清掉 ComfyUI 里所有排队中的任务(在跑的不动)。同一台服务器上别人排的任务也会被清掉。
free_memory让 ComfyUI 卸载模型、释放显存。下一次生成要重新加载模型,会慢一些。
权限是逐项给的:装之前,应用会把它声明的权限摊开给你看。本地脚本以你当前用户的权限运行,只装信得过的来源。