Чат-ассистент¶
Ассистент — панель справа в интерфейсе Аэрозвено. Оператор пишет обычной фразой, что изменить в сценарии, что рассчитать или что объяснить, а ассистент выполняет это через те же расчётные сервисы, что и кнопка «Рассчитать». Главное правило: языковая модель не считает план и не выносит вердикт. План строит планировщик, допуск определяет валидатор, модель только управляет входными данными и объясняет результат.
Где доступен
Панель открывается кнопкой «Ассистент» в верхней строке и работает только в режиме данных 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 |
отчёт валидатора и пояснительная записка | оценка, текст |
Как проверяется то, что предложила модель¶
- Строгая схема аргументов на стороне поставщика модели.
- Неизвестный инструмент или неразборчивые аргументы — ошибка возвращается модели, диалог продолжается.
- Разбор типов полей каждой операции.
- Политика и закрепления оператора; в режиме подбора разрешены только приписка, включение и выключение бортов, угол галсов и новые площадки.
- Диапазоны значений (например, ветер ≥ 0, направление 0–360°, резерв энергии и λ — от 0 до 1, лимит расчёта — до 300 с). Значения не обрезаются, а отклоняются с сообщением.
- Справочник техники: модель и нагрузка существуют и совместимы, площадка подходит по типу борта, точка площадки строго внутри разрешённого пространства и вне бесполётных зон.
- После операции весь сценарий проверяется JSON-схемой; не прошёл — операция откатывается.
- Каждый расчёт (
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 вариантов за вызов |
| Поиск модели не повторяется от запуска к запуску | лучший найденный вариант может отличаться; план по нему воспроизводим |