分享一个有趣的小工具,10MB 身材的小工具,能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。
让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的,非 OpenAI 的 API 私有部署和使用起来。
这个小工具软件写于两周之前的 2023 年年底,开源在了 GitHub:soulteary/amazing-openai-api,有需要可以自取,欢迎一键三连。
目前项目只适配了三种我在使用的模型的 API,如果你觉得有其他的合适的 API 或者你认为很靠谱的模型,欢迎提交 PR。
这个小工具的思路借鉴于 stulzq/azure-openai-proxy,一个将 Azure OpenAI API 转换为 OpenAI API 格式的项目。在本地使用这个项目一段时间之后,我 fork 出了一个新的版本 soulteary/azure-openai-proxy,并将修改以 PR 形式反馈给了原始项目。随后,因为想在本地应用中测试 Yi-34B API,我制作了一个新的工具:soulteary/yi-openai-proxy,在随后 Gemini Pro API 出现了,想着不能每处一个模型就折腾一个这样的项目,后面太难维护了。
于是,我彻底重构了项目,并起一个略搞怪的名字:Amazing OpenAI API,和一个有意思的像是表情包的别名:AOA。
这个工具有两种使用方法,一种是从 GitHub Release 发布页面 下载二进制文件。
另外一种方法,则是使用 Docker ,从社区下载 GitHub 自动构建好的指定版本的容器镜像:
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
,就可以正常使用服务啦:
AZURE_ENDPOINT=https://你的部署名称.openai.azure.com/
完整的执行命令如下:
AZURE_ENDPOINT=https://你的部署名称.openai.azure.com/ ./aoa
当服务启动之后,我们的程序就可以通过访问 http://localhost:8080/v1/*
的地址,实现和访问 OpenAI 一样的 API 的效果啦。
如果你更喜欢使用 Docker,可以用下面的命令来实现和上面一样的效果:
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
使用示例。
这个小工具有两个有趣的特色功能。
在日常测试各种 AI 应用的时候,许多应用都需要我们设置 API Key 给它。
你如果你希望不要将 API Key 暴露给应用,或者不放心各种复杂的开源软件是否有 API Key 泄漏风险。
我们可以将 API Key 配置在工具中,比如在 Azure 模式的时候,可以添加 AZURE_API_KEY=你的 API Key
这个环境变量。以上文中 Azure 的命令为例,我们可以将命令改写为:
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
,我们可以这样写一条映射规则:
gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat
我们还是先拿上文中的 Azure 来举例,如果我们的 Azure 部署名称是 gpt-35
,我们希望将软件请求中的 gpt-3.5
和 gpt-4
都替换为这个部署名称:
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 官方的 API 转换为标准的 OpenAI API 调用,可以使用下面的命令:
AOA_TYPE=yi YI_ENDPOINT=<你的 API 地址> YI_API_KEY=<你的 API KEY> ./aoa
和使用 Azure 服务类似,我们可以使用一个技巧将各种开源、闭源软件使用的模型自动映射为我们希望的模型:
# 比如不论是 3.5 还是 4 都映射为 `gpt-35`
YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat
完整命令如下:
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
服务:
AOA_TYPE=yi YI_ENDPOINT=<你的 API 地址> YI_MODEL_ALIAS=gpt-3.5-turbo:yi-34b-chat,gpt-4:yi-34b-chat ./aoa
如果我们想将 Google 官方的 Gemini API 转换为标准的 OpenAI 调用,可以用下面的命令:
AOA_TYPE=gemini GEMINI_API_KEY=<你的 API KEY> ./aoa
和使用 Azure 服务类似,我们可以使用一个技巧将各种开源、闭源软件使用的模型自动映射为我们希望的模型:
# 比如不论是 3.5 还是 4 都映射为 `gpt-35`
GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro
完整命令如下:
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
参数:
AOA_TYPE=gemini GEMINI_MODEL_ALIAS=gpt-3.5-turbo:gemini-pro,gpt-4:gemini-pro ./aoa
下面,我们分别以 Azure、Yi、Gemini 为例,演示下如何编写 docker-compose.yml
配置,先来看看 Azure:
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:
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:
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
测试一把模型的流式输出:
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
}'
命令执行完毕,我们将得到类似下面的输出:
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 调用:
这篇文章就先写到这里吧。
接下来,我们来聊聊用这个方式来折腾一些有趣的东西。
—EOF
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
本文作者: 苏洋
创建时间: 2024年01月09日
统计字数: 6809字
阅读时间: 14分钟阅读
本文链接: https://soulteary.com/2024/01/09/amazing-openai-api-call-all-non-openai-models-according-to-the-openai-api.html