B · 源码地图
所有链接固定到提交 7d11ec31cb700d881fdf2d73731ecde0093b9540。行号是阅读入口,不表示整个行为只存在于这一段。
项目规模
| 区域 | Python 文件 | Python 行数 | 主要职责 |
|---|---|---|---|
comfy/ | 284 | 109,673 | 模型、采样、设备、张量与格式核心 |
comfy_api_nodes/ | 84 | 50,054 | Partner / 远端 API nodes |
comfy_extras/ | 136 | 40,855 | 内建扩展节点与模型能力 |
app/ | 36 | 9,954 | DB、用户、Assets、Managers |
comfy_api/ | 36 | 6,562 | V3 节点与内部 API 协议 |
comfy_execution/ | 9 | 2,305 | 动态图、缓存、进度、执行辅助 |
api_server/ | 7 | 180 | 内部 API server 辅助 |
tests* | 114 | 25,574 | 执行、单元、推理、安全与资产测试 |
| 总计 | 739 | 254,241 | 当前快照静态统计 |
顶层入口
| 问题 | 源码入口 |
|---|---|
| 进程怎样启动? | main.pyL501-593start_comfyui 与直接入口 |
| worker 怎样循环? | main.pyL329-424prompt_worker |
| 进度怎样接服务? | main.pyL435-464global progress hook |
| Server 怎样构造? | server.pyL215-327PromptServer + WebSocket |
| Prompt 怎样入队? | server.pyL1072-1144POST /prompt |
| 路由怎样汇总? | server.pyL1220-1281add_routes |
执行引擎
| 对象 / 函数 | 角色 | 源码 |
|---|---|---|
validate_prompt / validate_inputs | 结构、类型、值、环、输出根 | execution.pyL846-1247 |
PromptQueue | waiting/running/history/flags | execution.pyL1251-1411 |
PromptExecutor.execute_async | 请求级执行生命周期 | execution.pyL730-844 |
execute | 单节点状态机 | execution.pyL438-662 |
get_input_data | 链接、常量、hidden、V3 输入 | execution.pyL159-227 |
_async_map_node_over_list | list / V1 / V3 / async 调用 | execution.pyL243-319 |
get_output_from_returns | result/UI/expand/blocker 归一 | execution.pyL351-414 |
DynamicPrompt | 原始与临时节点统一视图 | comfy_execution/graph.pyL21-62 |
TopologicalSort | 动态依赖基础结构 | comfy_execution/graph.pyL106-191 |
ExecutionList | stage/unstage/complete 与启发式 | comfy_execution/graph.pyL193-342 |
GraphBuilder | 运行时子图构建与序列化 | comfy_execution/graph_utils.pyL13-114 |
ExecutionBlocker | 领域级阻断值 | comfy_execution/graph_utils.pyL140-155 |
缓存
| 对象 | 读什么 | 源码 |
|---|---|---|
IsChangedCache | V1/V3 外部状态 fingerprint | execution.pyL60-101 |
CacheSet | outputs 与 objects 策略组合 | execution.pyL104-149 |
CacheKeySetInputSignature | 祖先、常量、slot 的完整签名 | comfy_execution/caching.pyL82-149 |
BasicCache | prompt key set、读写、清理 | comfy_execution/caching.pyL151-286 |
HierarchicalCache | expand 子图的父子生命周期 | comfy_execution/caching.pyL288-421 |
LRUCache | generation 近似 LRU | comfy_execution/caching.pyL430-502 |
RAMPressureCache | CPU tensor 估算与压力淘汰 | comfy_execution/caching.pyL522-602 |
节点协议与扩展
| 对象 | 源码 |
|---|---|
V1 CLIPTextEncode 样例 | nodes.pyL56-77 |
核心 NODE_CLASS_MAPPINGS | nodes.pyL2058-2140 |
| 自定义模块 loader | nodes.pyL2236-2330 |
| 自定义目录扫描 | nodes.pyL2332-2380 |
V3 Schema | comfy_api/latest/_io.pyL1643-1745 |
V3 ComfyNode / NodeOutput | comfy_api/latest/_io.pyL2233-2305 |
| V3 完整小例子 | comfy_extras/nodes_color.pyL1-55 |
模型装载
| 阶段 | 源码 |
|---|---|
| safetensors / torch 文件读取 | comfy/utils.pyL122-200 |
| checkpoint wrapper | comfy/sd.pyL1955-2021 |
| state dict → MODEL/CLIP/VAE | comfy/sd.pyL2022-2122 |
| key/shape → model config | comfy/model_detection.pyL1247-1331 |
| diffusers UNet config | comfy/model_detection.pyL1332-1510 |
| supported model registry | comfy/supported_models.pyL2418-2515 |
ModelPatcher 与内存
| 对象 / 动作 | 源码 |
|---|---|
PromptModelTracker | comfy/model_patcher.pyL50-96 |
ModelPatcher state | comfy/model_patcher.pyL340-429 |
| clone | comfy/model_patcher.pyL430-504 |
| add patches | comfy/model_patcher.pyL834-856 |
| patch a weight | comfy/model_patcher.pyL891-920 |
| classic load | comfy/model_patcher.pyL974-1104 |
| patch / unpatch | comfy/model_patcher.pyL1105-1161 |
| partial unload/load | comfy/model_patcher.pyL1163-1274 |
| Dynamic Patcher | comfy/model_patcher.pyL1741-2118 |
LoadedModel | comfy/model_management.pyL733-824 |
free_memory | comfy/model_management.pyL855-900 |
load_models_gpu | comfy/model_management.pyL901-1016 |
| dtype policy | comfy/model_management.pyL1098-1165 |
采样
| 阶段 | 源码 |
|---|---|
| KSampler 节点入口 | nodes.pyL1564-1587 |
| noise 与 sample wrapper | comfy/sample.pyL1-80 |
| conditioning batch | comfy/samplers.pyL208-608 |
| CFG 公式入口 | comfy/samplers.pyL609-627 |
CFGGuider | comfy/samplers.pyL1188-1346 |
| scheduler / sampler factory | comfy/samplers.pyL1378-1398 |
KSampler | comfy/samplers.pyL1399-1463 |
文件、数据库与 Assets
| 主题 | 源码 |
|---|---|
| annotated path 与 MIME 安全 | folder_paths.pyL257-369 |
| upload / mask | server.pyL389-515 |
/view | server.pyL516-650 |
| user profile / path | app/user_manager.pyL25-100 |
| database setup | app/database/db.pyL65-190 |
| Asset / Reference models | app/assets/database/models.pyL26-169 |
| asset API | app/assets/api/routes.pyL208-827 |
| background seeder | app/assets/seeder.pyL76-200 |
按问题最快跳转
Prompt 为什么被拒? execution.py validate_inputs
节点为什么不执行? output roots → ExecutionList → cache
为什么执行顺序和画布不同? graph.py ux_friendly_pick_node
为什么只重算了一半? caching.py input signature
为什么节点执行两次? list mapping / pending resume / cache fingerprint
模型为何不是按文件名识别? model_detection.py
LoRA 为什么不复制模型? model_patcher.py clone + add_patches
为什么 GPU 还有空间却 offload? minimum inference memory + lowvram budget
cfg=1 为什么更快? samplers.py sampling_function
文件为何强制下载? dangerous content type / stored XSS
重启后 history 为什么没了? PromptQueue in-memory historyLast updated on