Files
go-openai-realtime/examples/text-only/main.go
T
zeekayandClaude Opus 5 410e64940f Go 1.27.1, and the code it can say more simply
Modules declare go 1.27.1 and the build images follow. go fix applied the
modernizers, and the examples print streamed deltas with Print instead of
using them as format strings; omitzero is not applied, since it changes
what the JSON says.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-16 19:21:06 -07:00

110 lines
2.5 KiB
Go

package main
import (
"bufio"
"context"
"fmt"
"log"
"os"
"sync"
"time"
openairt "github.com/hanzoai/go-openai-realtime"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
client := openairt.NewClient(os.Getenv("OPENAI_API_KEY"))
conn, err := client.Connect(ctx, openairt.WithLogger(openairt.StdLogger{}))
if err != nil {
log.Fatal(err)
}
var sendLock sync.Mutex
// Teletype response
responseDeltaHandler := func(ctx context.Context, event openairt.ServerEvent) {
switch event.ServerEventType() {
case openairt.ServerEventTypeResponseTextDelta:
fmt.Print(event.(openairt.ResponseTextDeltaEvent).Delta)
}
}
// Full response
responseHandler := func(ctx context.Context, event openairt.ServerEvent) {
switch event.ServerEventType() {
case openairt.ServerEventTypeResponseDone:
fmt.Printf("\n\n[full] %s\n\n", event.(openairt.ResponseDoneEvent).Response.Output[0].Content[0].Text)
fmt.Print("> ")
}
}
connHandler := openairt.NewConnHandler(ctx, conn, responseDeltaHandler, responseHandler)
connHandler.Start()
err = conn.SendMessage(ctx, &openairt.SessionUpdateEvent{
Session: openairt.ClientSession{
Modalities: []openairt.Modality{openairt.ModalityText},
},
})
if err != nil {
log.Fatal(err)
}
go func() {
for {
select {
case <-ctx.Done():
return
case <-time.After(30 * time.Second):
sendLock.Lock()
err := conn.Ping(ctx)
sendLock.Unlock()
if err != nil {
log.Printf("ping error: %v", err)
} else {
log.Printf("ping success")
}
}
}
}()
fmt.Println("Conversation")
fmt.Println("---------------------")
fmt.Print("> ")
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
if s.Text() == "exit" || s.Text() == "quit" {
break
}
sendLock.Lock()
conn.SendMessage(ctx, &openairt.ConversationItemCreateEvent{
Item: openairt.MessageItem{
ID: openairt.GenerateID("msg_", 10),
Status: openairt.ItemStatusCompleted,
Type: openairt.MessageItemTypeMessage,
Role: openairt.MessageRoleUser,
Content: []openairt.MessageContentPart{
{
Type: openairt.MessageContentTypeInputText,
Text: s.Text(),
},
},
},
})
conn.SendMessage(ctx, &openairt.ResponseCreateEvent{
Response: openairt.ResponseCreateParams{
Modalities: []openairt.Modality{openairt.ModalityText},
MaxOutputTokens: 4000,
},
})
sendLock.Unlock()
}
conn.Close()
err = <-connHandler.Err()
if err != nil {
log.Printf("connection error: %v", err)
}
}