Руководство и понимание

Безопасный для браузера искусственный интеллект в реальном времени через шлюз API: эфемерные токены, политика арендаторов и управление голосовыми сеансами

Практическая архитектура для браузера и мобильного голосового искусственного интеллекта: обеспечивает низкую задержку мультимедиа в реальном времени с помощью кратковременных учетных данных клиента, в то время как шлюз обеспечивает соблюдение политики арендатора, проверку бюджета, средства управления инструментами и журналы аудита.

Браузеры и мобильные приложения не должны получать долгосрочные ключи API поставщика. Однако для голосового ИИ в реальном времени отправка каждого аудиопакета через шлюз может увеличить задержку, эксплуатационные расходы и режимы сбоя. Лучше всего оставить шлюз в плоскости управления: аутентифицировать пользователя, обеспечить соблюдение политики арендатора, зарезервировать бюджет, создать узкие кратковременные учетные данные реального времени и позволить чувствительным к задержкам носителям использовать транспорт реального времени провайдера, где это возможно.

В этой статье описывается шаблон реализации для команд, создающих голосовые агенты, помощники по вызову, мобильные репетиторы, вторые пилоты службы поддержки или голосовые интерфейсы в приложениях через шлюз AI API. Цель — безопасность браузера без потери управления арендатором.

Проблема: прямые соединения в реальном времени обходят ваш контроль

Простой прокси-сервер на стороне сервера привлекателен тем, что он централизует ключи и обеспечивает возможность наблюдения. Для стандартных текстовых запросов часто это правильная модель. Звук в реальном времени отличается. Голосовой сеанс может включать в себя непрерывный входной сигнал микрофона, двунаправленный аудиовыход, прерывания, вызовы инструментов и строгие ожидания задержки. Проксирование всех носителей через шлюз может превратить шлюз в ретранслятор мультимедиа с высокой пропускной способностью вместо службы политики и выставления счетов.

Прямое подключение браузера к провайдеру решает проблему задержки, но создает другую проблему:

