一个计算机技术爱好者与学习者

0%

LLM 接口管理和分发系统 One API

1. One API简介

One API是一个LLM代理系统,支持LLM接口管理和消息分发。使得用户可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。

One API 比 openai-forword 更强大,因为 One API 除了作为LLM代理,还可以作为LLM一个中间商系统。

相关文档:

2. One API核心功能

  • 支持多种大模型:OpenAI、Claude、Gemini、Mistral、豆包、文心一言、通义千问、腾讯混元、SiliconCloud等等等等。
  • 支持 stream 模式,可以通过流式传输实现打字机效果
  • 支持绘图接口
  • 支持失败自动重试
  • 支持多机部署,提高并发
  • 支持渠道管理,批量创建渠道,支持渠道设置模型列表,支持通过负载均衡访问多个渠道
  • 支持多用户管理,支持用户额度配置,支持充值,支持用户分组以及渠道分组,支持为不同分组设置不同的倍率
  • 支持令牌管理,设置令牌的过期时间、额度、允许的 IP 范围以及允许的模型访问

3. 安装配置 One API

3.1. 安装配置 One API 概述

One API 提供了多种安装部署方式,包括Docker部署、裸机编译部署、多机部署、宝塔部署、第三方平台一键部署等。
本文中选择使用Docker部署,数据库选择MySQL,不使用Redis。

3.2. 安装MySQL(可选)

1、安装MySQL8,参考文档好好学MySQL:使用Docker安装配置MySQL

2、创建一个数据库,名称为 oneapi

3.3. 安装 One API

1、下载 one-api 镜像

1
docker pull justsong/one-api:v0.6.10-alpha.1

2、运行 one-api 容器
使用SQLite数据库:

1
2
3
4
5
6
docker run --name one-api -d \
--restart always \
-p 3000:3000 \
-e TZ=Asia/Shanghai \
-v /opt/one-api/data:/data \
justsong/one-api:v0.6.11-alpha.8

备用镜像地址:ghcr.io/songquanpeng/one-api:v0.6.11-alpha.8

使用MySQL数据库:

1
2
3
4
5
6
7
docker run --name one-api -d \
--restart always \
-p 3000:3000 \
-e SQL_DSN="root:123456@tcp(localhost:3306)/oneapi" \
-e TZ=Asia/Shanghai \
-v /opt/one-api/data:/data \
justsong/one-api:v0.6.11-alpha.8

其中,SQL_DSN的值要改成自己的MySQL配置。

3、查看容器状态

1
2
docker ps | grep one-api
docker logs one-api

3.4. 配置Nginx

参考配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server{
server_name oneapi.voidking.com; # 请根据实际情况修改你的域名

location / {
client_max_body_size 64m;
proxy_http_version 1.1;
proxy_pass http://localhost:3000; # 请根据实际情况修改你的端口
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_cache_bypass $http_upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_read_timeout 300s; # GPT-4 需要较长的超时时间,请自行调整
}
}

4. 使用 One API

4.1. 登录 One API

1、使用 IP+端口 或者 域名 访问 One API 首页

2、点击页面右上角 登录,登录进入管理页面
默认用户名为 root ,密码为 123456,登录后请先修改密码

4.2. 系统配置

4.2.1. 配置服务器地址

1、点击设置

2、配置服务器地址
该地址要和配置的域名一致。

4.2.2. 配置用户登录和注册方式

1、点击设置

2、配置登录注册部分,选择登录和注册方式

3、配置邮箱域名白名单

4.3. 配置渠道

1、点击渠道,添加新的渠道

2、填入渠道信息

  • 选择类型
  • 填入名称
  • 选择分组
  • 选择模型或者填入模型
  • 填入密钥
  • 部分类型需要填入 base_url
  • 填入模型重定向(可选)

填入的模型,其实是oneapi中的模型名,默认与真实模型名相同。如果oneapi中的模型名,与真实模型名不同,那么可以配置模型重定向。
例如:oneapi中模型名是 gpt3.5-test,真实模型名是 gpt-3.5-turbo-16k ,那么模型重定向配置如下

1
2
3
{
"gpt3.5-test": "gpt-3.5-turbo-16k"
}

3、提交,并点击测试

注意:根据个人经验,添加渠道并且测试成功后,并不能立刻通过API调用。
如果立刻调用,会报错:

1
openai.InternalServerError: Error code: 503 - {'error': {'message': '当前分组 default 下对于模型 xxx 无可用渠道 (request id: xxx)', 'type': 'one_api_error'}}

需要等待2到3分钟,再进行API调用才会正常,也许是oneapi的什么机制。

4.4. 配置额度

1、点击用户,选择某一个用户,编辑

2、剩余额度填入 token 数,会自动显示等价金额
100000 token,等价金额 0.2 刀

3、提交

4.5. 配置令牌

1、用户登录 One API

2、点击令牌,添加新的令牌

3、填入令牌信息

  • 名称
  • 模型范围
  • IP限制
  • 过期时间
  • 额度

4、提交

5、复制 token
找到新创建的令牌,点击复制,就可以获取到 token
注意:该 token 对应的 base_url 是我们配置的域名 https://oneapi.voidking.com/v1

6、聊天
找到新创建的令牌,点击聊天,会自动跳转到 NextChat,同时提示自动填入 base_url 和 token,点击确定,就可以使用 One API 代理进行聊天了。

5. 模型价格与倍率

参考文档:

模型倍率和补全倍率算法:

1
2
3
基准价格:0.002 $ /1k tokens
模型倍率 = 输入价格 / 基准价格
补全倍率 = 输出价格 / 输入价格

假设X模型的价格为 $0.18/M input tokens$0.72/M output tokens,那么它的模型倍率和补全倍率如下:

1
2
模型倍率 = 输入价格 / 基准价格 = (0.18/1000) / 0.002 = 0.09
补全倍率 = 输出价格 / 输入价格 = 0.72 / 0.18 = 4

在oneapi代码中,在计算费用时,涉及到变量包括:

  • model_name:模型名(针对模型名配置模型倍率和补全倍率)
  • base_price:基准价格,0.002 $ /1k tokens
  • prompt_tokens:提示词token数
  • completion_tokens:返回token数
  • model_ratio:模型倍率
  • completion_ratio:补全倍率
  • group_ratio:分组倍率(针对不同用户类型,控制打折或溢价)
  • quota:某个大模型的提示词token数和返回token数,换算成基准价格token数

变量关系如下:

1
quota = ((prompt_tokens * model_ratio) + (completion_ratio * model_ratio * completion_ratio)) * group_ratio

最终费用为:

1
cost = quota * base_price = quota * (0.002/1000)

6. API 调用 One API

参考文档:

6.1. curl调用测试

1
2
3
4
5
6
7
8
9
10
11
12
curl "https://oneapi.voidking.com/v1/chat/completions" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <ONE_API_KEY>" \
-d '{
"model": "gpt-3.5-turbo-16k",
"messages": [
{
"role": "user",
"content": "hello!"
}
]
}'

6.2. python调用测试

1、编写测试脚本 test.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from openai import OpenAI

client = OpenAI(
base_url="https://oneapi.voidking.com/v1",
api_key="<ONE_API_KEY>",
)

completion = client.chat.completions.create(
model="gpt-3.5-turbo-16k",
messages=[
{
"role": "user",
"content": "hello!"
}
]
)

print(completion.choices[0].message.content)

2、运行脚本

1
python test.py