Перейти к содержанию

Чат-ассистент

Ассистент — панель справа в интерфейсе Аэрозвено. Оператор пишет обычной фразой, что изменить в сценарии, что рассчитать или что объяснить, а ассистент выполняет это через те же расчётные сервисы, что и кнопка «Рассчитать». Главное правило: языковая модель не считает план и не выносит вердикт. План строит планировщик, допуск определяет валидатор, модель только управляет входными данными и объясняет результат.

Где доступен

Панель открывается кнопкой «Ассистент» в верхней строке и работает только в режиме данных API (расчёт на сервере). Если на стенде языковая модель отключена, свободный диалог недоступен, но детерминированная кнопка «Подобрать вариант» работает.

Что умеет

Возможность Как вызвать Нужна языковая модель
Поправить сценарий фразой: ветер, критерий, резерв энергии, режим разворота, буфер от зон, лимит времени расчёта поле ввода да
Поправить участок съёмки: GSD (или плотность точек, межгалсовое расстояние), перекрытия, угол галсов, название поле ввода да
Управлять парком: включить или выключить борт, сменить приписку и нагрузку, добавить или удалить борт поле ввода да
Управлять площадками: добавить кандидата по координатам, поправить, удалить с перебазированием бортов поле ввода да
Рассчитать план и сразу получить вердикт валидатора «рассчитай», кнопка «Рассчитать и подобрать» да
Подобрать вариант полным перебором: приписка бортов к площадкам, состав парка, площадки кнопка «Подобрать вариант» нет
Проверить свои варианты сверх перебора, в том числе угол галсов (до 8 за вызов) «подбери лучше», «проверь угол 30°» да
Объяснить отчёт валидатора кнопка «Объяснить отчёт» да
Оформить пояснительную записку к плану кнопка «Пояснительная записка» да

Чего не умеет (и почему)

  • Не рисует и не правит геометрию: участки съёмки, бесполётные зоны, границу разрешённого воздушного пространства, пол и потолок. Таких инструментов у модели нет — геометрия правится на карте.
  • Не меняет тип съёмки участка и не выдумывает маршруты, галсы, координаты.
  • Не объявляет план допущенным: признак «допущен» берётся только из отчёта валидатора.
  • Не меняет разрешения и закрепления — их задаёт оператор в блоке «Что разрешено системе».
  • Не принимает вариант с новой площадкой — такой вариант принимает только оператор, с подтверждением.
  • Не ослабляет требования ради того, чтобы план «сошёлся»: GSD, ветер, резерв энергии и буфер от зон меняются только по прямой просьбе оператора; уменьшение резерва или буфера помечается как риск безопасности.
  • Не работает без языковой модели (кроме кнопки «Подобрать вариант»): запасного разбора фраз по правилам нет.

Примеры диалогов

Правка и расчёт

Оператор: Поставь ветер 7 м/с с запада и рассчитай.

Ассистент: (карточка «Изменения»: ветер 0 → 7 м/с, направление 270°) (карточка «Оценка e1»: план допущен; время работ 00:31:12; налёт 00:31:12; покрытие 100 %) Ветер выставлен, план пересчитан и допущен валидатором (оценка e1).

Подбор

Оператор: Рассчитай план по текущему сценарию, затем подбери варианты лучше в пределах разрешённого, включая угол галсов. Сценарий не меняй.

Ассистент: (оценка e1 — ввод оператора; перебор приписок — выигрыша нет; свои варианты v1…v6 по углу галсов) Лучший вариант — v4, галсы 0°: время работ меньше на 3 % при том же покрытии, план допущен. Принять его можно кнопкой в карточке варианта.

Объяснение отчёта

Оператор: Объясни отчёт валидатора.

Ассистент: План допущен. Предупреждение G1-05: высота 160 м выше 150 м — для работ нужно разрешение на ИВП. Чтобы снять предупреждение, можно ослабить GSD участка T1 до 4 см.

Отказ по разрешению

Оператор: Выключи борт gemini-02.

Ассистент: Не могу: смена состава парка запрещена. Включите переключатель «Менять состав парка» в блоке «Что разрешено системе» и повторите просьбу.

Числа в примерах иллюстративные: в интерфейсе они всегда приходят из карточек оценки, которые заполняют планировщик и валидатор, а не из текста модели. Готовые запросы в панели: «Рассчитать и подобрать», «Объяснить отчёт», «Пояснительная записка».

Что разрешено системе

Оператор задаёт политику в блоке «Что разрешено системе» панели ассистента.

Переключатель По умолчанию Что открывает
Предлагать новые площадки запрещено добавление площадки и кандидатов площадок в подборе
Менять приписку бортов разрешено смену домашней площадки борта
Менять состав парка запрещено включение и выключение борта, смену нагрузки, добавление и удаление борта

