Amazing OpenAI API:把非 OpenAI 模型都按 OpenAI API 调用

news2025/1/18 16:50:50

分享一个有趣的小工具,10MB 身材的小工具,能够将各种不同的模型 API 转换为开箱即用的 OpenAI API 格式。

让许多依赖 OpenAI API 的软件能够借助开发者能够接触到的,非 OpenAI 的 API 私有部署和使用起来。

写在前面

这个小工具软件写于两周之前的 2023 年年底,开源在了 GitHub:soulteary/amazing-openai-api,有需要可以自取,欢迎一键三连。

开源小项目:AOA

目前项目只适配了三种我在使用的模型的 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-chatgemini-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 运行 AOA

如果你更喜欢使用 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 使用示例。

工具特色

这个小工具有两个有趣的特色功能。

保护我们的 API Key

在日常测试各种 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.5gpt-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 34B Chat 模型

如果我们想将 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

使用 Gemini Pro 模型

如果我们想将 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

Docker Compose 使用示例

下面,我们分别以 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 调用:

一个最简单的模型 AI 调用 GPT-4 (实际请求的是 Yi)

最后

这篇文章就先写到这里吧。

接下来,我们来聊聊用这个方式来折腾一些有趣的东西。

—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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些&#xff1f; &#xff08;1&#xff09;String&#xff08;字符串&#xff09; &#xff08;2&#xff09;Hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;List&#xff08;列表&#xff09; &#xff08;4&#xff09;Se…

zookeeper 与eureka区别

CAP定理 在分布式系统的发展中&#xff0c;影响最大的莫过于CAP定理了&#xff0c;是分布式系统发展的理论基石。 2000年&#xff0c;加州大学的计算机科学家 Eric Brewer提出了CAP猜想 2002 年&#xff0c;麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜…

深入理解 Hadoop (五)YARN核心工作机制浅析

概述 YARN 的核心设计理念是 服务化&#xff08;Service&#xff09; 和 事件驱动&#xff08;Event EventHandler&#xff09;。服务化 和 事件驱动 软件设计思想的引入&#xff0c;使得 YARN 具有低耦合、高内聚的特点&#xff0c;各个模块只需完成各自功能&#xff0c;而模…

静态关键字:static

static的作用 static是静态的意思&#xff0c;可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份&#xff0c;可以被共享访问、修改。 成员变量 分为2类 静态成员变量&#xff08;有static修饰&#xff0c;属于类&#xff0c;内存中加载…

【QML COOK】- 005-粒子系统(ParticleSystem)

1. 编辑main.qml import QtQuick import QtQuick.ParticlesWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")color: "#000000"MouseArea {id: mouseAreaanchors.fill: parentonClicked: {hahaEmitter.pulse(2000)}}ParticleSystem {…

大众汽车宣布将ChatGPT,批量集成在多种汽车中!

1月9日&#xff0c;大众汽车在官网宣布&#xff0c;将ChatGPT批量集成到电动、内燃机汽车中。 大众表示&#xff0c;将ChatGPT与其IDA语音助手相结合&#xff0c;用户通过自然语言就能与ChatGPT进行互动&#xff0c;例如&#xff0c;帮我看看最近的三星米其林饭店在哪里&#…

上门洗衣洗鞋小程序多门店管理模式是怎么样的

做干洗店和洗鞋店的老板们很多都不止一个门店&#xff0c;多门店的管理模式下&#xff0c;去做一个上门洗衣洗鞋小程序&#xff0c;需要有哪些必要的功能才能让不同的门店管理起来不乱呢。首先需要先确定一下不同门店的管理都会面临哪些经营场景和需求。 第一&#xff0c;加盟店…

Android BUG 之 Error: Activity class {} does not exist

项目场景&#xff1a; 更换包名&#xff0c;运行报错 问题描述 原因分析&#xff1a; 在替换包名的时候要确认&#xff0c;配置文件跟build中的保持一致&#xff0c;在更换后还要将旧包的缓存数据清理掉 解决方案&#xff1a; 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

