功能简介
OneAPI 是一款大模型 API 接口管理与分发工具,可以将 大模型厂商 或 自部署大模型 提供的 API 接口一键封装成 统一的、标准的 OpenAI API 接口格式,从而实现使用统一接口访问所有大模型服务。
安装部署
单机部署
使用 SQLite
适合个人、小规模、低并发场景。
# 准备文件夹
sudo mkdir -p ./LLM/One_API/one-api
sudo mkdir -p ./LLM/One_API/logs
# ./LLM/One_API/docker-compose-llm-one-api.yml 文件如下
version: '3.1'
services:
llm-one-api:
image: justsong/one-api:v0.6.11-preview.7
container_name: LLM-OneAPI
restart: always
ports:
- "13416:3000"
privileged: true
volumes:
# 数据文件夹
- ./one-api:/data
# 日志文件夹
- ./logs:/app/logs
environment:
# 更多可用环境变量,参考【环境变量】一节
# 设置时区
- TZ=Asia/Shanghai
# 设置主题
- THEME=berry
# 使用固定的会话密钥(系统重新启动后已登录用户的 cookie 将依旧有效)
- SESSION_SECRET=PVhkjrozbQxuwwrVwMpw
command: --log-dir /app/logs
# 修改容器内默认的端口号(将默认 3000 修改为 8000,注意 ports: 部分和 healthcheck: 部分也需做同步更改 )
# command: --log-dir /app/logs --port 8000
healthcheck:
test: [ "CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $2}'" ]
interval: 30s
timeout: 10s
retries: 3
# 一键安装并启动
sudo docker-compose -f docker-compose-llm-one-api.yml up -d
# 初始化启动会有些慢,请耐心等待...
# 使用 sudo docker ps -a 命令查看容器状态变为 (healthy) 即可
使用 MySQL
适合小型团队、中等规模、中量并发场景。
# 准备文件夹
sudo mkdir -p ./LLM/One_API/one-api
sudo mkdir -p ./LLM/One_API/logs
sudo mkdir -p ./LLM/One_API/mysql
# ./LLM/One_API/docker-compose-llm-one-api.yml 文件如下
version: '3.1'
services:
llm-one-api:
image: justsong/one-api:v0.6.11-preview.7
container_name: LLM-OneAPI
restart: always
ports:
- "13416:3000"
privileged: true
volumes:
# 数据文件夹
- ./one-api:/data
# 日志文件夹
- ./logs:/app/logs
environment:
# 更多可用环境变量,参考【环境变量】一节
# 设置时区
- TZ=Asia/Shanghai
# 设置主题
- THEME=berry
# 使用固定的会话密钥(系统重新启动后已登录用户的 cookie 将依旧有效)
- SESSION_SECRET=PVhkjrozbQxuwwrVwMpw
# 使用 MySQL 数据库
- SQL_DSN=oneapi:mnIirsCiEJYc@tcp(llm-one-api-db:3306)/one-api
depends_on:
- llm-one-api-db
networks:
- llm-one-api-network
command: --log-dir /app/logs
# 修改容器内默认的端口号(将默认 3000 修改为 8000,注意 ports: 部分和 healthcheck: 部分也需做同步更改 )
# command: --log-dir /app/logs --port 8000
healthcheck:
test: [ "CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $2}'" ]
interval: 30s
timeout: 10s
retries: 3
llm-one-api-db:
image: mysql:8.2.0
container_name: LLM-OneAPI-MySQL
restart: always
ports:
- "13417:3306"
privileged: true
volumes:
- ./mysql:/var/lib/mysql
environment:
# 设置时区
TZ: Asia/Shanghai
# 设置 root 用户的密码
MYSQL_ROOT_PASSWORD: 'RvEiNpbYlUZs'
# 创建专用用户
MYSQL_USER: oneapi
# 设置专用用户密码
MYSQL_PASSWORD: 'mnIirsCiEJYc'
# 自动创建数据库
MYSQL_DATABASE: one-api
networks:
- llm-one-api-network
networks:
llm-one-api-network:
driver: bridge
# 一键安装并启动
sudo docker-compose -f docker-compose-llm-one-api.yml up -d
# 初始化启动会有些慢,请耐心等待...
# 使用 sudo docker ps -a 命令查看容器状态,期间会重启数次,直到变为 (healthy) 即可
使用 MySQL + Redis
适合大型团队、大规模、高并发场景。
如果数据库访问延迟很低,则没有必要启用 Redis,启用后反而会出现数据滞后的问题。
# 准备文件夹
sudo mkdir -p ./LLM/One_API/one-api
sudo mkdir -p ./LLM/One_API/logs
sudo mkdir -p ./LLM/One_API/mysql
# ./LLM/One_API/docker-compose-llm-one-api.yml 文件如下
version: '3.1'
services:
llm-one-api:
image: justsong/one-api:v0.6.11-preview.7
container_name: LLM-OneAPI
restart: always
ports:
- "13416:3000"
privileged: true
volumes:
# 数据文件夹
- ./one-api:/data
# 日志文件夹
- ./logs:/app/logs
environment:
# 更多可用环境变量,参考【环境变量】一节
# 设置时区
- TZ=Asia/Shanghai
# 设置主题
- THEME=berry
# 使用固定的会话密钥(系统重新启动后已登录用户的 cookie 将依旧有效)
- SESSION_SECRET=PVhkjrozbQxuwwrVwMpw
# 使用 MySQL 数据库
- SQL_DSN=oneapi:mnIirsCiEJYc@tcp(llm-one-api-db:3306)/one-api
# 使用 Redis
- REDIS_CONN_STRING=redis://llm-one-api-redis:6379
depends_on:
- llm-one-api-db
- llm-one-api-redis
networks:
- llm-one-api-network
command: --log-dir /app/logs
# 修改容器内默认的端口号(将默认 3000 修改为 8000,注意 ports: 部分和 healthcheck: 部分也需做同步更改 )
# command: --log-dir /app/logs --port 8000
healthcheck:
test: [ "CMD-SHELL", "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $2}'" ]
interval: 30s
timeout: 10s
retries: 3
llm-one-api-db:
image: mysql:8.2.0
container_name: LLM-OneAPI-MySQL
restart: always
ports:
- "13417:3306"
privileged: true
volumes:
- ./mysql:/var/lib/mysql
environment:
# 设置时区
TZ: Asia/Shanghai
# 设置 root 用户的密码
MYSQL_ROOT_PASSWORD: 'RvEiNpbYlUZs'
# 创建专用用户
MYSQL_USER: oneapi
# 设置专用用户密码
MYSQL_PASSWORD: 'mnIirsCiEJYc'
# 自动创建数据库
MYSQL_DATABASE: one-api
networks:
- llm-one-api-network
llm-one-api-redis:
image: redis:latest
container_name: LLM-OneAPI-Redis
restart: always
networks:
- llm-one-api-network
networks:
llm-one-api-network:
driver: bridge
# 一键安装并启动
sudo docker-compose -f docker-compose-llm-one-api.yml up -d
# 初始化启动会有些慢,请耐心等待...
# 使用 sudo docker ps -a 命令查看容器状态,期间会重启数次,直到变为 (healthy) 即可
多机部署
# 多机部署时,环境变量注意事项如下:
# 所有服务器 SESSION_SECRET 设置一样的值
# 必须设置 SQL_DSN 来使用 MySQL 数据库(而非 SQLite),所有服务器连接同一个数据库
# 所有【从服务器】必须设置 NODE_TYPE=slave ,不设置则默认为【主服务器】
# 在使用【远程数据库】的情况下,【主从服务器】都推荐设置 SYNC_FREQUENCY=60 (服务器将定期从数据库加载数据同步配置),并启用 Redis
# 【从服务器】可以选择设置如 FRONTEND_BASE_URL=https://openai.justsong.cn ,以重定向页面请求到主服务器
# 【从服务器】上【分别】装好 Redis,设置好 REDIS_CONN_STRING ,这样可以做到在缓存未过期的情况下数据库零访问,可以减少延迟(Redis 集群或者哨兵模式请参考【环境变量】一节)
# 更多可用环境变量,参考【环境变量】一节
环境变量
# 所有可用环境变量如下:
# TZ:系统的时区设置,默认为{Asia/Shanghai}
# THEME:系统的主题设置,可选为{default, berry},默认为{default}
# SESSION_SECRET:使用固定的会话密钥,这样系统重新启动后已登录用户的 cookie 将依旧有效,设置为随机字符串,如 {PVhkjrozbQxuwwrVwMpw}
# SQL_DSN:设置之后将使用 MySQL 数据库而非 SQLite
# 示例:SQL_DSN=root:123456@tcp(localhost:3306)/oneapi
# 注意需要提前建立数据库 oneapi ,无需手动建表,程序将自动建表
# 请根据你的数据库配置修改下列参数(或者保持默认值):
# SQL_MAX_IDLE_CONNS:最大空闲连接数,默认为 100
# SQL_MAX_OPEN_CONNS:最大打开连接数,默认为 1000,如果报错 Error 1040: Too many connections,请适当减小该值
# SQL_CONN_MAX_LIFETIME:连接的最大生命周期,默认为 60,单位分钟
# REDIS_CONN_STRING:设置之后将使用 Redis 作为缓存使用
# 示例:REDIS_CONN_STRING=redis://default:redispw@localhost:49153
# 如果数据库访问延迟很低,没有必要启用 Redis,启用后反而会出现数据滞后的问题
# 如果需要使用哨兵或者集群模式:
# 则需要把该环境变量设置为节点列表,例如:localhost:49153,localhost:49154,localhost:49155
# 还需要设置以下环境变量:
# REDIS_PASSWORD:Redis 集群或者哨兵模式下的密码设置
# REDIS_MASTER_NAME:Redis 哨兵模式下主节点的名称
# SYNC_FREQUENCY:在启用 Redis 缓存的情况下与数据库同步配置的频率,单位为秒,默认为{600}
# 示例:SYNC_FREQUENCY=60
# NODE_TYPE:设置之后将指定节点类型,可选值为{master, slave},未设置则默认为{master}
# 示例:NODE_TYPE=slave
# FRONTEND_BASE_URL:设置之后将重定向页面请求到指定的地址,仅限【从服务器】设置
# 示例:FRONTEND_BASE_URL=https://openai.justsong.cn
# LOG_SQL_DSN:设置之后将为 logs 表使用独立的数据库
# MEMORY_CACHE_ENABLED:启用内存缓存,会导致用户额度的更新存在一定的延迟,可选值为{true, false},未设置则默认为{false}
# 示例:MEMORY_CACHE_ENABLED=true
# CHANNEL_UPDATE_FREQUENCY:设置之后将定期更新渠道余额,单位为分钟,未设置则不进行更新
# 示例:CHANNEL_UPDATE_FREQUENCY=1440
# CHANNEL_TEST_FREQUENCY:设置之后将定期检查渠道,单位为分钟,未设置则不进行检查
# 示例:CHANNEL_TEST_FREQUENCY=1440
# POLLING_INTERVAL:批量更新渠道余额以及测试可用性时的请求间隔,单位为秒,默认无间隔
# 示例:POLLING_INTERVAL=5
# BATCH_UPDATE_ENABLED:启用数据库批量更新聚合,会导致用户额度的更新存在一定的延迟,可选值为{true, false},未设置则默认为{false}
# 示例:BATCH_UPDATE_ENABLED=true
# 如果你遇到了数据库连接数过多的问题,可以尝试启用该选项
# BATCH_UPDATE_INTERVAL=5:批量更新聚合的时间间隔,单位为秒,默认为{5}
# 示例:BATCH_UPDATE_INTERVAL=5
# 请求频率限制:
# GLOBAL_API_RATE_LIMIT:全局 API 速率限制(除中继请求外),单 ip 三分钟内的最大请求数,默认为{180}
# GLOBAL_WEB_RATE_LIMIT:全局 Web 速率限制,单 ip 三分钟内的最大请求数,默认为{60}
# 编码器缓存设置:
# TIKTOKEN_CACHE_DIR:默认程序启动时会联网下载一些通用的词元的编码,如:gpt-3.5-turbo,在一些网络环境不稳定,或者离线情况,可能会导致启动有问题,可以配置此目录缓存数据,可迁移到离线环境
# DATA_GYM_CACHE_DIR:目前该配置作用与 TIKTOKEN_CACHE_DIR 一致,但是优先级没有它高
# RELAY_TIMEOUT:中继超时设置,单位为秒,默认不设置超时时间
# RELAY_PROXY:设置后使用该代理来请求 API
# USER_CONTENT_REQUEST_TIMEOUT:用户上传内容下载超时时间,单位为秒
# USER_CONTENT_REQUEST_PROXY:设置后使用该代理来请求用户上传的内容,例如图片
# SQLITE_BUSY_TIMEOUT:SQLite 锁等待超时设置,单位为毫秒,默认{3000}
# GEMINI_SAFETY_SETTING:Gemini 的安全设置,默认为{BLOCK_NONE}
# GEMINI_VERSION:One API 所使用的 Gemini 版本,默认为{v1}
# ENABLE_METRIC:是否根据请求成功率禁用渠道,默认不开启,可选值为{true, false}
# METRIC_QUEUE_SIZE:请求成功率统计队列大小,默认为{10}
# METRIC_SUCCESS_RATE_THRESHOLD:请求成功率阈值,默认为{0.8}
# INITIAL_ROOT_TOKEN:如果设置了该值,则在系统首次启动时会自动创建一个值为该环境变量值的 root 用户令牌
# INITIAL_ROOT_ACCESS_TOKEN:如果设置了该值,则在系统首次启动时会自动创建一个值为该环境变量的 root 用户创建系统管理令牌
# ENFORCE_INCLUDE_USAGE:是否强制在 stream 模型下返回 usage,默认不开启,可选值为{true, false}
# TEST_PROMPT:测试模型时的用户 prompt,默认为{Print your model name exactly and do not output without any other text.}
Nginx 代理配置(可选)
# 参考配置如下:
server{
server_name openai.justsong.cn; # 请根据实际情况修改你的域名
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 需要较长的超时时间,请自行调整
}
}
配置使用
# 初始用户名/密码:root/123456
# 渠道:用来管理和添加大模型厂商的大模型服务,只有超级管理员才能设置
# 令牌:供客户端或调用方使用,等同于大模型厂商提供的【密钥】
# 兑换:管理兑换码,类似话费充值卡
# 充值:给账户充值,与兑换配合使用。输入一个有效兑换码,就相当于给当前账户充值对应的额度,供令牌调用消耗
# 用户:新增用户,管理分组(分组的作用就是,假如在当前系统中代理 10 种大模型并商业化,可以设定 VIP 用户能够使用其中的 2 种模型,而 SVIP 可以使用全部模型)
# 日志:展示用户充值和额度消耗记录
# 设置:个人设置、运营设置、系统设置和其他设置
# 当【令牌】设置完毕,即可使用令牌访问调用大模型服务了,使用方式与 OpenAI API一致
# API_BASE_URL="http://<ip>:<port>/v1"
# API_KEY="你的令牌"
# 如:
API_BASE_URL="http://www.jusdot.cn:13416/v1"
API_KEY="sk-xxxxxx"
# 可以通过在令牌后面添加渠道 ID 的方式指定使用哪一个渠道处理本次请求,如:
Authorization: Bearer API_KEY-CHANNEL_ID
# 必须是管理员用户创建的令牌才能指定渠道 ID
# 不指定的话将会使用负载均衡的方式使用多个渠道
常见问题
1. 额度是什么?怎么计算? One API 的额度计算有问题?
额度 = 分组倍率 * 模型倍率 * (提示 token 数 + 补全 token 数 * 补全倍率)
其中补全倍率对于 GPT3.5 固定为 1.33,GPT4 为 2,与官方保持一致
如果是非流模式,官方接口会返回消耗的总 token,但是你要注意提示和补全的消耗倍率不一样
注意,One API 的默认倍率就是官方倍率,是已经调整过的
2. 账户额度足够为什么提示额度不足?
请检查你的令牌额度是否足够,这个和账户额度是分开的
令牌额度仅供用户设置最大使用量,用户可自由设置
3. 提示无可用渠道?
请检查的用户分组和渠道分组设置,以及渠道的模型设置
4. 渠道测试报错:invalid character '<' looking for beginning of value
这是因为返回值不是合法的 JSON,而是一个 HTML 页面,大概率是你的部署站的 IP 或代理的节点被 CloudFlare 封禁了
5. ChatGPT Next Web 报错:Failed to fetch
部署的时候不要设置 BASE_URL;
检查你的接口地址和 API Key 有没有填对;
检查是否启用了 HTTPS,浏览器会拦截 HTTPS 域名下的 HTTP 请求
6. 报错:当前分组负载已饱和,请稍后再试
上游渠道 429 了
7. 手动修改数据库后报错:数据库一致性已被破坏,请联系管理员?
这是检测到 ability 表里有些记录的渠道 id 是不存在的,这大概率是因为你删了 channel 表里的记录但是没有同步在 ability 表里清理无效的渠道
对于每一个渠道,其所支持的模型都需要有一个专门的 ability 表的记录,表示该渠道支持该模型
评论区