Формат файла урока
Файл урока хранит один урок или целую группу уроков. Приложение пишет его при экспорте и читает при импорте (см.
Мои уроки). Это JSON, имя кончается на .lesson.json, и внутри только данные: ничего из файла не
запускается, не вычисляется и не открывается.
Пример
Комментарии после // здесь для чтения; в настоящем файле их нет. Приложение читает этот файл как есть.
{
"format": "nodewise-studio/lessons", // что это за файл; с другим значением это не файл урока
"version": 1, // версия формата; более новая отклоняется с сообщением
"lessons": [ // один урок или больше (не больше 200)
{
"id": "sdxl-size", // строчные латинские буквы, цифры и дефисы; в приложении станет my:sdxl-size
"author": "Ваше имя", // показывается как текст
"source": "Сделан в редакторе уроков", // показывается как текст, никогда не открывается
"continues": ["image"], // уроки, с графа которых он начинается: подсказка, а не замок
"needs": { "packs": [], "classes": ["CheckpointLoaderSimple", "EmptyLatentImage"] },
"texts": { // слова на "en", "ru" или на обоих
"ru": {
"title": "Размер картинки SDXL",
"result": "Поставите заготовке размер, на котором учили SDXL.",
"steps": { // слова каждого шага, по id шага
"intro": { "title": "Почему размер важен", "body": "SDXL учили около одного мегапикселя." },
"model": { "title": "Загрузите модель", "body": "Добавьте {checkpoint} и выберите файл в `ckpt_name`." },
"size": { "title": "Поставьте размер", "body": "В ноде {latent} поставьте `width` 1024." }
}
}
},
"steps": [ // что должно быть на холсте после каждого шага
{ "id": "intro", "read": true }, // шаг, который только объясняет
{
"id": "model",
"roles": [{ "role": "checkpoint", "classes": ["CheckpointLoaderSimple"] }],
"fields": [{ "role": "checkpoint", "field": "ckpt_name", "test": { "kind": "chosen" } }]
},
{
"id": "size",
"roles": [{ "role": "latent", "classes": ["EmptyLatentImage"] }],
"fields": [{
"role": "latent", "field": "width",
"test": { "kind": "between", "min": 640, "max": 1536, "prefer": 1024 }, // «Сделать за меня» ставит 1024
"why": "im.sdxlSize" // причина, которую написало приложение; своих фраз файл принести не может
}]
}
]
}
]
}Части урока
id: собственный id урока. В приложении ваш урок получает idmy:и этот id, поэтому он никогда не заменяет встроенный урок.group: id и название на каждом языке, если урок входит в группу.follows: уроки, на идеи которых он опирается.continues: уроки, с графа которых он начинается. Это подсказки в списке, а не замки.adult:trueзакрывает урок переключателем Содержимое для взрослых (18+).authorиsource: показываются простым текстом.needs: паки нод и классы, их называет карточка. Классы приложение само сверяет с вашим ComfyUI.texts: слова наen,ruили на обоих. В каждомtitle,resultи слова каждого шага:titleиbody. В тексте шага{role}превращается в имя этой ноды жирным. Там же может бытьroles: короткая подпись роли по её имени, например"first": "первый кадр". Подпись стоит рядом с именем ноды в «Осталось сделать», чтобы две одинаковые ноды не путались.steps: что просит каждый шаг.
Что просит шаг
Шаг либо только объясняет ("read": true), либо просит что-то на холсте, но не то и другое сразу.
roles: ноды, которые добавляет шаг. Роль это имя, которое урок даёт ноде (sampler,positive); её занимает нода любого из классовclasses. Роль добавляется один раз, в одном шаге.links: связь от выхода одной роли ко входу другой:from,output,to,input.viaперечисляет классы, которые могут стоять между ними, например загрузчик LoRA.altперечисляет другие связи, которые делают то же.fields: значения. У каждого естьrole,fieldиtest, а ещё может бытьwhy(id причины, которую написало приложение),soft(совет, который не держит шаг) иidentifies.
Проверки:
kind | Что просит |
|---|---|
chosen | что-то выбрано или написано |
equals | ровно это значение value |
between | число от min до max; prefer это число из текста, его ставит Сделать за меня; frames требует 4n + 1 |
text | не меньше minChars знаков; по желанию words, has, english, notCopyOf, noNegation |
weighted | вес вида (red coat:1.2) от min до max, не 1 |
file | файл модели того вида, который знает приложение, или описанный словами, которые должны быть в имени |
sameFamily | файл, сделанный для семейства файла из другого поля |
same, differs, less | равно другому полю, не тот же файл, меньше другого поля |
size | около размера, на котором учили модель из другого поля |
aspect | пропорции другой ноды |
has-trigger | слова-триггеры LoRA, выбранной в названных полях |
Что приложение проверяет, прежде чем сохранить файл
- Размер (около 2 МБ самое большее), глубину вложенности, что это JSON,
formatиversion. - Каждый текст и список по его пределу; никаких управляющих символов и скрытых знаков направления текста.
- Незнакомые ключи отклоняются, поэтому файл от более новой версии так и говорит, а не читается наполовину.
- Части сходятся: ни урок, ни шаг не повторяются, роль добавлена раньше, чем шаг её называет, у каждого шага есть слова на каждом языке урока, диапазон не пуст, хотя бы один шаг что-то просит.
- Те же правила уроков, которым подчиняются встроенные уроки.
- Только виды файлов моделей и причины, которые знает приложение.
- Что урок можно пройти с пустого холста.
Если проверка не прошла, сообщение называет урок и шаг простыми словами, например «В уроке «…» шаг «…» говорит о ноде «…», которую не добавляет ни один шаг до него.»