很多团队做 AI 产品,第一阶段都很顺利:

  • 调通一个模型;
  • 写几个 API;
  • 跑出一个 demo。

但到了第二阶段,问题会集中爆发:

  • 客户要稳定,单一上游不稳定;
  • 成本要可控,调用量上来后账就乱了;
  • 用户要分层,个人、团队、管理员权限都不一样;
  • 运营要可视,出了问题要知道是谁、哪个 key、哪个渠道、哪个模型;
  • 商业要闭环,充值、订阅、额度、结算要打通。

这时你会发现,真正难的不是“会调模型”,而是“把模型能力做成一个能长期运营的系统”。

我这几天把 new-api 关键代码路径完整过了一遍,结论是:它的价值不在于“支持 40+ 上游”这句话本身,而在于它把 AI 网关最难的工程问题做成了一整套闭环。

这篇文章我不做功能清单,而是按“工程决策”的视角,讲我为什么推荐它。


先说结论:new-api 适合什么团队?

如果你符合下面两条以上,我建议认真评估 new-api:

  1. 你不是做一次性 demo,而是要长期运营 AI 服务;
  2. 你已经或即将接入多个模型提供商;
  3. 你需要用户体系、令牌体系、额度体系;
  4. 你需要计费可解释、可审计、可对账;
  5. 你希望业务团队只写业务,不反复改模型适配代码。

一句话:new-api 更像“AI 能力运营底座”,不是“API 转发脚本”。


一、我如何理解它的架构:分层清晰,但核心复杂度集中在中继闭环

从目录结构看,它是标准分层:

  • 路由层:router/
  • 控制器层:controller/
  • 服务层:service/
  • 模型层:model/
  • 中继适配层:relay/

这个结构不新鲜,但 new-api 做对的一点是:把复杂度集中在中继闭环中,而不是让复杂度溢出到业务端。

关键入口我看的是这几处:

  • 启动与后台任务:main.go
  • 管理 API:router/api-router.go
  • Relay API:router/relay-router.go
  • 分发中间件:middleware/distributor.go
  • 中继主流程:controller/relay.go
  • 通道重试:service/channel_select.go
  • 计费会话:service/billing_session.go

main.go 里能看到它不是“起个 HTTP 服务就完了”,还挂载了多种后台任务:

  • 自动测试渠道;
  • 渠道上游模型更新检测;
  • 订阅额度重置任务;
  • 凭证刷新任务(例如某些 OAuth 型渠道);
  • 可选性能观测、缓存同步等。

这说明它天然按“在线系统”而不是“代码示例”来设计。


二、它最关键的价值:把多模型调用从“请求转发”提升为“策略执行”

很多人理解网关,会停在“把请求发出去,再把响应拿回来”。

但在 new-api 里,请求进入系统后会经历一条治理链路(以 /v1/chat/completions 为例):

  1. 认证:TokenAuth 或用户态认证;
  2. 模型级限流:ModelRequestRateLimit
  3. 分发:Distribute 解析 model/group 并选通道;
  4. 中继:Relay 做请求校验、估算、预扣费、上游调用;
  5. 异常处理:失败重试、降级切换、可选惩罚;
  6. 结算:按真实 usage 做 delta 结算或退款。

对应代码路径:

  • 路由:router/relay-router.go
  • 分发:middleware/distributor.go
  • 执行:controller/relay.go

这条链路的核心思想是:

  • 调用成功率不是靠运气,是靠策略。
  • 成本正确性不是靠离线修账,是靠在线预扣+结算。

这就是我说它“可运营”的根本原因。


三、通道选择机制是实战导向,不是玩具随机

我专门看了 service/channel_select.go + middleware/distributor.go,它的路由策略值得单独说。

1)优先级 + 权重随机

不是全局随机,而是:

  • 先按优先级层选候选集;
  • 同优先级内按权重做随机。

这样可以实现“主渠道优先,备渠道兜底”,并且避免单点雪崩。

2)重试不是简单重复,而是“有状态降级”

中继失败后,它会结合重试次数切换优先级层,必要时换组。

这和“retry N 次同一个上游”完全是两个层级的稳定性设计。

3)auto 分组与跨组重试

TokenGroup == auto 时,会遍历可用组:

  • 当前组优先级耗尽后切到下一组;
  • 切组时重置优先级计数;
  • 上下文里记录当前 autoGroupIndex。

这是面对“渠道池异构+波动”时非常实用的策略。

4)通道亲和性

Distribute 还做了会话级亲和性:

  • 如果近期某模型在某组有稳定成功通道,优先复用;
  • 请求成功后记录亲和性;
  • 失败或通道不可用再回退到随机选择。

这对降低抖动、提高用户体感一致性很有效。


四、真正让我愿意推荐的点:计费系统是“系统工程”,不是“字段加减”

AI 网关最容易被低估的部分是计费。很多项目最后都死在“账对不上”。

new-api 在这块做得非常完整。

1)预扣费与退款逻辑是先验正确的

