AGTCloud API Docs
РуководстваСправочник APIИнтеграции и ресурсыОбновления и помощь
Взаимодействие в реальном времени

Взаимодействие в реальном времени

Обрабатывайте текст, аудио и вызовы функций в реальном времени через Realtime WebSocket.

OpenAI Realtime использует постоянное соединение и двунаправленные события для работы с текстом, аудио и вызовами функций в реальном времени. Клиент отправляет события сеанса, аудиобуфера, элементов диалога и управления ответами, а сервер непрерывно возвращает состояния сеанса, транскрипции, текст, аудио, аргументы функций и события ошибок.

Основной способ подключения на этой странице — WebSocket. При подключении замените MODEL_ID на ID модели, видимой текущему аккаунту и поддерживающей Realtime.

Типичные сценарии включают голосовой диалог в реальном времени, транскрипцию встреч и голосовых ассистентов, перевод и транскрипцию речи, интерактивную работу с кодом и серверные интеграции в реальном времени. Соединение может одновременно передавать текст и аудио, обрабатывая VAD, вызовы функций и обновления состояния через события.

WSS
wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID

Аутентификация и подключение

Аутентификация WebSocket

Серверное приложение устанавливает соединение WSS с помощью Bearer-ключа API и передаёт Header Realtime Beta в запросе рукопожатия.

ПараметрЗначение
Адрес подключенияwss://api.agtcloud.cn/v1/realtime?model=MODEL_ID
AuthorizationBearer your-api-key
OpenAI-Betarealtime=v1

Долгосрочный ключ API следует использовать только на доверенном сервере. Не добавляйте его в браузерный код, мобильный пакет или публичный репозиторий. Все соединения должны использовать HTTPS/WSS.

Временный токен

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

POST https://api.agtcloud.cn/v1/realtime/sessions
Content-Type: application/json
Authorization: Bearer your-api-key

{
  "model": "MODEL_ID",
  "voice": "verse"
}

Процесс подключения

В основном процессе WebSocket сервер устанавливает соединение непосредственно с ключом API. После успешного рукопожатия по этому соединению отправляются клиентские события и принимаются серверные.

В процессе WebRTC клиент сначала запрашивает временный токен у сервера своего приложения, который создаёт его через интерфейс сеансов. Затем клиент создаёт SDP Offer, отправляет его на Endpoint Realtime и получает SDP Answer, после чего обменивается событиями JSON по каналу данных oai-events.

Примеры подключения WebSocket

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

WSSПодключение WebSocket и обмен событиями
import WebSocket from 'ws';

const ws = new WebSocket('wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID', {
  headers: {
    Authorization: 'Bearer your-api-key',
    'OpenAI-Beta': 'realtime=v1',
  },
});

ws.on('open', () => {
  console.log('Соединение с сервером установлено.');
});

ws.on('message', (message) => {
  console.log(JSON.parse(message.toString()));
});

Подключение WebRTC

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

Сеансы, аудио и диалоги

Realtime поддерживает текстовые, голосовые и смешанные текстово-аудиодиалоги. Конфигурация сеанса может включать форматы входного и выходного аудио, голос, температуру, максимальную длину вывода, инструменты и параметры VAD.

  • Форматы входного и выходного аудио:pcm16, g711_ulaw, g711_alaw.
  • Примеры вариантов голоса:alloy, echo, shimmer.
  • Конфигурация VAD включает порог, аудиопрефикс перед речью и длительность тишины.
  • Диалог развивается через сеанс, элементы диалога, части содержимого и события ответов.

Поля отдельных событий доступны в браузере событий ниже; общие параметры и допустимые значения собраны в разделе «Общие типы».

Справочник событий

Выберите событие, чтобы увидеть определения полей и пример JSON. Можно менять направление событий, фильтровать по категории или искать по названию события.

События клиента · Сеанс

session.update

Обновляет конфигурацию сеанса по умолчанию.

