85ws.send(json.dumps(event))85ws.send(json.dumps(event))
86```86```
87 87
88```java
89import com.openai.client.okhttp.OkHttpClient;
90import com.openai.core.ClientOptions;
91import com.openai.core.JsonValue;
92import com.openai.helpers.RealtimeConnection;
93import com.openai.helpers.RealtimeWebSocketOptions;
94import com.openai.models.realtime.*;
95import java.util.List;
96import java.util.Map;
97
98connection.send(
99 RealtimeClientEvent.ofSessionUpdate(
100 SessionUpdateEvent.builder()
101 .session(
102 RealtimeSessionCreateRequest.builder()
103 .model("gpt-realtime-2.1")
104 .addTool(
105 RealtimeFunctionTool.builder()
106 .type(RealtimeFunctionTool.Type.FUNCTION)
107 .name("lookup_order")
108 .description("Look up an order by its order number.")
109 .parameters(
110 JsonValue.from(
111 Map.of(
112 "type",
113 "object",
114 "properties",
115 Map.of(
116 "order_number",
117 Map.of(
118 "type",
119 "string",
120 "description",
121 "The customer-facing order number.")),
122 "required",
123 List.of("order_number"))))
124 .build())
125 .toolChoice(com.openai.models.responses.ToolChoiceOptions.AUTO)
126 .build())
127 .build()));
128```
129
130```csharp
131using OpenAI.Realtime;
132
133#pragma warning disable OPENAI002
134
135await session.SendCommandAsync(new RealtimeClientCommandSessionUpdate(new RealtimeConversationSessionOptions
136{
137 Model = "gpt-realtime-2.1",
138 Tools =
139 {
140 new RealtimeFunctionTool("lookup_order")
141 {
142 FunctionDescription = "Look up an order by its order number.",
143 FunctionParameters = BinaryData.FromObjectAsJson(new { type = "object", properties = new { order_number = new { type = "string", description = "The customer-facing order number." } }, required = (string[])["order_number"] })
144 }
145 },
146 ToolChoice = RealtimeDefaultToolChoice.Auto
147}), timeout.Token);
148```
149
88```ruby150```ruby
89connection.session.update(151connection.session.update(
90 type: :realtime,152 type: :realtime,
151ws.send(json.dumps({"type": "response.create"}))213ws.send(json.dumps({"type": "response.create"}))
152```214```
153 215
216```java
217import com.openai.client.okhttp.OkHttpClient;
218import com.openai.core.ClientOptions;
219import com.openai.core.JsonValue;
220import com.openai.helpers.RealtimeConnection;
221import com.openai.helpers.RealtimeWebSocketOptions;
222import com.openai.models.realtime.*;
223import com.openai.models.responses.ToolChoiceFunction;
224import com.openai.models.responses.ToolChoiceOptions;
225import java.util.Map;
226
227static void sendFunctionCallOutput(RealtimeConnection connection, String callId)
228 throws Exception {
229 send(
230 connection,
231 RealtimeClientEvent.ofConversationItemCreate(
232 ConversationItemCreateEvent.builder()
233 .item(
234 RealtimeConversationItemFunctionCallOutput.builder()
235 .callId(callId)
236 .output("{\"status\":\"shipped\",\"delivery_date\":\"2026-05-09\"}")
237 .build())
238 .build()));
239 send(
240 connection,
241 RealtimeClientEvent.ofResponseCreate(
242 ResponseCreateEvent.builder()
243 .response(
244 RealtimeResponseCreateParams.builder()
245 .metadata(
246 RealtimeResponseCreateParams.Metadata.builder()
247 .putAdditionalProperty(
248 "topic", JsonValue.from("lookup_order_followup"))
249 .build())
250 .toolChoice(ToolChoiceOptions.NONE)
251 .build())
252 .build()));
253}
254
255// Retry only explicit admission rejections; these guarantee nothing was sent.
256private static void send(RealtimeConnection connection, RealtimeClientEvent event)
257 throws Exception {
258 long deadline = System.nanoTime() + java.util.concurrent.TimeUnit.SECONDS.toNanos(5);
259 while (true) {
260 try {
261 connection.send(event);
262 return;
263 } catch (com.openai.core.http.WebSocketWriteNotAttempted.Busy busy) {
264 if (System.nanoTime() >= deadline) throw busy;
265 Thread.sleep(10);
266 }
267 }
268}
269```
270
271```csharp
272using OpenAI.Realtime;
273
274#pragma warning disable OPENAI002
275
276internal static async Task SendFunctionCallOutputAsync(RealtimeSessionClient session, string callId, CancellationToken cancellationToken)
277{
278 string output = System.Text.Json.JsonSerializer.Serialize(new { status = "shipped", delivery_date = "2026-05-09" });
279 await session.SendCommandAsync(new RealtimeClientCommandConversationItemCreate(new RealtimeFunctionCallOutputItem(callId, output)), cancellationToken);
280 await session.SendCommandAsync(new RealtimeClientCommandResponseCreate
281 {
282 ResponseOptions = new()
283 {
284 Metadata = new Dictionary<string, BinaryData> { ["topic"] = BinaryData.FromObjectAsJson("lookup_order_followup") },
285 ToolChoice = RealtimeDefaultToolChoice.None
286 }
287 }, cancellationToken);
288}
289```
290
154```ruby291```ruby
155connection.conversation.items.create(292connection.conversation.items.create(
156 type: :function_call_output,293 type: :function_call_output,
225ws.send(json.dumps(event))362ws.send(json.dumps(event))
226```363```
227 364
365```java
366import com.openai.client.okhttp.OkHttpClient;
367import com.openai.core.ClientOptions;
368import com.openai.helpers.RealtimeConnection;
369import com.openai.helpers.RealtimeWebSocketOptions;
370import com.openai.models.realtime.*;
371import java.util.List;
372
373connection.send(
374 RealtimeClientEvent.ofSessionUpdate(
375 SessionUpdateEvent.builder()
376 .session(
377 RealtimeSessionCreateRequest.builder()
378 .model("gpt-realtime-2.1")
379 .addOutputModality(RealtimeSessionCreateRequest.OutputModality.TEXT)
380 .addTool(
381 RealtimeToolsConfigUnion.Mcp.builder()
382 .serverLabel("openai_docs")
383 .serverUrl("https://developers.openai.com/mcp")
384 .allowedToolsOfMcp(
385 List.of("search_openai_docs", "fetch_openai_doc"))
386 .requireApproval(
387 RealtimeToolsConfigUnion.Mcp.RequireApproval
388 .McpToolApprovalSetting.NEVER)
389 .build())
390 .build())
391 .build()));
392```
393
394```csharp
395using OpenAI.Realtime;
396
397#pragma warning disable OPENAI002
398
399await session.SendCommandAsync(new RealtimeClientCommandSessionUpdate(new RealtimeConversationSessionOptions
400{
401 Model = "gpt-realtime-2.1",
402 OutputModalities =
403 {
404 RealtimeOutputModality.Text
405 },
406 Tools =
407 {
408 new RealtimeMcpTool("openai_docs", new Uri("https://developers.openai.com/mcp"))
409 {
410 AllowedTools = new()
411 {
412 ToolNames =
413 {
414 "search_openai_docs",
415 "fetch_openai_doc"
416 }
417 },
418 ToolCallApprovalPolicy = RealtimeDefaultMcpToolCallApprovalPolicy.NeverRequireApproval
419 }
420 }
421}), timeout.Token);
422```
423
228```ruby424```ruby
229connection.session.update(425connection.session.update(
230 type: :realtime,426 type: :realtime,
311ws.send(json.dumps(event))507ws.send(json.dumps(event))
312```508```
313 509
510```java
511import com.openai.client.okhttp.OkHttpClient;
512import com.openai.core.ClientOptions;
513import com.openai.helpers.RealtimeConnection;
514import com.openai.helpers.RealtimeWebSocketOptions;
515import com.openai.models.realtime.*;
516import java.util.List;
517
518connection.send(
519 RealtimeClientEvent.ofSessionUpdate(
520 SessionUpdateEvent.builder()
521 .session(
522 RealtimeSessionCreateRequest.builder()
523 .model("gpt-realtime-1.5")
524 .addOutputModality(RealtimeSessionCreateRequest.OutputModality.TEXT)
525 .addTool(
526 RealtimeToolsConfigUnion.Mcp.builder()
527 .serverLabel("google_calendar")
528 .connectorId(
529 RealtimeToolsConfigUnion.Mcp.ConnectorId
530 .CONNECTOR_GOOGLECALENDAR)
531 .authorization(System.getenv("OPENAI_CONNECTOR_AUTHORIZATION"))
532 .allowedToolsOfMcp(List.of("search_events", "read_event"))
533 .requireApproval(
534 RealtimeToolsConfigUnion.Mcp.RequireApproval
535 .McpToolApprovalSetting.NEVER)
536 .build())
537 .build())
538 .build()));
539```
540
541```csharp
542using OpenAI.Realtime;
543
544#pragma warning disable OPENAI002
545
546await session.SendCommandAsync(new RealtimeClientCommandSessionUpdate(new RealtimeConversationSessionOptions
547{
548 Model = "gpt-realtime-1.5",
549 OutputModalities =
550 {
551 RealtimeOutputModality.Text
552 },
553 Tools =
554 {
555 new RealtimeMcpTool("google_calendar", RealtimeMcpToolConnectorId.GoogleCalendar)
556 {
557 AuthorizationToken = Environment.GetEnvironmentVariable("OPENAI_CONNECTOR_AUTHORIZATION")!,
558 AllowedTools = new()
559 {
560 ToolNames =
561 {
562 "search_events",
563 "read_event"
564 }
565 },
566 ToolCallApprovalPolicy = RealtimeDefaultMcpToolCallApprovalPolicy.NeverRequireApproval
567 }
568 }
569}), timeout.Token);
570```
571
314```ruby572```ruby
315access_token = ENV.fetch("OPENAI_MCP_ACCESS_TOKEN")573access_token = ENV.fetch("OPENAI_MCP_ACCESS_TOKEN")
316 574
619 ws.send(json.dumps(event))877 ws.send(json.dumps(event))
620```878```
621 879
880```java
881import com.openai.client.okhttp.OkHttpClient;
882import com.openai.core.ClientOptions;
883import com.openai.helpers.RealtimeConnection;
884import com.openai.helpers.RealtimeWebSocketOptions;
885import com.openai.models.realtime.*;
886import com.openai.models.responses.ToolChoiceOptions;
887
888// Replace https://mcp.example.com/mcp with your company's MCP server URL.
889
890static void approveMcpRequest(RealtimeConnection connection, String approvalRequestId)
891 throws Exception {
892 send(
893 connection,
894 RealtimeClientEvent.ofConversationItemCreate(
895 ConversationItemCreateEvent.builder()
896 .item(
897 RealtimeMcpApprovalResponse.builder()
898 .id("mcp_approval_" + approvalRequestId)
899 .approvalRequestId(approvalRequestId)
900 .approve(true)
901 .build())
902 .build()));
903}
904
905// Retry only explicit admission rejections; these guarantee nothing was sent.
906private static void send(RealtimeConnection connection, RealtimeClientEvent event)
907 throws Exception {
908 long deadline = System.nanoTime() + java.util.concurrent.TimeUnit.SECONDS.toNanos(5);
909 while (true) {
910 try {
911 connection.send(event);
912 return;
913 } catch (com.openai.core.http.WebSocketWriteNotAttempted.Busy busy) {
914 if (System.nanoTime() >= deadline) throw busy;
915 Thread.sleep(10);
916 }
917 }
918}
919```
920
921```csharp
922using OpenAI.Realtime;
923
924#pragma warning disable OPENAI002
925// Replace https://mcp.example.com/mcp with your company's MCP server URL.
926
927internal static async Task ApproveMcpRequestAsync(RealtimeSessionClient session, string approvalRequestId, CancellationToken cancellationToken)
928{
929 await session.SendCommandAsync(new RealtimeClientCommandConversationItemCreate(new RealtimeMcpToolCallApprovalResponseItem(approvalRequestId, true)
930 {
931 Id = $"mcp_approval_{approvalRequestId}"
932 }), cancellationToken);
933}
934```
935
622```ruby936```ruby
623# Use the ID from the received MCP approval-request item.937# Use the ID from the received MCP approval-request item.
624approval_request_id = item.id938approval_request_id = item.id
704ws.send(json.dumps(event))1018ws.send(json.dumps(event))
705```1019```
706 1020
1021```java
1022import com.openai.client.okhttp.OkHttpClient;
1023import com.openai.core.ClientOptions;
1024import com.openai.helpers.RealtimeConnection;
1025import com.openai.helpers.RealtimeWebSocketOptions;
1026import com.openai.models.realtime.*;
1027import java.util.List;
1028
1029connection.send(
1030 RealtimeClientEvent.ofResponseCreate(
1031 ResponseCreateEvent.builder()
1032 .response(
1033 RealtimeResponseCreateParams.builder()
1034 .metadata(
1035 RealtimeResponseCreateParams.Metadata.builder()
1036 .putAdditionalProperty(
1037 "topic", com.openai.core.JsonValue.from("mcp_initial"))
1038 .build())
1039 .addOutputModality(RealtimeResponseCreateParams.OutputModality.TEXT)
1040 .addInput(
1041 RealtimeConversationItemUserMessage.builder()
1042 .addContent(
1043 RealtimeConversationItemUserMessage.Content.builder()
1044 .type(
1045 RealtimeConversationItemUserMessage.Content.Type
1046 .INPUT_TEXT)
1047 .text(
1048 "Which transport should I use for browser clients in the Realtime API?")
1049 .build())
1050 .build())
1051 .addTool(
1052 RealtimeResponseCreateMcpTool.builder()
1053 .serverLabel("openai_docs")
1054 .serverUrl("https://developers.openai.com/mcp")
1055 .allowedToolsOfMcp(
1056 List.of("search_openai_docs", "fetch_openai_doc"))
1057 .requireApproval(
1058 RealtimeResponseCreateMcpTool.RequireApproval
1059 .McpToolApprovalSetting.NEVER)
1060 .build())
1061 .build())
1062 .build()));
1063```
1064
1065```csharp
1066using OpenAI.Realtime;
1067
1068#pragma warning disable OPENAI002
1069
1070await session.SendCommandAsync(new RealtimeClientCommandResponseCreate
1071{
1072 ResponseOptions = new()
1073 {
1074 Metadata = new Dictionary<string, BinaryData> { ["topic"] = BinaryData.FromObjectAsJson("mcp_initial") },
1075 OutputModalities =
1076 {
1077 RealtimeOutputModality.Text
1078 },
1079 InputItems =
1080 {
1081 RealtimeItem.CreateUserMessageItem("Which transport should I use for browser clients in the Realtime API?")
1082 },
1083 Tools =
1084 {
1085 new RealtimeMcpTool("openai_docs", new Uri("https://developers.openai.com/mcp"))
1086 {
1087 AllowedTools = new()
1088 {
1089 ToolNames =
1090 {
1091 "search_openai_docs",
1092 "fetch_openai_doc"
1093 }
1094 },
1095 ToolCallApprovalPolicy = RealtimeDefaultMcpToolCallApprovalPolicy.NeverRequireApproval
1096 }
1097 }
1098 }
1099}, timeout.Token);
1100```
1101
707```ruby1102```ruby
708connection.response.create(1103connection.response.create(
709 output_modalities: [:text],1104 output_modalities: [:text],
805ws.send(json.dumps(event))1200ws.send(json.dumps(event))
806```1201```
807 1202
1203```java
1204import com.openai.client.okhttp.OkHttpClient;
1205import com.openai.core.ClientOptions;
1206import com.openai.helpers.RealtimeConnection;
1207import com.openai.helpers.RealtimeWebSocketOptions;
1208import com.openai.models.realtime.*;
1209import java.util.List;
1210
1211send(
1212 connection,
1213 RealtimeClientEvent.ofResponseCreate(
1214 ResponseCreateEvent.builder()
1215 .response(
1216 RealtimeResponseCreateParams.builder()
1217 .metadata(
1218 RealtimeResponseCreateParams.Metadata.builder()
1219 .putAdditionalProperty(
1220 "topic", com.openai.core.JsonValue.from("mcp_initial"))
1221 .build())
1222 .addOutputModality(RealtimeResponseCreateParams.OutputModality.TEXT)
1223 .addInput(
1224 RealtimeConversationItemUserMessage.builder()
1225 .addContent(
1226 RealtimeConversationItemUserMessage.Content.builder()
1227 .type(
1228 RealtimeConversationItemUserMessage.Content.Type
1229 .INPUT_TEXT)
1230 .text("Check my schedule for this afternoon.")
1231 .build())
1232 .build())
1233 .addTool(
1234 RealtimeResponseCreateMcpTool.builder()
1235 .serverLabel("google_calendar")
1236 .build())
1237 .build())
1238 .build()));
1239
1240// Retry only explicit admission rejections; these guarantee nothing was sent.
1241private static void send(RealtimeConnection connection, RealtimeClientEvent event)
1242 throws Exception {
1243 long deadline = System.nanoTime() + java.util.concurrent.TimeUnit.SECONDS.toNanos(5);
1244 while (true) {
1245 try {
1246 connection.send(event);
1247 return;
1248 } catch (com.openai.core.http.WebSocketWriteNotAttempted.Busy busy) {
1249 if (System.nanoTime() >= deadline) throw busy;
1250 Thread.sleep(10);
1251 }
1252 }
1253}
1254```
1255
1256```csharp
1257using OpenAI.Realtime;
1258
1259#pragma warning disable OPENAI002
1260
1261await session.SendCommandAsync(new RealtimeClientCommandResponseCreate
1262{
1263 ResponseOptions = new()
1264 {
1265 Metadata = new Dictionary<string, BinaryData> { ["topic"] = BinaryData.FromObjectAsJson("mcp_initial") },
1266 OutputModalities =
1267 {
1268 RealtimeOutputModality.Text
1269 },
1270 InputItems =
1271 {
1272 RealtimeItem.CreateUserMessageItem("Check my schedule for this afternoon.")
1273 },
1274 Tools =
1275 {
1276 new RealtimeMcpTool
1277 {
1278 ServerLabel = "google_calendar"
1279 }
1280 }
1281 }
1282}, timeout.Token);
1283```
1284
808```ruby1285```ruby
809connection.response.create(1286connection.response.create(
810 output_modalities: [:text],1287 output_modalities: [:text],