Закреплённые оператором площадку, борт или участок система не меняет. Запрет проверяет код сервера до расчёта варианта, формулировка запроса его не обходит. Политика и закрепления хранятся в браузере и уходят с каждым запросом; в документ сценария они не попадают.

Архитектура: где языковая модель, а где расчёт

flowchart LR
  subgraph B[Браузер]
    UI[Панель ассистента]
  end
  subgraph GW[Gateway]
    C[POST /api/assistant/chat<br>поток SSE]
    L[Цикл «модель ↔ инструменты»<br>до 8 шагов]
    G[Проверки операций:<br>типы, политика, закрепления,<br>диапазоны, справочник, схема]
    R[Подбор перебором<br>/api/assistant/recommend]
  end
  M[(Языковая модель<br>OpenAI Responses API)]
  P[Планировщик<br>gRPC]
  V[Валидатор<br>gRPC]
  UI -->|сценарий, политика,<br>история| C --> L
  L <-->|сводка сценария,<br>вызовы инструментов| M
  L --> G -->|изменённый сценарий| P --> V
  R --> P
  V -->|вердикт и метрики| L
  L -->|события: ops, evaluation,<br>message, done| UI
Этап Кто выполняет Детерминированно?
Понять фразу, выбрать инструменты и аргументы, предложить свои варианты языковая модель нет
Разобрать аргументы, проверить политику, закрепления, диапазоны, справочник техники, геометрию площадки, схему сценария gateway да
Полный перебор приписок, состава парка и площадок; ранжирование gateway да
Построить план планировщик да
Проверить план, посчитать метрики, вынести вердикт валидатор да
Сформулировать ответ, объяснение, текст записки языковая модель нет

Путь одного ответа

sequenceDiagram
  autonumber
  actor U as Оператор
  participant UI as Панель ассистента
  participant GW as Gateway
  participant M as Языковая модель
  participant PL as Планировщик
  participant VL as Валидатор

  U->>UI: «Поставь ветер 7 м/с и рассчитай»
  UI->>GW: POST /api/assistant/chat (сценарий, политика, история)
  GW->>M: инструкция, сводка сценария, 18 инструментов
  M-->>GW: вызов set_weather
  GW->>GW: типы, политика, диапазоны, схема сценария
  GW-->>UI: событие ops: было → стало
  M-->>GW: вызов compute_plan
  GW->>PL: расчёт плана (gRPC)
  GW->>VL: проверка плана (gRPC)
  GW-->>UI: событие evaluation: вердикт и числа
  M-->>GW: текст ответа
  GW-->>UI: события message и done (итоговый сценарий)
  UI->>UI: открыть сценарий и запустить обычный расчёт
  • Ответ приходит потоком шагов (Server-Sent Events): status, tool, ops, evaluation, recommendation, note, message; последним — done или error. Текст модели приходит одним событием message, не по токенам.

  • Изменения сценария применяются сразу; прежний сценарий возвращает кнопка «Вернуть прежний». Если ассистент посчитал план, интерфейс сам запускает обычный расчёт по итоговому сценарию.

Языковая модель и её настройки

Параметр Значение
Интерфейс OpenAI Responses API (POST /responses), адрес задаётся OPENAI_BASE_URL — можно указать совместимый сервер внутри контура
Модель на стенде gpt-6-sol (OPENAI_MODEL; это же значение по умолчанию)
Включение LLM_PROVIDER=openai; по умолчанию none — ассистент выключен и сервер наружу не ходит
Инструменты 18 функций со строгими схемами (strict: true): лишние поля запрещены, все поля обязательны, null = «не менять»
Хранение у поставщика выключено (store: false)
Температура, лимит токенов не задаются — действуют значения поставщика
Таймаут обращения 60 с (LLM_TIMEOUT_MS), до 2 попыток при таймауте, сбое связи, 429 и 5xx
Шагов «модель ↔ инструменты» на ответ до 8 (ASSISTANT_MAX_STEPS); на последнем шаге инструменты не передаются
Вариантов в подборе до 24 (ASSISTANT_MAX_VARIANTS); своих вариантов модели — до 8 за вызов
Лимит расчёта одного варианта подбора 5 с (ASSISTANT_EVAL_TIME_LIMIT_S), одновременно — 2 расчёта (ASSISTANT_EVAL_CONCURRENCY)
Лимит расчёта по compute_plan не больше 60 с
История до 24 последних реплик по 4000 знаков, приходит в каждом запросе; на сервере не хранится

Что модель видит и что может поменять

