Skip to content
For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Primary navigation

Connect

Fork a stored Live session over WebSocket. Send session.start with an overrides object (which may be empty), then wait for session.started. The model is inherited.

WebSocket wss://api.openai.com/v1/live/sessions/{session_id}/fork

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()
	// Use the ID of a stored, closed session whose recording has finalized.
	connection, err := client.Live.Forks.Connect(ctx, "sess_123", live.ForkConnectionOptions{})
	if err != nil {
		return err
	}
	// Release the transport after the terminal event or an error.
	defer connection.Close()

	if err := connection.Send(ctx, live.ForkClientEventParamOfSessionStart(live.ForkSessionConfigParam{})); 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.ForkClientEventUnionParam{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
		}
	}
}