1. 为什么需要 One API 这类统一分发层
如果你手上同时握着 OpenAI、Claude、Gemini、DeepSeek 甚至国内几家大模型的 Key,大概率经历过这种混乱:每个 SDK 的鉴权方式不一样,流式返回的字段名对不上,某个渠道额度用完了要手动去改代码里的 base_url,团队里谁用了多少 token 全靠自觉。One API 就是冲着这个痛点来的——它是一个开源的 LLM API 管理与分发系统,把多家模型统一适配成 OpenAI 格式,你只需要对着一套接口写代码,背后走哪个渠道、用哪个 Key、额度怎么算,全部交给它管。
它本身不是模型,而是一层中间件。适合个人开发者做多模型聚合、小团队做 Key 分发和额度控制、企业做内部调用网关。部署方式很轻,一个 Docker 容器就能跑起来,默认账号 root、密码 123456,登录后第一件事就是改密码。这篇文章我会把部署、配置骨架、以及怎么把 TaoToken 的统一 Key 接进 One API 渠道这三件事串起来讲清楚,最后给你一套能直接复制去验证分发是否生效的动作。
需要先说明一点:One API 负责的是"管理和分发",它自己不生产模型能力。你要往它的渠道里填真实可用的上游 Key,整条链路才跑得通。下面进入实操。
2. 部署 One API 并准备 TaoToken 统一 Key
2.1 用 Docker 把 One API 跑起来
最省事的是 SQLite 版,适合个人和小团队先跑通:
docker run --name one-api -d --restart always \ -p 3000:3000 \ -e TZ=Asia/Shanghai \ -v /home/ubuntu/data/one-api:/data \ justsong/one-api如果你预期并发高、要多机部署,换成 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要提前建好。数据落在宿主机/home/ubuntu/data/one-api,确认这个目录有写权限,否则容器起来也会因为写不进 SQLite 而反复重启。访问http://你的服务器IP:3000就能看到登录页。
2.2 拿到 TaoToken 的统一 Key
TaoToken 在这里扮演的是"上游统一通道"的角色——你不需要在 One API 里为每家模型单独配一个渠道,而是把 TaoToken 当成一个 OpenAI 兼容的上游接进去。先去控制台创建 API Key:
- 控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- Key 管理页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
创建完复制那串sk-开头的 Key,先存好。它的 API 基址是https://taotoken.net/api,注意这个地址后面不加任何查询参数,One API 渠道里填的就是它。
2.3 在 One API 里新建渠道
登录后台,左侧进"渠道"→"添加新的渠道"。关键字段这样填:
| 字段 | 填写值 |
|---|---|
| 类型 | OpenAI(因为 TaoToken 是 OpenAI 兼容格式) |
| 名称 | taotoken-main |
| 分组 | default |
| 模型 | 按需勾选,或手动填 gpt-4o、claude-3-5-sonnet 等 |
| 密钥 | 你刚复制的 TaoToken Key |
| 代理/Base URL | https://taotoken.net/api |
填完点"测试",如果返回绿色成功,说明这条渠道通了。如果报错,先别急着改配置,翻到第 5 节对照排查。
3. 可复制的配置骨架:config.toml 与 settings.json
One API 本身主要通过环境变量和后台界面配置,但很多团队习惯把部署参数固化进编排文件,同时前端/客户端侧需要一份 settings.json 来指向 One API。下面两份骨架你可以直接改。
3.1 部署侧 config.toml(以 docker-compose 场景为例)
# config.toml —— One API 部署参数骨架 [server] port = 3000 log_dir = "./logs" [database] # 高并发建议 MySQL,个人可用 SQLite dsn = "root:123456@tcp(localhost:3306)/oneapi" [session] # 多机部署时所有节点必须一致 secret = "replace-with-a-random-string" [sync] # 从节点配置同步频率(秒) frequency = 60 # 渠道余额刷新(分钟) channel_update_frequency = 1440 [redis] # 多机部署强烈建议开启 conn_string = "redis://default:redispw@localhost:49153" [limit] # 全局 API 速率限制 global_api_rate_limit = 180 # 中继超时(秒) relay_timeout = 300对应到 docker-compose,把这些值映射成环境变量即可:
version: "3" services: one-api: image: justsong/one-api container_name: one-api restart: always ports: - "3000:3000" environment: - TZ=Asia/Shanghai - SQL_DSN=root:123456@tcp(mysql:3306)/oneapi - SESSION_SECRET=replace-with-a-random-string - SYNC_FREQUENCY=60 - REDIS_CONN_STRING=redis://default:redispw@redis:6379 volumes: - ./data/one-api:/data depends_on: - mysql - redis3.2 客户端侧 settings.json
不管你是接 ChatGPT Next Web 还是自己写的脚本,指向 One API 的配置长这样:
{ "apiBase": "https://your-domain/v1", "apiKey": "sk-你在OneAPI创建的令牌", "model": "gpt-4o", "stream": true, "timeout": 300000 }这里有个容易踩的坑:apiBase结尾的/v1不能少,One API 的 OpenAI 兼容入口就是挂在/v1下的。另外apiKey填的是你在 One API"令牌"页面新建的令牌,不是 TaoToken 的 Key,也不是 One API 的登录密码,三者别搞混。
4. 验证分发与调用是否真的生效
配置填完不代表链路通了,得用实际请求验证。分三步走。
4.1 在 One API 后台建令牌
进"令牌"页面,新增一个令牌,设置额度、过期时间、允许访问的模型。创建后会得到一串sk-开头的令牌,这就是你对外使用的 Key。
4.2 用 curl 打一次真实请求
curl https://your-domain/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的OneAPI令牌" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "用一句话说明什么是API网关"}], "stream": false }'如果返回正常的 JSON,choices[0].message.content里有内容,说明 One API → TaoToken → 上游模型这条链路是通的。同时回后台看"额度明细",应该能看到这次调用扣了额度,这证明分发和计费都在工作。
4.3 验证流式与多模型切换
把stream改成true再打一次,观察是否逐块返回。然后换一个模型名,比如claude-3-5-sonnet,再请求一次。如果两个模型都能出结果,说明 One API 的模型映射和 TaoToken 的多模型通道都生效了。
想更直观地验证模型对话效果,可以直接用 TaoToken 的对话页面对比:
- 模型对话:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
5. 本篇常见报错排查
报"无可用渠道":八成是渠道分组和令牌分组对不上。检查渠道的"分组"字段是否包含令牌所在分组,以及模型列表里有没有你请求的那个模型名。
报"额度不足":注意区分账户额度和令牌额度。令牌本身设了上限,用完了即使账户还有钱也会被拦。去令牌页面看剩余额度。
返回 JSON 解析错误:常见于上游返回了非 JSON 的错误页,比如被拦截或超时。先确认 TaoToken 的 Base URL 填的是https://taotoken.net/api,没有多余斜杠或路径。
流式请求卡住不返回:检查relay_timeout是否太短,以及 Nginx 反代有没有关掉缓冲。反代配置里加proxy_buffering off;和proxy_read_timeout 300s;通常能解决。
渠道测试通过但实际调用失败:可能是模型名大小写或版本号不一致。One API 的模型映射功能可以重定向,但字段容易丢,建议直接在渠道里把模型名对齐上游。
多机部署配置不同步:所有节点SESSION_SECRET必须一致,且都连同一个 MySQL,从节点设NODE_TYPE=slave,否则会出现这台能登录那台登不上的怪现象。
6. 把统一 Key 用进长期编码与 Agent 场景
链路跑通之后,真正的价值在于把它接进日常开发流。如果你用 Claude Code 这类编码工具,或者要跑长期的 Agent 任务,建议把 One API 作为统一出口,再配合 TaoToken 的 Coding Plan 做额度规划,避免每个工具各配一套 Key:
- Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
我自己的做法是:One API 里只保留一条 TaoToken 渠道,模型列表按项目需要勾选,令牌按"项目"维度拆分,每个项目一个令牌并设独立额度。这样月底看额度明细就知道哪个项目烧得多,不用去翻各家平台的后台。踩过的坑是早期把令牌额度设得太死,Agent 跑长任务中途被拦,后来改成按周预估再留 20% 余量就顺了。
最后提醒一句:One API 是管理分发层,不是模型本身,也不替代你的编辑器或 IDE。它的定位是让多模型调用这件事变得可管、可控、可观测。把渠道、令牌、额度这三样理顺,剩下的就是安心写业务代码了。