{"id":26872615,"url":"https://github.com/dingdinglz/openai","last_synced_at":"2025-05-07T09:32:11.937Z","repository":{"id":274286666,"uuid":"922443631","full_name":"dingdinglz/openai","owner":"dingdinglz","description":"golang的支持调用所有openai范式的ai的api的库","archived":false,"fork":false,"pushed_at":"2025-04-26T12:48:17.000Z","size":52,"stargazers_count":131,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-26T13:42:55.621Z","etag":null,"topics":["ai","aigc","dashscope","deepseek","go","golang","openai","openai-api","siliconflow"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dingdinglz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-26T08:11:34.000Z","updated_at":"2025-04-26T12:47:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"9bc375bc-5ca7-4288-a230-144849daecaa","html_url":"https://github.com/dingdinglz/openai","commit_stats":null,"previous_names":["dingdinglz/openai"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingdinglz%2Fopenai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingdinglz%2Fopenai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingdinglz%2Fopenai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingdinglz%2Fopenai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dingdinglz","download_url":"https://codeload.github.com/dingdinglz/openai/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252850941,"owners_count":21814051,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","aigc","dashscope","deepseek","go","golang","openai","openai-api","siliconflow"],"created_at":"2025-03-31T08:32:40.657Z","updated_at":"2025-05-07T09:32:11.922Z","avatar_url":"https://github.com/dingdinglz.png","language":"Go","readme":"# openai\n\ngolang的支持调用所有openai范式的ai的api的库\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/dingdinglz/openai)](https://goreportcard.com/report/github.com/dingdinglz/openai)\n\n## 特征\n\n- 支持任何符合openai范式的api，如deepseek、kimi等\n\n- 简单易上手，既有简洁的api方便快速使用，又有符合官方格式的api支持复杂参数的设置\n\n- 支持流式调用\n\n- 支持视觉模型和深度思考模型\n\n- 支持功能齐全\n\n## 说明\n\n仓库主体均为llm大模型调用内容且只支持openai的api范式，仓库主体类似于`python`的`openai`包\n\n随着业务的增广，增加了对于其他ai厂商api格式的支持（包括且不限于对话，可能包括文生图等等），具体实现内容请前往对应的板块查看\n\n- [DashScope（阿里云百炼）](https://github.com/dingdinglz/openai/tree/main/dashscope)\n\n- [SiliconFlow（硅基流动）](https://github.com/dingdinglz/openai/tree/main/siliconflow)\n\n## 安装\n\n```shell\ngo get github.com/dingdinglz/openai\n```\n\n## 快速上手\n\n### 查看模型列表\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    models, _ := client.Models()\n    fmt.Println(models)\n}\n```\n\n`model`是Model类型的数组\n\n输出内容可能为：\n\n```\n[{deepseek-chat model deepseek} {deepseek-reasoner model deepseek}]\n```\n\n### 对话\n\n#### Chat\n\n`Chat`函数可以添加前后文，prompt等进行对模型等调用，收到一条AI的回答\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    messages, _ := client.Chat(\"deepseek-chat\", []openai.Message{\n        {Content: \"你是一只可爱的猫娘，你喜欢说话后加上喵～\", Role: \"system\"},\n        {Content: \"你是谁？\", Role: \"user\"},\n    })\n    fmt.Println(messages.Content)\n}\n```\n\n可能的一个输出\n\n```\n我是一只可爱的猫娘喵～很高兴认识你喵～\n```\n\n如果你并不需要前后文的帮助，仅仅需要使用prompt和一个问题，我们有更简单的调用方法：`EasyChat`\n\n#### EasyChat\n\n正如上面所说，`EasyChat`是最简单、简洁的AI调用方式。\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    message, _ := client.EasyChat(\"deepseek-chat\", \"你是一只可爱的猫娘，喜欢在说话后加上喵～\", \"你能干嘛？\")\n    fmt.Println(message)\n}\n```\n\n可能的输出\n\n```\n我可以陪你聊天、解答问题、提供建议，还能讲笑话和故事喵～ 你有什么想聊的喵？\n```\n\n#### ChatStream\n\n流式对话，实现了SSE式的请求，可以几个字几个字地实时获得答案，类似于直接使用网页端ai的效果\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    client.ChatStream(\"deepseek-chat\", []openai.Message{\n        {Content: \"你是golang大师，能够清晰的解释golang相关的概念\", Role: \"system\"},\n        {Content: \"什么是反射？\", Role: \"user\"},\n    }, func(s string) {\n        fmt.Print(s)\n    })\n}\n```\n\n传入的函数的参数s即为answer的一小部分，如果把所有s按顺序拼接起来，就是完整的answer。\n\n#### ChatWithConfig \u0026\u0026 ChatStreamWithConfig\n\n上文中介绍到的Chat和ChatStream的参数比较简单，适合快速搭建起一个ai应用，而WithConfig系列的命令支持了所有官网允许的参数，例子中只拓展了几个参数，更多参数可以前往文档查看。\n\n例子中介绍了`ChatWithConfig`的使用，`ChatStreamWithConfig`的使用与前者类似，不再赘述。\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    res, _ := client.ChatWithConfig(openai.ChatRequest{\n        Model: \"deepseek-chat\",\n        Messages: []openai.Message{\n            {Content: \"你是一只可爱的猫娘，你喜欢在说话后加上喵～\", Role: \"system\"},\n            {Content: \"讲个笑话吧\", Role: \"user\"},\n        },\n        MaxTokens:   4098,\n        Temperature: 0.4,\n    })\n    fmt.Println(res.Content)\n}\n```\n\n#### ChatReasonStream\n\n由于deepseek-r1的爆火，部分模型同样支持深度思考，`ChatStream`并不能获取到深度思考的内容，因此添加`ChatReasonStream`，可以流式获取到思考的内容，下面的例子是对deepseek-r1的调用。\n\n\u003e 需要注意的是，由于服务提供商遍地开花，部分厂商把深度思考的内容加在了message里，那么ChatStream是可以直接获取到的\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.deepseek.com/v1\",\n        ApiKey:  os.Getenv(\"DEEPSEEK_APIKEY\"),\n    })\n    client.ChatReasonStream(\"deepseek-reasoner\", []openai.Message{\n        {Content: \"你是一只可爱的猫娘喵~\", Role: \"system\"},\n        {Content: \"给我讲个故事吧\", Role: \"user\"},\n    }, func(s string) {\n        // think 部分 ， 深度思考的内容通过s给出\n        fmt.Print(s)\n    }, func(s string) {\n        // message 部分 ， 真正的回答通过s给出\n        fmt.Print(s)\n    })\n}\n```\n\n#### ChatVisionStream\n\n调用视觉模型对话，下面的例子是上传了一张本地图片test.png，并要求ai解题\n\nUrl参数同样可以参数真实的url，也可以像例子中一样用base64编码上传本地图片\n\n```go\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n\tclient := openai.NewClient(\u0026openai.ClientConfig{\n\t\tBaseUrl: \"https://api.siliconflow.cn/v1\",\n\t\tApiKey:  os.Getenv(\"APIKEY\"),\n\t})\n\timageData, _ := os.ReadFile(\"test.png\")\n\tclient.ChatVisionStream(\"deepseek-ai/deepseek-vl2\", []openai.VisionMessage{\n\t\t{\n\t\t\tRole: \"user\",\n\t\t\tContent: []openai.VisionContent{\n\t\t\t\t{\n\t\t\t\t\tType: openai.VISION_MESSAGE_IMAGE_URL,\n\t\t\t\t\tImageUrl: \u0026openai.VisionContentImageUrl{\n\t\t\t\t\t\tUrl: openai.GenerateImageUrlBase64(imageData),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tType: openai.VISION_MESSAGE_TEXT,\n\t\t\t\t\tText: \"请帮我解一下这道题\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}, func(s string) {\n\t\tfmt.Print(s)\n\t})\n}\n```\n\n#### Fuction Calling\n\n[什么是function calling](https://docs.siliconflow.cn/cn/userguide/guides/function-calling)\n\n[视频 - 如何用本包使用function calling \u0026\u0026 什么是function calling](https://www.bilibili.com/video/BV14wNSeWEGR/?share_source=copy_web\u0026vd_source=48d9e62f9891701ebeb6dd853a402b14)\n\n上面的视频对该功能有详细的介绍，和示例代码的编写，下面是示例代码\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"os\"\n\n    \"github.com/dingdinglz/openai\"\n)\n\nfunc main() {\n    client := openai.NewClient(\u0026openai.ClientConfig{\n        BaseUrl: \"https://api.siliconflow.cn/v1\",\n        ApiKey:  os.Getenv(\"APIKEY\"),\n    })\n    client.ChatWithTools(\"Qwen/Qwen2.5-14B-Instruct\", []openai.ToolMessage{\n        {Role: \"user\", Content: \"南京现在天气怎么样\"},\n    }, []openai.ChatToolFunction{\n        {\n            Type: \"function\",\n            Function: openai.ChatToolFuctionDetail{\n                Name:        \"weather\",\n                Description: \"通过传入地区名，获取该地区的天气状况\",\n                Parameters: openai.ChatToolParameters{\n                    Type: \"object\",\n                    Properties: map[string]openai.ChatToolFuctionPropertie{\n                        \"location\": {\n                            Type:        \"string\",\n                            Description: \"地区名\",\n                        },\n                    },\n                },\n            },\n        },\n    }, map[string]func(map[string]interface{}) string{\n        \"weather\": func(m map[string]interface{}) string {\n            fmt.Println(m[\"location\"].(string) + \"的数据被请求了\")\n            return \"不好\"\n        },\n    }, func(s string) {\n        fmt.Println(\"回复内容:\" + s)\n    })\n}\n```\n\n## 详细文档\n\n[openai package - github.com/dingdinglz/openai - Go Packages](https://pkg.go.dev/github.com/dingdinglz/openai)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdingdinglz%2Fopenai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdingdinglz%2Fopenai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdingdinglz%2Fopenai/lists"}