Skip to main content

Обзор

Модели Realtime работают через долгоживущее WebSocket-соединение: аудио поступает на вход, аудио выходит на выходе, а модель можно прервать посреди предложения — без цикла «записать, загрузить, подождать, воспроизвести». Отличие от связки ASR + text model + TTS в том, что это сквозной процесс: модель напрямую слышит тембр, паузы и эмоции и так же напрямую говорит. Задержка укладывается в диапазон менее секунды. APIYI сейчас предлагает 4 модели в 2 протоколах, используя один эндпоинт и один ключ:
  • gpt-realtime-2.1 / gpt-realtime-2.1-mini — OpenAI Realtime GA protocol
  • qwen3.5-omni-plus-realtime / qwen3.5-omni-flash-realtime — Alibaba Cloud Model Studio protocol
Статус: закрытая бета / интеграция в процессе. Голосовой Realtime доступен в ограниченном объеме и пока не открыт для самостоятельного подключения — для активации нужно связаться с нами. Вышестоящий протокол и поведение во время беты еще могут измениться; все в разделе «Известные ограничения» ниже измерено и будет обновляться по мере изменений upstream. Пожалуйста, не запускайте в production без fallback-пути. Если вы планируете интеграцию или вам нужна более высокая параллельность, свяжитесь с нами через WeCom support или по почте [email protected] / [email protected].
🎤 Основные возможности: двунаправленная потоковая передача аудио по одному соединению, barge-in в любой момент, server_vad и semantic_vad обнаружение смены реплики, полный round trip function-calling (включая внедрение результата), ввод изображений и usage, разделённые по модальностям. Все перечисленное подтверждено для всех четырех моделей (2026-08-24, UTC+8).
Первое, что нужно запомнить: 4 модели используют два разных протокола запросов, с разными именами полей и разными именами событий. Изменение только параметра model без изменения тела запроса не сработает — это, безусловно, самая частая ошибка интеграции. Различия сводятся к 6 полям и 3 именам событий; все они перечислены ниже в разделе «Сравнение протоколов».

Запросить доступ к бете

Свяжитесь со службой поддержки WeCom, укажите ваш аккаунт и ожидаемую параллельность, и мы включим бета-группу на вашем ключе.

Руководство по API

Создание ключей, base URL, режимы тарификации и другие общие соглашения.

Ключи и группы

Создавайте ключи, выбирайте группы и задавайте квоты.

Журналы вызовов

Просматривайте использование token и фактические начисления по каждому вызову в консоли.
Эта страница длинная. Три раздела обязательны к прочтению: Сравнение протоколов (прочитайте перед переключением между моделями), Начните с текста (проверьте всю цепочку без микрофона) и Известные ограничения (четыре измеренных различия, влияющие на код клиента).

Пусть AI-агент выполнит интеграцию

Если вы разрабатываете с Codex / Claude Code / Cursor, скопируйте туда prompt ниже. Сначала он получит текстовую версию этой страницы (добавьте .md к любому docs URL), а затем напишет code под ваш стек — в требования уже заложены две семейства полей, жёсткое ограничение по sample rate, семантика cancel и отключения при простое.

Пусть кодирующий агент интегрирует или отладит Realtime voice. Скопируйте и вставьте в Codex, Claude Code, Cursor и похожие инструменты.

Почему APIYI для голоса в реальном времени

Один ключ, четыре модели

Тот же wss эндпоинт, та же авторизация. При смене моделей нужно изменить параметр model и соответствующий шаблон полей — не нужно поддерживать второй аккаунт поставщика.

Прямой доступ, без зарубежной настройки

Подключайтесь к api.apiyi.com из дата-центров материкового Китая, домашнего широкополосного интернета или зарубежных узлов. Не требуется аккаунт внешнего поставщика, подтверждение личности или предоплата.

Различия протоколов уже сопоставлены

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

Бесплатная самопроверка по тексту

Проверьте handshake, auth, поля, подключение tools и параллельные запросы без микрофона — аудио-тарифы стоят на порядок дороже текста, так что на интеграции это реальные сэкономленные деньги.

Измеренная задержка и параллельные запросы

Handshake p50 0.65–1.08 s и первый text delta p50 0.54–0.95 s при 20 параллельных сессиях, при этом условия теста и дата указаны в разделе Technical Specs.

