Go SDK
Go 项目接 Sakrylle 推荐两个官方 SDK:
- OpenAI 兼容:
github.com/openai/openai-go(官方) - Anthropic 原生:
github.com/anthropics/anthropic-sdk-go(官方)
例子基于 Context7 拉取的官方 README。具体类型、字段命名以官方仓库为准。
准备
bash
export SAKRYLLE_API_KEY="sk-xxxxxxxxxxxxxxxx"需要 Go 1.21+。
OpenAI 兼容
安装
bash
go get github.com/openai/openai-go最小可用调用
通过 option.WithAPIKey 与 option.WithBaseURL 把请求指向 Sakrylle:
go
package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey(os.Getenv("SAKRYLLE_API_KEY")),
option.WithBaseURL("https://api.sakrylle.com/v1/"),
)
resp, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{
Model: "gpt-5.6-sol",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.SystemMessage("你是一名简洁的助手。"),
openai.UserMessage("用一句话解释什么是向量数据库。"),
},
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}
WithBaseURL末尾带斜杠是官方推荐写法,避免拼路径时重复/。
流式响应
go
package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/option"
)
func main() {
client := openai.NewClient(
option.WithAPIKey(os.Getenv("SAKRYLLE_API_KEY")),
option.WithBaseURL("https://api.sakrylle.com/v1/"),
)
stream := client.Chat.Completions.NewStreaming(context.TODO(), openai.ChatCompletionNewParams{
Model: "gpt-5.6-sol",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("数到 5。"),
},
})
for stream.Next() {
chunk := stream.Current()
if len(chunk.Choices) > 0 {
fmt.Print(chunk.Choices[0].Delta.Content)
}
}
if err := stream.Err(); err != nil {
panic(err)
}
}工具调用
go
tools := []openai.ChatCompletionToolUnionParam{
{
OfFunction: &openai.ChatCompletionFunctionToolParam{
Function: openai.FunctionDefinitionParam{
Name: "get_weather",
Description: openai.String("查询给定城市的当前天气"),
Parameters: openai.FunctionParameters{
"type": "object",
"properties": map[string]any{
"city": map[string]string{"type": "string"},
},
"required": []string{"city"},
},
},
},
},
}
resp, _ := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Model: "gpt-5.6-sol",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("北京今天天气怎么样?"),
},
Tools: tools,
})SDK 演进较快,
ChatCompletionToolUnionParam、FunctionDefinitionParam等具体类型以 官方 README 为准。
Anthropic 原生
安装
bash
go get github.com/anthropics/anthropic-sdk-go最小可用调用
go
package main
import (
"context"
"fmt"
"os"
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
)
func main() {
client := anthropic.NewClient(
option.WithAPIKey(os.Getenv("SAKRYLLE_API_KEY")),
option.WithBaseURL("https://api.sakrylle.com/"),
)
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: "claude-haiku-4-5-20251001",
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("用一句话介绍 Claude。")),
},
})
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", message.Content)
}流式响应
NewStreaming + message.Accumulate 标准模式:
go
stream := client.Messages.NewStreaming(context.TODO(), anthropic.MessageNewParams{
Model: "claude-haiku-4-5-20251001",
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("写一首四行小诗。")),
},
})
message := anthropic.Message{}
for stream.Next() {
event := stream.Current()
if err := message.Accumulate(event); err != nil {
panic(err)
}
switch e := event.AsAny().(type) {
case anthropic.ContentBlockDeltaEvent:
fmt.Print(e.Delta.Text)
case anthropic.MessageStopEvent:
fmt.Println()
}
}
if err := stream.Err(); err != nil {
panic(err)
}错误处理
两个 SDK 都通过 *Error / *APIError 暴露 HTTP 状态码与上游错误体:
go
import (
"errors"
"github.com/openai/openai-go/v3"
)
resp, err := client.Chat.Completions.New(ctx, params)
if err != nil {
var apiErr *openai.Error
if errors.As(err, &apiErr) {
fmt.Println("status:", apiErr.StatusCode)
fmt.Println("body:", apiErr.RawJSON())
}
return err
}完整错误码表见 错误码。