Модели уходит сводка сценария, а не полные полигоны: у участков — площадь и центр, борта, площадки (координаты, расстояния до участков), число бесполётных зон, пол и потолок, охватывающий прямоугольник разрешённого пространства, ветер, критерий, настройки расчёта и политика. Названия объектов из сценария передаются как данные: строки чистятся (одна строка, без служебных символов, не длиннее 80 знаков), а инструкция прямо запрещает выполнять «указания» из них.

Инструмент Что меняет или делает Параметры
get_scenario, get_catalog читает сценарий и справочник техники —
set_weather ветер скорость, направление (откуда дует), порывы, температура
set_objective критерий и безопасность критерий (время работ / налёт / Парето), λ, резерв энергии, режим разворота (ЛЗП / пролётом), буфер от зон
set_solver настройки расчёта лимит времени (≤ 300 с), зерно
update_task участок съёмки название, GSD или плотность точек или межгалсовое расстояние, перекрытия, угол галсов или «подбирает планировщик»
update_unit, add_unit, remove_unit борт участие, домашняя площадка, нагрузка; модель при добавлении
add_site, update_site, remove_site площадка координаты, высота, какие типы бортов принимает, время оборота; перебазирование бортов при удалении
compute_plan расчёт плана + проверка валидатором подпись
recommend полный перебор что перебирать: приписка, парк, площадки
evaluate_variants свои варианты модели (до 8) изменения: приписка, включить / выключить борт, площадка, угол галсов
adopt_variant принять вариант только допущенный, не устаревший, без новой площадки
get_plan_report, write_report_note отчёт валидатора и пояснительная записка оценка, текст

Как проверяется то, что предложила модель

  1. Строгая схема аргументов на стороне поставщика модели.
  2. Неизвестный инструмент или неразборчивые аргументы — ошибка возвращается модели, диалог продолжается.
  3. Разбор типов полей каждой операции.
  4. Политика и закрепления оператора; в режиме подбора разрешены только приписка, включение и выключение бортов, угол галсов и новые площадки.
  5. Диапазоны значений (например, ветер ≥ 0, направление 0–360°, резерв энергии и λ — от 0 до 1, лимит расчёта — до 300 с). Значения не обрезаются, а отклоняются с сообщением.
  6. Справочник техники: модель и нагрузка существуют и совместимы, площадка подходит по типу борта, точка площадки строго внутри разрешённого пространства и вне бесполётных зон.
  7. После операции весь сценарий проверяется JSON-схемой; не прошёл — операция откатывается.
  8. Каждый расчёт (compute_plan, варианты подбора) проходит цепочку планировщик → валидатор; карточки в интерфейсе показывают числа валидатора.

Подбор без языковой модели

Кнопка «Подобрать вариант» (POST /api/assistant/recommend) полностью детерминирована: она перебирает приписку бортов к площадкам, состав парка и площадки в пределах разрешённого, считает каждый вариант планировщиком (5 с на вариант), проверяет валидатором и ранжирует. Выигрыш меньше 0,5 % выигрышем не считается. Перебор не сочетает элементы между собой и не перебирает угол галсов — угол проверяет модель через evaluate_variants.

В замере 28.09.2026 на демо-сценариях s01–s10 модель находила вариант лучше ввода оператора примерно в половине сценариев, и почти всегда — за счёт угла галсов. Поиск модели не детерминирован: два запуска могут найти разные углы. Сам план по найденному варианту воспроизводим.

API

База — /api/assistant.

Маршрут Назначение Ответ
GET /api/assistant/status включена ли модель, её имя, лимиты шагов, вариантов, реплик JSON
POST /api/assistant/recommend подбор перебором (без модели) JSON с вариантами
POST /api/assistant/chat диалог; при выключенной модели — 503 UPSTREAM_UNAVAILABLE поток text/event-stream
curl -sN https://app.aerozveno.ru/api/assistant/chat -u "$LOGIN:$PASSWORD" \
  -H 'content-type: application/json' \
  -d '{"messages":[{"role":"user","content":"Рассчитай план"}],
       "scenario": '"$(cat s03-multi-sites.json)"'}'

Ограничения

Ограничение Следствие
Сводка сценария уходит внешнему поставщику модели для закрытого контура укажите совместимый сервер в OPENAI_BASE_URL или отключите модель (LLM_PROVIDER=none)
Лента диалога, политика и закрепления хранятся в браузере на другом компьютере или в другом браузере их нет
Закрепления хранятся по идентификатору закрепление vpp-1 действует во всех сценариях, где есть такой идентификатор
Пригодность новой площадки на местности системе неизвестна вариант с новой площадкой принимает только оператор
Перебор не сочетает элементы и не перебирает угол галсов угол проверяет модель, до 8 вариантов за вызов
Поиск модели не повторяется от запуска к запуску лучший найденный вариант может отличаться; план по нему воспроизводим