Прямая поддержка в период беты

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

Основные возможности

Двунаправленная потоковая передача, прерываемая

Аудио передаётся по мере генерации; клиент может отправить response.cancel в любое время. Сессия сохраняется, контекст сохраняется. Проверено на всех четырёх моделях.

Два режима определения смены реплики

server_vad разделяет по длительности тишины, semantic_vad разделяет по намерению (лучше игнорирует слова-паразиты вроде «uh-huh»). Оба режима проверены на всех четырёх моделях.

Полный цикл вызова функций

Модель вызывает инструмент, клиент выполняет его, function_call_output внедряет результат, и модель продолжает отвечать. Проверено от начала до конца на всех четырёх моделях.

Ввод изображений, учёт использования по модальностям

Отправляйте изображения в ходе сеанса, чтобы модель могла их прочитать; usage возвращает tokens текста / аудио / изображений отдельно, чтобы можно было отнести стоимость. Проверено на всех четырёх моделях.

Поддерживаемые модели

Выходной аудиосигнал во всех четырёх моделях — PCM со знаком 16-bit / mono / 24 kHz.
Два семейства протоколов имеют общими только эндпоинт и схему аутентификации. Поля запроса и имена серверных событий также различаются. При смене моделей вам нужно менять и шаблоны полей — см. ниже «Сравнение протоколов».

Цены

Цены в одном предложении: тарификация по token, и аудио обходится в разы дороже текста (для gpt-realtime-2.1: вход аудио $32 против входа текста $4; выход аудио $64 против выхода текста $24). Во время интеграции запускайте только текстовый режим и переключайтесь на аудио после проверки цепочки — см. «Начните с текста» ниже.
Приведённые ниже таблицы — это официальные прайс-листы поставщиков, в USD за 1M token. Фактические списания в APIYI — это то, что показывают журналы вызовов; бонус за пополнение ещё больше снижает эффективную стоимость.

Протокол Realtime GA

Протокол Model Studio

Измерения тарификации различаются: ввод изображения включён в текстовый тариф, а выход разделён на «только текст» и «текст + аудио» (по последнему тарифу оплачивается только аудиочасть).
Примечание о Beta: голосовой Realtime доступен в ограниченном объёме, и тарификация всё ещё приводится в соответствие с upstream. Если ваши фактические списания заметно отличаются от таблиц выше, пожалуйста, обратитесь в поддержку, чтобы мы могли провести сверку. Цены могут меняться в зависимости от политики поставщика и доступности. Эта возможность предлагается, чтобы обеспечить поставки и обслуживать клиентов, а не как предложение, ориентированное на прибыль.

Группа доступа

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

Технические характеристики

Измеренная задержка и параллельные запросы

Измерено 2026-08-24 (UTC+8) по публичному api.apiyi.com пути, 20 параллельных сессий × 2 модели, одноходовой обмен только текстом:
Это разовые измерения на конкретном уровне параллельных запросов и не являются обязательством по производительности. Во время бета-версии SLA по доступности не предоставляется — реализуйте переподключение и плавную деградацию на клиенте.

Эндпоинт

Все четыре модели используют этот эндпоинт; параметр запроса model выбирает, к какой из них вы обратитесь.
При подключении из браузера: этот эндпоинт также поддерживает аутентификацию через субпротокол Sec-WebSocket-Protocol (realtime, openai-insecure-api-key.<key>, openai-beta.realtime-v1), так что браузерный WebSocket может подключаться напрямую — но это передаёт ваш ключ браузеру, где любой посетитель может прочитать его в сетевой панели. Используйте это только для локальной проверки. В production настройте бэкенд-релей: бэкенд хранит ключ и открывает соединение с APIYI, а фронтенд общается только с вашим сервисом.

⚠️ Сравнение протоколов (прочтите перед переключением моделей)

Обе семейства используют один и тот же эндпоинт, схему авторизации и общий поток событий. Различия сосредоточены в структуре поля 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:
Протокол Realtime GA:
Частота дискретизации — жёсткое ограничение: audio.input.format.rate в протоколе Realtime GA должна быть ≥ 24000; при отправке 16000 запрос сразу завершается с integer_below_min_value: Expected a value >= 24000. Протокол Model Studio требует входные данные 16 kHz. Выполните ресемплирование на клиенте.

