Перейти к основному содержимому

HTTP API

Оба приложения — FastAPI на localhost, каждое говорит только со своей SPA. Общего сервера и межприложенческого API нет: генератор и раннер связаны форматом пака.

Раннер студента

Порт 8766.

Практика и задания

МетодПутьОтдаёт
GET/api/packописание базы, DDL, таблицы, число заданий, сколько решено
GET/api/tasksзадания с формулировками, темами, сложностью, открытыми примерами, статусом и текущим решением

GET /api/tasks отдаёт и public_checks — открытые проверки задания. Скрытые в ответ не попадают.

Работа с базой

МетодПутьДелает
POST/api/queryвыполняет SQL в живой базе, возвращает колонки, строки и время
POST/api/load_exampleналивает в живую базу открытый вариант данных
POST/api/resetвозвращает живую базу к пустой схеме

Проверка

МетодПутьДелает
POST/api/tasks/{id}/checkпрогоняет решение по всем вариантам в проверочной базе, сохраняет solutions/<id>.sql
GET/api/tasks/{id}/variant/{variant}данные варианта и ожидаемый результат
POST/api/tasks/{id}/variant/{variant}то же плюс результат решения студента на этих данных — для построчного сравнения
Правило закрытых данных

Эти два эндпоинта отдают ожидаемый результат только для открытых примеров и для вариантов, на которых решение студента уже упало. Всё остальное остаётся в закрытой части пака и наружу не уходит.

Черновики

МетодПутьДелает
GET POST/api/history/{id}история запросов по заданию; кольцо из ста записей
GET PUT/api/bookmarksзакладки

Хранятся в solutions/.history/, который раннер дописывает в solutions/.gitignore: черновики не попадают в сдачу.

Оформление

МетодПутьОтдаёт
GET/api/themeразобранную тему: brand, scheme, fonts, tokens, hasCss
GET/theme/theme.cssсодержимое theme.css как есть
GET/theme/assets/{path}файлы темы; расширения по белому списку

Значения токенов подставляются в <head> при отдаче index.html, поэтому приложение стартует уже в цветах курса. Параметр ?theme=off отключает тему.

Заголовки

Content-Security-Policy: default-src 'self'; img-src 'self' data:; font-src 'self';
style-src 'self' 'unsafe-inline'; script-src 'self'
X-Content-Type-Options: nosniff

unsafe-inline для стилей необходим: редактор кода вставляет свои <style> в рантайме, и токены темы приходят инлайн-блоком. Внешние запросы при этом запрещены — образ автономен.

Студия автора

Порт 8765. Доступна только с локального адреса.

МетодПутьДелает
GET/api/practiceсостояние всех трёх шагов и хэши
GET/api/catalogкаталог предметных областей и тем SQL для форм
GET POST/api/domain, /api/domain/generate, /api/domain/approveшаг 1
GET POST/api/tasks, /api/tasks/generate, /api/tasks/approveшаг 2
POST/api/materializeшаг 3 по всем заданиям
GET/api/outcomesрезультаты прогона: статусы, материализации, матрица негативов
GET/api/tasks/{id}/variant/{variant}данные любого варианта, включая скрытые

Ручной режим — параллельная пара эндпоинтов у каждого шага: /prompt отдаёт готовый промт, /manual принимает ответ модели и валидирует его так же, как ответ API.

Студии автора закрытых данных не существует: она показывает всё содержимое пака, включая скрытые проверки и ожидаемые результаты всех вариантов.