Skip to content
For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Primary navigation
Theme

Connect

The Realtime API enables you to build low-latency, multi-modal conversational experiences. It currently supports text and audio as both input and output, as well as function calling.

Some notable benefits of the API include:

  • Native speech-to-speech: Skipping an intermediate text format means low latency and nuanced output.
  • Natural, steerable voices: The models have natural inflection and can laugh, whisper, and adhere to tone direction.
  • Simultaneous multimodal output: Text is useful for moderation; faster-than-realtime audio ensures stable playback.

The Realtime API is a stateful, event-based API that communicates over a WebSocket. To start a Realtime conversation, set model in the connection URL. To join an existing call, set call_id instead. Transcription sessions use intent=transcription.

WebSocket wss://api.openai.com/v1/realtime

Connect

import com.openai.client.okhttp.OkHttpClient;
import com.openai.core.ClientOptions;
import com.openai.helpers.RealtimeConnection;
import com.openai.helpers.RealtimeWebSocketOptions;
import com.openai.models.realtime.ConversationItemCreateEvent;
import com.openai.models.realtime.RealtimeClientEvent;
import com.openai.models.realtime.RealtimeConversationItemUserMessage;
import com.openai.models.realtime.RealtimeResponse;
import com.openai.models.realtime.RealtimeServerEvent;
import com.openai.models.realtime.RealtimeSessionCreateRequest;
import com.openai.models.realtime.ResponseCreateEvent;
import com.openai.models.realtime.SessionUpdateEvent;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Main {
    public static void main(String[] args) throws Exception {
        ClientOptions options =
                ClientOptions.builder()
                        .fromEnv()
                        .httpClient(OkHttpClient.builder().build())
                        .build();
        try (RealtimeConnection connection =
                RealtimeConnection.connect(
                        options,
                        RealtimeWebSocketOptions.builder().model("gpt-realtime").build())) {
            // One deadline for the exchange; repeated deltas must not extend it.
            long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(60);
            connection.send(
                    RealtimeClientEvent.ofSessionUpdate(
                            SessionUpdateEvent.builder()
                                    .session(
                                            RealtimeSessionCreateRequest.builder()
                                                    .addOutputModality(
                                                            RealtimeSessionCreateRequest
                                                                    .OutputModality.TEXT)
                                                    .build())
                                    .build()));
            connection.send(
                    RealtimeClientEvent.ofConversationItemCreate(
                            ConversationItemCreateEvent.builder()
                                    .item(
                                            RealtimeConversationItemUserMessage.builder()
                                                    .addContent(
                                                            RealtimeConversationItemUserMessage
                                                                    .Content.builder()
                                                                    .type(
                                                                            RealtimeConversationItemUserMessage
                                                                                    .Content.Type
                                                                                    .INPUT_TEXT)
                                                                    .text("Say hello.")
                                                                    .build())
                                                    .build())
                                    .build()));
            connection.send(
                    RealtimeClientEvent.ofResponseCreate(ResponseCreateEvent.builder().build()));
            while (true) {
                long remaining = deadline - System.nanoTime();
                if (remaining <= 0) {
                    throw new TimeoutException("Response did not complete within 60 seconds.");
                }
                RealtimeServerEvent event =
                        connection.receiveAsync().get(remaining, TimeUnit.NANOSECONDS);
                if (event.isResponseOutputTextDelta()) {
                    System.out.print(event.asResponseOutputTextDelta().delta());
                } else if (event.isError()) {
                    throw new IllegalStateException(event.asError().error().message());
                } else if (event.isResponseDone()) {
                    // response.done includes non-successful outcomes too.
                    if (!event.asResponseDone()
                            .response()
                            .status()
                            .filter(RealtimeResponse.Status.COMPLETED::equals)
                            .isPresent()) {
                        throw new IllegalStateException(
                                "Realtime response did not complete successfully.");
                    }
                    System.out.println();
                    return;
                }
            }
        } finally {
            options.close();
        }
    }
}