本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2024年01月09日 统计字数: 6810字 阅读时间: 14分钟阅读 本文链接: https://soulteary.com/2024/01/09/amazing-openai-api-call-all-non-openai-models-according-to-the-openai-api.html ----- # Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用 分享一个有趣的小工具,10MB 身材的小工具,能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。 让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的,非 OpenAI 的 API 私有部署和使用起来。 ## 写在前面 这个小工具软件写于两周之前的 2023 年年底,开源在了 GitHub:[soulteary/amazing-openai-api](https://github.com/soulteary/amazing-openai-api),有需要可以自取,欢迎一键三连。 ![开源小项目:AOA](https://attachment.soulteary.com/2024/01/09/github.jpg) 目前项目只适配了三种我在使用的模型的 API,如果你觉得有其他的合适的 API 或者你认为很靠谱的模型,欢迎提交 PR。 这个小工具的思路借鉴于 [stulzq/azure-openai-proxy](https://github.com/stulzq/azure-openai-proxy),一个将 Azure OpenAI API 转换为 OpenAI API 格式的项目。在本地使用这个项目一段时间之后,我 fork 出了一个新的版本 [soulteary/azure-openai-proxy](https://github.com/soulteary/azure-openai-proxy),并将修改以 PR 形式反馈给了原始项目。随后,因为想在本地应用中测试 Yi-34B API,我制作了一个新的工具:[soulteary/yi-openai-proxy](https://github.com/soulteary/yi-openai-proxy),在随后 Gemini Pro API 出现了,想着不能每处一个模型就折腾一个这样的项目,后面太难维护了。 于是,我彻底重构了项目,并起一个略搞怪的名字:**Amazing OpenAI API**,和一个有意思的像是表情包的别名:**AOA**。 ## 下载工具 这个工具有两种使用方法,一种是从 [GitHub Release 发布页面](https://github.com/soulteary/amazing-openai-api/releases) 下载二进制文件。 ![发布页面的二进制文件](https://attachment.soulteary.com/2024/01/09/assets.jpg) 另外一种方法,则是使用 Docker ,从社区下载 GitHub 自动构建好的指定版本的容器镜像: ```bash docker pull soulteary/amazing-openai-api:v0.6.1 ``` ## 快速上手 AOA 的使用是不需要编写任何程序配置文件,我们通过指定**环境变量**就能够完成应用行为的调整。 我们可以通过这个方式调整的程序行为包括:“选择工作模型”、“设置模型运行需要的参数”、“设置模型兼容别名”。 ### 直接运行可执行文件 程序默认支持三种模型的 API 转换,如果我们不进行任何参数指定,那么程序将默认将工作模型设置为 `azure` 模型。如果你希望使用 `yi-34b-chat` 或 `gemini-pro`,需要设置环境变量 `AOA_TYPE=yi` 或者 `AOA_TYPE=gemini`,来让程序切换工作模式。 当我们不使用任何参数,直接执行程序(`azure` 模式)。这个时候,我们只需要额外设置环境变量 `AZURE_ENDPOINT`,就可以正常使用服务啦: ```bash AZURE_ENDPOINT=https://你的部署名称.openai.azure.com/ ``` 完整的执行命令如下: ```bash AZURE_ENDPOINT=https://你的部署名称.openai.azure.com/ ./aoa ``` 当服务启动之后,我们的程序就可以通过访问 `http://localhost:8080/v1/*` 的地址,实现和访问 OpenAI 一样的 API 的效果啦。 ### 使用 Docker 运行 AOA 如果你更喜欢使用 Docker,可以用下面的命令来实现和上面一样的效果: ```bash docker run --rm -it -e AZURE_ENDPOINT=https://suyang231210.openai.azure.com/ -p 8080:8080 soulteary/amazing-openai-api:v0.6.1 ``` 同样的,我们就可以访问 `http://localhost:8080/v1/*` 的地址,使用 OpenAI 格式的请求来访问 Azure OpenAI、Yi 34B-Chat、Gemini Pro 啦。 每个模型的详细使用示例,可以参考下文中的 `Docker Compose` 使用示例。 ## 工具特色 这个小工具有两个有趣的特色功能。 ### 保护我们的 API Key 在日常测试各种 AI 应用的时候,许多应用都需要我们设置 API Key 给它。 **你如果你希望不要将 API Key 暴露给应用,或者不放心各种复杂的开源软件是否有 API Key 泄漏风险。** 我们可以将 API Key 配置在工具中,比如在 Azure 模式的时候,可以添加 `AZURE_API_KEY=你的 API Key` 这个环境变量。以上文中 Azure 的命令为例,我们可以将命令改写为: ```bash AZURE_ENDPOINT=https://<你的 Endpoint 地址>.openai.azure.com/ AZURE_API_KEY=<你的 API KEY> AZURE_MODEL_ALIAS=gpt-3.5-turbo:gpt-35 ./aoa ``` 然后,各种软件在请求的模型 API 的时候,就不需要再填写 API Key 啦,或者你随便填一个也行。 **这样就起到了严格的 API Key 隔离,提升了 API Key 的安全性。** ### 方便的模型映射功能 如果你使用 Azure,你一定知道 Azure 中的 Deployment Name 需要在请求参数中体现。同样的,Yi 模型、Gemini Pro 也需要在请求的时候,设置这些模型的名称在请求参数中。 **但是,我们的使用的软件,通常只支持调用:GPT 3.5、GPT 3.5 Turbo、GPT-4 等等“事实标准”。** 总不能每用一个软件就要改下人家代码,来适配这个模型名称吧,并且很多软件也不一定是开源的,折腾起来未免太麻烦了。 好在我们可以通过下面的方式,来将软件调用模型的名称进行一键“替换”,替换为我们实际在使用的模型。 比如,我们可以通过下面的方式,来将原始请求中的模型,映射为我们真实的模型名称。比如,想要将 `GPT 3.5/4` 都替换为 `yi-34b-chat`,我们可以这样写一条映射规则: ```bash gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat ``` 我们还是先拿上文中的 Azure 来举例,如果我们的 Azure 部署名称是 `gpt-35`,我们希望将软件请求中的 `gpt-3.5` 和 `gpt-4` 都替换为这个部署名称: ```bash AZURE_ENDPOINT=https://<你的 Endpoint 地址>.openai.azure.com/ AZURE_API_KEY=<你的 API KEY> AZURE_MODEL_ALIAS=gpt-3.5-turbo:gpt-35,gpt-4:gpt-35 ./aoa ``` 是不是很简单。 ## 使用 Yi 34B Chat 模型 如果我们想将 Yi 官方的 API 转换为标准的 OpenAI API 调用,可以使用下面的命令: ```bash AOA_TYPE=yi YI_ENDPOINT=<你的 API 地址> YI_API_KEY=<你的 API KEY> ./aoa ``` 和使用 Azure 服务类似,我们可以使用一个技巧将各种开源、闭源软件使用的模型自动映射为我们希望的模型: ```bash # 比如不论是 3.5 还是 4 都映射为 `gpt-35` YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat ``` 完整命令如下: ```bash AOA_TYPE=yi YI_ENDPOINT=<你的 API 地址> YI_API_KEY=<你的 API KEY> YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat ./aoa ``` 如果我们在启动服务的时候配置了 `YI_API_KEY` 的话,不论是开源软件也好,使用 `curl` 调用也罢,我们都不需要添加 `Authorization: Bearer <你的 API Key>`(也可以随便写),这样就起到了严格的 API Key 隔离,提升了 API Key 的安全性。 如果你还是习惯在请求头参数中添加认证内容,可以使用下面的不包含 `YI_API_KEY` 的命令,程序将透传验证到 `Yi API` 服务: ```bash AOA_TYPE=yi YI_ENDPOINT=<你的 API 地址> YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat ./aoa ``` ## 使用 Gemini Pro 模型 如果我们想将 Google 官方的 Gemini API 转换为标准的 OpenAI 调用,可以用下面的命令: ```bash AOA_TYPE=gemini GEMINI_API_KEY=<你的 API KEY> ./aoa ``` 和使用 Azure 服务类似,我们可以使用一个技巧将各种开源、闭源软件使用的模型自动映射为我们希望的模型: ```bash # 比如不论是 3.5 还是 4 都映射为 `gpt-35` GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro ``` 完整命令如下: ```bash AOA_TYPE=gemini GEMINI_API_KEY=<你的 API KEY> GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro ./aoa ``` 和上面类似,如果你还是希望每次请求的时候,都携带 API Key,可以不传递 `GEMINI_API_KEY` 参数: ```bash AOA_TYPE=gemini GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro ./aoa ``` ## Docker Compose 使用示例 下面,我们分别以 Azure、Yi、Gemini 为例,演示下如何编写 `docker-compose.yml` 配置,先来看看 Azure: ```yaml version: "3" services: amazing-openai-api: image: soulteary/amazing-openai-api:v0.6.1 restart: always ports: - 8080:8080 environment: - AZURE_ENDPOINT=https://<修改为你的部署名称>.openai.azure.com/ - AZURE_API_KEY=<修改为你的API KEY> - AZURE_MODEL=gpt-4 # 模型名称映射,比如将请求中的 GPT 3.5 Turbo 映射为 GPT 4 - AZURE_MODEL_ALIAS=gpt-3.5-turbo:gpt-4 logging: options: max-size: 1m ``` 然后是 Yi: ```yaml version: "3" services: amazing-openai-api: image: soulteary/amazing-openai-api:v0.6.1 restart: always ports: - 8080:8080 environment: # 设置工作模型为 YI - AOA_TYPE=yi # 设置 YI API 服务器地址 - YI_ENDPOINT=<修改为你申请或搭建的服务地址> # 设置 YI API Key - YI_API_KEY=<修改为你的API KEY> # 模型名称映射,比如将请求中的 GPT 3.5 Turbo,GPT-4 都映射为 yi-34b-chat - YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat logging: options: max-size: 1m ``` 最后是 Gemini: ```yaml version: "3" services: amazing-openai-api: image: soulteary/amazing-openai-api:v0.6.1 restart: always ports: - 8080:8080 environment: # 设置工作模型为 Gemini - AOA_TYPE=gemini # 设置 Gemini API Key - GEMINI_API_KEY=<修改为你的API KEY> # 模型名称映射,比如将请求中的 GPT 3.5 Turbo,GPT-4 都映射为 gemini-pro - GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro # 限制国内请求,需要使用服务器进行代理中转,或者跑在国外服务器上 - https_proxy=http://10.11.12.90:7890 logging: options: max-size: 1m ``` 根据你的实际需求和想使用的模型情况,将上面的内容进行完善,并保存为 `docker-compose.yml`,然后执行 `docker compose up -d`,稍等片刻,服务就运行起来啦。 接着,我们可以使用自己顺手的软件来进行接口测试,比如用 `curl` 测试一把模型的流式输出: ```yaml curl http://0.0.0.0:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer soulteary" \ -d '{ "model": "gpt-4", "messages": [{"role": "user", "content": "Hello."}], "temperature": 0.2, "stream": true }' ``` 命令执行完毕,我们将得到类似下面的输出: ```yaml data: {"id":"79fb180d21694513","created":0,"model":"yi-34b-chat","choices":[{"delta":{"role":"assistant"},"index":0}],"content":"","lastOne":false} data: {"id":"79fb180d21694513","object":"chat.completion.chunk","created":3705525,"model":"yi-34b-chat","choices":[{"delta":{"role":"assistant","content":"Hello"},"index":0}],"content":"Hello","lastOne":false} ... data: {"id":"79fb180d21694513","object":"chat.completion.chunk","created":3705525,"model":"yi-34b-chat","choices":[{"delta":{"role":"assistant","content":""},"index":0,"finish_reason":"stop"}],"content":"Hello! How can I assist you today? If you have any questions or need information on a specific topic, feel free to ask.","usage":{"completion_tokens":27,"prompt_tokens":14,"total_tokens":41},"lastOne":true} data: [DONE] ``` 或者用客户端软件,来一个最普通的模型 API 调用: ![一个最简单的模型 AI 调用 GPT-4 (实际请求的是 Yi)](https://attachment.soulteary.com/2024/01/09/paw.jpg) ## 最后 这篇文章就先写到这里吧。 接下来,我们来聊聊用这个方式来折腾一些有趣的东西。 --EOF