03-teacher

03. Руководство teacher

Аудитория. Автор курсов внутри школы. Пишет исходники, запускает AI-пайплайн, редактирует результат, публикует версии, следит за качеством и адаптирует курс под реальные сложности студентов.


Что делает teacher


Доступ

Учётка в dev:
teacher@local / change_me_locally (демо-школа).

Фронт: http://127.0.0.1:3500/login.


1. Создать курс

На сегодня у teacher'а два практических способа получить курс, оба через UI-редактор:

1a. Открыть пустой черновик и править руками

  1. Зайди на /courses.
  2. В блоке «Открыть / создать черновик» вбей course_id (латиница/цифры/-), например my-first-course.
  3. Жми «Открыть редактор» → попадёшь на /courses/my-first-course/edit.
  4. API под капотом: POST /courses/{course_id}/draft — идемпотентно открывает существующий открытый черновик или создаёт новый. Если такой course_id уже опубликован — черновик будет склонирован с последней опубликованной версии.
  5. Дальше правь в редакторе (см. §2 ниже).

1b. Склонировать существующий опубликованный курс

curl -X POST "http://127.0.0.1:55400/courses/<src_course_id>/copy" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"new_course_id":"my-fork","new_title":"Моя правка"}'

Это сразу создаёт опубликованный клон (v1), дальше открываешь его в редакторе.

1c. Сгенерировать курс AI-пайплайном (CourseGenerationWorkflow)

Сейчас нет готовой CLI-обёртки и UI-кнопки для запуска CourseGenerationWorkflow из коробки. Workflow зарегистрирован в packages.workflows.worker, но стартуется либо:

Типичные агенты пайплайна (для понимания что происходит): Harvester → DocumentIngestor → EmbeddingComputer → Curator → Architect → Composer → NarrativeKeeper → GlossaryCurator → Critic → Publisher.

Удобный CLI-запуск — в roadmap (Phase 6).


2. Редактор курса

URL: /courses/[id]/edit

Возможности:

Для каждого типа есть:

Добавить блок

В редакторе → «+ Добавить блок» → выбрать тип → заполнить поля → autosave.

Удалить блок

Кнопка корзины на блоке. Курс остаётся в course_drafts до публикации.

Критик-баннер

Если Critic при последнем прогоне вернул замечания — на блоке показывается .lms-banner--rework с указанием проблемы. Исправь и попроси пересгенерировать (если блок был AI-generated) либо правь руками.


3. Генерация медиа

Изображения — Gemini Nano Banana (gemini-3.1-flash-image-preview).
Аудио — Gemini TTS (gemini-3.1-flash-tts-preview) / Lyria.
Видео — Veo.

В dev по умолчанию LMS_TEST_MODE=1 → Veo и Lyria заблокированы, Nano Banana — лимит 3 картинки на тест (cost guard, ADR-0013 / manifest §18). Для настоящей генерации:

Все сгенерированные артефакты кладутся в MinIO, в media_assets пишется запись с s3_uri, mime, prompt_hash, cost_usd.


4. Локализация

Агент Localizer переводит курс на другой язык с сохранением:

Переводы хранятся в course_translations. На фронте — language switcher.

Запуск: через HTTP-эндпоинты /courses/{id}/translations (POST — создать перевод, GET — список). CLI-обёртки нет.


5. Публикация новой версии

Когда доволен — жми Publish в редакторе. Это:

  1. Запускает Critic ещё раз (обязательный чек).
  2. Если APPROVEPublisher пишет новую строку в published_courses (version = MAX+1).
  3. Старая версия остаётся доступна по /courses/[id]/v/[N].

Если REJECT — редактор показывает список замечаний критика, версия не создаётся. Исправь и опубликуй снова.


6. Адаптивное обучение

Когда студент ошибается на блоке — фронт может нажать «Нужна подсказка?» → идёт запрос на POST /adaptive/supplement. Агент AdaptiveSupplementer на лету генерирует дополнительный блок (текст-пояснение / мини-quiz / flashcard). Результат:

Teacher'у виден суммарный эффект: в /analytics блоки с высоким fail_rate — кандидаты на переработку основы, а не только подсказок.


7. Типичные ошибки teacher'ов

Проблема Причина Решение
Пайплайн зависает Gemini API лимит Проверить CostReport; LMS_TEST_MODE=1 если это dev-проба
Критик всё REJECT'ит Слабые исходники Добавить больше материалов; проверить что Curator отобрал что надо
{{term:...}} ломается Нет записи в glossary_entries Запустить GlossaryCurator ещё раз
Картинки не генерятся Тест-режим LMS_TEST_MODE=0 + достаточный MAX_DAILY_USD
Публикация не применяется Critic вернул REJECT Читать список замечаний в UI

Ссылки