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)
}
}
}