标题:Node.js 搭建多模型 API 网关:统一接口、路由分发与 Token 统计实战
摘要
在开发 AI 应用时,往往需要同时接入多家厂商的大模型,不同模型的入参格式、返回结构、错误码都不统一,对接成本很高。本文分享一套轻量 API 网关实现方案,完成多模型统一封装、自动路由、token 消耗统计与异常重试,降低多模型接入开发工作量。
正文:
一、背景
开发 AI 应用过程中,经常需要切换不同大模型来做效果对比。
不同模型服务商 API 规范差异很大:
- 请求体参数结构不一样
- 返回流(stream)解析方式不同
- 报错 code、报错信息格式不统一
如果每新增一个模型,都单独写一套对接代码,后期维护成本会持续升高。
因此搭建一层统一 API 网关,把下游各种模型接口做封装,前端业务侧只需要对接一套标准接口,按需路由到不同模型。
二、核心能力设计
这套网关主要实现 4 个核心功能:
- 统一入参封装:对外提供一套标准请求体,网关内部自动转换成对应模型所需参数
- 模型路由策略:根据请求参数指定模型,支持负载均衡、故障自动切换
- Token 用量统计:统计输入、输出 token 消耗,方便做用量计费与用量监控
- 异常捕获与重试:下游接口超时、报错时自动重试,返回标准化错误信息
三、简化核心代码示例
// 统一请求入口
async function chatCompletion(req, res) {
const { model, messages, temperature, stream = false } = req.body;
// 1. 根据模型名称路由到对应服务商
const targetProvider = getModelProvider(model);
try {
// 2. 参数转换,适配对应模型接口
const adaptParams = adaptRequestParams(targetProvider, {
messages,
temperature,
stream
});
// 3. 请求下游模型
const result = await targetProvider.request(adaptParams);
// 4. token消耗统计
const tokenUsage = calcToken(messages, result.content);
// 5. 返回统一格式结果
return res.json({
code: 200,
data: result.content,
usage: tokenUsage
})
} catch (err) {
// 标准化错误返回
return res.json({
code: err.code || 500,
msg: err.message
})
}
}
四、踩坑总结
- 流式返回处理:SSE 流式输出,不同模型分片规则不一样,需要单独做分片解析,容易出现乱码。
- Token 计算误差:不同模型的分词器不一样,前端预估算 token 和服务商实际扣费 token 会存在少量偏差。
- 限流处理:下游模型接口都有 QPS 限制,网关层需要增加限流排队,防止短时间并发触发服务商限流。
- 超时控制:大模型长文本推理耗时波动大,需要设置合理超时时间,避免请求长时间挂起。
五、总结
多模型 API 网关可以很好屏蔽底层各个大模型接口差异,业务开发不用反复适配新模型。新增模型只需要在网关新增适配层即可,扩展性强。
适合 AI 应用开发者、个人开发者做本地测试、业务原型开发。