Голосовые системы

Самостоятельный Chat Agent — поставка 12 ноября 2026

Опубликован один скрипт для сайта Chat Agent, отдельного Forms и Forms внутри iframe. Текст, потоковые фрагменты, вызов инструмента страницы и автоматическая озвучка проверены в браузере. Сохранённая фраза прошла распознавание. Обнаруженная ошибка последующей обработки бытовой фразы Agent описана ниже и не считается успешной проверкой команды.

Подключение

<script type="module"
        src="https://chat-agent.gis-master.ru/widget/chat-agent.js"></script>

session_id и контейнер для подключения не нужны. После загрузки появляется кнопка Chat Agent справа внизу. Виджет не читает UUID из адреса /chat/<UUID>.

  • Контрольная страница Chat Agent.
  • Отдельный Forms.
  • На контрольной странице тот же Forms содержит самостоятельный экземпляр внутри iframe.

История разделена по origin и ключам chat-agent.widget.session.top / chat-agent.widget.session.frame. Открытые экземпляры имеют собственные client/context/document ID. Повторное подключение модуля не создаёт вторую панель. При недоступном localStorage ID остаётся в памяти документа, панель предупреждает об отсутствии восстановления истории после перезагрузки.

Исходники и CI

Репозиторий MR Поставленная ревизия Проверки и поставка
Chat Agent !81, merged e64a7abfb135a4eac1fd5770ef7073293c24b010 5970 — Gateway, 5971 — Front; обязательные группы прошли
Forms !1, merged 47a312907518e54b649592abf1732d38b1c42ad6 5973, success; registry-listener применил образ

Gateway: build 31767, preflight 31771, refresh 31797. Front: build 31818, preflight 31822, refresh 31848. Forms: tests 31853, build/push 31852. Для Forms устранён отказ Trivy обновлением Nginx 1.30.5 → 1.30.6; сканирование не ослаблялось.

Локально: 628 frontend-тестов и типизация; 29 адресных backend-тестов; 3 теста с настоящим тестовым NATS; сборки Front/widget/extension; проверки Nginx и DRS. Forms: типизация, lint, 20 тестов и сборка. Manifest, ID, permissions и CSP пакета расширения сохранены. Установленное расширение не переустанавливалось, отдельный production-прогон старого расширения в этой поставке не выполнялся.

Registry и работающие сервисы

Все три latest проверены в Registry Explorer, их pipeline и commit совпадают с выпуском. Gateway и Front подтверждены в обновлённом Insight как 1/1 running. Для Forms Inspect подтвердил running/healthy, фактический Image ID и OCI revision. Наличие тега в registry отдельно не использовалось как доказательство поставки.

Компонент Версия Registry manifest digest
chat-agent_src_api_gateway 7.3.1257 sha256:f5283b50f8a4ff43fa66de45fb67166974997259998d8536f08b15025c62a9ea
chat-agent_src_front 1.0.1258 sha256:e3214b799dc4dfb547d0904d8375a2761177dabac2072744d65e572a24f783fd
forms-stack_frontend 0.4.8 sha256:a512eb6d12cf6beb131009d100a6189f23f470344d88b7a59bd3d441c23e6355

Forms работает с Image ID sha256:d50cb9b5ba4d9403c1f422e0e9df3a9b9a749e4193332c565841c29db48ba556 и OCI revision 47a31290…. Image ID отличается от registry manifest digest — это разные идентификаторы.

Поставка Chat Agent ограничена Gateway и Front. Agent, Ingress, ASR, TTS, GPU/MIG и административные сервисы не обновлялись. Общий redeploy/prune не выполнялся. Прежние digest и параметры сохранены в rollback.json рядом с отчётом.

Подтверждённые браузерные сценарии

