SDK quickstart: Go

OpenAI's official Go SDK (openai-go) is the easiest path. The community go-openai library works too.

Install

go get github.com/openai/openai-go

Hello world

package main

import (
  "context"
  "fmt"
  "os"

  "github.com/openai/openai-go"
  "github.com/openai/openai-go/option"
)

func main() {
  client := openai.NewClient(
    option.WithBaseURL("https://api.greenjoules.cloud/v1/"),
    option.WithAPIKey(os.Getenv("JC_API_KEY")),
  )

  r, err := client.Chat.Completions.New(context.Background(),
    openai.ChatCompletionNewParams{
      Model: openai.F("auto"),
      Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
        openai.UserMessage("hi"),
      }),
    },
  )
  if err != nil {
    panic(err)
  }
  fmt.Println(r.Choices[0].Message.Content)
}

Joule headers

The SDK exposes the raw HTTP response on the parent struct:

resp, err := client.Chat.Completions.New(ctx, params)
if err != nil { return err }

raw := resp.RawResponse // *http.Response
fmt.Println("joules:", raw.Header.Get("X-Energy-Joules"))
fmt.Println("routed:", raw.Header.Get("X-Routed-To"))
fmt.Println("tier:", raw.Header.Get("X-Tier"))

Streaming

stream := client.Chat.Completions.NewStreaming(ctx, params)
defer stream.Close()
for stream.Next() {
  chunk := stream.Current()
  if len(chunk.Choices) > 0 {
    fmt.Print(chunk.Choices[0].Delta.Content)
  }
}
if err := stream.Err(); err != nil {
  return err
}

Embeddings + tool use

// embeddings
e, _ := client.Embeddings.New(ctx, openai.EmbeddingNewParams{
  Model: openai.F(openai.EmbeddingModelTextEmbedding3Small),
  Input: openai.F[openai.EmbeddingNewParamsInputUnion](
    openai.EmbeddingNewParamsInputArrayOfStrings([]string{"a", "b"}),
  ),
})

// tools
params := openai.ChatCompletionNewParams{
  Model: openai.F("auto"),
  Tools: openai.F([]openai.ChatCompletionToolParam{{
    Type: openai.F("function"),
    Function: openai.F(shared.FunctionDefinitionParam{
      Name: openai.F("get_weather"),
      Description: openai.F("Get current weather"),
      Parameters: openai.F(shared.FunctionParameters{
        "type": "object",
        "properties": map[string]any{"location": map[string]any{"type": "string"}},
      }),
    }),
  }}),
  Messages: openai.F([]openai.ChatCompletionMessageParamUnion{
    openai.UserMessage("weather in helsinki?"),
  }),
}

Errors

r, err := client.Chat.Completions.New(ctx, params)
if err != nil {
  var apierr *openai.Error
  if errors.As(err, &apierr) {
    switch apierr.StatusCode {
    case 402: // insufficient balance
    case 429: // energy budget hit
    }
  }
}

Next

For the object-store side, see the AWS S3 migration guideaws-sdk-go-v2 works against our endpoint unchanged.