service/pre_consume_quota.go

  • 请求前先检查用户额度;
  • 按预估成本预扣(钱包/令牌);
  • 调用失败时返还;
  • 支持 trustQuota 旁路(额度足够时减少小额高频扣费开销)。

这不是“业务功能”,而是“财务一致性机制”。

2)BillingSession 把账务生命周期统一了

service/billing_session.go,它把一次请求的资金行为封装成会话:

  • PreConsume:预扣;
  • Reserve:流式过程中补扣;
  • Settle:按实际消耗做 delta 结算;
  • Refund:失败回滚,幂等安全。

这套机制的意义是:把“应该扣多少”变成可计算、可回滚、可追踪的状态机。

3)表达式计费:把复杂定价从代码里抽离出来

pkg/billingexpr/expr.md 这份文档非常关键,设计理念我很认同:

  • 一个表达式即计费真相(One expression, one truth);
  • 变量体系覆盖 prompt/completion/cache/image/audio;
  • 支持 tier(阶梯定价)、header/param 条件;
  • 通过 AST introspection 自动处理 p/c 子项排除,避免重复计费。

这意味着运营侧可以迭代定价策略,而不是每次都发版改代码。

这对商业化产品非常重要。


五、认证与权限模型不花哨,但很务实

router/api-router.go + middleware/auth.go 看,它做了清晰权限分层:

  • UserAuth:普通用户操作;
  • AdminAuth:运营管理能力;
  • RootAuth:高风险系统配置。

同时,用户登录面也比较完整:

  • 注册/登录/重置密码;
  • 2FA;
  • Passkey/WebAuthn;
  • OAuth(含自定义 provider)。

这意味着你可以把它直接作为“面向最终用户”的平台后端,而不是只能给内部工程师用。


六、管理员视角:new-api 不是“能配渠道”,而是“能做运营”

我看完管理路由后的直接感受是:它的设计是按运营岗位需求来的。

管理员典型工作流可以这样跑:

  1. 新增渠道,配置模型映射与分组;
  2. 批量测试渠道可用性,更新余额;
  3. 检测上游模型变化并应用同步;
  4. 观察日志与消耗分布,做权重/优先级调优;
  5. 配置充值、订阅、额度分配;
  6. 处理异常用户与风险 key。

这在 API 路由里都有对应接口,而不是停留在文档口号。


七、用户视角:从注册到调用的路径是闭环的

普通用户路径在代码里也很清楚:

  1. 注册/登录;
  2. 创建或获取 API token;
  3. 充值或订阅拿额度;
  4. 按 OpenAI 兼容 API 调用模型;
  5. 在日志/面板查看消耗与结果。

对产品团队来说,这条链路完整意味着你可以更快验证“从流量到收入”的闭环。


八、我认为它在工程上做得好的 5 个决策

决策 1:中间件前置治理

限流、鉴权、分发不挤在业务 handler 里,降低心智负担。

决策 2:适配器模式隔离上游差异

relay/channel/* 各 provider 适配器独立,新增渠道不破坏主流程。

决策 3:重试与路由策略解耦

RetryParam + 通道选择服务让降级逻辑可维护。

决策 4:账务会话化

BillingSession 把扣费问题从“散落函数”变成“有状态对象”。

决策 5:文档与代码一致性较高

docs/architecture.mddocs/api-reference.mdpkg/billingexpr/expr.md 对理解源码非常有帮助。


九、上线时你要注意的现实问题(我给的实践建议)

推荐归推荐,落地时还是要规避几个坑。

1)先别一上来就全渠道

建议先 2~3 个主渠道跑稳定,再逐步扩池。否则排障复杂度会指数上升。

2)先把“观测”建好

至少要能按 用户/令牌/模型/渠道/状态码 维度查日志。

3)计费表达式先做“简单可解释版”

第一版先做基础费率 + 1~2 个阶梯,不要一次上太复杂规则。

4)重试策略要和业务 SLA 对齐

高实时业务不一定适合太多重试层,宁可快速失败再重发。

5)权限边界要明确

RootAuth 能改系统关键配置,生产环境必须收口操作权限。


十、适用与不适用边界

适用

  • 多模型聚合平台;
  • ToB AI 中台;
  • 有明确商业化目标(计费、订阅、充值);
  • 需要长期可运营能力。

可能不适用

  • 只做个人脚本,单模型、低调用量;
  • 不需要账号体系和额度管理;
  • 对运维治理完全无要求。

如果你只是写个个人代理,new-api 可能“过重”; 如果你要做产品平台,它反而“刚好”。


结语:我为什么愿意推荐它

我推荐 new-api,不是因为它“功能多”,而是因为它在最难的地方做了正确工程化:

  • 把多模型接入做成了策略路由;
  • 把计费做成了可结算、可回滚、可扩展的系统;
  • 把用户/管理员场景都放进同一个产品闭环。

对准备认真做 AI 产品的团队来说, 从“能调用模型”到“能运营业务”,中间那段最难的路,new-api 基本帮你铺好了。

如果你现在正处在“demo 之后、平台之前”的阶段,这个项目值得你深挖并投入。