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();
}
}
}