REST-справочник¶
Все маршруты gateway. Ошибки возвращаются единым JSON:
{ "errorCode": "…", "message": "…", "errors"?: [{ "path", "rule", "message" }], "details"?: … }.
Сводка маршрутов¶
| Метод | Путь | Назначение | Успех |
|---|---|---|---|
| GET | /healthz |
процесс жив | 200 |
| GET | /readyz |
готовность: база, планировщик, валидатор | 200 / 503 |
| GET | /status |
версия, коммит, время старта | 200 |
| GET | /metrics |
метрики Prometheus | 200 |
| GET | /api/docs, /api/openapi.json |
Swagger UI и OpenAPI | 200 |
| GET | /api/fleet |
справочник моделей БВС | 200 |
| GET | /api/payloads |
справочник нагрузок | 200 |
| GET | /api/scenarios |
список: демо-сценарии и пользовательские | 200 |
| POST | /api/scenarios |
сохранить сценарий | 201 |
| GET | /api/scenarios/{id} |
документ сценария | 200 |
| PATCH | /api/scenarios/{id} |
переименовать пользовательский сценарий | 200 |
| DELETE | /api/scenarios/{id} |
удалить пользовательский сценарий и его расчёты | 204 |
| GET | /api/scenarios/{id}/plans |
история расчётов сценария | 200 |
| POST | /api/plans |
поставить расчёт в очередь | 202 |
| GET | /api/plans/{id} |
статус или готовый план | 200 |
| GET | /api/plans/{id}/events |
поток прогресса (SSE) | 200 |
| GET | /api/plans/{id}/export/{fmt} |
выгрузка kml, geojson, plan, waypoints |
200 |
| POST | /api/plans/{id}/stop |
остановить и взять лучший план | 202 |
| POST | /api/plans/{id}/replan |
пересчёт после выбытия бортов | 202 |
| POST | /api/validate |
отчёт валидатора по паре «сценарий + план» | 200 |
| GET | /api/weather/forecast |
прогноз ветра в точке (если включён на стенде) | 200 |
| GET | /api/assistant/status |
состояние чат-ассистента | 200 |
| POST | /api/assistant/recommend |
подбор вариантов перебором | 200 |
| POST | /api/assistant/chat |
диалог с ассистентом (SSE) | 200 |
Служебные¶
GET /healthz → {"status":"ok"}. GET /readyz проверяет базу и доступность планировщика и
валидатора; при недоступности — 503. GET /status — имя сервиса, версия, коммит сборки, время
старта. GET /metrics — текст Prometheus, включая число заданий по статусам.
Справочники¶
GET /api/fleet — модели БВС: тип (multirotor, fixed_wing), скорости, запас хода, потолок и
минимальная высота, предел ветра, радиус разворота, совместимые нагрузки. GET /api/payloads —
нагрузки: тип съёмки, параметры камеры (матрица, фокусное расстояние, размер кадра), типовые
перекрытия.
Сценарии¶
GET /api/scenarios¶
Список: демо-сценарии s01–s13 и сохранённые пользовательские, с названием, источником и признаком «только чтение» для демо.
POST /api/scenarios¶
Тело — документ сценария (см. Работа с файлами). Повторное сохранение
с тем же scenario_id создаёт новую версию. Параметр ?geoscan_data=true помечает сценарий как
построенный из данных организаторов.
| Код | Когда |
|---|---|
| 201 | сохранён |
| 422 | SCHEMA_VALIDATION_FAILED — документ не прошёл JSON Schema; в errors[] путь поля и правило |
| 409 | SCENARIO_READONLY — попытка перезаписать демо-сценарий |
GET /api/scenarios/{id}/plans¶
История расчётов сценария: plan_id, status, created_at, finished_at, criterion,
makespan_s, scenario_changed (сценарий менялся после расчёта).
Расчёт¶
POST /api/plans¶
| Поле тела | Смысл |
|---|---|
scenario или scenario_id |
сценарий целиком или идентификатор сохранённого / демо-сценария |
objective |
makespan (по умолчанию), total_flight_time, pareto |
time_limit_s (или solver.time_limit_s) |
лимит времени расчёта, от 1 до 1800 с; по умолчанию 300 с |
seed (или solver.seed) |
зерно генератора |
separation |
разведение бортов: none (по умолчанию), time, altitude |
Заголовок Idempotency-Key (рекомендуется): повтор того же запроса возвращает тот же planId с
заголовком Idempotency-Replayed: true, другое тело с тем же ключом — 409.
Ответ 202:
{ "planId": "3f0c…", "status": "queued" }
и заголовок Location: /api/plans/{planId}.
| Код | Когда |
|---|---|
| 202 | задание в очереди |
| 400 | SCHEMA_VALIDATION_FAILED — тело или сценарий не прошли проверку, лимит вне 1…1800 с |
| 404 | SCENARIO_NOT_FOUND |
| 409 | IDEMPOTENCY_KEY_CONFLICT |
| 429 | QUEUE_FULL — в очереди 20 заданий; заголовок Retry-After: 30 |
GET /api/plans/{id}¶
Пока идёт расчёт — status (queued или running) и progress. После завершения:
{
"planId": "3f0c…",
"status": "completed",
"metrics": {
"makespan_s": 787.95, "total_flight_time_s": 2310.4, "total_distance_m": 0,
"uav_used": 3, "sorties": 3, "coverage_fraction": 1.0,
"objective": "makespan", "solver": { "status": "feasible", "solve_time_s": 0.7 }
},
"plan": { "schema_version": 1, "scenario_id": "s03-multi-sites", "missions": [ … ], "…": "…" }
}
При ошибке — status: "failed" и error с кодом: GSD_UNREACHABLE (требуемый GSD недостижим ни
одним бортом), SCHEMA_VALIDATION_FAILED, UPSTREAM_TIMEOUT, SOLVER_INTERRUPTED, CANCELLED
и др.
GET /api/plans/{id}/events¶
Поток Server-Sent Events. Каждый кадр — id: <номер> и data: {JSON} с полями planId, stage,
progress (0…1), objective_value, elapsed_s, message, ts. Поток закрывается после стадии
completed или failed; расчёт продолжается и без подписчика. Для переподключения передайте
Last-Event-ID.
GET /api/plans/{id}/export/{fmt}¶
fmt: kml, geojson, plan (QGroundControl), waypoints. Параметр ?uav=<id> — выгрузка одного
борта. Ответ — файл (Content-Disposition: attachment).
| Код | Когда |
|---|---|
| 409 | PLAN_NOT_READY — расчёт ещё не завершён |
| 400 | EXPORT_FORMAT_UNSUPPORTED |
| 404 | PLAN_NOT_FOUND, UAV_NOT_IN_PLAN |
POST /api/plans/{id}/stop¶
Остановить расчёт и взять лучший найденный план. Если задание ещё в очереди — оно завершается без
плана («Расчёт остановлен оператором: план ещё не найден»). Если идёт расчёт — ответ
{"status":"running","stopRequested":true}, а план приходит с предупреждением STOPPED_BY_OPERATOR.
Для завершённого расчёта — 409. Подробности — Правила расчёта.
POST /api/plans/{id}/replan¶
Пересчёт готового плана без выбывших бортов:
{ "exclude_uav_ids": ["gemini-02"] }
Ответ 202 с новым planId. Если без исключённых бортов парк пуст — 400; родительский план не
готов — 409.
Проверка плана¶
POST /api/validate¶
Тело — { "scenario": {…}, "plan": {…} }. Ответ 200 — { "report": {…} } с вердиктом
admitted, пересчитанными метриками и 39 проверками (см. Проверки валидатора).
Так можно проверить план, рассчитанный вне Аэрозвено, если он записан в формате JSON-плана.
Время ответа валидатора ограничено 30 с.
Прогноз ветра¶
GET /api/weather/forecast?lat=55.76&lon=37.62&height_m=120&time=2026-09-20T06:00:00Z — скорость и
направление ветра из Open-Meteo на заданной высоте. На стендах без доступа в интернет источник
выключен.
Коды ошибок¶
| Код | HTTP | Смысл |
|---|---|---|
SCHEMA_VALIDATION_FAILED |
400 / 422 | документ не соответствует схеме |
SCHEMA_VERSION_UNSUPPORTED |
400 | неизвестная версия схемы |
PAYLOAD_TOO_LARGE |
413 | тело больше 25 МБ |
SCENARIO_NOT_FOUND, PLAN_NOT_FOUND, UAV_NOT_IN_PLAN |
404 | нет такого объекта |
SCENARIO_READONLY |
409 | демо-сценарий нельзя перезаписать |
PLAN_NOT_READY |
409 | расчёт не завершён |
IDEMPOTENCY_KEY_CONFLICT |
409 | тот же ключ, другое тело |
GSD_UNREACHABLE, PAYLOAD_INCOMPATIBLE |
422 | нерешаемый вход: GSD недостижим, нет совместимой нагрузки |
QUEUE_FULL |
429 | очередь заполнена |
UPSTREAM_UNAVAILABLE |
503 | планировщик, валидатор или языковая модель недоступны |
UPSTREAM_TIMEOUT |
504 | внутренний сервис не ответил вовремя |
SOLVER_INTERRUPTED, CANCELLED, PLAN_FAILED, INTERNAL |
— / 500 | расчёт прерван, отменён или упал |