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

Модуль XVI — голосовые агенты и агенты реального времени

Модуль XVI управляет разговорными агентами и агентами реального времени. Это плоскость наблюдения и управления: она не переизобретает голосовой SDK (Realtime API, WebRTC, ASR или TTS) и сама никогда не открывает медиапоток. Она решает, кто может открыть голосовую сессию, с какой моделью и провайдером, под какой политикой, и отслеживает метаданные этой сессии — но никогда её содержимое.

Открытие голосового интерфейса трактуется как привилегированное действие, а не свободная операция. Политика — default-DENY: сессия без разрешающей политики отклоняется. Открытие двухфазное и проходит через гейт human-in-the-loop (approval gate); оно привязано к plan_hash, так что одобрение нельзя молча повысить до более сильной модели (anti-TOCTOU), аудируется на реального принципала (никогда system) и фиксируется в режиме только добавление. Сам модуль никогда не вызывает провайдера — актуация уходит через отдельный seam отправки.

Вторая половина — наблюдение: модуль отслеживает только метаданные сессии — вычисляемое состояние (live/idle/ended, вычисляемое во время чтения по свежести активности, без хранимой колонки жизненного цикла), число ходов, длительность, задержку (честные среднее и максимум по реальным сэмплам) и язык BCP-47. Из этого он поднимает управленческие findings: нарушение политики, когда телеметрия называет агента/модель/провайдера, не разрешённого ни одной политикой; finding деградации задержки, когда задержка пересекает SLA политики; и finding неуправляемого открытия, когда открытие пытаются выполнить без подключённого гейта — пробел поверхностируется, а открытие всё равно отклоняется.

Модуль объявляет три сущности в общей модели данных:

СущностьИзменяемостьНазначение
sessionизменяемая (upsert)метаданные сессии; ноль содержимого
policyизменяемаяуправленческое объявление — кто может открыть, с какой моделью/провайдером (default-DENY)
decisionтолько добавлениенеизменяемый журнал решений об открытии/закрытии

Политика сопоставляется по агенту, разрешённой модели и разрешённому провайдеру (каждый конкретный или wildcard), с опциональными границами по минутам сессии и SLA задержки. Отсутствие сопоставленной политики означает DENY. Журнал решений записывает каждый open_request, open и close с вердиктом политики, статусом гейта и статусом исхода. Доступ на чтение — роль viewer и выше; объявление политики и открытие сессии — это административные, тенантно-ограниченные и аудируемые действия. Эти маршруты модуля публикуются в отдельном beta-справочнике маршрутов модулей, а не в стабильном основном контракте — их форма на уровне полей живёт в типизированных интерфейсах продукта. Денежных сумм здесь нет; FinOps (модуль XI) владеет стоимостью.

Модуль владеет deny-closed seam-ом приёма — собственным событием voice.telemetry.observed — через который внутрипроцессный зонд подавал бы метаданные сессии. Протокол по построению содержит минимум данных: парсер телеметрии несёт allow-list и отклоняет всё событие, если видит запрещённый ключ, поэтому никакое аудио, текст транскрипта, текст ASR/TTS, содержимое prompt/response или PII говорящего никогда не могут быть сохранены. Единственный сохраняемый сигнал транскрипта — односторонний хеш внешнего локатора транскрипта — доказательство того, что транскрипт существует, но никогда сам транскрипт. Управленческие findings излучаются как finding.reported с хешированными деталями, после коммита.

Управляемое открытие отправляет команду вживую: как только оператор обеспечит голосовой диспетчер, одобренное открытие чеканит серверный эфемерный учётный данные и возвращает только этот учётный данные плюс координаты подключения — модель, голос, инструменты и определение ходов фиксируются из политики, никогда от клиента, а мастер-ключ провайдера никогда не покидает сервер. Без этого обеспечения seam отправки находится в режиме deny-closed: одобренное открытие честно записывается как «declared, not opened», а не подделывается.