Чтение ComfyUI

Как приложение узнаёт, какие ноды и модели есть в ComfyUI, никогда его не меняя.

Пути

ПутьКодЧто читается
Сам ComfyUI по сохранённому адресу (основной путь)src/main/comfy/direct.ts через src/main/comfy/gate.ts/object_info (типы нод, устаревшие удаляются), /system_stats (его командная строка не сохраняется), папки и файлы моделей с размерами из /experiment/models (или /models), заголовки .safetensors через /view_metadata фоновыми порциями (404 значит «метаданных нет»), превью модели и паки из /customnode/installed ComfyUI-Manager, если он отвечает, иначе из python_module каждой ноды.
MCP-сервер (необязательно, Streamable HTTP)src/main/mcp/, вид определяет src/main/mcp/profiles.tsПо виду: catalog (всё, плюс файлы рядом с моделями, файлы паков и отпечатки), modelList (только list_local_models {action:'list'}), checkpointList (только list_models {}); ноды для двух последних берутся из ComfyUI. Незнакомый сервер не вызывается.
Файл«Файл ▸ Загрузить список нод из файла…»Ответ object_info, сохранённый как JSON.

Пути Windows в списках сервера или ComfyUI (буквы дисков, обратные косые черты) принимаются (src/shared/mcp/serverPaths.ts).

Проверка для ComfyUI

src/main/comfy/gate.ts: только GET, redirect: 'manual', предел размера и времени на каждый адрес. Адреса собираются только конструкторами COMFY_ROUTES, а второй список шаблонов проверяет каждый запрос; имена папок и файлов проверяются и кодируются. Через неё проходит каждый запрос к ComfyUI, включая пробы портов «Найти на этом компьютере». tests/unit/comfyGate.test.ts доказывает, что /prompt, /queue, /interrupt, /free, /history, /upload/*, /userdata, /settings и адреса установки и перезапуска Manager отклоняются, что поддельный адрес не доходит до fetch и что ни один модуль в src/main/comfy не вызывает fetch сам.

Что ещё не проверено на настоящей установке, перечислено в Выпуск версии.

Проверка для MCP

Каждый вызов MCP проходит через readOnlySession (src/main/mcp/readOnly.ts):

  • READ_ONLY_SCHEMAS перечисляет инструменты, которые приложению можно вызывать, и точную форму их аргументов, каждая с .strict(), так что лишнее поле отклоняется, а не передаётся дальше.
  • Инструменту, который умеет и писать (workspace_files), разрешено только действие read, только для файла рядом с моделью или pyproject.toml / README.md пака, и действие hash только для файла модели.
  • Всё остальное бросает McpRefusedError, не выйдя из приложения, и попадает в журнал.
  • Шлюз, который добавляет приставку к именам инструментов (gateway_comfy-models), распознаётся (detectToolPrefix), и приставка снимается до проверки.

Тесты: tests/unit/mcpCatalogSafety.test.ts и тесты синхронизации пробуют все прочие инструменты и формы аргументов.

Синхронизация

src/main/mcp/sync.ts:

  1. При запуске, если включена автосинхронизация (с любым из адресов), затем по интервалу или когда человек выбирает «Синхронизация ▸ Синхронизировать сейчас».
  2. Читает типы нод и паки, затем каждую папку моделей; папка, которая не прочиталась, сохраняет прежний список.
  3. Кладёт их в node_catalog, node_packs и model_catalog; вид каталога кэшируется (cachedCatalog в src/main/commands/commit.ts).
  4. Читает метаданные моделей в фоне порциями с паузами («Настройки ▸ Синхронизация»), останавливается после повторяющихся сбоев и выжидает.
  5. Записывает итог в sync_state постоянными английскими предложениями, которые окно переводит.

Состояние синхронизации и её ошибки доходят до окна через IPC знаний (src/main/ipc/knowledgeIpc.ts).

Каталог

src/main/catalog/repository.ts и src/main/knowledge/repository.ts отвечают остальному приложению: типы нод с полями (src/shared/catalog/fieldSpec.ts), модели с семейством и видом (src/shared/knowledge/baseModel.ts, modelKind.ts), какой загрузчик читает какую папку (src/shared/catalog/modelFolders.ts) и поиск (src/shared/knowledge/search.ts).

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/dev/Reading-ComfyUI.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.