Обзор
Модели Realtime работают через долгоживущее WebSocket-соединение: аудио поступает на вход, аудио выходит на выходе, а модель можно прервать посреди предложения — без цикла «записать, загрузить, подождать, воспроизвести». Отличие от связки ASR + text model + TTS в том, что это сквозной процесс: модель напрямую слышит тембр, паузы и эмоции и так же напрямую говорит. Задержка укладывается в диапазон менее секунды. APIYI сейчас предлагает 4 модели в 2 протоколах, используя один эндпоинт и один ключ:gpt-realtime-2.1/gpt-realtime-2.1-mini— OpenAI Realtime GA protocolqwen3.5-omni-plus-realtime/qwen3.5-omni-flash-realtime— Alibaba Cloud Model Studio protocol
server_vad и semantic_vad обнаружение смены реплики, полный round trip function-calling (включая внедрение результата), ввод изображений и usage, разделённые по модальностям. Все перечисленное подтверждено для всех четырех моделей (2026-08-24, UTC+8).model без изменения тела запроса не сработает — это, безусловно, самая частая ошибка интеграции. Различия сводятся к 6 полям и 3 именам событий; все они перечислены ниже в разделе «Сравнение протоколов».Запросить доступ к бете
Руководство по 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
Измерения тарификации различаются: ввод изображения включён в текстовый тариф, а выход разделён на «только текст» и «текст + аудио» (по последнему тарифу оплачивается только аудиочасть).Группа доступа
Технические характеристики
Измеренная задержка и параллельные запросы
Измерено 2026-08-24 (UTC+8) по публичномуapi.apiyi.com пути, 20 параллельных сессий × 2 модели, одноходовой обмен только текстом:
Эндпоинт
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 примерно с частотой один кадр в секунду.
Известные ограничения (beta)
Все четыре пункта ниже подтверждены, и все они влияют на код клиента. Прочитайте это перед интеграцией.Лучшие практики
Сначала выбирайте шаблон поля по семейству протокола
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 более общие. При отладке сначала проверяйте синтаксис поля именно в первом случае.Частые вопросы
Почему на этой странице нет интерактивной песочницы?
Почему на этой странице нет интерактивной песочницы?
Могу ли я переключаться между четырьмя моделями, меняя только имя модели?
Могу ли я переключаться между четырьмя моделями, меняя только имя модели?
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. ключ включён для beta-группы (503 с «no available channel», если нет); 5. промежуточный reverse proxy не удаляет заголовок Upgrade — это частая проблема при проксировании через собственный шлюз.Могу ли я подключиться из браузера? Не утечёт ли мой ключ?
Могу ли я подключиться из браузера? Не утечёт ли мой ключ?
Sec-WebSocket-Protocol, поэтому браузер WebSocket может подключиться напрямую. Но это передаёт ваш ключ в браузер, где любой посетитель может прочитать его на панели сети, поэтому это подходит только для локальной проверки. В production реализуйте backend relay: backend хранит ключ и открывает соединение с APIYI, а frontend взаимодействует только с вашим сервисом.Отправка аудио 16 kHz в gpt-realtime-2.1 завершается ошибкой. Почему?
Отправка аудио 16 kHz в gpt-realtime-2.1 завершается ошибкой. Почему?
integer_below_min_value. Правильный формат — "audio": {"input": {"format": {"type": "audio/pcm", "rate": 24000}}}. Две модели Model Studio, напротив, требуют 16 kHz — они не взаимозаменяемы.У меня нет микрофона / аудио трудно тестировать. Что делать?
У меня нет микрофона / аудио трудно тестировать. Что делать?
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 как сигнал завершения хода и добавьте timeout в качестве запасного варианта. Сама сессия не затрагивается, и разговор продолжается нормально. Две модели Realtime GA ведут себя здесь корректно.Соединение обрывается примерно через 5 минут.
Соединение обрывается примерно через 5 минут.
session.update), либо принимайте разрыв соединения и переподключайтесь автоматически. Не забудьте повторно отправить session.update и любой необходимый контекст после переподключения.Как долго может оставаться открытой одна сессия?
Как долго может оставаться открытой одна сессия?
session.created содержит expires_at, которое измеряется примерно через 30 минут после подключения, после чего нужно переподключиться. В протоколе Model Studio основное ограничение, которое мы наблюдали, — разрыв соединения после 300 секунд простоя. Проектируйте длинные разговоры, исходя из того, что сессии истекают, и заранее продумайте, как контекст будет переноситься между сессиями.Как задать voice и почему при его изменении возвращается cannot_update_voice?
Как задать voice и почему при его изменении возвращается cannot_update_voice?
session.update: поле верхнего уровня voice в Model Studio, audio.output.voice в Realtime GA. Как только сессия выдала аудиовывод, voice больше нельзя изменить — это относится к обоим протоколам и возвращает cannot_update_voice. Зафиксируйте его в первом frame и откройте новую сессию для переключения. Также не отправляйте пустую строку как voice в Model Studio; он возвращает 400.В ручном режиме commit у меня нет input transcription.
В ручном режиме commit у меня нет input transcription.
flash в Model Studio не доставляет событие завершения транскрипции в ручном режиме commit (стабильно воспроизведено во всех запусках); модель plus — доставляет, и обе работают в режиме VAD. Переключитесь на server_vad или semantic_vad. Тестирование показывает, что текст транскрипта в этом случае попадает в недокументированное поле в delta events, но это поле может измениться в любой момент, и на него не следует полагаться. Учтите, что это влияет только на отображение того, что сказал пользователь, в вашем UI — на разговор это не влияет, и модель правильно понимает аудио и отвечает на него.Поддерживается ли image input? Почему я получаю Error append image before append audio.?
Поддерживается ли image input? Почему я получаю Error append image before append audio.?
input_image непосредственно в сообщение. В Model Studio изображения рассматриваются как video frames, поэтому audio должен быть добавлен до любого image, и именно это вызывает данную ошибку. На практике рабочий подход — вставлять image frames в audio stream примерно по одному frame в секунду.Есть ли prompt caching? Как подтвердить попадание в кэш?
Есть ли prompt caching? Как подтвердить попадание в кэш?
usage.input_token_details.cached_tokens. На двух моделях Model Studio попаданий в кэш не наблюдалось.Как оценить стоимость? Текст и аудио тарифицируются отдельно?
Как оценить стоимость? Текст и аудио тарифицируются отдельно?
usage в response.done показывает tokens по модальностям (text / audio / image, отдельно для input и output), поэтому стоимость можно отнести по модальностям. Уровни тарификации audio существенно выше, чем text, поэтому во время интеграции рекомендуется использовать только text. За фактической тарификацией см. журналы вызовов.