openEuler22.0.3安装oracle11.2.0.4报错总结

openEuler是CentOS8系列魔改来的 1.xstart无法打开报错x11拒绝转义 yum install *x11* vi /etc/ssh/sshd_config X11Forwarding yes systemctl restart sshd 2.执行runinstaller报错,无论是直接无法打开界面报错: when installed in the jdk 1.2 Linux 还是打开界面报错: no o…

20、Kubernetes核心技术 - 基于Prometheus和Grafana搭建集群监控平台

目录 一、概述 二、监控平台架构图​编辑 三、部署 Prometheus 3.1、Prometheus简介 3.2、部署守护进程node-exporter 3.3、部署rbac 3.4、ConfigMap 3.5、Deployment 3.6、Service 3.7、验证Prometheus 四、部署Grafana 4.1、Deployment 4.2、Service 4.3、Ing…

每天刷两道题——第十一天

1.1滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值 。 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输出&…

Spark与Cassandra的集成与数据存储

Apache Spark和Apache Cassandra是大数据领域中两个重要的工具&#xff0c;用于数据处理和分布式数据存储。本文将深入探讨如何在Spark中集成Cassandra&#xff0c;并演示如何将Spark数据存储到Cassandra中。将提供丰富的示例代码&#xff0c;以帮助大家更好地理解这一集成过程…

pycharm的使用技巧

1.新建文件时,自动生成代码 settings->editor->file and code templates,选择python script ${NAME} 文件名 ${DATE} 日期 2.自动补齐自定义段落 settings->editor->live templates,在右侧点击+号,添加自定义的内容 完成之后,在下方勾选python 3.修改注释的…

服务器日常维护要素,应该如何做好维护

维护服务器的目的是为了让服务器的性能保持最佳状态&#xff0c;发现问题及时解决&#xff0c;没有问题也可以对相关的应用和配置进行调优。但也有很多用户疑问&#xff0c;服务器具体会有哪些方面需要维护的&#xff0c;今天就一起来看看吧。 服务器日常维护&#xff0c;主要包…

融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」

&#xff08;&#x1f446;点击获取《社交泛娱乐出海作战地图》&#xff09; 1 月 5 日&#xff0c;由知名 IT 技术媒体 51CTO 主办的第十八届“中国企业年终评选”正式揭晓榜单&#xff0c;融云 CEO 董晗荣获“2023 年度科技影响力人物奖”。关注【融云全球互联网通信云】了解…

java连接池、C3P0、Druid德鲁伊连接池技术

java线程池 连接池C3P0Druid 连接池 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0c…

CAN位时序分解

标准位时序 CAN标准位时序描述如下表 段名称段的作用Tq数同步段 (SS: Synchronization Segment)用于多个连接在总线上的单元通过此段实现时序调整&#xff0c;同步进行接收和发送的工作。信号的跳变边沿最好出现在此段中。 若通讯节点检测到总线上信号的跳变沿被包含在 SS 段的…

电子学会C/C++编程等级考试2020年09月(一级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:输出整数 输入四个整数,把输入的第三、第四个整数输出。 时间限制:3000 内存限制:65536 输入 只有一行,共四个整数,整数之间由一个空格分隔。整数是32位有符号整数。 输出 只有一行,二个整数,即输入的第三、第四个整数,以一…

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接

阿里云 WindowsServer 使用之 配置 SQL Server 允许远程连接 第一步&#xff1a;安装 SQL Server 数据库 这是一个很详细的安装教程&#xff0c;可以参考一下 安装SQL Server详细教程 需要注意&#xff1a;安装实例时&#xff0c;建议在‘身份验证模式’直接选择“混合模式”…

【第一次使用finalshell连接虚拟机内的centos】小白处理方式

第一次使用finalshell连接centos7的时候&#xff0c;因为都是新环境什么都没有配置&#xff0c;所以就需要安装finalshell和对新的centos7 进行一些配置。 安装finalshel&#xff0c;默认不安装d盘&#xff0c;就需要对安装路径做一下调整&#xff0c;其余都是下一步默认安装的…