Обзор
Модели реального времени работают через долгоживущее WebSocket-соединение: аудио поступает в поток, аудио передаётся из потока, а модель можно прервать прямо посреди фразы — без цикла «записать, загрузить, подождать, воспроизвести». Отличие от объединения ASR + текстовой модели + TTS заключается в том, что это сквозная система: модель напрямую воспринимает интонацию, паузы и эмоции и напрямую говорит. Задержка составляет менее секунды. В настоящее время APIYI предлагает 4 модели на базе 2 протоколов, использующие один эндпоинт и один ключ:gpt-realtime-2.1/gpt-realtime-2.1-mini— протокол OpenAI Realtime GAqwen3.5-omni-plus-realtime/qwen3.5-omni-flash-realtime— протокол Alibaba Cloud Model Studio
server_vad и semantic_vad обнаружение окончания реплики, полный цикл вызова функций (включая внедрение результата), ввод изображений и usage с разбивкой по модальностям. Всё перечисленное проверено на всех четырёх моделях (первая проверка 2026-08-24, повторная проверка 2026-09-14, UTC+8).model без изменения тела запроса не сработает — это безусловно самая распространённая ошибка интеграции. Различия сводятся к 6 полям и 3 именам событий, перечисленным ниже в разделе «Сравнение протоколов».Поддержка WeCom
Руководство по API
Ключи и группы
Журналы вызовов
Пусть AI-агент выполнит интеграцию
.md к любому docs URL), а затем напишет code под ваш стек — в требования уже заложены две семейства полей, жёсткое ограничение по sample rate, семантика cancel и отключения при простое.Пусть кодирующий агент интегрирует или отладит Realtime voice. Скопируйте и вставьте в Codex, Claude Code, Cursor и похожие инструменты.
Что этот prompt помогает вам избежать
Что этот prompt помогает вам избежать
Почему APIYI для голосовой связи в реальном времени
Один ключ, четыре модели
wss эндпоинт и те же данные авторизации. Для смены модели достаточно изменить параметр model и соответствующий шаблон полей — не нужно поддерживать второй аккаунт у поставщика.Прямой доступ без зарубежной настройки
api.apiyi.com из дата-центров в материковом Китае, домашней сети или зарубежных узлов. Аккаунт у вышестоящего поставщика, подтверждение личности и предварительная оплата не требуются.Различия протоколов уже сопоставлены
Бесплатное самостоятельное тестирование через текст
Измеренные задержка и параллельные запросы
Прямая инженерная поддержка
Основные возможности
Двунаправленная потоковая передача, прерываемая
response.cancel в любое время. Сессия сохраняется, контекст сохраняется. Проверено на всех четырёх моделях.Два режима определения смены реплики
server_vad разделяет по длительности тишины, semantic_vad разделяет по намерению (лучше игнорирует слова-паразиты вроде «uh-huh»). Оба режима проверены на всех четырёх моделях.Полный цикл вызова функций
function_call_output внедряет результат, и модель продолжает отвечать. Проверено от начала до конца на всех четырёх моделях.Ввод изображений, учёт использования по модальностям
usage возвращает tokens текста / аудио / изображений отдельно, чтобы можно было отнести стоимость. Проверено на всех четырёх моделях.Поддерживаемые модели
Тарификация
gpt-realtime-2.1 входные аудио-данные стоят $32 против $4 для текста; выходные аудио-данные — $64 против $24 для текста). Во время интеграции используйте только текст, а после проверки цепочки переключитесь на аудио — см. раздел «Начните с текста» ниже.Протокол Realtime GA
Протокол Model Studio
Измерения тарификации различаются: входные изображения включаются в текстовый уровень, а выходные данные разделяются на «только текст» и «текст + аудио» (при последней ставке тарифицируется только аудиочасть).response.cancel) тарифицируется по фактически сгенерированному объёму, а пустая сессия не тарифицируется. Входные данные из кэша пока не тарифицируются со скидкой: попадания в кэш достоверно отображаются в usage.cached_tokens, но APIYI в настоящее время тарифицирует их по соответствующей ставке для входных текстовых данных. Официальная ставка для кэшированных данных начнёт применяться автоматически после исправления пути тарификации; об этом будет объявлено в журнале изменений. Цены могут изменяться в соответствии с политикой поставщиков и доступностью ресурсов. Эта возможность предоставляется для обеспечения поставок и обслуживания клиентов, а не как ориентированное на получение прибыли предложение.Группа доступа
Технические характеристики
Измеренная задержка и параллельные запросы
Измерено 2026-09-14 (UTC+8) по публичному путиapi.apiyi.com, gpt-realtime-2.1 и -mini при 20 и 40 параллельных сессиях для каждого, односторонний обмен только текстом:
Эндпоинт
model выбирает, к какой из них вы обратитесь.
⚠️ Сравнение протоколов (прочтите перед переключением моделей)
Обе семейства используют один и тот же эндпоинт, схему авторизации и общий поток событий. Различия сосредоточены в структуре поляsession.update и нескольких именах серверных событий.
Сравнение полей запроса
Сравнение серверных событий
session.created, session.updated, conversation.item.create, input_audio_buffer.append, input_audio_buffer.commit, response.create, response.cancel, response.done — называются одинаково в обоих.
Два минимальных payload для session.update
Один и тот же текст, записанный дважды; копируйте напрямую. Протокол Model Studio:Начните с текста: для чего нужен текстовый канал и трёхэтапная самопроверка
Аудиопайплайн включает захват с микрофона, ресемплинг, chunking и определение turns. Любое слабое звено проявляется как «ничего не происходит», а это трудно диагностировать. Поэтому не начинайте с микрофона.Текст — это управляющая плоскость, а не запасной способ ввода
В realtime voice model текст — это не «ещё один способ передать ввод», а весь канал управления, кроме аудиопотока:Трёхэтапная самопроверка
Шаг 1: только текст, без микрофона
output_modalities в режим только текста, отключите turn detection и отправьте один input_text. Уже это проверяет handshake, ключ и группу, правильно ли вы выбрали шаблон полей, сработал ли session.update, корректно ли подставляются tools, сохраняется ли многотуровый контекст и как ведут себя параллельные запросы. Вообще не создаётся ни одного audio token.Шаг 2: воспроизведите локальный wav-файл
input_audio_buffer.append блоками по 100 ms. Это отделяет аудиопайплайн (формат, частоту дискретизации, разбиение на чанки, commit, срабатывание VAD) от вашей бизнес-логики и делает процесс воспроизводимым — один и тот же файл должен дважды давать один и тот же результат.Шаг 3: подключите живой микрофон
Запускаемый текстовый smoke test
Зависит только отwebsockets (pip install websockets). Переключайте протоколы, изменяя одну переменную:
Особенности сессии: голос, определение смены реплики, инструменты, изображения
Голос
Определение смены реплики: server_vad и semantic_vad
server_vad— разделяет по длительности тишины, с простыми параметрами (threshold,silence_duration_ms,prefix_padding_ms).semantic_vad— разделяет по намерению в разговоре, игнорируя слова-паразиты и бессмысленный фоновый шум. Более устойчиво в средах с несколькими говорящими.- Вы также можете отключить определение смены реплики (
nullилиnone) и работать в ручном режиме: сами отправляйтеinput_audio_buffer.commit, затемresponse.create. Это подходит для интерфейсов push-to-talk, где сменой реплик управляет UI.
Вызов функций
Порядок событий: модель отправляетresponse.output_item.done типа function_call (содержащий call_id и arguments) → клиент выполняет его → результат подставляется → ещё одно response.create позволяет модели продолжить.
Ввод изображений
протокол Realtime GA: поместитеinput_image напрямую в сообщение; значение может быть data URI.
Error append image before append audio.. При тестировании рабочий подход — вставлять input_image_buffer.append в поток input_audio_buffer.append примерно с частотой один кадр в секунду.
Известные ограничения
Каждый пункт ниже измерен, и все они влияют на код клиента. Ознакомьтесь с этим разделом перед интеграцией.Лучшие практики
Сначала выбирайте шаблон поля по семейству протокола
session.update payloads как две константы конфигурации, выбираемые по имени модели, а не разбросанные по if-веткам. Именно эта часть чаще всего ломается при сопровождении спустя шесть месяцев.Закрепите параметры сеанса в первом фрейме
output_modalities, voice, speed, turn_detection и transcription в самом первом session.update. Особенно для голосового режима — после того как audio уже сгенерировано, будет слишком поздно.Сначала пройдите текстовый smoke test перед добавлением audio
Преобразуйте sample rate и channels на клиенте
Завершайте работу по output_item.done с тайм-аутом
response.done. Этот подход корректен для обеих семейств и помогает не зависать на одном ходе, когда пользователь прерывает.Добавьте поддержание соединения и переподключение для длительных сеансов
expires_at в Realtime GA. После переподключения повторно отправьте session.update и весь необходимый контекст, иначе новый сеанс будет работать с настройками по умолчанию.Используйте бэкенд-релей в продакшене
Ошибки и повторные попытки
event_id каждого события и session.id сессии и указывайте их при сообщении о проблеме — это значительно сокращает время диагностики. Также обратите внимание, что объекты ошибок Realtime GA содержат code и param (с указанием точного имени поля и допустимых значений), тогда как сообщения об ошибках Model Studio являются менее подробными. При отладке сначала проверьте синтаксис полей в Realtime GA.Часто задаваемые вопросы
Почему на этой странице нет интерактивной песочницы?
Почему на этой странице нет интерактивной песочницы?
Можно ли переключаться между четырьмя моделями, изменяя только имя модели?
Можно ли переключаться между четырьмя моделями, изменяя только имя модели?
modalities ↔ output_modalities, voice ↔ audio.output.voice, input_audio_format ↔ audio.input.format, turn_detection ↔ audio.input.turn_detection, input_audio_transcription ↔ audio.input.transcription, а также имена событий response.text.delta ↔ response.output_text.delta и response.audio.delta ↔ response.output_audio.delta. Полное соответствие приведено в разделе «Сравнение протоколов».Рукопожатие сразу завершается с ошибкой. Как это отладить?
Рукопожатие сразу завершается с ошибкой. Как это отладить?
wss://, а не https://; 2. эндпоинт содержит ?model=<model-name>; 3. присутствует заголовок Authorization: Bearer <key>; 4. группа ключа включает модель (все четыре модели входят в группу по умолчанию; несоответствие возвращает 503 с сообщением «нет доступного канала»); 5. промежуточный обратный прокси не удаляет заголовок Upgrade — это распространённая проблема при передаче запросов через собственный шлюз.Можно ли подключиться из браузера? Не станет ли мой ключ доступен другим?
Можно ли подключиться из браузера? Не станет ли мой ключ доступен другим?
Sec-WebSocket-Protocol, поэтому браузер WebSocket может подключаться напрямую. Но в этом случае ключ передаётся браузеру, где любой посетитель может прочитать его на вкладке сети, поэтому такой способ подходит только для локальной проверки. В рабочей среде создайте серверный релей: сервер хранит ключ и открывает соединение с APIYI, а фронтенд взаимодействует только с вашим сервисом.Отправка аудио с частотой дискретизации 16 кГц в gpt-realtime-2.1 завершается с ошибкой. Почему?
Отправка аудио с частотой дискретизации 16 кГц в gpt-realtime-2.1 завершается с ошибкой. Почему?
integer_below_min_value. Правильный вариант — "audio": {"input": {"format": {"type": "audio/pcm", "rate": 24000}}}. Для двух моделей Model Studio требуется частота 16 кГц — эти варианты несовместимы.У меня нет микрофона / аудио сложно тестировать. Что делать?
У меня нет микрофона / аудио сложно тестировать. Что делать?
say и afconvert — команды приведены в этом разделе.После отправки response.cancel я никогда не получаю response.done.
После отправки response.cancel я никогда не получаю response.done.
response.text.done, response.content_part.done и response.output_item.done, но response.done не передаётся. Используйте response.output_item.done как сигнал завершения хода и добавьте тайм-аут в качестве резервного механизма. Сама сессия не затрагивается, и диалог продолжается в обычном режиме. Две модели Realtime GA работают здесь корректно.Моё соединение разрывается примерно через 5 минут.
Моё соединение разрывается примерно через 5 минут.
session.update), либо примите отключение и автоматически подключайтесь заново. После повторного подключения не забудьте повторно отправить session.update и весь необходимый контекст.Как долго может оставаться открытой одна сессия?
Как долго может оставаться открытой одна сессия?
session.created содержит expires_at, значение которого составляет примерно 30 минут с момента подключения, после чего необходимо подключиться заново. В протоколе Model Studio основным наблюдаемым ограничением является отключение после 300 секунд бездействия. Проектируйте длительные диалоги с учётом того, что срок действия сессий истекает, и заранее продумайте перенос контекста между сессиями.Как задать голос и почему при его изменении возвращается cannot_update_voice?
Как задать голос и почему при его изменении возвращается cannot_update_voice?
session.update: на верхнем уровне voice для Model Studio и audio.output.voice для Realtime GA. После того как сессия вывела аудио, изменить голос больше нельзя — это относится к обоим протоколам и возвращает cannot_update_voice. Зафиксируйте голос в первом кадре и откройте новую сессию для его смены. Кроме того, не отправляйте пустую строку в качестве голоса в Model Studio: это возвращает 400.В ручном режиме commit я не получаю транскрипцию входного аудио.
В ручном режиме commit я не получаю транскрипцию входного аудио.
flash в Model Studio не передаёт событие завершения транскрипции в ручном режиме commit (это стабильно воспроизводится в разных запусках); модель plus передаёт его, и обе модели работают в режиме VAD. Переключитесь на server_vad или semantic_vad. Тестирование показывает, что в этом случае текст транскрипции записывается в недокументированное поле событий delta, однако это поле может измениться в любой момент, и полагаться на него не следует. Это влияет только на отображение сказанного пользователем в вашем интерфейсе — диалог не нарушается, а модель корректно понимает аудио и отвечает на него.Поддерживается ли ввод изображений? Почему я получаю Error append image before append audio.?
Поддерживается ли ввод изображений? Почему я получаю Error append image before append audio.?
input_image помещается непосредственно в сообщение. В Model Studio изображения обрабатываются как кадры видео, поэтому аудио необходимо добавлять перед любым изображением, что и вызывает эту ошибку. В ходе тестирования рабочий подход заключался во вставке кадров изображений в аудиопоток примерно по одному кадру в секунду.Поддерживается ли кэширование промптов? Как подтвердить попадание в кэш?
Поддерживается ли кэширование промптов? Как подтвердить попадание в кэш?
usage.input_token_details.cached_tokens (префикс длиной не менее 1024 token с шагом 128 token). Обратите внимание: APIYI в настоящее время тарифицирует кэшированные token по полной ставке для текстового ввода; о скидке будет объявлено в журнале изменений после её запуска. Для двух моделей Model Studio попаданий в кэш не наблюдалось.Поддерживаются ли WebRTC, SIP или эфемерные ключи (client_secrets)?
Поддерживаются ли WebRTC, SIP или эфемерные ключи (client_secrets)?
POST /v1/realtime/client_secrets и POST /v1/realtime/calls в APIYI возвращают 404, SIP также недоступен; единственной точкой входа является один эндпоинт WebSocket wss://api.apiyi.com/v1/realtime. Для клиентов браузера или мобильных приложений создайте серверный релей: сервер хранит ключ и открывает WebSocket-соединение, а фронтенд взаимодействует только с вашим сервисом.Работают ли поля сессии GA, такие как reasoning.effort и noise_reduction, в gpt-realtime-2.1?
Работают ли поля сессии GA, такие как reasoning.effort и noise_reduction, в gpt-realtime-2.1?
session.updated: reasoning.effort (minimal / low / medium / high / xhigh, принимаются обеими моделями), audio.input.noise_reduction, audio.input.turn_detection.idle_timeout_ms, audio.input.transcription.model (включая gpt-realtime-whisper), truncation, tracing, max_output_tokens и parallel_tool_calls. Семантика полей соответствует справочной документации OpenAI; шлюз не изменяет их.Как оценить стоимость? Текст и аудио тарифицируются отдельно?
Как оценить стоимость? Текст и аудио тарифицируются отдельно?
usage в response.done сообщает количество token отдельно для каждой модальности (текст / аудио / изображение, раздельно для ввода и вывода), поэтому стоимость можно распределить; в подробном представлении журнала вызовов указаны те же usage для каждой модальности — одна запись на каждый завершённый response.done. Тарифы для аудио значительно выше, чем для текста, поэтому на этапе интеграции рекомендуется использовать только текст. Фактические списания см. в журналах вызовов.