目 录CONTENT

文章目录
AI

大模型 API 管理器

解小风
2025-09-01 / 0 评论 / 3 点赞 / 11 阅读 / 13508 字

功能简介

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 表的记录,表示该渠道支持该模型

3
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区