1. 为什么要在本地折腾 One-Api 这层网关
如果你手里同时握着 OpenAI、Claude、通义千问、DeepSeek 好几个平台的 Key,每次写代码都要为不同 SDK 改一遍请求格式,那种感觉就像家里有五个遥控器却只能开一台电视。One-Api 解决的就是这件事:它把各家大模型的接口统一翻译成 OpenAI API 格式,你只需要记住一套/v1/chat/completions的写法,后面换模型只改一个model字段。
这篇要做的,是在本地用 Docker 把 One-Api 跑起来,数据用 SQLite 存,不额外装 MySQL,然后通过 TaoToken 的统一 Key 通道把上游模型接进来,最后用 curl 打一发请求确认整条链路通了。适合谁?适合正在学 Semantic Kernel、LangChain 这类框架,但被各家 API 申请和格式差异卡住的开发者;也适合想把多个模型 Key 收拢到一处、方便切换和记账的人。
我试过直接在每个项目里硬编码不同厂商的请求逻辑,维护起来非常痛苦,后来把 One-Api 当成一层本地代理,代码里只认 OpenAI 格式,清爽很多。下面按“装网关 → 配渠道 → 发令牌 → 验证 → 排错”的顺序走一遍,命令都可以直接复制。
2. 前置准备:TaoToken 统一 Key 与本地环境
2.1 TaoToken 在这里扮演什么角色
One-Api 本身是个“翻译+转发”的网关,它需要下游有真实可用的模型通道。TaoToken 提供的是统一的 Key 和 API 通道,你可以把它理解成一个已经帮你对接好多种模型的入口,One-Api 只要把渠道地址指向它,就能用一套凭证调用多个模型。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api 。
这样做的好处是:你不需要在 One-Api 里为每个厂商单独填一堆参数,渠道配置更干净;同时多模型调用的额度、切换都集中在 TaoToken 侧管理。对于本地学习和中小项目来说,少维护一层账号体系。
2.2 本地需要装什么
Docker Desktop 是必须的,Windows 和 macOS 都行。装好后确认docker命令可用:
docker --version docker compose version如果docker compose version报错,说明你的 Docker 版本较老,需要升级到带 Compose V2 的版本。另外准备一个存放数据的目录,比如 Windows 下用C:/LLM/OneApi-Data,macOS/Linux 下用~/oneapi-data,后面挂载给容器,保证重启不丢配置。
3. 用 docker-compose 部署 One-Api(SQLite 存储)
3.1 为什么选 SQLite 而不是 MySQL
One-Api 默认支持 SQLite 和 MySQL。本地学习、单机使用,SQLite 足够,零额外依赖,数据就是一个文件,备份直接拷走。只有多人协作、高并发场景才需要上 MySQL。所以这里用 SQLite,把复杂度降到最低。
3.2 可复制的 docker-compose 骨架
新建一个目录,比如oneapi,在里面创建docker-compose.yml:
services: one-api: image: justsong/one-api:latest container_name: one-api restart: always ports: - "3000:3000" environment: - TZ=Asia/Shanghai - SQL_DSN= volumes: - ./data:/data healthcheck: test: ["CMD-SHELL", "wget -q -O - http://localhost:3000/api/status || exit 1"] interval: 30s timeout: 5s retries: 3这里几个关键点:SQL_DSN留空表示使用默认的 SQLite,数据库文件会落在容器/data目录下;volumes把宿主机的./data映射进去,这样数据持久化在本地;healthcheck用来确认服务真的起来了,不是容器在跑但进程挂了。
启动:
docker compose up -d docker compose logs -f one-api看到日志里出现监听 3000 端口、数据库初始化完成之类的信息,就说明起来了。如果拉镜像慢,可以先单独docker pull justsong/one-api:latest。
3.3 首次登录与改密码
浏览器打开http://localhost:3000,默认账号root,密码123456。登录后第一件事就是改密码,在“个人设置”里改掉,别留着默认密码。改完重新登录一次确认生效。
4. 配置渠道与令牌:把 TaoToken 接进来
4.1 新增渠道
进入“渠道”页面,点“添加新的渠道”。类型选择OpenAI(因为 TaoToken 提供的是 OpenAI 兼容接口),名称随便起,比如taotoken-main。关键字段:
| 字段 | 填写内容 |
|---|---|
| 类型 | OpenAI |
| 名称 | taotoken-main |
| 分组 | default |
| 模型 | 按需填,如 gpt-4o,claude-3-5-sonnet,deepseek-chat |
| 代理 | 留空 |
| 密钥 | 你的 TaoToken Key |
| 代理地址 | https://taotoken.net/api |
模型这一栏要和你实际要调用的模型名对应,多个用英文逗号分隔。代理地址填 TaoToken 的 API 基址,注意不要带末尾斜杠。填完点“提交”,渠道列表里状态应该变成绿色“已启用”。
4.2 生成访问令牌
渠道通了,还需要一个给本地项目用的令牌。进入“令牌”页面,点“添加新的令牌”,名称随意,额度按需设置(学习用可以设个较小值),过期时间留空表示不过期。生成后会得到一串sk-开头的 Key,这就是你项目里要用的凭证。
注意:这个令牌是 One-Api 自己签发的,和你填在渠道里的 TaoToken Key 是两回事。前者给本地项目用,后者是 One-Api 访问上游用的,别搞混。
5. 验证请求:curl 打通 /v1/chat/completions
5.1 用 curl 发一发
拿到 One-Api 令牌后,直接打本地网关:
curl http://localhost:3000/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的OneApi令牌" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "user", "content": "用一句话解释什么是 API 网关"} ], "temperature": 0.7 }'如果返回结构里有choices[0].message.content,说明整条链路通了:本地 One-Api 收到请求 → 按渠道配置转发到 TaoToken → 拿到模型回复 → 按 OpenAI 格式返回给你。
5.2 成功结果长什么样
正常返回大致是这样:
{ "id": "chatcmpl-xxxx", "object": "chat.completion", "created": 1715000959, "choices": [ { "index": 0, "message": { "role": "assistant", "content": "API 网关是位于客户端和后端服务之间的中间层,负责统一入口、转发请求并处理鉴权等公共逻辑。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 18, "completion_tokens": 40, "total_tokens": 58 } }看到usage里有 token 统计,说明计费链路也正常。这时候你在 Semantic Kernel 或 LangChain 里把base_url指向http://localhost:3000/v1,api_key填 One-Api 令牌,就能直接跑框架代码了。
6. 本篇常见错排查
6.1 渠道测试报 401 或 403
多半是渠道里的密钥填错,或者代理地址写成了带路径的形式。检查两点:密钥是不是 TaoToken 的 Key,代理地址是不是https://taotoken.net/api且没有多余斜杠。另外确认渠道类型选的是 OpenAI,不是 Azure 或其他。
6.2 请求返回 model not found
说明你请求里的model字段不在渠道配置的模型列表里。回到渠道编辑页,把要用的模型名加进去,保存后重新测试。模型名要和上游实际支持的名称一致,大小写敏感。
6.3 容器起来但浏览器打不开 3000
先看docker compose logs -f one-api有没有报错。常见原因是端口被占用,改一下映射端口,比如"3001:3000",然后访问http://localhost:3001。Windows 下还要确认 Docker Desktop 的端口转发没被防火墙拦。
6.4 重启后配置丢了
检查docker-compose.yml里的volumes映射路径是否正确,数据文件应该出现在宿主机的./data目录下。如果用的是相对路径,注意 compose 文件所在目录就是基准目录。SQLite 模式下,one-api.db文件在就说明持久化生效了。
6.5 令牌额度用完或过期
在“令牌”页面能看到每个令牌的剩余额度和状态。学习阶段如果额度设太小,请求会返回额度不足的错误,直接编辑令牌调大或新建一个即可。
7. 后续怎么用:把本地网关接进你的项目
整条链路跑通后,你的项目代码只需要认 OpenAI 格式。以 Python 为例:
from openai import OpenAI client = OpenAI( base_url="http://localhost:3000/v1", api_key="sk-你的OneApi令牌" ) resp = client.chat.completions.create( model="gpt-4o", messages=[{"role": "user", "content": "你好"}] ) print(resp.choices[0].message.content)想换模型只改model字段,不用动请求逻辑。如果你要长期跑编码类任务或 Agent,建议把调用凭证和额度规划放到 Coding Plan 里统一管理,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ;需要查看和生成 Key 的话在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ;想先在网页里直接试模型效果,可以用 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入过程中遇到报错,对照接入文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 排查会更快。
一个实用小技巧:把docker-compose.yml和data目录一起放进你的 dotfiles 仓库,换机器时 clone 下来docker compose up -d,几分钟就能恢复整套本地网关,比重新配一遍渠道省事得多。