OneAPI 1.2.0 接口计费系统开源版:把 settings 改到 TaoToken 的本地部署与计费验证
1. 本地跑 OneAPI 1.2.0 接口计费系统先把 settings 里的上游通道想清楚OneAPI 1.2.0 接口计费系统开源版简单说就是一套能自己部署在本地或服务器上的接口管理后台。它能做什么把 OpenAI、Claude、Gemini 这些不同厂商的 Key 统一收进一个面板对外只暴露一个地址和一套令牌同时记录每次调用消耗了多少额度、扣了多少钱。适合谁手里握着好几家模型 Key、又需要给团队或客户分配用量、还想看到计费明细的开发者。我这次的目标很明确把 OneAPI 1.2.0 跑起来渠道和令牌建好然后把上游 endpoint 指向 TaoToken 的统一通道最后用一次真实请求去核对计费日志和余额扣减是不是对得上。整个过程不需要你懂太多底层网络知识跟着配置走就行。先说清楚一个概念避免后面绕晕。OneAPI 里有两个方向一个是「渠道」代表上游真正的模型提供方你要填 Base URL 和 Key另一个是「令牌」代表你发给调用方的凭证调用方拿这个令牌来访问你的 OneAPI。计费发生在令牌这一层每次请求经过 OneAPI它会根据模型倍率和分组倍率算出消耗写进日志并从令牌余额里扣。所以「把 settings 改到 TaoToken」这件事本质是改渠道里的上游地址让 OneAPI 把请求转发到 TaoToken 的统一通道而不是直连各家厂商。这样做的好处是你只需要维护一个上游 Key模型切换、用量统计、余额扣减都在 OneAPI 这一层完成管理成本低很多。TaoToken 在这里扮演的就是那个统一上游。它的 API 地址是 https://taotoken.net/api官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 。你可以在它的控制台里创建 Key然后把这个 Key 填进 OneAPI 的渠道配置。下面我会按「部署 → 建渠道 → 建令牌 → 发请求 → 对账 → 排错」的顺序走一遍。每一步都给可复制的配置和命令你照着改参数就能用。重点会放在 settings 配置片段和计费验证上因为这两块最容易出问题。2. 部署 OneAPI 1.2.0 与 TaoToken 前置准备源码、依赖和 Key 怎么拿2.1 源码获取与目录结构OneAPI 1.2.0 的源码你可以从常见的开源托管渠道拿到解压后核心目录大概是这样one-api/ ├── main.go ├── go.mod ├── web/ │ └── build/ # 前端打包产物 ├── storage/ │ └── install/ │ └── install.lock # 安装锁重装时要删 └── .env.example注意 excerpt 里提到的那句「安装请删除 storage/install/install.lock」这是重装或者初始化失败时的关键动作。如果你之前装过一次、数据库里已经有表结构再次进入安装页会被这个锁挡住删掉它才能重新走安装流程。2.2 运行环境准备OneAPI 是 Go 写的最省事的跑法是 Docker其次是自己编译。我两种都试过Docker 更适合快速验证计费链路。Docker 方式docker run -d --name one-api \ -p 3000:3000 \ -e TZAsia/Shanghai \ -v /home/oneapi/data:/data \ justsong/one-api:latest跑起来后访问http://你的IP:3000默认账号是root密码123456第一次登录会强制你改密码。源码编译方式git clone 你的源码地址 one-api cd one-api go mod download go build -o one-api ./one-api --port 3000 --log-dir ./logs如果你用的是 1.2.0 这个版本编译前确认go.mod里的 Go 版本要求一般 1.20 以上没问题。2.3 TaoToken 侧的准备在 TaoToken 控制台里创建一个 API Key这个 Key 就是待会儿要填进 OneAPI 渠道的「密钥」。创建入口在控制台的 API Keys 页面https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。创建时注意两点一是记下 Key 的完整字符串它通常只显示一次二是确认这个 Key 所属的分组因为 OneAPI 里的分组倍率要和它对得上否则计费对账会有偏差。TaoToken 的接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了 Base URL 的写法和支持的模型列表。OneAPI 渠道里填的 Base URL 就是https://taotoken.net/api注意结尾不要多加/v1OneAPI 会自己拼接路径。2.4 数据库选择OneAPI 支持 SQLite、MySQL、PostgreSQL。本地验证计费SQLite 最省事不用额外起数据库容器。生产环境建议 MySQL因为并发写入日志时 SQLite 会有锁竞争。SQLite 的配置在启动参数或环境变量里指定比如SQL_DSNoneapi.dbMySQL 则是SQL_DSNroot:密码tcp(127.0.0.1:3306)/oneapi数据库选好之后安装向导会自动建表。如果卡在安装页先检查storage/install/install.lock是否存在存在就删掉再刷新。3. 可复制配置settings 片段、渠道与令牌创建全流程3.1 核心 settings 配置片段OneAPI 的配置有两种来源环境变量和数据库里的系统设置。计费相关的关键项我整理成下面这个 JSON 片段你可以对照着在「系统设置」里改或者写进.env{ ServerAddress: http://127.0.0.1:3000, SQLDSN: oneapi.db, LogDir: ./logs, DebugEnabled: true, MemoryCacheEnabled: true, RateLimitEnabled: true, GlobalApiRateLimitNum: 120, GlobalApiRateLimitDuration: 60, RetryTimes: 2, ChannelDisableThreshold: 5, QuotaForNewUser: 500000, QuotaForInviter: 0, PreConsumedQuota: 500, DisplayTokenStatEnabled: true }几个参数值得单独说PreConsumedQuota是预扣额度。OneAPI 在请求真正完成前会先扣一笔等拿到上游返回的实际用量后再多退少补。这个值设太小会导致高倍率模型请求被拒设太大会让余额看起来掉得很快。500 是个比较稳的起点。ChannelDisableThreshold是渠道连续失败多少次后自动禁用。验证阶段可以设大一点避免一次网络抖动就把渠道关了排查时反而看不到真实报错。RetryTimes是失败重试次数。如果你只配了一个渠道重试意义不大配了多个渠道时重试会自动切到下一个。3.2 渠道配置把上游指向 TaoToken登录 OneAPI 后台进「渠道」页面点「添加新的渠道」。关键字段这样填字段填写内容类型OpenAI名称taotoken-channel分组default模型gpt-4o,gpt-4o-mini,claude-3-5-sonnet-20241022密钥你在 TaoToken 创建的 API KeyBase URLhttps://taotoken.net/api模型重定向留空这里有个容易踩的坑Base URL 填成https://taotoken.net/api/v1会导致路径重复请求变成/api/v1/v1/chat/completions直接 404。OneAPI 的 OpenAI 类型渠道会自动补/v1所以只填到/api就行。模型列表要和你实际要调用的模型对上。TaoToken 支持的模型 ID 以文档为准填错模型名会在请求时报「模型不存在」或者「无可用渠道」。填完点提交渠道状态应该是「已启用」。如果显示「已禁用」把鼠标移到状态上能看到原因常见的是 Key 无效或者 Base URL 不通。3.3 令牌创建与计费绑定进「令牌」页面点「添加新的令牌」。字段说明名称随便起比如test-billing。额度可以设成无限也可以设一个固定值方便观察扣减比如 100000。分组选 default要和渠道的分组一致。过期时间按需。创建完成后令牌列表里会显示一个sk-开头的字符串这就是你调用时要用的凭证。注意它和 TaoToken 的 Key 不是一回事TaoToken 的 Key 在渠道里OneAPI 的令牌在调用方手里。计费链路是这样的调用方拿 OneAPI 令牌请求 → OneAPI 根据令牌分组和模型倍率算出预扣额度 → 转发到 TaoToken → 拿到响应后按实际用量结算 → 写日志、扣余额。3.4 模型倍率与分组倍率计费金额 用量 × 模型倍率 × 分组倍率。模型倍率在「模型倍率」页面配分组倍率在「分组倍率」页面配。验证阶段建议先把所有倍率设成 1这样日志里的数字最直观方便你核对。如果你想让计费更贴近真实成本可以按 TaoToken 的定价来设倍率。但第一次验证时倍率全设 1 能帮你快速确认「请求有没有被记录、余额有没有被扣」这两个基本事实。4. 验证请求与成功结果一次真实调用核对计费日志与余额扣减4.1 发起请求用 curl 发一次 chat completions 请求。把sk-你的OneAPI令牌替换成上一步创建的令牌curl -X POST http://127.0.0.1:3000/v1/chat/completions \ -H Authorization: Bearer sk-你的OneAPI令牌 \ -H Content-Type: application/json \ -d { model: gpt-4o-mini, messages: [ {role: user, content: 用一句话说明什么是接口计费} ], max_tokens: 100 }如果一切正常你会拿到类似这样的返回{ id: chatcmpl-xxx, object: chat.completion, created: 1730000000, model: gpt-4o-mini, choices: [ { index: 0, message: { role: assistant, content: 接口计费是指按每次 API 调用的实际用量来结算费用。 }, finish_reason: stop } ], usage: { prompt_tokens: 18, completion_tokens: 22, total_tokens: 40 } }重点看usage字段这是上游返回的真实用量OneAPI 会拿它来结算。4.2 核对日志回到 OneAPI 后台进「日志」页面。你应该能看到刚才那条请求字段包括时间、令牌名称、模型、提示 tokens、补全 tokens、额度消耗、耗时、渠道。额度消耗的计算逻辑是(prompt_tokens completion_tokens) × 模型倍率 × 分组倍率再叠加预扣的调整。倍率全为 1 时40 个 token 对应的消耗应该是一个和 40 成比例的数字。如果日志里没有这条记录先检查「日志」页面的筛选条件是不是把时间范围限死了。再看渠道状态如果渠道被自动禁用请求会走失败分支日志里会有错误信息。4.3 核对余额扣减进「令牌」页面看test-billing这个令牌的已用额度。它应该等于日志里那条记录的消耗值。如果你设了固定额度剩余额度 初始额度 - 已用额度。再进「用户」页面看 root 用户的余额。OneAPI 的额度体系里用户余额和令牌额度是两层令牌额度是上限用户余额是实际可用的总量。两者都会因为这次请求而减少。4.4 用模型对话页面做交叉验证除了 curl你也可以在 TaoToken 的模型对话页面直接测一下同一个模型确认上游通道本身是通的https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。如果那边能正常返回而 OneAPI 这边报错问题就出在 OneAPI 的渠道配置上而不是上游。这一步能帮你快速定位问题边界省得在两边来回猜。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照5.1 401 Unauthorized报错长这样{ error: { message: invalid api key, type: invalid_request_error } }两种可能一是 OneAPI 令牌填错了检查Authorization: Bearer sk-xxx里的字符串有没有多余空格二是渠道里的 TaoToken Key 失效了去 TaoToken 控制台确认 Key 状态。如果日志里显示「渠道 401」那就是上游 Key 的问题如果请求根本没进日志那就是 OneAPI 令牌的问题。5.2 local proxy failed这个报错通常出现在 OneAPI 无法连接到上游时local proxy failed: dial tcp: lookup taotoken.net: no such host先确认服务器能解析taotoken.net用nslookup taotoken.net或ping taotoken.net测一下。如果是容器环境检查容器的 DNS 配置。还有一种情况是 Base URL 写错了比如多写了路径或者协议头写成了http。5.3 reading choices 相关报错panic: runtime error: index out of range [0] with length 0或者日志里出现reading choices字样一般是上游返回的结构和 OneAPI 预期的不一致。常见原因是模型名填错上游返回了一个错误对象而不是正常的 completion 结构OneAPI 去取choices[0]就崩了。解决办法先在 TaoToken 的模型对话页面确认这个模型 ID 是有效的再把渠道里的模型列表改成完全一致的 ID。5.4 OAuth 相关报错如果你在渠道里选了需要 OAuth 的类型可能会遇到oauth token exchange failed: invalid_grantOneAPI 1.2.0 里部分渠道支持 OAuth 授权但如果你用的是 TaoToken 这种统一通道类型选 OpenAI 加 Base URL 就够了不需要走 OAuth。遇到这个报错直接把渠道类型改成 OpenAI用 Key 认证。5.5 计费对不上的排查顺序如果请求成功但日志里的消耗和你手算的不一致按这个顺序查先看模型倍率是不是 1再看分组倍率是不是 1然后看预扣额度有没有正确退回。OneAPI 的日志详情里会显示预扣和实际结算两个数字如果预扣远大于实际说明PreConsumedQuota设太大了调小即可。还有一种情况是流式请求。流式返回时 OneAPI 可能拿不到完整的 usage会按估算值计费。验证阶段建议先用非流式请求确认链路通了再测流式。5.6 渠道自动禁用如果渠道状态变成「已禁用」进渠道编辑页看「自动禁用原因」。常见的是连续超时。把ChannelDisableThreshold调大或者手动点「启用」恢复。排查阶段建议先关掉自动禁用避免它干扰你观察真实报错。6. 把 OneAPI 计费链路用起来从验证到日常管理的几个实用动作验证通过之后这套东西就可以进入日常使用了。几个我实际用下来觉得有用的动作第一给不同调用方建不同令牌。比如给前端项目一个令牌、给脚本任务一个令牌这样日志里能直接看出是哪个业务在消耗额度。令牌名称起得清楚一点比事后翻日志猜要省事。第二定期导出日志做对账。OneAPI 的日志页面支持按时间筛选你可以每周导一次和 TaoToken 控制台的用量对一下。两边数字接近就说明计费链路是健康的。第三模型倍率按实际成本设。验证阶段全设 1 是为了好看懂长期用还是要按 TaoToken 的定价来配否则余额扣减和真实成本会对不上。第四渠道可以配多个做冗余。如果你有多个 TaoToken Key可以建多个渠道OneAPI 会在失败时自动切换。RetryTimes设成 2 或 3配合ChannelDisableThreshold能扛住偶发的上游抖动。第五长期跑编码任务或者 Agent 场景的话可以考虑用 Coding Plan 来管理额度https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。它和 OneAPI 的令牌体系可以配合使用一个管上游额度一个管下游分配。如果你在配置过程中遇到渠道报错或者计费对不上先去接入文档里核对 Base URL 和模型 ID 的写法https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。大部分问题都是路径多写了一段或者模型名大小写不一致导致的。最后提醒一句storage/install/install.lock这个文件在重装时一定要删我见过好几次卡在安装页就是因为忘了删它。删掉之后刷新页面安装向导会重新走一遍建表流程。