一个统一的 Go SDK,用于调用各种主流大语言模型 API,包括 OpenAI、Claude、Gemini、DeepSeek 等。
- 统一接口: 使用相同的接口调用不同的 LLM 提供商
- 多提供商支持: OpenAI、Claude、Gemini、DeepSeek 等
- 流式响应: 支持 SSE 流式输出
- 多模态: 支持文本、图片等多种内容类型
- Function Calling: 支持工具调用和函数调用
- 对话历史管理: 内置对话上下文管理
- 简单易用: 最少配置即可开始使用
go get github.com/Arterning/go-llmpackage main
import (
"fmt"
"log"
gollm "github.com/Arterning/go-llm"
)
func main() {
// 创建客户端
client, err := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderOpenAI,
Model: "gpt-4",
APIKey: "your-api-key",
})
if err != nil {
log.Fatal(err)
}
// 发送消息
response, err := gollm.SimpleChat(client, "Hello!")
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}client, _ := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderOpenAI,
Model: "gpt-4",
APIKey: "sk-...",
})client, _ := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderDeepSeek,
Model: "deepseek-chat",
APIKey: "your-deepseek-key",
})client, _ := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderClaude,
Model: "claude-3-opus-20240229",
APIKey: "sk-ant-...",
})client, _ := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderGemini,
Model: "gemini-pro",
APIKey: "your-gemini-key",
})client, _ := gollm.NewClient(gollm.Config{
Provider: gollm.ProviderOpenAI,
Model: "gpt-4",
APIKey: "your-api-key",
BaseURL: "https://your-custom-endpoint.com/v1", // 可选
})req := &gollm.ChatRequest{
Messages: []gollm.Message{
gollm.NewTextMessage(gollm.RoleSystem, "You are a helpful assistant."),
gollm.NewTextMessage(gollm.RoleUser, "What is the capital of France?"),
},
Temperature: 0.7,
MaxTokens: 1000,
}
resp, err := client.Chat(context.Background(), req)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Choices[0].Message.Content[0].Text)req := &gollm.ChatRequest{
Messages: []gollm.Message{
gollm.NewTextMessage(gollm.RoleUser, "Write a poem about programming."),
},
Stream: true,
}
chunkChan, errChan := client.ChatStream(context.Background(), req)
for {
select {
case chunk, ok := <-chunkChan:
if !ok {
return
}
fmt.Print(chunk.Choices[0].Delta.Content)
case err := <-errChan:
if err != nil {
log.Fatal(err)
}
}
}req := &gollm.ChatRequest{
Messages: []gollm.Message{
gollm.NewMultimodalMessage(
gollm.RoleUser,
gollm.NewTextContent("What's in this image?"),
gollm.NewImageContent("https://example.com/image.jpg"),
),
},
MaxTokens: 1000,
}
resp, err := client.Chat(context.Background(), req)tools := []gollm.Tool{
{
Type: "function",
Function: gollm.ToolFunction{
Name: "get_weather",
Description: "Get the current weather",
Parameters: map[string]interface{}{
"type": "object",
"properties": map[string]interface{}{
"location": map[string]interface{}{
"type": "string",
"description": "City name",
},
},
"required": []string{"location"},
},
},
},
}
req := &gollm.ChatRequest{
Messages: []gollm.Message{
gollm.NewTextMessage(gollm.RoleUser, "What's the weather in Tokyo?"),
},
Tools: tools,
ToolChoice: "auto",
}
resp, err := client.Chat(context.Background(), req)
// 检查工具调用
if len(resp.Choices[0].ToolCalls) > 0 {
// 处理工具调用...
}查看 examples/conversation.go 获取完整的对话管理示例。
type Config struct {
Provider Provider // 必填:提供商
Model string // 必填:模型名称
APIKey string // 必填:API密钥
BaseURL string // 可选:自定义API地址
Timeout time.Duration // 可选:超时时间(默认60秒)
ProxyURL string // 可选:代理地址
}type ChatRequest struct {
Messages []Message // 必填:消息列表
Temperature float32 // 0-2,控制随机性
MaxTokens int // 最大生成token数
TopP float32 // 0-1,nucleus sampling
Stream bool // 是否流式输出
Tools []Tool // 可用工具列表
ToolChoice string // "auto", "none", "required"
FrequencyPenalty float32 // -2.0 到 2.0
PresencePenalty float32 // -2.0 到 2.0
Stop []string // 停止序列
User string // 用户标识
}go-llm/
├── types.go # 核心类型定义
├── client.go # 客户端工厂
├── helpers.go # 辅助函数
├── provider_openai.go # OpenAI 实现
├── provider_claude.go # Claude 实现
├── provider_gemini.go # Gemini 实现
├── examples/ # 示例代码
│ ├── simple_chat.go
│ ├── stream_chat.go
│ ├── multimodal.go
│ ├── function_calling.go
│ └── conversation.go
└── README.md
查看 examples/ 目录获取更多示例:
simple_chat.go- 基础对话示例stream_chat.go- 流式响应示例multimodal.go- 多模态输入示例function_calling.go- Function Calling 示例conversation.go- 对话历史管理示例
type Client interface {
// 发送聊天请求,返回完整响应
Chat(ctx context.Context, req *ChatRequest) (*ChatResponse, error)
// 发送流式聊天请求,返回响应通道
ChatStream(ctx context.Context, req *ChatRequest) (<-chan StreamChunk, <-chan error)
// 获取提供商类型
GetProvider() Provider
// 获取模型名称
GetModel() string
}// 创建客户端
func NewClient(config Config) (Client, error)
// 简单对话(单轮)
func SimpleChat(client Client, userMessage string) (string, error)
// 创建文本消息
func NewTextMessage(role Role, text string) Message
// 创建多模态消息
func NewMultimodalMessage(role Role, contents ...Content) Message所有 API 调用都会返回 error,建议进行适当的错误处理:
resp, err := client.Chat(ctx, req)
if err != nil {
// 处理错误
log.Printf("API error: %v", err)
return
}常见错误类型:
- 配置错误:无效的 Provider、Model 或 APIKey
- 网络错误:连接超时、请求失败
- API 错误:认证失败、配额超限、请求格式错误
- API Key 安全: 不要在代码中硬编码 API Key,建议使用环境变量
- 速率限制: 各提供商都有速率限制,建议实现重试机制
- 成本控制: 使用 MaxTokens 参数控制生成长度
- 上下文长度: 注意不同模型的上下文窗口限制
- 流式响应: 使用流式响应时记得正确处理通道关闭
MIT License
欢迎提交 Issue 和 Pull Request!
如有问题或建议,请提交 GitHub Issue。