guides/realtime-conversations.md +247 −0
120ws.send(json.dumps(event))120ws.send(json.dumps(event))
121```121```
122 122
123```go
124// Replace pmpt_123 and 89 with an existing saved prompt and version.
125// The saved prompt must define the city variable.
126if err := conn.Send(ctx, realtime.RealtimeClientEventParamOfSessionUpdate(realtime.RealtimeSessionCreateRequestParam{
127 Model: "gpt-realtime-2.1",
128 Prompt: responses.ResponsePromptParam{
129 ID: "pmpt_123",
130 Version: openai.String("89"),
131 Variables: map[string]responses.ResponsePromptVariableUnionParam{
132 "city": {
133 OfString: openai.String("Paris"),
134 },
135 },
136 },
137 OutputModalities: []string{"audio"},
138 Instructions: openai.String("Speak clearly and briefly. Confirm before taking action."),
139 Audio: realtime.RealtimeAudioConfigParam{
140 Input: realtime.RealtimeAudioConfigInputParam{
141 Format: realtime.RealtimeAudioFormatsUnionParam{
142 OfAudioPCM: &realtime.RealtimeAudioFormatsAudioPCMParam{
143 Rate: 24000,
144 },
145 },
146 TurnDetection: realtime.RealtimeAudioInputTurnDetectionUnionParam{
147 OfSemanticVad: &realtime.RealtimeAudioInputTurnDetectionSemanticVadParam{},
148 },
149 },
150 Output: realtime.RealtimeAudioConfigOutputParam{
151 Format: realtime.RealtimeAudioFormatsUnionParam{
152 OfAudioPCM: &realtime.RealtimeAudioFormatsAudioPCMParam{
153 Rate: 24000,
154 },
155 },
156 Voice: realtime.RealtimeAudioConfigOutputVoiceUnionParam{
157 OfString: openai.String("marin"),
158 },
159 },
160 },
161})); err != nil {
162 return err
163}
164```
165
123```java166```java
124import com.openai.client.okhttp.OkHttpClient;167import com.openai.client.okhttp.OkHttpClient;
125import com.openai.core.ClientOptions;168import com.openai.core.ClientOptions;
267ws.send(json.dumps(event))310ws.send(json.dumps(event))
268```311```
269 312
313```go
314if err := conn.Send(ctx, realtime.RealtimeClientEventParamOfConversationItemCreate(realtime.RealtimeConversationItemUserMessageParam{
315 Content: []realtime.RealtimeConversationItemUserMessageContentParam{
316 {
317 Text: openai.String("What Prince album sold the most copies?"),
318 Type: "input_text",
319 },
320 },
321})); err != nil {
322 return err
323}
324```
325
270```java326```java
271import com.openai.client.okhttp.OkHttpClient;327import com.openai.client.okhttp.OkHttpClient;
272import com.openai.core.ClientOptions;328import com.openai.core.ClientOptions;
341ws.send(json.dumps(event))397ws.send(json.dumps(event))
342```398```
343 399
400```go
401if err := conn.Send(ctx, realtime.RealtimeClientEventUnionParam{
402 OfResponseCreate: &realtime.ResponseCreateEventParam{
403 Response: realtime.RealtimeResponseCreateParams{
404 OutputModalities: []string{"text"},
405 },
406 },
407}); err != nil {
408 return err
409}
410```
411
344```java412```java
345import com.openai.client.okhttp.OkHttpClient;413import com.openai.client.okhttp.OkHttpClient;
346import com.openai.core.ClientOptions;414import com.openai.core.ClientOptions;
420 print(server_event["response"]["output"][0])488 print(server_event["response"]["output"][0])
421```489```
422 490
491```go
492func receiveUntil(ctx context.Context, conn *realtime.RealtimeConnection, terminal string) (realtime.RealtimeServerEventUnion, error) {
493 for {
494 event, err := conn.Recv(ctx)
495 if err != nil {
496 return event, fmt.Errorf("waiting for %s: %w", terminal, err)
497 }
498 if event.Type == "error" {
499 return event, fmt.Errorf("Realtime API error: %s", event.OfRealtimeErrorEvent.Error.Message)
500 }
501 if event.Type == "response.done" && event.OfResponseDoneEvent.Response.Status != "completed" {
502 return event, fmt.Errorf("response ended with status %s", event.OfResponseDoneEvent.Response.Status)
503 }
504 if event.Type == "response.done" {
505 response := event.OfResponseDoneEvent.Response
506 fmt.Println("Response status:", response.Status)
507 for _, output := range response.Output {
508 item := output.OfRealtimeConversationItemAssistantMessage
509 if item.Type == "message" {
510 for _, content := range item.Content {
511 if content.Type == "output_text" {
512 fmt.Print(content.Text)
513 }
514 }
515 }
516 }
517 }
518 if event.Type == terminal {
519 return event, nil
520 }
521 }
522}
523```
524
423```java525```java
424import com.openai.client.okhttp.OkHttpClient;526import com.openai.client.okhttp.OkHttpClient;
425import com.openai.core.ClientOptions;527import com.openai.core.ClientOptions;
797 ws.send(json.dumps(event))899 ws.send(json.dumps(event))
798```900```
799 901
902```go
903// audio contains mono PCM16 samples at 24 kHz.
904for start := 0; start < len(audio); start += 9600 {
905 end := min(start+9600, len(audio))
906 if err := conn.Send(ctx, realtime.RealtimeClientEventParamOfInputAudioBufferAppend(base64.StdEncoding.EncodeToString(audio[start:end]))); err != nil {
907 return err
908 }
909}
910```
911
800```java912```java
801import com.openai.client.okhttp.OkHttpClient;913import com.openai.client.okhttp.OkHttpClient;
802import com.openai.core.ClientOptions;914import com.openai.core.ClientOptions;
898ws.send(json.dumps(event))1010ws.send(json.dumps(event))
899```1011```
900 1012
1013```go
1014if err := conn.Send(ctx, realtime.RealtimeClientEventParamOfConversationItemCreate(realtime.RealtimeConversationItemUserMessageParam{
1015 Content: []realtime.RealtimeConversationItemUserMessageContentParam{
1016 {
1017 Audio: openai.String(base64.StdEncoding.EncodeToString(audio)),
1018 Type: "input_audio",
1019 },
1020 },
1021})); err != nil {
1022 return err
1023}
1024```
1025
901```java1026```java
902import com.openai.client.okhttp.OkHttpClient;1027import com.openai.client.okhttp.OkHttpClient;
903import com.openai.core.ClientOptions;1028import com.openai.core.ClientOptions;
1011 print(server_event["delta"])1136 print(server_event["delta"])
1012```1137```
1013 1138
1139```go
1140func receiveUntil(ctx context.Context, conn *realtime.RealtimeConnection, terminal string) (realtime.RealtimeServerEventUnion, error) {
1141 for {
1142 event, err := conn.Recv(ctx)
1143 if err != nil {
1144 return event, fmt.Errorf("waiting for %s: %w", terminal, err)
1145 }
1146 if event.Type == "response.output_audio.delta" {
1147 audio, err := base64.StdEncoding.DecodeString(event.OfResponseAudioDeltaEvent.Delta)
1148 if err != nil {
1149 return event, err
1150 }
1151 fmt.Printf("Received %d audio bytes\n", len(audio))
1152 }
1153 if event.Type == "error" {
1154 return event, fmt.Errorf("Realtime API error: %s", event.OfRealtimeErrorEvent.Error.Message)
1155 }
1156 if event.Type == "response.done" && event.OfResponseDoneEvent.Response.Status != "completed" {
1157 return event, fmt.Errorf("response ended with status %s", event.OfResponseDoneEvent.Response.Status)
1158 }
1159 if event.Type == terminal {
1160 return event, nil
1161 }
1162 }
1163}
1164```
1165
1014```java1166```java
1015import com.openai.client.okhttp.OkHttpClient;1167import com.openai.client.okhttp.OkHttpClient;
1016import com.openai.core.ClientOptions;1168import com.openai.core.ClientOptions;
1080dataChannel.send(JSON.stringify(event));1232dataChannel.send(JSON.stringify(event));
1081```1233```
1082 1234
1235```go
1236if err := conn.Send(ctx, realtime.RealtimeClientEventParamOfConversationItemCreate(realtime.RealtimeConversationItemUserMessageParam{
1237 Content: []realtime.RealtimeConversationItemUserMessageContentParam{
1238 {
1239 ImageURL: openai.String("data:image/png;base64," + base64.StdEncoding.EncodeToString(image)),
1240 Type: "input_image",
1241 },
1242 {
1243 Text: openai.String("Describe this image."),
1244 Type: "input_text",
1245 },
1246 },
1247})); err != nil {
1248 return err
1249}
1250
1251if err := conn.Send(ctx, realtime.RealtimeClientEventUnionParam{
1252 OfResponseCreate: &realtime.ResponseCreateEventParam{
1253 Response: realtime.RealtimeResponseCreateParams{
1254 OutputModalities: []string{"text"},
1255 },
1256 },
1257}); err != nil {
1258 return err
1259}
1260```
1261
1083```ruby1262```ruby
1084encoded_image = Base64.strict_encode64(File.binread("image.png"))1263encoded_image = Base64.strict_encode64(File.binread("image.png"))
1085 1264
1191ws.send(json.dumps(event))1370ws.send(json.dumps(event))
1192```1371```
1193 1372
1373```go
1374if err := conn.Send(ctx, realtime.RealtimeClientEventUnionParam{
1375 OfResponseCreate: &realtime.ResponseCreateEventParam{
1376 Response: realtime.RealtimeResponseCreateParams{
1377 Instructions: openai.String("\nAnalyze the conversation so far. If it is related to support, output\n\"support\". If it is related to sales, output \"sales\".\n"),
1378 Metadata: shared.Metadata{
1379 "topic": "classification",
1380 },
1381 Conversation: "none",
1382 OutputModalities: []string{"text"},
1383 },
1384 },
1385}); err != nil {
1386 return err
1387}
1388```
1389
1194```java1390```java
1195import com.openai.client.okhttp.OkHttpClient;1391import com.openai.client.okhttp.OkHttpClient;
1196import com.openai.core.ClientOptions;1392import com.openai.core.ClientOptions;
1303 print(response["output"][0])1499 print(response["output"][0])
1304```1500```
1305 1501
1502```go
1503func receiveUntil(ctx context.Context, conn *realtime.RealtimeConnection, terminal string) (realtime.RealtimeServerEventUnion, error) {
1504 for {
1505 event, err := conn.Recv(ctx)
1506 if err != nil {
1507 return event, fmt.Errorf("waiting for %s: %w", terminal, err)
1508 }
1509 if event.Type == "error" {
1510 return event, fmt.Errorf("Realtime API error: %s", event.OfRealtimeErrorEvent.Error.Message)
1511 }
1512 if event.Type == "response.done" && event.OfResponseDoneEvent.Response.Metadata["topic"] != "classification" {
1513 continue
1514 }
1515 if event.Type == "response.done" && event.OfResponseDoneEvent.Response.Status != "completed" {
1516 return event, fmt.Errorf("response ended with status %s", event.OfResponseDoneEvent.Response.Status)
1517 }
1518 if event.Type == "response.done" {
1519 response := event.OfResponseDoneEvent.Response
1520 fmt.Println("Response status:", response.Status)
1521 for _, output := range response.Output {
1522 item := output.OfRealtimeConversationItemAssistantMessage
1523 if item.Type == "message" {
1524 for _, content := range item.Content {
1525 if content.Type == "output_text" {
1526 fmt.Print(content.Text)
1527 }
1528 }
1529 }
1530 }
1531 }
1532 if event.Type == terminal {
1533 return event, nil
1534 }
1535 }
1536}
1537```
1538
1306```java1539```java
1307import com.openai.client.okhttp.OkHttpClient;1540import com.openai.client.okhttp.OkHttpClient;
1308import com.openai.core.ClientOptions;1541import com.openai.core.ClientOptions;
1552ws.send(json.dumps(event))1785ws.send(json.dumps(event))
1553```1786```
1554 1787
1788```go
1789if err := conn.Send(ctx, realtime.RealtimeClientEventUnionParam{
1790 OfResponseCreate: &realtime.ResponseCreateEventParam{
1791 Response: realtime.RealtimeResponseCreateParams{
1792 Instructions: openai.String("\nSay exactly the following:\nI'm a little teapot, short and stout!\nThis is my handle, this is my spout!\n"),
1793 Input: []realtime.ConversationItemUnionParam{},
1794 OutputModalities: []string{"text"},
1795 },
1796 },
1797}); err != nil {
1798 return err
1799}
1800```
1801
1555```java1802```java
1556import com.openai.client.okhttp.OkHttpClient;1803import com.openai.client.okhttp.OkHttpClient;
1557import com.openai.core.ClientOptions;1804import com.openai.core.ClientOptions;