SoxAIDocs
Quickstart

Go Quickstart

Use the go-openai library with SoxAI in Go projects

Go Quickstart

Installation

go get github.com/sashabaranov/go-openai

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