Начните с текста: для чего нужен текстовый канал и трёхэтапная самопроверка

Аудиопайплайн включает захват с микрофона, ресемплинг, chunking и определение turns. Любое слабое звено проявляется как «ничего не происходит», а это трудно диагностировать. Поэтому не начинайте с микрофона.

Текст — это управляющая плоскость, а не запасной способ ввода

В realtime voice model текст — это не «ещё один способ передать ввод», а весь канал управления, кроме аудиопотока:

Трёхэтапная самопроверка

1

Шаг 1: только текст, без микрофона

Установите output_modalities в режим только текста, отключите turn detection и отправьте один input_text. Уже это проверяет handshake, ключ и группу, правильно ли вы выбрали шаблон полей, сработал ли session.update, корректно ли подставляются tools, сохраняется ли многотуровый контекст и как ведут себя параллельные запросы. Вообще не создаётся ни одного audio token.
2

Шаг 2: воспроизведите локальный wav-файл

Используйте фиксированный локальный аудиофайл вместо микрофона, передавая его в input_audio_buffer.append блоками по 100 ms. Это отделяет аудиопайплайн (формат, частоту дискретизации, разбиение на чанки, commit, срабатывание VAD) от вашей бизнес-логики и делает процесс воспроизводимым — один и тот же файл должен дважды давать один и тот же результат.
3

Шаг 3: подключите живой микрофон

Когда первые два шага пройдены, остаются только захват и воспроизведение. Если теперь что-то ломается, пространство поиска уже небольшое.
Нет под рукой тестового аудио? На macOS встроенные инструменты за одну строку создают совместимый файл:
Выбор неверной частоты дискретизации — самая частая ошибка на шаге 2: два протокола различаются, не путайте их.

Запускаемый текстовый smoke test

Зависит только от websockets (pip install websockets). Переключайте протоколы, изменяя одну переменную:
Если это запускается, эндпоинт, ключ, группа и шаблон полей настроены правильно — переходите к шагу 2.

Особенности сессии: голос, определение смены реплики, инструменты, изображения

Голос

Закрепляйте голос в первом session.update. После того как сессия сгенерировала аудиовывод, изменение голоса завершается cannot_update_voice — это относится к обоим протоколам. Чтобы сменить голос, откройте новую сессию. Также в протоколе Model Studio не отправляйте пустую строку в качестве голоса; система откатится к неподдерживаемому голосу и вернёт 400. Если вам не нужно задавать значение, просто не передавайте это поле.

Определение смены реплики: 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.
В режиме VAD вы обязаны продолжать потоковую передачу. После окончания речи продолжайте передавать короткий отрезок тишины (2 секунды достаточно при тестировании), чтобы сервер мог определить конец речи. Если вы отправите только озвученную часть и затем остановитесь, speech_stopped никогда не сработает и ответ не будет сгенерирован.

Вызов функций

Порядок событий: модель отправляет response.output_item.done типа function_call (содержащий call_id и arguments) → клиент выполняет его → результат подставляется → ещё одно response.create позволяет модели продолжить.
Полный цикл подтверждён на всех четырёх моделях — после подстановки модель корректно пересказывает, что вернул инструмент.

Ввод изображений

протокол Realtime GA: поместите input_image напрямую в сообщение; значение может быть data URI.
протокол Model Studio: изображения рассматриваются как кадры видео, поэтому сначала нужно добавить audio, иначе вы получите Error append image before append audio.. При тестировании рабочий подход — вставлять input_image_buffer.append в поток input_audio_buffer.append примерно с частотой один кадр в секунду.

Известные ограничения (beta)

Все четыре пункта ниже подтверждены, и все они влияют на код клиента. Прочитайте это перед интеграцией.
Эти поведения могут измениться по мере эволюции upstream в течение beta; эта страница будет поддерживаться в актуальном состоянии. Если вы столкнётесь с чем-то, чего нет в этом списке, сообщите об этом через поддержку WeCom или на [email protected], указав метку времени и session.id, чтобы мы могли отследить это.

Лучшие практики

1

Сначала выбирайте шаблон поля по семейству протокола