ПолеТипОбязательноОписаниеПример
event_idstringНетИдентификатор события, созданный клиентомevent_123
typestringНетТип событияsession.update
modalitiesstring[]НетМодальности, в которых модель может отвечать["text", "audio"]
instructionsstringНетСистемные инструкции, добавляемые перед вызовом модели"Отвечайте кратко и точно."
voicestringНетГолос, используемый модельюalloy, echo, shimmer
input_audio_formatstringНетФормат входного аудиоpcm16, g711_ulaw, g711_alaw
output_audio_formatstringНетФормат выходного аудиоpcm16, g711_ulaw, g711_alaw
input_audio_transcription.modelstringНетМодель для транскрипцииwhisper-1
turn_detection.typestringНетТип обнаружения речиserver_vad
turn_detection.thresholdnumberНетПорог активации VAD (0.0-1.0)0.8
turn_detection.prefix_padding_msintegerНетДлительность аудио, включаемого перед началом речи500
turn_detection.silence_duration_msintegerНетДлительность тишины для обнаружения окончания речи1000
toolsarrayНетСписок инструментов, доступных модели[]
tool_choicestringНетСпособ выбора инструментов модельюauto/none/required
temperaturenumberНетТемпература сэмплирования модели0.8
max_output_tokensstring or integerНетМаксимальное число Tokens в одном ответе"inf"/4096
Пример JSON
{
  "event_id": "event_123",
  "type": "session.update",
  "modalities": [
    "text",
    "audio"
  ],
  "instructions": "Отвечайте кратко и точно.",
  "voice": "alloy, echo, shimmer",
  "input_audio_format": "pcm16, g711_ulaw, g711_alaw",
  "output_audio_format": "pcm16, g711_ulaw, g711_alaw",
  "input_audio_transcription": {
    "model": "whisper-1"
  },
  "turn_detection": {
    "type": "server_vad",
    "threshold": 0.8,
    "prefix_padding_ms": 500,
    "silence_duration_ms": 1000
  },
  "tools": [],
  "tool_choice": "auto",
  "temperature": 0.8,
  "max_output_tokens": "inf"
}

Общие типы

В следующих раскрываемых разделах собраны таблицы параметров лимитов частоты, вызовов функций, аудио, VAD, инструментов, моделей, событий, сеансов, элементов диалога, содержимого, ответов, транскрипции, аудиопотоков и WebRTC.

