



Выберите ребёнка для просмотра прогресса:
Профиль ребёнка и весь его прогресс будут удалены. Это действие нельзя отменить.
Изображение 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 из библиотеки или вставьте внешнюю ссылку.
Эпизод — это один урок: набор сцен (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.
Приключение: в таблице колонка «Приключение» — к какой группе уроков относится эпизод. Кнопка «Удалить приключение» удаляет выбранное приключение и все его эпизоды (уроки), связанные сцены и медиа по правилам API — отменить нельзя.
Урок — один эпизод (одна цепочка сцен). Приключение (все уроки) — доступ ко всем эпизодам этого приключения подряд. Сначала выберите ребёнка, затем либо урок, либо приключение; чекбокс «Сбросить прогресс» обнуляет пройденное по выбранному назначению.
Отметьте детей в списке и выберите приключение в поле выше — оно будет назначено всем выбранным сразу.
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).
Журнал действий над контентом (создание/правки миров, приключений, эпизодов, сцен). Для узкой выборки укажите тип сущности; «Все» может быть объёмным — уменьшайте лимит при медленной сети.
Реестр типов сцен (Game Template Registry). Показаны поддерживаемые параметры, обязательные поля и флаги voice/offline.
Сначала выберите ребёнка из поиска (или вставьте UUID в скрытое поле через выбор в выпадающем списке), затем «↻ Обновить». Показаны сохранённые голосовые проходы и метаданные оценки.
Введите 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 КБ.
Меняет карточку Мира в каталоге. Поля подгружаются из приключения текущего эпизода. Сохранение отправляет 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.coach_audio_code / hint_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.
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), при необходимости фон (background_media_code) и персонажа (char_idle_code), звуки верно/неверно (sound_correct_code, sound_wrong_code) — всё как отдельные файлы с понятными media_code.params_json. Минимально: prompt (текст на экране), eval_mode (например pitch), expected_ref (нота, например C4 для высоты тона), лимиты min_duration_ms / max_duration_ms, max_attempts, опционально hint_after_attempt. Перечисленные *_code должны совпадать с медиа-библиотекой — проверьте кнопкой «Проверить готовность эпизода».otto-lesson.json). Назначьте эпизод ребёнку в разделе «Уроки», если нужен прогресс в приложении.POST /evaluate/voice. В Инспекторе → «Голос» можно посмотреть сохранённые проходы по ребёнку. Качество анализа высоты — при установленном на сервере librosa (вкладка «Метрики» → audio-health).#gameScreen.
#gameScreen (кнопка в превью админки «▶ Открыть превью» или у ребёнка в приложении). Анимация рисуется в узле #gameNavForwardAnim: правый нижний угол, в той же зоне, что кнопка «Вперёд». Размер контейнера анимации в CSS — 80×80 px (на гостевом экране сами навигационные круги могут быть крупнее — это нормально). В узкой карточке превью под CMS этого контейнера нет — там Lottie не показывается.params_json поле forward_anim_code — строка с кодом медиа (как у картинок): в разделе «Загрузка медиа» загрузите экспортированный из After Effects .json (Bodymovin / Lottie), задайте код и вставьте его сюда кнопкой «Вставить в params_json» или через «Быструю привязку ассета».lottie-web (loop: false, один проход). Если библиотека Lottie не загрузилась или JSON битый, после таймаута (~8 с) зона сбрасывается; в режиме «финал» кнопка «Вперёд» снова становится доступной.forward_anim_code для IT_V_SELECT: кнопка «Вперёд» временно скрывается, проигрывается Lottie; по окончании кнопка снова видна. Опционально — картинка/звук завершения (completion_* и алиасы complete_*): полноэкранный оверлей только если задана картинка; при одном только аудио звук играет без оверлея. Текстовый оверлей — только если явно задан completion_message / completion_title. Дополнительно: correct_feedback_anim_code (или selection_correct_anim_code) — Lottie в режиме подсказки после верного ответа; порядок относительно звука — correct_anim_timing: before_audio (по умолчанию) или after_audio. Порядок похвалы и озвучки варианта — feedback_audio_order: по умолчанию (поле пустое или option_audio_first) сначала аудио варианта, затем похвала; для «сначала похвала» задайте praise_first или praise_then_option (устаревший синоним option_first читается так же).idle_hint_1_sec / idle_hint_2_sec > 0 таймеры всегда активны. Если заданы idle_hint_*_audio_code и/или анимация — они проигрываются; иначе — короткая визуальная подсветка кнопок. idle_hint_2_sec — задержка от того же момента, что и первая (после разблокировки кнопок), не «+N к первой подсказке»; для 10 с и 20 с укажите 10 и 20. Анимации: idle_hint_*_anim_code; если пусто — подставляется forward_anim_code. Режим «hint»: не переводит на следующую сцену автоматически.forward_anim_code в рантайме не вызывает эту же Lottie-последовательность после успешного drag — поле в JSON можно оставить для единообразия или на будущее, но эффекта на полноэкранной drag-сцене сейчас не будет.
Загрузить .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).















