Этот репозиторий содержит справочный клиент, который примеры образец для подключения к API OpenAI в реальном времени. Эта библиотека находится в бета -версии и не должна рассматриваться как окончательная реализация. Вы можете использовать его, чтобы легко прототипировать разговорные приложения.
Самый простой способ сразу же играть с API -это использовать консоль в реальном времени , она использует эталонный клиент для доставки полностью функционального инспектора API с примерами визуализации голоса и многого другого.
Эта библиотека создана для использования как на стороне сервера (node.js), так и в браузере (React, Vue), как в кодовых базах JavaScript. Находясь в бета -версии, чтобы установить библиотеку, вам нужно будет npm install непосредственно из репозитория GitHub.
$ npm i openai/openai-realtime-api-beta --save import { RealtimeClient } from '@openai/realtime-api-beta' ;
const client = new RealtimeClient ( { apiKey : process . env . OPENAI_API_KEY } ) ;
// Can set parameters ahead of connecting, either separately or all at once
client . updateSession ( { instructions : 'You are a great, upbeat friend.' } ) ;
client . updateSession ( { voice : 'alloy' } ) ;
client . updateSession ( {
turn_detection : { type : 'none' } , // or 'server_vad'
input_audio_transcription : { model : 'whisper-1' } ,
} ) ;
// Set up event handling
client . on ( 'conversation.updated' , ( event ) => {
const { item , delta } = event ;
const items = client . conversation . getItems ( ) ;
/**
* item is the current item being updated
* delta can be null or populated
* you can fetch a full list of items at any time
*/
} ) ;
// Connect to Realtime API
await client . connect ( ) ;
// Send a item and triggers a generation
client . sendUserMessageContent ( [ { type : 'input_text' , text : `How are you?` } ] ) ; Вы можете использовать этот клиент непосредственно из браузера в EG React или Vue Apps. Мы не рекомендуем это, ваши клавиши API находятся под угрозой, если вы подключаетесь к OpenAI непосредственно из браузера. Чтобы создать создание клиента в среде браузера, используйте:
import { RealtimeClient } from '@openai/realtime-api-beta' ;
const client = new RealtimeClient ( {
apiKey : process . env . OPENAI_API_KEY ,
dangerouslyAllowAPIKeyInBrowser : true ,
} ) ;Если вы запускаете свой собственный ретрансляционный сервер, например, с консоли в реальном времени, вы можете вместо этого подключиться к URL -адресам сервера реле, например, SO:
const client = new RealtimeClient ( { url : RELAY_SERVER_URL } ) ; В этой библиотеке есть три примитива для взаимодействия с API в реальном времени. Мы рекомендуем начать с RealtimeClient , но более продвинутым пользователям может быть удобнее работать ближе к металлу.
RealtimeClientconversation.item.completed conversation.interrupted conversation.updated conversation.item.appended realtime.eventRealtimeAPIclient.realtimeserver.{event_name} и client.{event_name} соответственноRealtimeConversationclient.conversationКлиент поставляется с некоторыми основными утилитами, которые позволяют быстро создавать приложения в реальном времени.
Отправить сообщения на сервер от пользователя проста.
client . sendUserMessageContent ( [ { type : 'input_text' , text : `How are you?` } ] ) ;
// or (empty audio)
client . sendUserMessageContent ( [
{ type : 'input_audio' , audio : new Int16Array ( 0 ) } ,
] ) ; Чтобы отправить потоковое аудио, используйте метод .appendInputAudio() . Если вы находитесь в режиме turn_detection: 'disabled' , то вам нужно использовать .createResponse() чтобы сообщить модели ответить.
// Send user audio, must be Int16Array or ArrayBuffer
// Default audio format is pcm16 with sample rate of 24,000 Hz
// This populates 1s of noise in 0.1s chunks
for ( let i = 0 ; i < 10 ; i ++ ) {
const data = new Int16Array ( 2400 ) ;
for ( let n = 0 ; n < 2400 ; n ++ ) {
const value = Math . floor ( ( Math . random ( ) * 2 - 1 ) * 0x8000 ) ;
data [ n ] = value ;
}
client . appendInputAudio ( data ) ;
}
// Pending audio is committed and model is asked to generate
client . createResponse ( ) ; Работать с инструментами легко. Просто вызовите .addTool() и установите обратный вызов в качестве второго параметра. Обратный вызов будет выполнен с параметрами для инструмента, и результат будет автоматически отправлен обратно в модель.
// We can add tools as well, with callbacks specified
client . addTool (
{
name : 'get_weather' ,
description :
'Retrieves the weather for a given lat, lng coordinate pair. Specify a label for the location.' ,
parameters : {
type : 'object' ,
properties : {
lat : {
type : 'number' ,
description : 'Latitude' ,
} ,
lng : {
type : 'number' ,
description : 'Longitude' ,
} ,
location : {
type : 'string' ,
description : 'Name of the location' ,
} ,
} ,
required : [ 'lat' , 'lng' , 'location' ] ,
} ,
} ,
async ( { lat , lng , location } ) => {
const result = await fetch (
`https://api.open-meteo.com/v1/forecast?latitude= ${ lat } &longitude= ${ lng } ¤t=temperature_2m,wind_speed_10m` ,
) ;
const json = await result . json ( ) ;
return json ;
} ,
) ; Метод .addTool() автоматически запускает обработчик инструмента и запускает ответ при завершении обработчика. Иногда вы можете не хотеть этого, например: использование инструментов для генерации схемы, которую вы используете для других целей.
В этом случае мы можем использовать элемент tools с updateSession . В этом случае вы должны указать type: 'function' , которая не требуется для .addTool() .
ПРИМЕЧАНИЕ. Инструменты, добавленные с .addTool() не будут переопределены при обновлении сеансов вручную, как это, но каждое изменение updateSession() будет переопределять предыдущие изменения updateSession() . Инструменты, добавленные через .addTool() сохраняются и добавляются ко всему, что установлено вручную здесь.
client . updateSession ( {
tools : [
{
type : 'function' ,
name : 'get_weather' ,
description :
'Retrieves the weather for a given lat, lng coordinate pair. Specify a label for the location.' ,
parameters : {
type : 'object' ,
properties : {
lat : {
type : 'number' ,
description : 'Latitude' ,
} ,
lng : {
type : 'number' ,
description : 'Longitude' ,
} ,
location : {
type : 'string' ,
description : 'Name of the location' ,
} ,
} ,
required : [ 'lat' , 'lng' , 'location' ] ,
} ,
} ,
] ,
} ) ;Затем, чтобы обрабатывать вызовы функций ...
client . on ( 'conversation.updated' , ( { item , delta } ) => {
if ( item . type === 'function_call' ) {
// do something
if ( delta . arguments ) {
// populating the arguments
}
}
} ) ;
client . on ( 'conversation.item.completed' , ( { item } ) => {
if ( item . type === 'function_call' ) {
// your function call is complete, execute some custom code
}
} ) ; Возможно, вы захотите вручную прервать модель, особенно в режиме turn_detection: 'disabled' . Для этого мы можем использовать:
// id is the id of the item currently being generated
// sampleCount is the number of audio samples that have been heard by the listener
client . cancelResponse ( id , sampleCount ) ; Этот метод приведет к немедленному прекращению генерации модели, но также усекает элемент, воспроизводимый путем удаления всего звука после sampleCount и очистки текстового ответа. Используя этот метод, вы можете прервать модель и предотвратить ее «запомнить» все, что он сгенерировал, что опережает, где находится состояние пользователя.
Если вам нужно больше ручного управления, и вы хотите отправить пользовательские клиентские события в соответствии со ссылкой на API клиентских событий в реальном времени, вы можете использовать client.realtime.send() как SO:
// manually send a function call output
client . realtime . send ( 'conversation.item.create' , {
item : {
type : 'function_call_output' ,
call_id : 'my-call-id' ,
output : '{function_succeeded:true}' ,
} ,
} ) ;
client . realtime . send ( 'response.create' ) ; С RealtimeClient мы сократили накладные расходы на события от событий сервера до пяти основных событий, которые наиболее важны для вашего потока управления приложениями. Эти события не являются частью самой спецификации API, но оберните логику, чтобы облегчить разработку приложений.
// errors like connection failures
client . on ( 'error' , ( event ) => {
// do thing
} ) ;
// in VAD mode, the user starts speaking
// we can use this to stop audio playback of a previous response if necessary
client . on ( 'conversation.interrupted' , ( ) => {
/* do something */
} ) ;
// includes all changes to conversations
// delta may be populated
client . on ( 'conversation.updated' , ( { item , delta } ) => {
// get all items, e.g. if you need to update a chat window
const items = client . conversation . getItems ( ) ;
switch ( item . type ) {
case 'message' :
// system, user, or assistant message (item.role)
break ;
case 'function_call' :
// always a function call from the model
break ;
case 'function_call_output' :
// always a response from the user / application
break ;
}
if ( delta ) {
// Only one of the following will be populated for any given event
// delta.audio = Int16Array, audio added
// delta.transcript = string, transcript added
// delta.arguments = string, function arguments added
}
} ) ;
// only triggered after item added to conversation
client . on ( 'conversation.item.appended' , ( { item } ) => {
/* item status can be 'in_progress' or 'completed' */
} ) ;
// only triggered after item completed in conversation
// will always be triggered after conversation.item.appended
client . on ( 'conversation.item.completed' , ( { item } ) => {
/* item status will always be 'completed' */
} ) ; Если вы хотите больше контролировать разработку приложений, вы можете использовать событие realtime.event и выбрать только для ответа на события сервера . Полная документация для этих событий доступна на справочнике API API сервера Realtime.
// all events, can use for logging, debugging, or manual event handling
client . on ( 'realtime.event' , ( { time , source , event } ) => {
// time is an ISO timestamp
// source is 'client' or 'server'
// event is the raw event payload (json)
if ( source === 'server' ) {
doSomething ( event ) ;
}
} ) ; Вам нужно будет убедиться, что у вас есть файл .env с OPENAI_API_KEY= set для запуска тестов. Оттуда запустить тестовый набор легко.
$ npm testЧтобы запустить тесты с журналами отладки (будут регистрировать события, отправленные и полученные из WebSocket), используйте:
$ npm test -- --debugСпасибо за проверку API в реальном времени. Хотелось бы услышать от вас. Особая благодарность команде API в режиме реального времени за то, что он сделал все возможным.