One API 调研
One API 调研
1 需求背景
最近在工作中有这样的需求:实现对 LLM API 的管理,以及对用户请求进行分发,同时统计用户对于 API 的使用。
在 LLM 逐渐普及的现在,这样的需求想来应该是有着较为成熟的开源方案的。
而经过调研,One API 这个开源项目,能较好的满足以上需求。
2 One API 支持的功能
在 One API 的 README 中,详细列出了 One API 支持的功能,但从需求上来说,实际需要使用到的,只有:
- 支持通过负载均衡的方式访问多个渠道。
- 支持 stream 模式,可以通过流式传输实现打字机效果。
- 支持令牌管理,设置令牌的过期时间、额度、允许的 IP 范围以及允许的模型访问。
- 支持渠道管理,批量创建渠道。
- 支持用户分组以及渠道分组,支持为不同分组设置不同的倍率。

3 项目部署
One API 支持使用 Docker 进行部署,为保证数据的持久化以及后续升级迭代,应强依赖 MySQL,故部署命令:
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 /home/ubuntu/data/one-api:/data justsong/one-api
需要先在对应的数据库创建好 oneapi 这个库。
当部署成功后,可基于:http://localhost:3000,访问到该项目。
4 界面展示
One API 会有一个默认的超级管理员账号 root,密码为 123456,One API 登陆后,才会开启完整的功能。
未登录时:
登陆后:
主要涉及到的两大功能,渠道管理与令牌管理。
渠道管理:
令牌管理:
5 使用方式
5.1 通过渠道添加对应 LLM 的 API。
渠道添加完成后,可基于测试按钮,测试是否连通。
5.2 添加一个令牌
令牌添加完成后,可基于复制按钮获取到令牌的对应值。
5.3 修改原本调用大模型的相关代码,将请求统一发送到 One API
api_key
修改为令牌值,base_url
修改为部署的 One API 的地址。
注意,具体的
base_url
的格式取决于你所使用的客户端。
例如,使用 Open AI 进行调用:
client = OpenAI(
api_key="sk-xxxxxx",
base_url="http://<host>:<port>/v1"
)
6 Demo
以调用智谱 API 为例,演示一下,使用 One API 的效果:
from openai import OpenAI, OpenAIError
client = OpenAI(
api_key="sk-Q2IOIh2N2PaVaeWIBcB121A746434d8eBe159eD7E6A89aEa",
base_url="http://127.0.0.1:3000/v1"
)
try:
completion = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content": "你是一个聪明且富有创造力的小说作家"},
{"role": "user",
"content": "请你作为童话故事大王,写一篇短篇童话故事,故事的主题是要永远保持一颗善良的心,要能够激发儿童的学习兴趣和想象力,同时也能够帮助儿童更好地理解和接受故事中所蕴含的道理和价值观。"}
],
top_p=0.7,
temperature=0.9
)
print(completion.choices[0].message)
except OpenAIError as e:
print(f"调用失败,错误信息: {e}")
使用 One API 转发前,打印的结果:
ChatCompletionMessage(content='《星星森林的奇迹》...', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None)
使用 One API 转发后,打印的结果:
ChatCompletionMessage(content='《神奇的音乐盒》...', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None)
格式一致,符合预期。
在操作界面可看到对应的记录,记录了提示词消耗、补全消耗、额度,可基于此来定义计费规则。
而在令牌管理界面也可看到对应令牌的额度:
而当令牌的额度用尽时:
再次使用该令牌进行调用,会返回错误信息:
调用失败,错误信息: Error code: 401 - {'error': {'message': '该令牌额度已用尽 (request id: 2025021020230234574074071941926)', 'type': 'one_api_error'}}
可基于此,依据用户的余额限制用户的使用。
同时在设置页面可对倍率进行设置,以满足自定义计费需求:
7 API 支持
前面都是依据前端进行操作,但要在项目中引入 One API,主要还是得看 One API 是否有相关的 API 支持。
答案是有的,作者也有提供相关的操作文档:使用 API 操控 & 扩展 One API
简单来说,One API 支持两种鉴权方式:Cookie 和 Token,而 API 调用则主要涉及到 Token。
具体的操作方式:
- 在 One API 的系统设置中,生成系统访问令牌,即获取 Token。
- 在调用 One API 的 API 时,Token 作为请求头的 Authorization 字段的值即可。
至于 One API 的 API 文档,作者则没有给出,需要自己进行抓包。