OpenAI SDK-compatible GPT-Live speech-to-speech
/oai/live/sessionsHolds a speech-to-speech conversation over the OpenAI GPT-Live protocol; gpt-live-1 and gemini-3.8-live share its frames. Set the OpenAI SDK base URL to https://api.allmodels.io/oai and authenticate with your AllModels API key.
- First frame:
session.start, a text frame of at most 64 KB sent within 15 seconds. - Model:
session.model:gpt-live-1(optionalopenai/prefix) orgemini-3.8-live(optionalgemini/prefix). - Delegation: client only (
delegationabsent or{"type":"client"},storeabsent orfalse). - Audio:
audio/pcmat 24000 (default) or 16000, oraudio/pcmu/audio/pcmaat 8000, both directions. - Voices: set
session.audio.output.voiceinsession.start.gpt-live-1takes the GPT-Live voices (defaultmarin);gemini-3.8-livetakes Gemini's prebuilt voices by name, for example{"audio": {"output": {"voice": "Kore"}}}(defaultZephyr). - Ending: send
session.close, then wait forsession.closed. - Billing:
gpt-live-1on session seconds;gemini-3.8-liveon tokens. See the models page for prices.
Walkthrough and Gemini differences: Speech to speech. Frames and close codes: the realtime WebSocket reference.
Authorization
BearerAuth Tenant key supplied as the Authorization Bearer token.
In: header
Header Parameters
Must be websocket to perform the protocol upgrade.
Response Body
application/json
application/json
import { readFile, writeFile } from "node:fs/promises";import { setTimeout as sleep } from "node:timers/promises";import OpenAI from "openai";import { LiveWS } from "openai/resources/live/ws";const client = new OpenAI({ apiKey: process.env.ALLMODELS_API_KEY, baseURL: "https://api.allmodels.io/oai"});const live = new LiveWS(client);const reply = [];let quiet;live.on("session.output_audio.delta", ({ delta }) => reply.push(Buffer.from(delta, "base64")));live.on("session.output_transcript.delta", () => { // End the session two seconds after the reply's transcript goes quiet. clearTimeout(quiet); quiet = setTimeout(() => live.send({ type: "session.close" }), 2000);});live.on("session.closed", async () => { await writeFile("reply.pcm", Buffer.concat(reply)); live.close();});live.on("error", console.error);live.send({ type: "session.start", session: { model: "gpt-live-1", // or "gemini-3.8-live" audio: { format: { type: "audio/pcm", rate: 24000 }, output: { voice: "marin" } }, delegation: { type: "client" } }});// Stream 100 ms frames in real time, then two seconds of silence.const audio = Buffer.concat([await readFile("question.pcm"), Buffer.alloc(2 * 24000 * 2)]);for (let offset = 0; offset < audio.length; offset += 4800) { live.send({ type: "session.input_audio.append", audio: audio.subarray(offset, offset + 4800).toString("base64") }); await sleep(100);}import asyncioimport base64import osfrom pathlib import Pathfrom openai import AsyncOpenAIasync def stream_audio(connection): # Stream 100 ms frames in real time, then two seconds of silence. audio = Path("question.pcm").read_bytes() + bytes(2 * 24000 * 2) for offset in range(0, len(audio), 4800): chunk = base64.b64encode(audio[offset:offset + 4800]).decode("ascii") await connection.session.input_audio.append(audio=chunk) await asyncio.sleep(0.1)async def main(): client = AsyncOpenAI( api_key=os.environ["ALLMODELS_API_KEY"], base_url="https://api.allmodels.io/oai", ) async with client.live.connect() as connection: await connection.session.start(session={ "model": "gpt-live-1", # or "gemini-3.8-live" "audio": {"format": {"type": "audio/pcm", "rate": 24000}, "output": {"voice": "marin"}}, "delegation": {"type": "client"}, }) sender = asyncio.create_task(stream_audio(connection)) quiet = None with open("reply.pcm", "wb") as reply: async for event in connection: if event.type == "session.output_audio.delta": reply.write(base64.b64decode(event.delta)) elif event.type == "session.output_transcript.delta": # End the session two seconds after the reply's transcript goes quiet. if quiet: quiet.cancel() quiet = asyncio.get_running_loop().call_later( 2, lambda: asyncio.ensure_future(connection.session.close()) ) elif event.type == "session.closed": break sender.cancel()asyncio.run(main()){ "error": { "message": "string", "type": "string", "param": "string", "code": "string" }}{ "error": { "message": "string", "type": "string", "param": "string", "code": "string" }}OpenAI SDK-compatible realtime transcription and speech-to-speech GET
One OpenAI Realtime WebSocket for two uses. Set the OpenAI SDK base URL to `https://api.allmodels.io/oai` and authenticate with your AllModels API key.
Realtime WebSocket reference
Message-level AsyncAPI reference for every AllModels WebSocket channel.
