TypeScript client for OpenAI's realtime voice API.
- Strongly typed TS fork of openai/openai-realtime-api-beta
- All events and handlers are 100% typed
- Drop-in replacement for OpenAI's JS version
- Fixes many small bugs and inconsistencies
- Published to NPM
- Supports Node.js, browser, deno, bun, CF workers, etc
- Includes Node.js CLI examples for easy local testing
- Includes a simple relay server
- Includes the OpenAI Realtime Console demo using this package 🔥
npm install openai-realtime-apiThis package is ESM-only. It requires Node.js >= 18, a browser environment, or an equivalent JS runtime (Deno, Bun, CF workers, etc).
Important
All usage and events are 100% compatible with the OpenAI JS version. The main difference aside from bug fixes is that all events are fully-typed.
import { RealtimeClient } from 'openai-realtime-api'
// Create a new client; all params are optional; apiKey defaults to the
// `OPENAI_API_KEY` environment variable (when using Node.js).
const client = new RealtimeClient({
sessionConfig: {
instructions: 'You are a great, upbeat friend.',
voice: 'alloy'
}
})
// Can change session config ahead of connecting.
client.updateSession({
turn_detection: null,
input_audio_transcription: { model: 'whisper-1' }
})
// Example of custom event handling
client.on('conversation.updated', (event) => {
// All events are fully-typed based on the event name.
// In this case, `event` will have the type `RealtimeCustomEvents.ConversationUpdatedEvent`
const { item, delta } = event
// Access the full list of conversation items.
const items = client.conversation.getItems()
})
// Connect to the Realtime API.
await client.connect()
// Send a text message and trigger a response generation.
client.sendUserMessageContent([{ type: 'input_text', text: 'How are you?' }])
// Wait for a completed response from the model.
// (`event` will be of type `RealtimeServerEvents.ResponseDoneEvent`)
const event = await client.realtime.waitForNext('response.done')See examples for more complete demos.
See also the official OpenAI Realtime API Guide and API Reference.
For more info on usage, tools, and custom events, see OpenAI's readme. Note that this package is 100% compatible with OpenAI's beta package in terms of both official and unofficial events. The only difference is that all events are typed.
RealtimeClient takes in an optional apiKey which defaults to process.env.OPENAI_API_KEY.
RealtimeClient takes in an optional url which can be pointed at a relay server.
import { RealtimeClient } from 'openai-realtime-api'
// Create a browser client which points to a relay server.
const client = new RealtimeClient({ url: RELAY_SERVER_URL })Alternatively, you can use apiKey with RealtimeClient in the browser, but you also have to pass dangerouslyAllowAPIKeyInBrowser: true.
import { RealtimeClient } from 'openai-realtime-api'
// Create a browser client which connects directly to the OpenAI realtime API
// with an unsafe, client-side API key.
const client = new RealtimeClient({
apiKey: process.env.OPENAI_API_KEY,
dangerouslyAllowAPIKeyInBrowser: true
})Caution
We strongly recommend against including your API key in any client (mobile or browser). It can be useful for local testing, but for production, you should be using a relay server.
import { RealtimeClient } from 'openai-realtime-api'
import { RealtimeRelay } from 'openai-realtime-api/node'
// Setting `relay: true` disables tool calls and directly modifying the session,
// since that will be the responsibility of the upstream client.
const client = new RealtimeClient({ relay: true })
const relay = new RealtimeRelay({ client })
relay.listen(8081)Note that RealtimeRelay uses a different import path because it contains Node.js-specific code.
A full example is included in examples/node/relay-server.ts.
To run the included examples (requires Node.js >= 18):
- Clone this repo
- Run
pnpm install - Setup
.envwith yourOPENAI_API_KEY
You can set debug: true in the RealtimeClient constructor of these examples to print out the full event log.
Simple Node.js demo using the RealtimeClient which sends a text message and waits for a complete response.
- examples/node/basic.ts
- Run
npx tsx examples/node/basic.ts
Simple Node.js demo using the RealtimeClient which sends a short audio message and waits for a complete response.
- examples/node/audio.ts
- Run
npx tsx examples/node/audio.ts
Simple Node.js demo using the RealtimeClient with a microphone and speaker to simulate a full, back & forth conversation from the terminal.
- examples/node/convo.ts
- This demo uses the mic and speaker npm packages
micrequires sox; on macOS, you can runbrew install soxnpx tsx examples/node/convo.ts
This example has been imported from https://github.com/openai/openai-realtime-console (at commit 6ea4dba). The only change has been to replace @openai/realtime-api-beta with openai-realtime-api and to fix a few types.
To run the realtime console example:
pnpm install
cd examples/openai-realtime-console
pnpm start- add an example using tools
- add an example next.js app
- improve readme docs
MIT © Travis Fischer
If you found this project interesting, consider following me on Twitter.