Записывайте два session.update payloads как две константы конфигурации, выбираемые по имени модели, а не разбросанные по if-веткам. Именно эта часть чаще всего ломается при сопровождении спустя шесть месяцев.
2

Закрепите параметры сеанса в первом фрейме

Установите output_modalities, voice, speed, turn_detection и transcription в самом первом session.update. Особенно для голосового режима — после того как audio уже сгенерировано, будет слишком поздно.
3

Сначала пройдите текстовый smoke test перед добавлением audio

Запустите текстовый smoke test на этой странице, чтобы убедиться, что endpoint, ключ, группа и шаблон поля заданы верно, а затем переходите к audio. Аудио-уровни стоят на порядок дороже текстовых, так что это экономит большую часть вашего бюджета на интеграцию.
4

Преобразуйте sample rate и channels на клиенте

PCM 16-битный со знаком, моно; 16 kHz для Model Studio, ≥ 24 kHz для Realtime GA. Не ожидайте исправления на стороне сервера — неверный формат обычно проявляется тишиной, а не явной ошибкой.
5

Завершайте работу по output_item.done с тайм-аутом

Не ждите только response.done. Этот подход корректен для обеих семейств и помогает не зависать на одном ходе, когда пользователь прерывает.
6

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

Следите за 300-секундным лимитом простоя в Model Studio и expires_at в Realtime GA. После переподключения повторно отправьте session.update и весь необходимый контекст, иначе новый сеанс будет работать с настройками по умолчанию.
7

Используйте бэкенд-релей в продакшене

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

Ошибки и повторные попытки

Совет по устранению неполадок: записывайте event_id каждого события и session.id сессии и включайте их в сообщение о проблеме — это значительно сокращает время диагностики. Также обратите внимание, что объекты ошибок Realtime GA содержат code и param (то есть указывают точное имя поля и его допустимые значения), тогда как сообщения об ошибках Model Studio более общие. При отладке сначала проверяйте синтаксис поля именно в первом случае.

Частые вопросы

