Skip to content

一个统一的 Go SDK,用于调用各种主流大语言模型 API,包括 OpenAI、Claude、Gemini、DeepSeek 等。

Notifications You must be signed in to change notification settings

Arterning/go-llm

Repository files navigation

go-llm

一个统一的 Go SDK,用于调用各种主流大语言模型 API,包括 OpenAI、Claude、Gemini、DeepSeek 等。

特性

  • 统一接口: 使用相同的接口调用不同的 LLM 提供商
  • 多提供商支持: OpenAI、Claude、Gemini、DeepSeek 等
  • 流式响应: 支持 SSE 流式输出
  • 多模态: 支持文本、图片等多种内容类型
  • Function Calling: 支持工具调用和函数调用
  • 对话历史管理: 内置对话上下文管理
  • 简单易用: 最少配置即可开始使用

安装

go get github.com/Arterning/go-llm

快速开始

基础用法

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

支持的提供商

OpenAI

client, _ := gollm.NewClient(gollm.Config{
    Provider: gollm.ProviderOpenAI,
    Model:    "gpt-4",
    APIKey:   "sk-...",
})

DeepSeek

client, _ := gollm.NewClient(gollm.Config{
    Provider: gollm.ProviderDeepSeek,
    Model:    "deepseek-chat",
    APIKey:   "your-deepseek-key",
})

Claude

client, _ := gollm.NewClient(gollm.Config{
    Provider: gollm.ProviderClaude,
    Model:    "claude-3-opus-20240229",
    APIKey:   "sk-ant-...",
})

Gemini

client, _ := gollm.NewClient(gollm.Config{
    Provider: gollm.ProviderGemini,
    Model:    "gemini-pro",
    APIKey:   "your-gemini-key",
})

自定义 API 地址

client, _ := gollm.NewClient(gollm.Config{
    Provider: gollm.ProviderOpenAI,
    Model:    "gpt-4",
    APIKey:   "your-api-key",
    BaseURL:  "https://your-custom-endpoint.com/v1",  // 可选
})

使用示例

1. 基础对话

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)

2. 流式响应

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

3. 多模态输入(图片理解)

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)

4. Function Calling

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 {
    // 处理工具调用...
}

5. 多轮对话管理

查看 examples/conversation.go 获取完整的对话管理示例。

配置选项

Config 结构

type Config struct {
    Provider  Provider      // 必填:提供商
    Model     string        // 必填:模型名称
    APIKey    string        // 必填:API密钥
    BaseURL   string        // 可选:自定义API地址
    Timeout   time.Duration // 可选:超时时间(默认60秒)
    ProxyURL  string        // 可选:代理地址
}

ChatRequest 参数

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 - 对话历史管理示例

API 文档

Client 接口

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 错误:认证失败、配额超限、请求格式错误

注意事项

  1. API Key 安全: 不要在代码中硬编码 API Key,建议使用环境变量
  2. 速率限制: 各提供商都有速率限制,建议实现重试机制
  3. 成本控制: 使用 MaxTokens 参数控制生成长度
  4. 上下文长度: 注意不同模型的上下文窗口限制
  5. 流式响应: 使用流式响应时记得正确处理通道关闭

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

联系方式

如有问题或建议,请提交 GitHub Issue。

About

一个统一的 Go SDK,用于调用各种主流大语言模型 API,包括 OpenAI、Claude、Gemini、DeepSeek 等。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages