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/option"
)
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.Beta.Responses.Connect(ctx, openai.BetaResponseConnectionOptions{},
option.WithHeader("OpenAI-Beta", "responses_multi_agent=v1"))
if err != nil {
return err
}
// Closing in run releases the socket before main can exit on an error.
defer connection.Close()
err = connection.Send(ctx, openai.BetaResponsesClientEventUnionParam{
OfResponseCreate: &openai.BetaResponsesClientEventResponseCreateParam{
Model: "gpt-6-astra",
Input: openai.BetaResponsesClientEventResponseCreateInputUnionParam{
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.OfBetaResponsesServerEventBetaResponseTextWsDelta.Delta)
case "response.completed":
// A closed socket alone does not prove the response completed.
fmt.Println()
return nil
case "error":
e := event.OfBetaResponsesServerEventBetaResponseWsError.Error
return fmt.Errorf("%s: %s", e.Code, e.Message)
case "response.failed", "response.incomplete":
return fmt.Errorf("response ended with %s", event.Type)
}
}
}