Skip to content

golang的支持调用所有openai范式的ai的api的库

License

Notifications You must be signed in to change notification settings

dingdinglz/openai

Folders and files

NameName
Last commit message
Last commit date

Latest commit

21027ed · Feb 13, 2025

History

23 Commits
Feb 9, 2025
Feb 8, 2025
Feb 9, 2025
Feb 13, 2025
Jan 26, 2025
Feb 13, 2025
Feb 13, 2025
Feb 7, 2025
Feb 13, 2025
Feb 9, 2025
Jan 26, 2025
Feb 13, 2025
Jan 26, 2025
Jan 26, 2025
Jan 26, 2025
Feb 3, 2025
Jan 26, 2025
Jan 26, 2025
Jan 26, 2025
Jan 27, 2025
Feb 13, 2025
Feb 13, 2025

Repository files navigation

openai

golang的支持调用所有openai范式的ai的api的库

特征

  • 支持任何符合openai范式的api,如deepseek、kimi等

  • 简单易上手,既有简洁的api方便快速使用,又有符合官方格式的api支持复杂参数的设置

  • 支持流式调用

  • 支持视觉模型和深度思考模型

  • 支持功能齐全

说明

仓库主体均为llm大模型调用内容且只支持openai的api范式,仓库主体类似于pythonopenai

随着业务的增广,增加了对于其他ai厂商api格式的支持(包括且不限于对话,可能包括文生图等等),具体实现内容请前往对应的板块查看

安装

go get github.com/dingdinglz/openai

快速上手

查看模型列表

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    models, _ := client.Models()
    fmt.Println(models)
}

model是Model类型的数组

输出内容可能为:

[{deepseek-chat model deepseek} {deepseek-reasoner model deepseek}]

对话

Chat

Chat函数可以添加前后文,prompt等进行对模型等调用,收到一条AI的回答

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    messages, _ := client.Chat("deepseek-chat", []openai.Message{
        {Content: "你是一只可爱的猫娘,你喜欢说话后加上喵~", Role: "system"},
        {Content: "你是谁?", Role: "user"},
    })
    fmt.Println(messages.Content)
}

可能的一个输出

我是一只可爱的猫娘喵~很高兴认识你喵~

如果你并不需要前后文的帮助,仅仅需要使用prompt和一个问题,我们有更简单的调用方法:EasyChat

EasyChat

正如上面所说,EasyChat是最简单、简洁的AI调用方式。

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    message, _ := client.EasyChat("deepseek-chat", "你是一只可爱的猫娘,喜欢在说话后加上喵~", "你能干嘛?")
    fmt.Println(message)
}

可能的输出

我可以陪你聊天、解答问题、提供建议,还能讲笑话和故事喵~ 你有什么想聊的喵?

ChatStream

流式对话,实现了SSE式的请求,可以几个字几个字地实时获得答案,类似于直接使用网页端ai的效果

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    client.ChatStream("deepseek-chat", []openai.Message{
        {Content: "你是golang大师,能够清晰的解释golang相关的概念", Role: "system"},
        {Content: "什么是反射?", Role: "user"},
    }, func(s string) {
        fmt.Print(s)
    })
}

传入的函数的参数s即为answer的一小部分,如果把所有s按顺序拼接起来,就是完整的answer。

ChatWithConfig && ChatStreamWithConfig

上文中介绍到的Chat和ChatStream的参数比较简单,适合快速搭建起一个ai应用,而WithConfig系列的命令支持了所有官网允许的参数,例子中只拓展了几个参数,更多参数可以前往文档查看。

例子中介绍了ChatWithConfig的使用,ChatStreamWithConfig的使用与前者类似,不再赘述。

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    res, _ := client.ChatWithConfig(openai.ChatRequest{
        Model: "deepseek-chat",
        Messages: []openai.Message{
            {Content: "你是一只可爱的猫娘,你喜欢在说话后加上喵~", Role: "system"},
            {Content: "讲个笑话吧", Role: "user"},
        },
        MaxTokens:   4098,
        Temperature: 0.4,
    })
    fmt.Println(res.Content)
}

ChatReasonStream

由于deepseek-r1的爆火,部分模型同样支持深度思考,ChatStream并不能获取到深度思考的内容,因此添加ChatReasonStream,可以流式获取到思考的内容,下面的例子是对deepseek-r1的调用。

需要注意的是,由于服务提供商遍地开花,部分厂商把深度思考的内容加在了message里,那么ChatStream是可以直接获取到的

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.deepseek.com/v1",
        ApiKey:  os.Getenv("DEEPSEEK_APIKEY"),
    })
    client.ChatReasonStream("deepseek-reasoner", []openai.Message{
        {Content: "你是一只可爱的猫娘喵~", Role: "system"},
        {Content: "给我讲个故事吧", Role: "user"},
    }, func(s string) {
        // think 部分 , 深度思考的内容通过s给出
        fmt.Print(s)
    }, func(s string) {
        // message 部分 , 真正的回答通过s给出
        fmt.Print(s)
    })
}

ChatVisionStream

调用视觉模型对话,下面的例子是上传了一张本地图片test.png,并要求ai解题

Url参数同样可以参数真实的url,也可以像例子中一样用base64编码上传本地图片

package main

import (
	"fmt"
	"os"

	"github.com/dingdinglz/openai"
)

func main() {
	client := openai.NewClient(&openai.ClientConfig{
		BaseUrl: "https://api.siliconflow.cn/v1",
		ApiKey:  os.Getenv("APIKEY"),
	})
	imageData, _ := os.ReadFile("test.png")
	client.ChatVisionStream("deepseek-ai/deepseek-vl2", []openai.VisionMessage{
		{
			Role: "user",
			Content: []openai.VisionContent{
				{
					Type: openai.VISION_MESSAGE_IMAGE_URL,
					ImageUrl: &openai.VisionContentImageUrl{
						Url: openai.GenerateImageUrlBase64(imageData),
					},
				},
				{
					Type: openai.VISION_MESSAGE_TEXT,
					Text: "请帮我解一下这道题",
				},
			},
		},
	}, func(s string) {
		fmt.Print(s)
	})
}

Fuction Calling

什么是function calling

视频 - 如何用本包使用function calling && 什么是function calling

上面的视频对该功能有详细的介绍,和示例代码的编写,下面是示例代码

package main

import (
    "fmt"
    "os"

    "github.com/dingdinglz/openai"
)

func main() {
    client := openai.NewClient(&openai.ClientConfig{
        BaseUrl: "https://api.siliconflow.cn/v1",
        ApiKey:  os.Getenv("APIKEY"),
    })
    client.ChatWithTools("Qwen/Qwen2.5-14B-Instruct", []openai.ToolMessage{
        {Role: "user", Content: "南京现在天气怎么样"},
    }, []openai.ChatToolFunction{
        {
            Type: "function",
            Function: openai.ChatToolFuctionDetail{
                Name:        "weather",
                Description: "通过传入地区名,获取该地区的天气状况",
                Parameters: openai.ChatToolParameters{
                    Type: "object",
                    Properties: map[string]openai.ChatToolFuctionPropertie{
                        "location": {
                            Type:        "string",
                            Description: "地区名",
                        },
                    },
                },
            },
        },
    }, map[string]func(map[string]interface{}) string{
        "weather": func(m map[string]interface{}) string {
            fmt.Println(m["location"].(string) + "的数据被请求了")
            return "不好"
        },
    }, func(s string) {
        fmt.Println("回复内容:" + s)
    })
}

详细文档

openai package - github.com/dingdinglz/openai - Go Packages