Quickstart
Go Quickstart
Use the go-openai library with SoxAI in Go projects
Go Quickstart
Installation
go get github.com/sashabaranov/go-openaiBasic Chat Completion
package main
import (
"context"
"fmt"
"log"
"os"
openai "github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig(os.Getenv("SOXAI_API_KEY"))
config.BaseURL = "https://api.soxai.io/v1"
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT4o,
Messages: []openai.ChatCompletionMessage{
{
Role: openai.ChatMessageRoleSystem,
Content: "You are a helpful assistant.",
},
{
Role: openai.ChatMessageRoleUser,
Content: "What is the Go programming language?",
},
},
},
)
if err != nil {
log.Fatalf("Chat completion error: %v", err)
}
fmt.Println(resp.Choices[0].Message.Content)
}Streaming
package main
import (
"context"
"errors"
"fmt"
"io"
"log"
"os"
openai "github.com/sashabaranov/go-openai"
)
func main() {
config := openai.DefaultConfig(os.Getenv("SOXAI_API_KEY"))
config.BaseURL = "https://api.soxai.io/v1"
client := openai.NewClientWithConfig(config)
stream, err := client.CreateChatCompletionStream(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT4oMini,
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "Tell me a short joke."},
},
Stream: true,
},
)
if err != nil {
log.Fatalf("Stream error: %v", err)
}
defer stream.Close()
for {
response, err := stream.Recv()
if errors.Is(err, io.EOF) {
fmt.Println()
break
}
if err != nil {
log.Fatalf("Stream receive error: %v", err)
}
fmt.Print(response.Choices[0].Delta.Content)
}
}Embeddings
resp, err := client.CreateEmbeddings(
context.Background(),
openai.EmbeddingRequest{
Input: []string{"The quick brown fox"},
Model: openai.SmallEmbedding3,
},
)
if err != nil {
log.Fatalf("Embedding error: %v", err)
}
fmt.Printf("Embedding dimensions: %d\n", len(resp.Data[0].Embedding))Session Stickiness
To bind a conversation to a specific upstream provider, add the X-Session-ID header using a custom HTTP client:
package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
openai "github.com/sashabaranov/go-openai"
)
type sessionTransport struct {
sessionID string
base http.RoundTripper
}
func (t *sessionTransport) RoundTrip(r *http.Request) (*http.Response, error) {
r = r.Clone(r.Context())
r.Header.Set("X-Session-ID", t.sessionID)
return t.base.RoundTrip(r)
}
func main() {
config := openai.DefaultConfig(os.Getenv("SOXAI_API_KEY"))
config.BaseURL = "https://api.soxai.io/v1"
config.HTTPClient = &http.Client{
Transport: &sessionTransport{
sessionID: "my-conversation-xyz",
base: http.DefaultTransport,
},
}
client := openai.NewClientWithConfig(config)
resp, err := client.CreateChatCompletion(context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT4o,
Messages: []openai.ChatCompletionMessage{
{Role: openai.ChatMessageRoleUser, Content: "Continue our conversation..."},
},
},
)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}Error Handling
resp, err := client.CreateChatCompletion(ctx, req)
if err != nil {
var apiErr *openai.APIError
if errors.As(err, &apiErr) {
switch apiErr.HTTPStatusCode {
case 401:
log.Fatal("Invalid API key")
case 429:
log.Printf("Rate limited or quota exceeded: %s", apiErr.Message)
case 503:
log.Fatal("All upstream providers unavailable")
default:
log.Fatalf("API error %d: %s", apiErr.HTTPStatusCode, apiErr.Message)
}
}
log.Fatal(err)
}