Connect
Connect to Live without query parameters. Send session.start with model and session configuration, then wait for session.started. Follow the Live prompting guide before writing instructions.
WebSocket wss://api.openai.com/v1/live/sessions
Connect
package main
import (
"context"
"fmt"
openai "github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/live"
"log"
"time"
)
func main() {
if err := observe(); err != nil {
log.Fatal(err)
}
}
func observe() error {
// Stop waiting if the peer never sends the expected events.
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
client := openai.NewClient()
// New primary session; model belongs in session.start, not the URL.
connection, err := client.Live.Connect(ctx, live.LiveConnectionOptions{})
if err != nil {
return err
}
// Release the transport after the terminal event or an error.
defer connection.Close()
if err := connection.Send(ctx, live.ClientEventParamOfSessionStart(live.SessionConfigParam{Model: "gpt-live-1"})); err != nil {
return err
}
closeRequested := false
for {
received, err := connection.Recv(ctx)
if err != nil {
return fmt.Errorf("disconnected before session.closed; final usage unconfirmed: %w", err)
}
switch event := received.AsAny().(type) {
case live.ErrorEvent:
return fmt.Errorf("Live reported a session error.")
case live.SessionStartedEvent:
// Wait for startup before closing the session this example owns.
fmt.Println("Session ready:", event.Session.ID, event.Session.Model)
err = connection.Send(ctx, live.ClientEventUnionParam{OfSessionClose: &live.SessionCloseEventParam{}})
closeRequested = err == nil
case live.SessionClosedEvent:
if !closeRequested || event.Reason != "close_requested" {
return fmt.Errorf("session ended unexpectedly: %s; usage=%v", event.Reason, event.Usage)
}
fmt.Println("Final usage:", event.Usage)
return nil
}
if err != nil {
return err
}
}
}