Создание групп и добавление учеников по UUID — тестовый инструмент, не финальный сценарий.
Шаг 1 из 3
Шаг 2 из 3
Шаг 3 из 3
Шаг 3 из 3
Шаг 2 из 3
У вас уже есть лицензия педагога OTTO NOTE?
Шаг 3 из 3
Ольга, лицензированный
педагог OTTO NOTE
Спасибо, мы проверим и подтвердим
ваши данные в ближайшее время
Шаг 3 из 3
Ольга, педагог
Профиль ребёнка и весь его прогресс будут удалены. Это действие нельзя отменить.
Изображение JPG/PNG/WebP, рекомендованный размер 1920×1080 (16:9), ≤ 2 МБ.
PNG/JPG/WebP, 800×800 (квадрат), ≤ 500 КБ.
Приключение — это группа уроков (эпизодов) внутри мира. Код используется в URL и в otto-lesson.json (adventure_code).
Сначала создайте мир, затем приключение, затем эпизоды.
Родительский мир из списка. Сменить мир у уже созданного приключения через это поле нельзя — только через API/БД.
Уникальный внутри мира: латиница, цифры, _, дефис, до 64 символов. Без пробелов и кириллицы.
Текст для каталога и родителей; можно на русском, до 255 символов.
Меньшее число — выше в списке приключений внутри мира (0, 1, 2…).
PNG/JPG/WebP, квадрат 800×800 или карточка 16:9 до 1280×720, ≤ 500 КБ. Загрузите файл в «Загрузка медиа», скопируйте URL из библиотеки или вставьте внешнюю ссылку.
Одна HTTPS-ссылка на папку или документ для всего приключения. Поле можно оставить пустым.
Эпизод — это один урок: набор сцен (items), общий прогресс ребёнка и медиа, привязанные к этому episode_id.
После создания откройте CMS, вставьте ID эпизода и наполните сцены или импортируйте папку с otto-lesson.json.
Фильтрует список приключений; сам эпизод хранится в выбранном приключении.
Эпизод всегда привязан к одному приключению. В импорте урока тот же контекст задаётся полем adventure_id или парой world_code + adventure_code.
Уникальный внутри приключения: латиница, цифры, _, дефис, до 64 символов. Совпадает с episode.code в манифесте, если импортируете урок папкой.
Заголовок в каталоге и у ребёнка; до 255 символов, можно на русском.
Порядок уроков внутри приключения (0 — первый в списке при равных правилах сортировки).
PNG/JPG/WebP, квадрат 800×800 или карточка 16:9 до 1280×720, ≤ 500 КБ. Загрузите в «Загрузка медиа», затем вставьте URL.
Новый урок всегда создаётся черновиком. После добавления и сохранения сцен используйте «Опубликовать».
Урок появится в демо-каталоге только после публикации самого урока и его мира.
Приключение: в таблице колонка «Приключение» — к какой группе уроков относится эпизод. Кнопка «Удалить приключение» архивирует выбранное приключение и скрывает все его уроки из активных каталогов. История и прогресс детей сохраняются.
Урок — один эпизод (одна цепочка сцен). Приключение (все уроки) — доступ ко всем эпизодам этого приключения подряд. Сначала выберите ребёнка, затем либо урок, либо приключение; чекбокс «Сбросить прогресс» обнуляет пройденное по выбранному назначению.
Отметьте детей в списке и выберите приключение в поле выше — оно будет назначено всем выбранным сразу.
GET /content/audit. Выберите тип сущности или «Все», задайте лимит записей (1…500), нажмите «↻ Обновить». В таблице: время, тип, действие, фрагмент payload.GET /content/interaction-types: коды IT_V_*, описание, обязательные поля в params_json, флаги (голос, офлайн). Переключитесь на вкладку — список запросится с сервера; сверяйте с конструктором сцен в CMS.GET /admin/children/…/audio-results. Найдите ребёнка в поиске, нажмите «↻ Обновить»: список записей, оценка, длительность; кнопка воспроизведения при наличии файла.GET /rewards/admin/progress (или GET /admin/rewards/progress). «↻ Обновить» — прогресс букв и подарка по всем детям. Если ответ 404, обновите бэкенд и проверьте прокси /api.GET /admin/metrics/summary?days=… и GET /admin/system/audio-health: счётчики по детям, эпизодам, назначениям, голосу и телеметрии за выбранное окно, плюс статус librosa/numpy для анализа голоса (ok: true — полноценный режим, иначе fallback).GET /admin/ml/overview?days=…, только чтение (кнопок обучения/правки модели нет). Откройте вкладку «ML», задайте окно дней и нажмите «↻ Обновить».stage_2_ml_pitch, mode=ml, model_version (сейчас pitch-score-v1). Если модели нет — stage_1 и rule-based.ml; Diagnostics и Adaptation пока rule_based; STT/Whisper — disabled (не используется).eval_score, разбивка по eval_mode, распределение skill_level детей.ml / fallback / rule_based), нота или reason.pitch_rule_version=2 и все pitch_phrase оцениваются детерминированным rule-based анализатором; синтетический ML для них намеренно не вызывается. ML-вкладка сохраняется для диагностики старых записей/контракта v1. Whisper не входит в pitch-контур. Детали конкретной записи ребёнка смотрите на вкладке «Голос» (eval_detail: scoring_source, pitch_rule_version, reason).
Журнал действий над контентом (создание/правки миров, приключений, эпизодов, сцен). Для узкой выборки укажите тип сущности; «Все» может быть объёмным — уменьшайте лимит при медленной сети.
Реестр типов сцен (Game Template Registry). Показаны поддерживаемые параметры, обязательные поля и флаги voice/offline.
Временный режим тестирования точности. Сначала выберите ребёнка из поиска, затем «↻ Обновить». Доступ отключается перед продакшеном вместе с удалением исходных записей.
CSV не содержит имён, контактов, расшифровок и ссылок на аудио. Эксперт заполняет expert_level (low/mid/high), при необходимости оценки и expert_trajectory, затем загружает этот же файл. Активация доступна только после автоматической проверки целевых объёмов и точности.
Введите UUID или начните вводить название/код — подсказки из API. После «Загрузить элементы» редактируются сцены этого эпизода; «Удалить эпизод» архивирует урок и скрывает его из активных каталогов, сохраняя историю и прогресс детей.
Код, название, порядок и обложка сохраняются через API (PATCH). Обложка — URL или путь после загрузки файла в блок «Загрузка медиа» (скопируйте ссылку из библиотеки или укажите путь).
Ниже — карточка этого урока в каталоге. Кнопка «Сохранить урок» обновляет только эпизод; приключение правится отдельно блоком ниже.
Поле episode_id в превью рантайма и в загрузке медиа должно совпадать с текущим эпизодом.
UUID родительского приключения; меняется только переносом эпизода через API/БД, не из этой формы.
Латиница, цифры, _, дефис, до 64 символов; уникален внутри приключения.
До 255 символов — отображаемое имя урока.
Порядок среди уроков приключения (меньше — выше в списке).
PNG/JPG/WebP, 800×800 или 16:9 до 1280×720, ≤ 500 КБ.
Статус меняется только кнопками «Опубликовать» и «В черновик». Так сохранение метаданных не может случайно опубликовать старые сцены.
Не влияет на доступ после входа. Снятие галочки убирает урок из гостевого каталога после сохранения.
Код изображения или видео из медиатеки. Показывается во весь экран только при первом завершении этого урока ребёнком.
Необязательный код аудио из медиатеки. Аудио запускается вместе с изображением или видео; если выбрано отдельное аудио, звук самого видео отключается.
Меняет карточку приключения в каталоге (не сами уроки). Кнопка «Сохранить приключение» шлёт PATCH по приключению; урок сохраняется отдельно кнопкой «Сохранить урок».
Код приключения должен совпадать с тем, что в манифесте импорта (adventure_code), если импортируете папкой.
UUID из API; не редактируется вручную.
Латиница, цифры, _, дефис, до 64 символов.
Отображаемое имя; до 255 символов.
Сортировка приключений внутри мира (меньше — выше).
Те же рекомендации, что у обложки мира: PNG/JPG/WebP, квадрат 800×800 или 16:9 до 1280×720, ≤ 500 КБ.
Одна HTTPS-ссылка на папку или документ для всего приключения. Пустое поле удалит ссылку.
По умолчанию 10. Одна Муза выдаётся за первое прохождение урока Академии.
Публичное изображение или видео из медиатеки; откроется после набора нужного числа Муз.
Не путать с общими материалами: эта ссылка открывается только после завершения курса.
Меняет карточку Мира в каталоге. Поля подгружаются из приключения текущего эпизода. Сохранение отправляет PATCH по миру.
Можно вставить URL из медиабиблиотеки («📋 URL») или media-code.
В одной папке: otto-lesson.json и ассеты. Имя файла (без расширения) → media_code после нормализации. В JSON: либо episode_id, либо adventure_id (UUID) + episode для создания эпизода, либо пара world_code + adventure_code. Массив items — как в API CMS.
В папке нужен otto-lesson.json или lesson.json со сценами, плюс файлы медиа: PNG/JPG/WebP (≤ 2 МБ), MP3/OGG/WebM (≤ 5 МБ), MP4 (≤ 50 МБ), Lottie .json (≤ 200 КБ). Имя файла без расширения → media_code (латиница, цифры, _, до 64 символов).
Список эпизодов выбранного приключения — скопируйте episode_id в поле «ID эпизода» CMS, в «Превью урока» или в необязательное поле загрузки медиа.
Сначала мир — затем подгружается список приключений этого мира.
Выберите мир и приключение — список ниже покажет все эпизоды (уроки) этого приключения и их episode_id для превью.
Перетащите файлы в эту область или выберите их в полях ниже — список попадёт в «Несколько файлов».
1280×720 (16:9), JPG/WebP, ≤ 500 КБ. Поле background_media_code.params_json сцены: logo_image_code или logo_media_code (тот же код, что в медиатеке).~400×400, ≤ 200 КБ. Поля image_code у items[] и targets[].~300×300, ≤ 150 КБ.200×200, ≤ 100 КБ. Поле char_idle_code.prompt_audio_code, demo_*_audio_code.sound_correct_code, sound_wrong_code.sound_wrong_code, затем параллельно wrong_animation_code и retry_coach_audio_code, затем hint_audio_code. После последней ошибки вместо retry используется coach_audio_code, затем показывается правильный ответ.completion_audio_code или complete_audio_code (алиас). Оверлей с картинкой — при completion_image_code / complete_image_code или completion_overlay_image_code. Текст задаётся через completion_message / completion_title. Полный пропуск финала — skip_completion_overlay / completion_overlay_skip.video_url у IT_V_VIDEO.forward_anim_code.media_code; разрешены только латиница, цифры и _, длина до 64 символов.
Латиница / цифры / _, до 64 символов. Используется в params_json сцены.
PNG/JPG/WebP/SVG ≤ 2 МБ; MP3/OGG/WebM ≤ 5 МБ; MP4 ≤ 50 МБ; Lottie .json ≤ 200 КБ. Подробнее — в раскрывающемся блоке выше.
Если указать — файл привяжется к этому эпизоду в медиатеке (удобно для массовой загрузки ассетов урока). Оставьте пустым для общих медиа. Синхронизация: кнопка «ID эпизода → в поля загрузки медиа».
Массовая загрузка: выберите все файлы из папки урока — для каждого файла в БД будет создан media_code из имени без расширения (латиница, цифры, _, макс. 64 символа). Укажите тот же ID эпизода, что и для сцен.
Те же лимиты: PNG/JPG/WebP/SVG ≤ 2 МБ; MP3/OGG/WebM ≤ 5 МБ; MP4 ≤ 50 МБ; Lottie .json ≤ 200 КБ. Имя файла без расширения → media_code.
Выберите количество нот (1–4) и героев для каждой позиции. Поля targets и mapping для этого режима не нужны.
rack_order: random — перемешать стойку справа; json — порядок как в списке нот.
skill_level (low, mid, high — legacy MIN/STD/EXT тоже принимаются). Уровень ставится автоматически после POST /diagnostic/children/{id}/evaluate или вручную через PATCH (ниже в разделе «Адаптив»). Runtime прогоняет params_json через adapt_params(level) на каждую выдачу.
params_json ключ level_overlays со словарём по уровням. Поля сливаются поверх базовых (deep merge):
{
"prompt": "Базовая подсказка",
"max_attempts": 3,
"options": ["A","B","C"],
"correct": "A",
"level_overlays": {
"low": { "max_attempts": 4, "hint_after_attempt": 1, "options": ["A","B"] },
"mid": { "max_attempts": 3, "hint_after_attempt": 2 },
"high": { "max_attempts": 2, "hint_after_attempt": 2, "selection_feedback_delay_ms": 1500 }
}
}
Способ 2 — rule-based (если level_overlays не задан). Сервер сам корректирует числа:low: max_attempts +1, hint_after_attempt = 1, idle_hint_*_sec × 1.5.mid: без изменений (дефолт).high: hint_after_attempt = max_attempts (только после исчерпания), selection_feedback_delay_ms × 0.7 (минимум 1500мс).
levels во фронте означает раунды внутри одной сцены (несколько подряд) — это другое. Не путайте: для адаптации под ребёнка используйте именно level_overlays.
GET /runtime/items/{id}/preview?level=high) — увидите, какой params_json уйдёт ребёнку.
Медиа должно быть уже загружено выше с этим media_code. Лимиты по форматам — см. блок «Допустимые форматы и рекомендованные размеры файлов».
interaction_type_code = IT_V_VOICE (шаблон можно взять в реестре «Типы игр» в Инспекторе).prompt_audio_code), при необходимости короткую фонограмму (backing_audio_code), фон (background_media_code) и персонажа (char_idle_code), звуки верно/неверно (sound_correct_code, sound_wrong_code) — всё как отдельные файлы с понятными media_code. Если задана фонограмма, перед игрой ребёнок обязательно увидит предупреждение «Для этой игры нужны наушники».params_json. Для одной ноты: {"prompt":"Спой фа","eval_mode":"pitch","expected_ref":"F4","pitch_rule_version":2,"pitch_tolerance_semitones":3,"pass_threshold":0.5}. Для короткой фразы: eval_mode="pitch_phrase" и expected_notes из 1–16 элементов вида {"note":"F4","start_ms":500,"duration_ms":400}, отсортированных по start_ms. Добавьте лимиты min_duration_ms / max_duration_ms, max_attempts, опционально hint_after_attempt. Все *_code должны совпадать с медиа-библиотекой — проверьте кнопкой «Проверить готовность эпизода».otto-lesson.json). Назначьте эпизод ребёнку в разделе «Уроки», если нужен прогресс в приложении.POST /evaluate/voice. В Инспекторе → «Голос» можно посмотреть сохранённые проходы по ребёнку. Качество анализа высоты — при установленном на сервере librosa (вкладка «Метрики» → audio-health).IT_V_VIDEO; pitch_phrase предназначен только для коротких фраз до 16 нот. В узком превью под CMS показывается только сводка параметров; полноценный микрофон и оценка — в #gameScreen.
#gameScreen (кнопка в превью админки «▶ Открыть превью» или у ребёнка в приложении). Финальная анимация перехода рисуется в узле #gameNavForwardAnim: правый нижний угол, в той же зоне, что кнопка «Вперёд», в контейнере 80×80 px. Анимации персонажа для правильного, неправильного ответа и бездействия в IT_V_SELECT используют отдельный, более крупный адаптивный контейнер в правом нижнем углу. В узкой карточке превью под CMS этих контейнеров нет — там Lottie не показывается.params_json поле forward_anim_code — строка с кодом медиа (как у картинок): в разделе «Загрузка медиа» загрузите экспортированный из After Effects .json (Bodymovin / Lottie), задайте код и вставьте его сюда кнопкой «Вставить в params_json» или через «Быструю привязку ассета».lottie-web (loop: false, один проход). Если библиотека Lottie не загрузилась или JSON битый, после таймаута (~8 с) зона сбрасывается; в режиме «финал» кнопка «Вперёд» снова становится доступной.completion_media_code принимает код публичного изображения или видео и показывает его в полноэкранном оверлее. Для аудио используйте completion_audio_code; алиасы complete_* и старые поля картинки сохраняются для совместимости. Текст — completion_message / completion_title. forward_anim_code — общая финальная Lottie-анимация для этих четырёх типов заданий. Для IT_V_SELECT отдельно доступны correct_feedback_anim_code / selection_correct_anim_code, correct_anim_timing и feedback_audio_order. Нейтральный финал после исчерпания попыток в SELECT/VOICE задаётся отдельно: failure_completion_image_code и failure_completion_audio_code; успешные текст, похвала и forward-анимация в этом случае не используются.idle_hint_1_sec и idle_hint_2_sec считаются от одного момента готовности задания; значения по умолчанию — 10 и 20 секунд, значение 0 отключает соответствующую подсказку. Медиа задаются полями idle_hint_*_audio_code (публичное аудио) и idle_hint_*_anim_code (публичный Lottie JSON). Новая подсказка останавливает медиа предыдущей; на время ответа, записи голоса, обработки и скрытия вкладки таймеры приостанавливаются. Только у SELECT при пустом idle_hint_*_anim_code сохраняется совместимый fallback на forward_anim_code.
Загрузить .json можно выше в разделе «Загрузка медиа» — выберите файл, укажите код (например anim-cat-wave), нажмите «Загрузить медиа». Проверка визуала — только через полноэкранное превью урока.
«Проверить готовность эпизода» — локальная проверка списка сцен (обязательные поля, IT_V_DRAG, коды медиа и Lottie, в т.ч. forward_anim_code / *_anim_code против медиа-библиотеки) без сохранения на сервер. Сначала загрузите элементы эпизода кнопкой выше.
Просмотр сцен эпизода как у ребёнка. Без UUID ребёнка — запрос GET /content/episodes/…/items (только контент, без прогресса и пейвола).
С UUID ребёнка — GET /runtime/children/…/episodes/… (как в приложении: прогресс, доступ).
После «Загрузить урок» сцены листаются в карточке ниже; «▶ Открыть превью» — полноэкранный игровой экран с навигацией как в уроке.
Без UUID — быстрая проверка верстки и сцен через GET /content/episodes/…/items.
С UUID — как в приложении: рантайм, прогресс, пейвол.
IT_V_VOICE (микрофон): запись и POST /evaluate/voice требуют профиль ребёнка — укажите UUID (поиск или вручную), иначе кнопка «▶ Открыть превью» для урока с голосовыми сценами не откроется полноэкранно. Разрешите доступ к микрофону в браузере; удобнее localhost или HTTPS.
Без child_id превью грузит сцены напрямую из контента; с ребёнком — через рантайм с учётом прогресса. UUID должен совпадать с эпизодом в CMS.
Загрузить урок — подтянуть список сцен в блок ниже (карточка + JSON параметров + интерактив в рамках админки).
Открыть превью — тот же урок в полноэкранном #gameScreen (кнопки назад / подсказка / вперёд, как у ребёнка).
Начать заново — сбросить индекс сцен в превью и в полноэкранной игре, если она открыта.
Сообщения об ошибках — в строке под кнопками.
В карточке превью: Назад / Вперёд — переключение сцен без сохранения на сервер; интерактив (выбор, drag, голос) работает для проверки UX. Телеметрия в превью может уходить с пометкой источника runtime_preview.
Каждый ребёнок имеет skill_level: low (упрощённый), mid (стандартный, дефолт) или high (усложнённый). Уровень определяет, как сервер прогоняет params_json сцены через adapt_params: применяет ваш level_overlays и/или rule-based-правки. Полный текст инструкции — в редакторе сцен под полем «Параметры сцены». Уровень пишется в payload.skill_level каждого telemetry-события — это даёт отчёт «какой ребёнок какой вариант получил».
Уровень либо выставляется автоматически (POST /diagnostic/children/{id}/evaluate — берётся среднее по голосовым попыткам: ≥0.8 → high, ≥0.5 → mid, иначе low), либо вручную ниже. Принимаются также MIN/STD/EXT — нормализуются в low/mid/high. Пустое значение = сброс (адаптация отключится, ребёнок получит «mid»-вариант).
Выберите профиль в выпадающем списке (клик по строке) или вставьте UUID — как в блоке «Превью урока».
Тот же params_json, прогнанный через adapt_params(level), БЕЗ привязки к конкретному ребёнку (GET /runtime/items/{id}/preview?level=…). Полезно проверить, что ваш level_overlays работает корректно.
CSV-экспорт telemetry-событий с колонкой skill_level — у заказчика будет ответ «какой ребёнок какой вариант получил» (GET /telemetry/export/csv?limit=…).
Здесь открывается актуальная спецификация REST API (OpenAPI): полный каталог маршрутов, модели тел запросов и ответов, перечисление кодов состояния. Этого достаточно, чтобы проверить весь публичный контракт backend — не только сценарии из текстовых инструкций CMS, но и рантайм, профили, адаптацию, телеметрию, медиа и административные операции. В Swagger UI (/docs) доступна интерактивная отправка запросов без отдельного HTTP-клиента (кнопка «Try it out»). ReDoc (/redoc) удобен для чтения документации; /openapi.json — для автогенерации клиентов, контрактных тестов и пайплайнов. Для защищённых методов укажите схему Bearer и токен, выданный после входа (в браузере он хранится в localStorage.token).