Параметры событий лимитов частоты4 поля
ПолеТипОбязательноОписаниеВарианты или пример
namestringДаНазвание лимитаПример: requests_per_min
limitintegerДаЗначение лимитаПример: 60
remainingintegerДаОставшаяся доступная квотаПример: 45
reset_secondsintegerДаВремя до сброса (секунды)Пример: 35
Параметры вызова функции4 поля
ПолеТипОбязательноОписаниеВарианты или пример
typestringДаТип функцииПример: function
namestringДаНазвание функцииПример: get_weather
descriptionstringНетОписание функцииПример: Получить текущую погоду
parametersobjectДаОпределение аргументов функцииПример: {"type": "object", "properties": {...}}
Параметры формата аудио4 поля
ПолеТипОбязательноОписаниеВарианты или пример
sample_rateinteger—Частота дискретизацииДопустимые значения: 8000, 16000, 24000, 44100, 48000
channelsinteger—Число каналовДопустимые значения: 1 (моно), 2 (стерео)
bits_per_sampleinteger—Разрядность сэмпловДопустимые значения: 16 (pcm16), 8 (g711)
encodingstring—КодированиеДопустимые значения: pcm16, g711_ulaw, g711_alaw
Параметры обнаружения речи3 поля
ПолеТипОбязательноОписаниеВарианты или пример
thresholdnumber—Порог активации VADПо умолчанию: 0.5; диапазон: 0.0-1.0
prefix_padding_msinteger—Аудиопрефикс перед речью (миллисекунды)По умолчанию: 500; диапазон: 0-5000
silence_duration_msinteger—Длительность обнаружения тишины (миллисекунды)По умолчанию: 1000; диапазон: 100-10000
Параметры выбора инструментов2 поля
ПолеТипОбязательноОписаниеВарианты или пример
tool_choicestring—Способ выбора инструментовДопустимые значения: auto, none, required
toolsarray—Список доступных инструментовДопустимые значения: [{type, name, description, parameters}]
Параметры конфигурации модели4 поля
ПолеТипОбязательноОписаниеВарианты или пример
temperaturenumber—Температура сэмплированияДиапазон/допустимые значения: 0.0-2.0; по умолчанию: 1.0
max_output_tokensinteger or string—Максимальная длина выводаДиапазон/допустимые значения: 1-4096/"inf"; по умолчанию: "inf"
modalitiesstring[]—Модальности ответаДиапазон/допустимые значения: ["text", "audio"]; по умолчанию: ["text"]
voicestring—ГолосДиапазон/допустимые значения: alloy, echo, shimmer; по умолчанию: alloy
Общие параметры событий3 поля
ПолеТипОбязательноОписаниеВарианты или пример
event_idstringДаУникальный идентификатор событияПример: event_123
typestringДаТип событияПример: session.update
timestampintegerНетВременная метка события (миллисекунды)Пример: 1677649363000
Параметры состояния сеанса3 поля
ПолеТипОбязательноОписаниеВарианты или пример
statusstring—Состояние сеансаДопустимые значения: active, ended, error
errorobject—Сведения об ошибкеДопустимые значения: {"type": "error_type", "message": "сообщение об ошибке"}
metadataobject—Метаданные сеансаДопустимые значения: {"client_id": "web", "session_type": "chat"}
Параметры состояния элементов диалога3 поля
ПолеТипОбязательноОписаниеВарианты или пример
statusstring—Состояние элемента диалогаДопустимые значения: completed, in_progress, incomplete
rolestring—Роль отправителяДопустимые значения: user, assistant, system
typestring—Тип элемента диалогаДопустимые значения: message, function_call, function_call_output
Параметры типа содержимого3 поля
ПолеТипОбязательноОписаниеВарианты или пример
typestring—Тип содержимогоДопустимые значения: text, audio, transcript
formatstring—Формат содержимогоДопустимые значения: plain, markdown, html
encodingstring—КодированиеДопустимые значения: utf-8, base64
Параметры состояния ответа3 поля
ПолеТипОбязательноОписаниеВарианты или пример
statusstring—Состояние ответаДопустимые значения: completed, cancelled, failed, incomplete
status_detailsobject—Сведения о состоянииДопустимые значения: {"reason": "user_cancelled"}
usageobject—Статистика использованияДопустимые значения: {"total_tokens": 50, "input_tokens": 20, "output_tokens": 30}
Параметры транскрипции аудио4 поля
ПолеТипОбязательноОписаниеВарианты или пример
enabledboolean—Включена ли транскрипцияПример: true
modelstring—Модель транскрипцииПример: whisper-1
languagestring—Язык транскрипцииПример: en, zh, auto
promptstring—Подсказка для транскрипцииПример: "Транскрипция разговора"
Параметры аудиопотока3 поля
ПолеТипОбязательноОписаниеВарианты или пример
chunk_sizeinteger—Размер аудиоблока (байты)Допустимые значения: 1024, 2048, 4096
latencystring—Режим задержкиДопустимые значения: low, balanced, high
compressionstring—СжатиеДопустимые значения: none, opus, mp3
Параметры конфигурации WebRTC3 поля
ПолеТипОбязательноОписаниеВарианты или пример
ice_serversarray—Список серверов ICEПо умолчанию: [{"urls": "stun:stun.l.google.com:19302"}]
audio_constraintsobject—Ограничения аудиоПо умолчанию: {"echoCancellation": true}
connection_timeoutinteger—Тайм-аут подключения (миллисекунды)По умолчанию: 30000

Обработка ошибок и восстановление

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

ТипЧастые причиныДействия
Ошибка подключенияСбой сети, неудачное рукопожатие или неверная конфигурация подключенияПроверьте адрес WSS, сеть и запрос рукопожатия; ограничьте число повторных подключений
Ошибка аутентификацииКлюч API недействителен, временный токен истёк или не соответствует адресу APIОбновите учётные данные и проверьте соответствие ключа API адресу API в запросе
Ошибка аудиоПрава доступа к устройству, неподдерживаемый формат или несовместимый кодекПроверьте разрешения устройства, частоту дискретизации и кодирование, затем восстановите аудиоканал
Ошибка сеансаТайм-аут сеанса, ограничение параллельности или несогласованное состояние событийСохраните событие ошибки и создайте сеанс заново; при необходимости перейдите на интерфейс без работы в реальном времени

Стратегии восстановления могут включать автоматическое переподключение, восстановление сеанса, ограниченные повторные попытки и переход к упрощённой функциональности. При ошибке сначала прочитайте событие error, сохраните event_id, error.type, error.code, error.message и сведения о связанном событии, а затем решайте, нужна ли повторная отправка.