전송 방식
기본 전송 계층
섹션 제목: “기본 전송 계층”WebRTC를 통한 연결
섹션 제목: “WebRTC를 통한 연결”기본 전송 계층은 WebRTC를 사용합니다. 마이크에서 오디오를 녹음하고 자동으로 재생합니다.
자신의 미디어 스트림이나 오디오 요소를 사용하려면 세션을 생성할 때 OpenAIRealtimeWebRTC 인스턴스를 제공하세요.
import { RealtimeAgent, RealtimeSession, OpenAIRealtimeWebRTC } from '@openai/agents/realtime';
const agent = new RealtimeAgent({ name: 'Greeter', instructions: 'Greet the user with cheer and answer questions.',});
async function main() { const transport = new OpenAIRealtimeWebRTC({ mediaStream: await navigator.mediaDevices.getUserMedia({ audio: true }), audioElement: document.createElement('audio'), });
const customSession = new RealtimeSession(agent, { transport });}WebSocket을 통한 연결
섹션 제목: “WebSocket을 통한 연결”WebRTC 대신 WebSocket 연결을 사용하려면 세션을 생성할 때 transport: 'websocket' 또는 OpenAIRealtimeWebSocket 인스턴스를 전달하세요. 이는 예를 들어 Twilio로 전화 에이전트를 구축하는 등 서버 측 사용 사례에 적합합니다.
import { RealtimeAgent, RealtimeSession } from '@openai/agents/realtime';
const agent = new RealtimeAgent({ name: 'Greeter', instructions: 'Greet the user with cheer and answer questions.',});
const myRecordedArrayBuffer = new ArrayBuffer(0);
const wsSession = new RealtimeSession(agent, { transport: 'websocket', model: 'gpt-realtime',});await wsSession.connect({ apiKey: process.env.OPENAI_API_KEY! });
wsSession.on('audio', (event) => { // event.data is a chunk of PCM16 audio});
wsSession.sendAudio(myRecordedArrayBuffer);원문 PCM16 오디오 바이트를 처리하기 위해 임의의 녹음/재생 라이브러리를 사용하세요.
Cloudflare Workers (workerd) 참고 사항
섹션 제목: “Cloudflare Workers (workerd) 참고 사항”Cloudflare Workers 및 기타 workerd 런타임은 전역 WebSocket 생성자를 사용해 아웃바운드 WebSocket을 열 수 없습니다. 확장 패키지의 Cloudflare 전송을 사용하세요. 내부적으로 fetch() 기반 업그레이드를 수행합니다.
import { CloudflareRealtimeTransportLayer } from '@openai/agents-extensions';import { RealtimeAgent, RealtimeSession } from '@openai/agents/realtime';
const agent = new RealtimeAgent({ name: 'My Agent',});
// Create a transport that connects to OpenAI Realtime via Cloudflare/workerd's fetch-based upgrade.const cfTransport = new CloudflareRealtimeTransportLayer({ url: 'wss://api.openai.com/v1/realtime?model=gpt-realtime',});
const session = new RealtimeSession(agent, { // Set your own transport. transport: cfTransport,});사용자 지정 전송 메커니즘 구축
섹션 제목: “사용자 지정 전송 메커니즘 구축”다른 음성 간 API를 사용하거나 사용자 지정 전송 메커니즘이 필요한 경우 RealtimeTransportLayer 인터페이스를 구현하고 RealtimeTransportEventTypes 이벤트를 발생시켜 직접 만들 수 있습니다.
Realtime API와의 보다 직접적인 상호작용
섹션 제목: “Realtime API와의 보다 직접적인 상호작용”OpenAI Realtime API를 사용하면서 Realtime API에 더 직접 접근하려면 두 가지 옵션이 있습니다.
옵션 1 - 전송 계층 액세스
섹션 제목: “옵션 1 - 전송 계층 액세스”RealtimeSession의 모든 기능을 활용하면서 전송 계층에 접근하려면 session.transport를 통해 접근하세요.
전송 계층은 수신한 모든 이벤트를 * 이벤트로 내보내며, sendEvent() 메서드를 사용해 원시 이벤트를 전송할 수 있습니다.
import { RealtimeAgent, RealtimeSession } from '@openai/agents/realtime';
const agent = new RealtimeAgent({ name: 'Greeter', instructions: 'Greet the user with cheer and answer questions.',});
const session = new RealtimeSession(agent, { model: 'gpt-realtime',});
session.transport.on('*', (event) => { // JSON parsed version of the event received on the connection});
// Send any valid event as JSON. For example triggering a new responsesession.transport.sendEvent({ type: 'response.create', // ...});옵션 2 — 전송 계층만 사용
섹션 제목: “옵션 2 — 전송 계층만 사용”자동 도구 실행, 가드레일 등이 필요 없다면 연결과 인터럽션(중단 처리)만 관리하는 “얇은(thin) 클라이언트”로 전송 계층만 사용할 수도 있습니다.
import { OpenAIRealtimeWebRTC } from '@openai/agents/realtime';
const client = new OpenAIRealtimeWebRTC();const audioBuffer = new ArrayBuffer(0);
await client.connect({ apiKey: '<api key>', model: 'gpt-4o-mini-realtime-preview', initialSessionConfig: { instructions: 'Speak like a pirate', voice: 'ash', modalities: ['text', 'audio'], inputAudioFormat: 'pcm16', outputAudioFormat: 'pcm16', },});
// optionally for WebSocketsclient.on('audio', (newAudio) => {});
client.sendAudio(audioBuffer);