Интерактивные песочницы основаны на спецификациях OpenAPI, которые описывают один запрос и один ответ по HTTP. Realtime — это десятки типов событий, идущих в обе стороны по одному долго живущему соединению, что не укладывается в эту модель. Альтернатива — текстовый smoke test в разделе «Начните с текста»: несколько десятков строк, без микрофона, и он подтверждает, что цепочка работает.
Нет. Эндпоинт и авторизация одинаковы, но поля запроса и имена событий относятся к двум протоколам. Как минимум вам нужно изменить: modalitiesoutput_modalities, voiceaudio.output.voice, input_audio_formataudio.input.format, turn_detectionaudio.input.turn_detection, input_audio_transcriptionaudio.input.transcription, а также имена событий response.text.deltaresponse.output_text.delta и response.audio.deltaresponse.output_audio.delta. См. раздел сравнения протоколов для полной сопоставительной таблицы.
Проверьте пять вещей по порядку: 1. схема — wss://, а не https://; 2. эндпоинт включает ?model=<model-name>; 3. заголовок Authorization: Bearer <key> присутствует; 4. ключ включён для beta-группы (503 с «no available channel», если нет); 5. промежуточный reverse proxy не удаляет заголовок Upgrade — это частая проблема при проксировании через собственный шлюз.
Технически да — эндпоинт принимает авторизацию через subprotocol Sec-WebSocket-Protocol, поэтому браузер WebSocket может подключиться напрямую. Но это передаёт ваш ключ в браузер, где любой посетитель может прочитать его на панели сети, поэтому это подходит только для локальной проверки. В production реализуйте backend relay: backend хранит ключ и открывает соединение с APIYI, а frontend взаимодействует только с вашим сервисом.
Протокол Realtime GA требует частоту дискретизации входа не ниже 24000; 16000 возвращает integer_below_min_value. Правильный формат — "audio": {"input": {"format": {"type": "audio/pcm", "rate": 24000}}}. Две модели Model Studio, напротив, требуют 16 kHz — они не взаимозаменяемы.
Выполните трёхшаговую самопроверку в разделе «Начните с текста»: сначала проверьте цепочку только по тексту (без генерации audio tokens), затем воспроизведите локальный wav-файл, чтобы проверить audio pipeline, и только после этого подключайте живой микрофон. Тестовое аудио можно сгенерировать одной строкой с помощью встроенных средств macOS say и afconvert — команды приведены в том разделе.
Это известное поведение двух моделей Model Studio (воспроизведено во всех 6 тестовых прогонах): после прерывания вы получаете response.text.done, response.content_part.done и response.output_item.done, но response.done не доставляется. Используйте response.output_item.done как сигнал завершения хода и добавьте timeout в качестве запасного варианта. Сама сессия не затрагивается, и разговор продолжается нормально. Две модели Realtime GA ведут себя здесь корректно.
Протокол Model Studio разрывает соединения после 300 секунд бездействия, и ping/pong на уровне WebSocket не считается активностью — heartbeat не продлит этот таймер. Либо периодически отправляйте событие уровня приложения в период простоя (например, session.update), либо принимайте разрыв соединения и переподключайтесь автоматически. Не забудьте повторно отправить session.update и любой необходимый контекст после переподключения.
В протоколе Realtime GA событие session.created содержит expires_at, которое измеряется примерно через 30 минут после подключения, после чего нужно переподключиться. В протоколе Model Studio основное ограничение, которое мы наблюдали, — разрыв соединения после 300 секунд простоя. Проектируйте длинные разговоры, исходя из того, что сессии истекают, и заранее продумайте, как контекст будет переноситься между сессиями.
Задавайте voice в session.update: поле верхнего уровня voice в Model Studio, audio.output.voice в Realtime GA. Как только сессия выдала аудиовывод, voice больше нельзя изменить — это относится к обоим протоколам и возвращает cannot_update_voice. Зафиксируйте его в первом frame и откройте новую сессию для переключения. Также не отправляйте пустую строку как voice в Model Studio; он возвращает 400.
Модель flash в Model Studio не доставляет событие завершения транскрипции в ручном режиме commit (стабильно воспроизведено во всех запусках); модель plus — доставляет, и обе работают в режиме VAD. Переключитесь на server_vad или semantic_vad. Тестирование показывает, что текст транскрипта в этом случае попадает в недокументированное поле в delta events, но это поле может измениться в любой момент, и на него не следует полагаться. Учтите, что это влияет только на отображение того, что сказал пользователь, в вашем UI — на разговор это не влияет, и модель правильно понимает аудио и отвечает на него.
Все четыре модели поддерживают image input, но синтаксис отличается. В Realtime GA вы помещаете input_image непосредственно в сообщение. В Model Studio изображения рассматриваются как video frames, поэтому audio должен быть добавлен до любого image, и именно это вызывает данную ошибку. На практике рабочий подход — вставлять image frames в audio stream примерно по одному frame в секунду.
Две модели Realtime GA поддерживают это, и это применяется автоматически — в тестах уже во втором ходе внутри сессии было попадание в кэш, со значением в usage.input_token_details.cached_tokens. На двух моделях Model Studio попаданий в кэш не наблюдалось.
Объект usage в response.done показывает tokens по модальностям (text / audio / image, отдельно для input и output), поэтому стоимость можно отнести по модальностям. Уровни тарификации audio существенно выше, чем text, поэтому во время интеграции рекомендуется использовать только text. За фактической тарификацией см. журналы вызовов.

Связанная документация

Руководство по API

Создание ключей, базовый URL, режимы тарификации и другие общие соглашения.

Ключи и группы

Создавайте ключи, выбирайте группы и задавайте квоты.

Генерация текста

Обычные chat-модели — лучший выбор для текстового общения.

Тарификация моделей

Актуальная тарификация, эндпоинты и группы для каждой модели на платформе.

Бонус за пополнение

Ещё больше снижает вашу фактическую стоимость.

Запросить доступ к beta

Свяжитесь с поддержкой WeCom, указав ваш аккаунт и ожидаемые параллельные запросы.
Realtime voice сейчас находится в закрытой beta. Каждый измеренный результат на этой странице датирован 2026-08-24 (UTC+8) и будет обновляться по мере изменений upstream. Если вы планируете интеграцию, столкнулись с тем, что эта страница не покрывает, или вам нужны более высокие параллельные запросы, свяжитесь с нами по адресу [email protected] / [email protected].