Сценарий Результат и связь
Chat Agent top Сессия 574b0f36-9b9b-492d-9f05-4c80a7006219, не UUID маршрута. Запрос 8c32e033-3f5a-439e-b400-c45f11713ce1: потоковый текст → финал → Qwen TTS → playing → ended, панель «Воспроизведено»
Forms top: действие страницы Сессия fa575b25-8629-4179-82c7-a7f279231df9. Запрос cc2cce4d-72a0-4074-9ded-fecd9785987a: список инструментов, затем native select_pet_product с product_id=dog-ball; товар выбран, ответ озвучен. Monitor: команда выполнена, ошибок 0
Диагностика шага В модалке показаны page_action, источник native, аргументы выбора товара и подтверждённый результат selection_revision=1
Перезагрузка Forms Сессия top и история восстановлены; новый client/context. История не запустила повторный выбор товара или озвучку
Forms внутри iframe Отдельная сессия 5fd23bab-74c1-4e94-b16f-ea17ebb382eb. Запрос 493fc183-9ac2-4b8c-9f87-3b11613ca913: ответ, потоковые фрагменты и TTS ended подтверждены. Панель ограничена областью iframe
ASR на сохранённой записи Файл ordinary/03-clean.flac, 1,97 с. Подан через временный синтетический MediaStream, физический микрофон не использовался. Получено «давай выйдем немного раньше». Monitor: транскрипция распознана, ошибок 0
Закрытие панели Оба тестовых MediaStream перешли в ended, AudioContext закрыты, оригинальный getUserMedia восстановлен. В Monitor активных аудиоподключений 0
Публичные ресурсы Анонимные HEAD entry/worklet/WASM/ONNX: HTTP 200, корректный MIME, ACAO *. Entry no-cache; хешированные ресурсы immutable
Авторизация Forms реально получил bootstrap 200 и продление 200; технический OPTIONS 204. POST без входа перенаправляется в Slim Auth

В первом коротком TTS worker сообщил first_block_ms=283, 23 блока и 2160 мс аудио. Это время worker до первого блока, не измеренная задержка от запроса пользователя до слышимого звука. Новый сравнительный benchmark не выполнялся.

На Forms первый запуск VAD потребовал загрузки ресурсов; запрос worker-модуля занял около 7,9 с, повторный — около 10 мс. Это отдельное наблюдение холодного браузерного запуска, не время распознавания модели.

Обнаруженные ограничения

  1. Agent на бытовой фразе. После корректного ASR «давай выйдем немного раньше» Agent вызвал инструменты и достиг лимита 10 действий. Запрос 1e420f8a-2697-585f-900f-dfc92367de3b: транскрипция успешна, связанная команда завершилась ошибкой. В этой поставке Agent не менялся; исправление выбора инструментов осталось отдельной задачей. Выбор товара через настоящий инструмент ранее прошёл успешно.
  2. Разовый сетевой сбой продления. После успешного продления 200 следующий bootstrap завершился net::ERR_CONNECTION_CLOSED. Панель показала access_expired; видимая кнопка «Повторить» восстановила соединение без повторного входа. Это не наблюдавшийся отказ CORS/профиля; текст ошибки интерфейса не различает причины обновления доступа.
  3. Чужие сайты. Публичного script-тега достаточно для загрузки пакета, но cookies Slim Auth, CSP, HTTPS, sandbox и Permissions Policy принимающей страницы продолжают определять возможность подключения и голоса. Проверены Chat Agent, Forms и вложенный Forms, не все сторонние браузеры/домены.

Объём изменений

Область Добавлено Удалено Чистое изменение
Рабочий код и конфигурация Chat Agent 117 54 +63
Рабочий код и конфигурация Forms 5 4 +1
Тесты 133 13 +120
Документация 46 9 +37

Итого рабочий код/конфигурация +64 строки, не сокращение общего объёма. Удалены зависимость от маршрута сессии и прежний фиксированный origin, ресурсы сведены в одну сборку. Новые сервисы не добавлены, панель и аудиотракт переиспользуются.

Свидетельства

  • registry-proof.json, runtime-chat-agent.json, frontend-delivery.json, gateway-delivery.json — registry, revision и поставка.
  • chat-agent-wire.json — отфильтрованные поля тестового обмена без токенов доступа и аудиотел.
  • monitor-session.txt, monitor-live.png — команды, успешная транскрипция и отдельная ошибка Agent.
  • public-assets-check.json, published-resources.json — опубликованные ресурсы и заголовки.
  • chat-agent-live.png, forms-live.png, forms-tool-step.png, forms-iframe-live.png — проверка интерфейса.
  • Локальные логи проверок, patch и source-stats.json находятся в той же папке.

Исходник

Скачать Markdown · К материалам исследования