Go SDK

github.com/joytoken/client-sdk-golang is a small Go client for JoyToken’s public developer API. It wraps Chat Completions, streaming Chat Completions, model listing, API key headers, default base URLs, and structured API errors.

Install

$go get github.com/joytoken/client-sdk-golang

Configure

client.go
1package main
2
3import (
4 "os"
5
6 joytoken "github.com/joytoken/client-sdk-golang"
7)
8
9var client = joytoken.NewClient(
10 joytoken.WithAPIKey(os.Getenv("JOY_TOKEN_API_KEY")),
11)

Defaults:

OptionDefault
API keyJOY_TOKEN_API_KEY
API base URLJOY_TOKEN_API_BASE_URL or https://api-dev.joytokens.ai
OpenAI base URLJOY_TOKEN_OPENAI_BASE_URL or ${apiBaseURL}/openai/v1
HTTP clienthttp.Client{Timeout: 60 * time.Second}

Chat Completions

chat.go
1response, err := client.CreateChatCompletion(ctx, joytoken.ChatCompletionRequest{
2 Model: "auto",
3 Tier: "standard",
4 Messages: []joytoken.ChatMessage{
5 {Role: "system", Content: "You are concise."},
6 {Role: "user", Content: "Explain JoyToken in one sentence."},
7 },
8})
9if err != nil {
10 return err
11}
12
13fmt.Println(response.Choices[0].Message.Content)

Streaming

stream.go
1stream, err := client.StreamChatCompletion(ctx, joytoken.ChatCompletionRequest{
2 Model: "auto",
3 Messages: []joytoken.ChatMessage{
4 {Role: "user", Content: "Write a short release note."},
5 },
6})
7if err != nil {
8 return err
9}
10defer stream.Close()
11
12for {
13 chunk, err := stream.Recv()
14 if errors.Is(err, io.EOF) {
15 break
16 }
17 if err != nil {
18 return err
19 }
20
21 if len(chunk.Choices) > 0 {
22 fmt.Print(chunk.Choices[0].Delta["content"])
23 }
24}

JoyToken can send a metadata event near the end of a stream. Check whether Choices is present before rendering content.

Models

models.go
1models, err := client.ListModels(ctx)
2if err != nil {
3 return err
4}
5
6for _, model := range models.Data {
7 fmt.Println(model.ID, model.Name)
8}

Error handling

errors.go
1response, err := client.CreateChatCompletion(ctx, request)
2if err != nil {
3 var apiErr *joytoken.APIError
4 if errors.As(err, &apiErr) {
5 log.Printf("joytoken status=%d request_id=%s body=%s", apiErr.StatusCode, apiErr.RequestID, apiErr.Body)
6 return err
7 }
8 return err
9}
10
11fmt.Println(response.Choices[0].Message.Content)

APIError includes the HTTP status, request ID, and raw body. Use it for logging and retry decisions.

Custom client

custom-client.go
1client := joytoken.NewClient(
2 joytoken.WithAPIKey(os.Getenv("JOY_TOKEN_API_KEY")),
3 joytoken.WithAPIBaseURL("https://api-dev.joytokens.ai"),
4 joytoken.WithHeader("X-Request-ID", "go-worker"),
5 joytoken.WithHTTPClient(&http.Client{Timeout: 30 * time.Second}),
6)