<ул>
  • Браузер не может безопасно хранить стандартный ключ API поставщика.
  • Проверку бюджета арендатора можно пропустить, если приложение подключается напрямую.
  • Ограничения модели, региона, голоса, модальности и инструментов становятся обещаниями на стороне клиента.
  • Атрибуция использования становится неполной или задерживается.
  • Отделы безопасности теряют точку принятия решения, которую можно проверить, еще до начала сеанса.
  • Практический подход заключается не в том, чтобы «проксировать каждый байт». Это «посредник каждой сессии».

    Факты, рекомендации и прогнозы

    Факты. Поставщики искусственного интеллекта в реальном времени все чаще поддерживают транспорты с малой задержкой, такие как WebRTC, WebSocket и SIP. В общедоступной документации OpenAI Realtime API описаны интерфейсы реального времени с малой задержкой, включая WebRTC. Руководство по WebRTC в реальном времени Azure OpenAI описывает приложение браузера, использующее серверную службу токенов для получения эфемерного токена перед запуском подключения WebRTC, и предостерегает от использования стандартного ключа API в клиентском приложении. В руководстве OpenAI Agents SDK в реальном времени также рекомендуется использовать поток, в котором серверная часть создает недолговечный эфемерный клиентский токен, а браузер использует его для установления соединения WebRTC.

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

    Прогнозы: API-интерфейсы поставщиков реального времени в течение некоторого времени будут оставаться неравномерными. Срок действия токенов, поля конфигурации сеанса, элементы управления отключением на стороне сервера, события использования и поддержка регионов будут различаться. Шлюзы должны явно моделировать возможности поставщика, а не делать вид, что все API реального времени идеально переносимы.

    Эталонная архитектура: шлюз как плоскость управления в реальном времени

    Безопасный для браузера поток операций в реальном времени состоит из пяти частей:

    <ол>
  • Клиентское приложение: браузер или мобильное приложение, запрашивающее голосовой сеанс.
  • Бэкэнд приложения: проверяет подлинность конечного пользователя и вызывает шлюз или внедряет логику создания токенов шлюза, если шлюз является частью серверного стека.
  • Шлюз AI API: обеспечивает соблюдение политики клиента, определяет профиль модели, резервирует бюджет, записывает сеанс и создает эфемерный секрет клиента поставщика.
  • Поставщик реального времени: завершает работу WebRTC или другого транспорта в реальном времени.
  • Регистрация и аналитика: учитывает использование после того, как становятся доступны события поставщика, данные о продолжительности или окончательные отчеты об использовании.
  • Шлюзу не обязательно ретранслировать каждый аудиокадр, чтобы оставаться авторитетным. Ему должно принадлежать решение о создании сеанса и путь согласования.

    Рекомендуемая последовательность запросов

    <ол>
  • Пользователь открывает голосовую функцию в клиентском приложении.
  • Клиент вызывает ваш сервер: POST /voice/sessions.
  • Бэкэнд проверяет сеанс пользователя и пересылает запрос mint на шлюз с идентификатором клиента, идентификатором пользователя, предполагаемой функцией, метаданными устройства и источником.
  • Шлюз оценивает политику и бюджет.
  • Шлюз создает локальную запись realtime_session перед обращением к поставщику.
  • Шлюз вызывает поставщика, используя его защищенные учетные данные среды выполнения, и создает эфемерный сеанс реального времени с узкой областью действия.
  • Шлюз возвращает браузеру только эфемерный секрет клиента и утвержденные метаданные сеанса.
  • Браузер устанавливает соединение WebRTC напрямую с провайдером.
  • Шлюз принимает события использования поставщика, обратные вызовы, результаты опросов или консервативные оценки на основе продолжительности.
  • В реестре рассчитывается зарезервированный бюджет и записываются события аудита.
  • Предварительная проверка правил

    Самый важный момент соблюдения требований — до того, как эфемерный токен будет отчеканен. Если у браузера есть кратковременные учетные данные, принудительное применение в середине сеанса может быть ограничено, если поставщик не поддерживает элементы управления обновлением сеанса, отключением, наблюдением или обратным вызовом.

    Шлюз должен проверить как минимум:

    <ул>
  • Статус арендатора: активный, приостановленный, пробный, с предоплатой, с выставленным счетом или помещенный в карантин.
  • Права пользователя: может ли этот пользователь использовать голосовую связь в реальном времени, а не только текстовый чат.
  • Разрешенный профиль модели: одобренная модель или развертывание в реальном времени, а не произвольные идентификаторы моделей, предоставленные клиентом.
  • Регион и политика хранения: соответствует ли выбранный регион поставщика и набор функций правилам данных клиента.
  • Максимальная продолжительность сеанса: например, 5, 15 или 30 минут в зависимости от плана.
  • Допустимые модальности: аудиовход, аудиовыход, текст, изображение или вызовы инструментов.
  • Шаблон голоса и инструкций: фиксирован или ограничен политикой.
  • Доступный бюджет: предоплаченный остаток, зарезервированный ежемесячный лимит или максимальный размер расходов на каждую функцию.
  • Параллелизм: активные голосовые сеансы на уровне клиента и пользователя.
  • Контроль злоупотреблений: отметки о рисках для пользователей, репутация источника, необычная скорость вызова или отключение клиента.
  • Безопасным вариантом по умолчанию является отклонение неоднозначных запросов. Если клиент запрашивает модель, инструмент, голос или регион, которых нет в политике реального времени клиента, шлюз должен вернуть явную ошибку политики вместо молчаливого расширения доступа.

    Дизайн записи сеанса

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

    {
      "session_id": "rt_01j...",
      "tenant_id": "tenant_123",
      "end_user_id": "user_hash_456",
      "провайдер": "провайдер_а",
      «provider_session_id»: ноль,
      "model_profile": "стандарт голосовой поддержки",
      "upstream_model_or_deployment": "realtime-model-x",
      "регион": "истус",
      "session_config_hash": "sha256:...",
      "allowed_modalities": ["audio_input", "audio_output"],
      "allowed_tools": ["lookup_order_status"],
      "tool_approval_policy": "approve_side_effects",
      "budget_reservation_id": "resv_789",
      «max_duration_секунд»: 900,
      "issued_at": "2026-08-21T10:00:00Z",
      "expires_at": "2026-08-21T10:01:00Z",
      "client_origin": "https://app.example.com",
      "device_id_hash": "sha256:...",
      "статус": "чеканка"
    

    По умолчанию не сохраняйте необработанный звук микрофона или полные подсказки. Храните хэши конфигурации, идентификаторы, решения по политике и минимальный метаданные, достаточные для аудита, поддержки и выставления счетов. Если запись требуется, сделайте ее явной, с учетом согласия и на основе политики клиента.

    Конечная точка создания эфемерного токена

    Конечная точка, обращенная к шлюзу, может выглядеть так:

    POST /v1/realtime/sessions
    Авторизация: носитель 
    Тип контента: приложение/json
    {
      "tenant_id": "tenant_123",
      "end_user_id": "user_hash_456",
      "feature": "support_voice_agent",
      "origin": "https://app.example.com",
      "device_nonce": "8f3b...",
      "requested_profile": "стандарт голосовой поддержки"
    

    Ответ не должен раскрывать ключ среды выполнения исходного потока:

    {
      "session_id": "rt_01j...",
      "провайдер": "провайдер_а",
      "транспорт": "webrtc",
      "client_secret": "ephemeral_secret_here",
      "expires_at": "2026-08-21T10:01:00Z",
      "одобрено": {
        "model_profile": "стандарт голосовой поддержки",
        «max_duration_секунд»: 900,
        "modality": ["audio_input", "audio_output"],
        "tools": ["lookup_order_status"]
      }
    

    Привяжите выдачу к источнику, сеансу аутентифицированного пользователя, арендатору и одноразовому номеру. Поставщик может не поддерживать все эти привязки изначально, поэтому применяйте все, что можете, на шлюзе: ограничивайте попытки создания монет, отклоняйте неожиданные источники, записывайте метаданные устройства и сокращайте срок действия токена.

    Шаблоны сеансов: по умолчанию сужаются

    Шаблон сеанса в реальном времени должен быть более строгим, чем общий запрос на завершение чата. Голосовые сеансы интерактивны, их сложнее проверять в режиме реального времени, и они могут длиться дольше, чем ожидалось.

    Рекомендуемые поля шаблона включают:

    <ул>
  • Фиксированная модель или развертывание: выбирается профилем модели на стороне шлюза.
  • Инструкции: шаблон запроса, управляемый сервером, с переменными, одобренными арендатором.
  • Голос: выбран из белого списка.
  • Модальность: отключите режимы текста, изображения или инструментов, если они не нужны продукту.
  • Настройки входного звука: обнаружение поворота, поведение транскрипции или обработка тишины, если это поддерживается.
  • Ограничения вывода: максимальная длина ответа или поведение ответа, если оно поддерживается.
  • Разрешенный список инструментов: только инструменты, необходимые для этой функции.
  • Продолжительность сеанса: короткий срок действия учетных данных плюс максимальная продолжительность звонка.
  • Строгие шаблоны снижают гибкость, но упрощают затраты, соблюдение требований и поддержку. Если командам разработчиков нужны динамические голоса или инструкции, предоставляйте контролируемые варианты профиля вместо того, чтобы передавать поставщику произвольную конфигурацию клиента.

    Управление бюджетом для голосовой связи в реальном времени

    Использование в реальном времени может быть сложнее оценить до того, как появится окончательный поставщик услуг. Сеанс может длиться пять секунд или двадцать минут. Он может включать в себя аудиовход, аудиовыход, транскрипцию, вызовы инструментов и текстовые токены. Поэтому шлюз должен сочетать в себе резервирование, ограничения и сверку.

    Перед созданием

    <ул>
  • Оцените наихудшую или консервативную стоимость сеанса на основе максимальной продолжительности, модели, условий и плана арендатора.
  • Зарезервируйте бюджет перед раскрытием секрета клиента.
  • Отклонять новые сеансы, если у арендатора недостаточно баланса или достигнут дневной лимит голосовой связи.
  • Во время сеанса

    <ул>
  • Отслеживайте активные сеансы и ожидаемую скорость сжигания.
  • Применить ограничения на одновременную работу клиентов и пользователей.
  • Используйте поддерживаемые провайдером функции завершения или обновления сеанса, если они доступны.
  • Вызывать оповещения о ненормальной продолжительности сеанса, повторных повторных подключениях или необычном использовании голосовой связи.
  • После сеанса

    <ул>
  • Принимать события использования поставщика или окончательные отчеты об использовании, если таковые имеются.
  • Приведите зарезервированный бюджет к фактической стоимости.
  • Если конкретное использование задерживается или является неполным, сохраните консервативное резервирование до сверки.
  • Атрибуция использования арендатору, пользователю, функции, профилю модели и идентификатору сеанса.
  • Это менее точно, чем синхронное текстовое выставление счетов в момент ответа, но с точки зрения эксплуатации оно безопаснее, чем выдача прямых учетных данных без резервирования.

    Вызовы инструментов внутри сеансов в реальном времени

    Голосовые агенты в реальном времени часто становятся более полезными, когда они могут вызывать инструменты: искать учетную запись, записываться на прием, обновлять заявку или запускать рабочий процесс. Рассматривайте выполнение инструмента отдельно от передачи звука.

    Медиа-подключение браузера не должно подразумевать разрешение на выполнение побочных эффектов. Шлюз или серверная часть должны обеспечивать следующее:

    <ул>
  • Реестр инструментов: у каждого инструмента есть владелец, схема, области действия и уровень риска.
  • Списки разрешенных. В шаблонах сеансов точно перечислены доступные инструменты.
  • Ворота одобрения. побочные действия требуют подтверждения пользователя, одобрения человека или утверждения политики.
  • Отдельные учетные данные: учетные данные инструмента никогда не внедряются в сеанс браузера.
  • Объединенный журнал аудита: каждый вызов инструмента ссылается на идентификатор сеанса в реальном времени.
  • Например, голосовому агенту службы поддержки может быть разрешено автоматически вызывать lookup_order_status, но для refund_pay может потребоваться явное подтверждение и событие внутреннего утверждения. Поставщик реального времени может организовать диалог, но границы разрешений должен определять ваш шлюз.

    Видимость без проксирования каждого байта

    Прямой медиапоток WebRTC снижает задержку шлюза и нагрузку на полосу пропускания, но видимость становится более зависимой от событий поставщика и метаданных вашего собственного сеанса. Создавайте аналитику на основе нескольких источников данных:

    <ул>
  • Записи о создании сеанса со шлюза.
  • События жизненного цикла на стороне клиента, такие как подключение, отключение, попытка повторного подключения, отказ в микрофоне или завершение вызова.
  • Идентификаторы сеансов поставщика, события использования или окончательные записи использования.
  • Оценки на основе продолжительности, когда использование поставщика задерживается.
  • Журналы вызовов инструментов объединены по идентификатору сеанса.
  • Записи о резервировании бюджета и расчетах.
  • Не ждите идеальных телеметрических данных поставщика, прежде чем запускать элементы управления. Начните с консервативного резервирования и четкой атрибуции, а затем повышайте точность расчетов по мере развития отчетов об использовании поставщика.

    Контрольный список безопасности

    <ул>
  • Никогда не отправляйте стандартные ключи API поставщика браузерным или мобильным клиентам.
  • Используйте кратковременные эфемерные секреты клиента для запуска сеанса в реальном времени.
  • Аутентификация конечного пользователя перед созданием токена.
  • По возможности свяжите решения по выпуску с метаданными арендатора, пользователя, источника, nonce и устройства.
  • Храните учетные данные среды выполнения поставщика в внутреннем хранилище или секретном хранилище шлюза.
  • Запишите строку аудита сеанса перед созданием поставщика.
  • Используйте шаблоны сеансов, одобренные арендатором, вместо произвольной конфигурации клиента.
  • Применить ограничения одновременного использования, ежедневного использования и максимальной продолжительности.
  • Используйте списки разрешенных инструментов и шлюзы утверждения для устранения побочных эффектов.
  • По умолчанию минимизировать сохранение необработанных подсказок и звука.
  • Поддерживать матрицу возможностей поставщика для сроков действия токенов, регионов, инструментов, событий использования и контроля прекращения действия.
  • Матрица возможностей поставщика

    Поскольку API реального времени различаются, моделируйте адаптер шлюза исходя из возможностей, а не предположений. Простая матрица может способствовать принятию решений по маршрутизации и политике:

    {
      "провайдер_а": {
        "транспорты": ["webrtc", "websocket"],
        «ephemeral_client_tokens»: правда,
        "token_ttl_секунды": 60,
        «server_side_disconnect»: правда,
        «session_update»: правда,
        "usage_events": "final_and_incremental",
        "регионы": ["нас", "ес"],
        «tool_approval_supported»: правда
      },
      "provider_b": {
        "транспорты": ["веб-сокет"],
        «ephemeral_client_tokens»: правда,
        «токен_ттл_секунды»: 120,
        «server_side_disconnect»: ложь,
        «session_update»: ложь,
        "usage_events": "final_only",
        "регионы": ["нас"],
        «tool_approval_supported»: ложь
      }
    

    Если арендатору требуется резидентство в ЕС и завершение на стороне сервера, шлюз должен маршрутизироваться только к поставщикам и развертываниям, которые удовлетворяют обоим требованиям. Если ни один поставщик не соответствует политике, закрытие при сбое.

    Путь миграции

    Вам не нужно создавать каждый элемент управления с первого дня. Практическое внедрение:

    <ол>
  • Только создание прокси-сеанса. сохраните прямое воспроизведение мультимедиа, но требуйте, чтобы все сеансы в реальном времени создавались серверной частью или шлюзом.
  • Добавьте шаблоны политик: замените предоставленные клиентом поля модели и инструкций утвержденными профилями.
  • Добавить резервирование бюджета: зарезервируйте консервативную стоимость сеанса перед выпуском токена.
  • Добавьте аналитику жизненного цикла: соберите информацию о начале сеанса, подключении, отключении, продолжительности, идентификаторе сеанса поставщика и статусе расчета.
  • Добавить управление инструментом: для вызовов инструментов в реальном времени требуются списки разрешенных и разрешения.
  • Добавьте маршрутизацию возможностей поставщика. выберите поставщиков по региону, модальности, поддержке мероприятий и средствам контроля завершения.
  • Добавьте дополнительные рабочие процессы наблюдения или записи: только в том случае, если это соответствует требованиям, получено согласие и одобрено арендатором.
  • Практическое заключение

    Для голосового ИИ в реальном времени шлюз AI API не должен автоматически становиться ретранслятором мультимедиа. Более безопасная архитектура с меньшей задержкой заключается в том, чтобы шлюз отвечал за плоскость управления: аутентифицировал пользователей, применял политику арендатора, резервировал бюджет, создавал запись аудита, создавал эфемерные учетные данные с узкой областью действия и согласовывал использование после сеанса.

    Основное правило реализации простое: браузеры могут получать кратковременные секреты сеанса, а не долгоживущие ключи поставщика. Все остальное вытекает из этой границы: строгие шаблоны, создание с учетом происхождения, ограничение количества одновременных сессий, утверждение инструментов, урегулирование использования и матрицы возможностей поставщика. Это дает группам разработчиков возможность голосового взаимодействия в режиме реального времени, не отказываясь от управления ключами API, контроля затрат AI API, командного управления API или аналитики использования ИИ.

    Связанное чтение

    FAQ

    Часто задаваемые вопросы

    Должен ли шлюз проксировать весь звук в реальном времени?
    Не по умолчанию. Проксирование всех носителей может увеличить задержку и затраты на полосу пропускания. Для голосовых сеансов браузера распространенной схемой является разрешение мультимедиа использовать транспорт поставщика с низкой задержкой, такой как WebRTC, в то время как шлюз управляет созданием сеанса, политикой, резервированием бюджета, событиями аудита и расчетами.
    Достаточно ли эфемерных токенов реального времени для защиты сеансов искусственного интеллекта в браузере?
    Нет. Короткоживущие токены уменьшают радиус взрыва, но серверная часть или шлюз по-прежнему нуждаются в аутентификации, проверке происхождения, проверке прав арендатора, ограничениях скорости, шаблонах сеансов и средствах контроля злоупотреблений перед выпуском токена.
    Как следует выставлять счета за голосовые сеансы в реальном времени, если использование происходит поздно?
    Зарезервируйте умеренную сумму перед созданием сеанса, а затем рассчитывайте фактическое использование провайдера, когда поступят окончательные события или отчеты. Если точное использование является неполным, объедините данные поставщика с продолжительностью, моделью, условиями и оценками, определенными политикой, до сверки.
    Как следует обрабатывать вызовы инструментов в голосовых агентах реального времени?
    Рассматривайте инструменты как отдельную границу управления. Используйте списки разрешенных инструментов, отдельные учетные данные серверной части, уровни риска, шлюзы утверждения для побочных эффектов и журналы аудита, которые связывают каждый обратный вызов инструмента с идентификатором сеанса в реальном времени.