Формат файла урока

Файл урока хранит один урок или целую группу уроков. Приложение пишет его при экспорте и читает при импорте (см. Мои уроки). Это 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 урока. В приложении ваш урок получает id my: и этот 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.
  • Каждый текст и список по его пределу; никаких управляющих символов и скрытых знаков направления текста.
  • Незнакомые ключи отклоняются, поэтому файл от более новой версии так и говорит, а не читается наполовину.
  • Части сходятся: ни урок, ни шаг не повторяются, роль добавлена раньше, чем шаг её называет, у каждого шага есть слова на каждом языке урока, диапазон не пуст, хотя бы один шаг что-то просит.
  • Те же правила уроков, которым подчиняются встроенные уроки.
  • Только виды файлов моделей и причины, которые знает приложение.
  • Что урок можно пройти с пустого холста.

Если проверка не прошла, сообщение называет урок и шаг простыми словами, например «В уроке «…» шаг «…» говорит о ноде «…», которую не добавляет ни один шаг до него.»

См. также

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

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