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

Connect to a persistent Responses API WebSocket. Send response.create events to create responses and response.steer events to queue user input containing text, images, or files for a continuation. Receive response stream events and steering acceptance, pending, or failure events over the socket.

WebSocket wss://api.openai.com/v1/responses

Connect

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/openai/openai-go/v3"
	"github.com/openai/openai-go/v3/responses"
)

func main() {
	if err := run(); err != nil {
		log.Fatal(err)
	}
}

func run() error {
	// Bound the whole exchange, including reads from a silent server.
	ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
	defer cancel()
	client := openai.NewClient()
	connection, err := client.Responses.Connect(ctx, responses.ResponseConnectionOptions{})
	if err != nil {
		return err
	}
	// Closing in run releases the socket before main can exit on an error.
	defer connection.Close()

	err = connection.Create(ctx, responses.ResponsesClientEventResponseCreateParam{
		Model: "gpt-6-astra",
		Input: responses.ResponsesClientEventResponseCreateInputUnionParam{
			OfString: openai.String("Say hello in one short sentence."),
		},
	})
	if err != nil {
		return err
	}
	for {
		event, err := connection.Recv(ctx)
		if err != nil {
			return fmt.Errorf("response did not complete: %w", err)
		}
		switch event.Type {
		case "response.output_text.delta":
			fmt.Print(event.OfResponsesServerEventResponseTextWsDelta.Delta)
		case "response.completed":
			// A closed socket alone does not prove the response completed.
			fmt.Println()
			return nil
		case "error":
			e := event.OfResponsesServerEventResponseWsError.Error
			return fmt.Errorf("%s: %s", e.Code, e.Message)
		case "response.failed", "response.incomplete":
			return fmt.Errorf("response ended with %s", event.Type)
		}
	}
}