我给自己写了一个 mini OpenRouter:基于蓝耘 MaaS 的多模型路由网关实战
我给自己写了一个 mini OpenRouter基于蓝耘 MaaS 的多模型路由网关实战一、为什么需要自己的网关前几篇我把蓝耘 MaaS 的 API 已经摸熟了——45 个模型、OpenAI 兼容协议、统一 Key 调用。但真要在生产环境用起来会很快撞上几个工程问题该用哪个模型蓝耘有 25 个对话模型qwen3.6-flash 便宜但能力一般glm-5.3 强但贵。让每个业务开发自己挑结果肯定是全部用最贵的。模型挂了怎么办虽然蓝耘 SLA 不错但任何单一模型都有限流、抖动、临时不可用的可能。直接调裸 API一旦失败业务就 500。成本到底花在哪月底账单总消耗 100 万 token但哪个业务线、哪个模型、哪个用户花的算不清。业界的标准答案是AI Gateway——OpenRouter、Portkey、One-API 这类产品干的就是这事。但它们要么走 SaaS 订阅多一层 vendor lock-in、要么需要自己部署 K8s小团队玩不起。我的方案蓝耘本身已经是统一上游我只需要在它前面再加一层薄薄的智能路由 容错 计费。用 Python 标准库写了 200 行跑通全部功能。二、架构设计整个网关只有 4 个核心模块全部跑在调用方进程内无独立部署模块职责实现Router按规则选模型一组 lambda 规则从上到下匹配Failover失败自动切换每个模型配一条备胎链RateLimiter控制并发asyncio.Semaphore(5)MeteringToken 级成本核算按模型定价表精确到分对外只暴露一个方法gw.call(prompt)业务方完全不用关心下面是哪个模型在干活。三、核心代码精华版完整代码 200 行这里只贴最关键的三段模型注册表 路由规则“配置即代码”MODEL_REGISTRY{qwen3.6-flash:{price_in:0.001,price_out:0.005,tier:cheap},deepseek-v4-flash:{price_in:0.001,price_out:0.002,tier:mid},glm-5.3:{price_in:0.005,price_out:0.020,tier:premium},}ROUTING_RULES[(lambdap:len(p)100,glm-5.3),# 长 prompt(lambdap:代码inpordebuginp.lower(),deepseek-v4-flash),# 代码类(lambdap:len(p)50,qwen3.6-flash),# 短问答]FALLBACK_CHAIN{qwen3.6-flash:[deepseek-v4-flash,glm-5.3],deepseek-v4-flash:[qwen3.6-flash,glm-5.3],glm-5.3:[deepseek-v4-flash,qwen3.6-flash],}带容错的主调用入口asyncdefcall(self,prompt:str,request_id:str)-CallRecord:primaryself.route(prompt)models_to_try[primary]FALLBACK_CHAIN.get(primary,[])foridx,modelinenumerate(models_to_try):recordawaitself._try_call(model,prompt,request_id,fallback_frommodels_to_try[idx-1]ifidx0elseNone)ifrecord.ok:ifidx0:self.stats.failovers1returnrecordreturnrecord# 全部失败并发安全的 HTTP 调用asyncio urllibasyncdef_try_call(self,model,prompt,rid,fallback_fromNone):asyncwithself.sem:# 信号量限流最多 5 并发t0time.time()loopasyncio.get_event_loop()dawaitloop.run_in_executor(None,self._http_post,body)# urllib 是同步的扔进 executor 不阻塞事件循环...注意几个工程细节run_in_executor把同步的 urllib 包装成异步避免引入 httpx/aiohttp 依赖asyncio.Semaphore控制并发上限防止打爆上游每次调用记录CallRecorddataclass便于后续审计/计费四、实测场景场景 1路由策略——三种 prompt 各走各的模型我设计了三种典型业务 prompt让网关自动选择模型实测结果Prompt字符数路由到耗时成本“你好”2qwen3.6-flash9.59s¥0.001600“帮我 debug…”20deepseek-v4-flash8.88s¥0.000696撰写 5000 字报告…×3177glm-5.312.95s¥0.010571最便宜的 qwen3.6-flash 一次只要 0.16 分钱最贵的 glm-5.3 一次 1 分钱——价格差 6.6 倍。如果业务不区分场景全用 glm-5.3一天 1 万次调用就是 ¥105而合理路由后只要 ¥30 左右省 70%。场景 2故障转移——主模型挂了自动切备胎最考验网关能力的场景。我故意调一个不存在的模型not-exist-model-xyz看输出✗ 第 1 次尝试 [not-exist-model-xyz] HTTP 404 ✓ 第 2 次尝试 [qwen3.6-flash] 成功 6.74s ¥0.001771第一次 404 立刻返回不到 100ms 就触发了备胎切换业务方收到的是成功响应完全无感知网关记录了这次 failoverfailovers: 1后续可以告警这种容错对生产环境至关重要——故障转移不是模型挂了更常见的是限流、超时、单条请求触发了上游 bug。蓝耘返回的错误码很规范HTTP 404、HTTP 402、HTTP 429等让容错逻辑可以写得非常干净。场景 3并发压测——10 个并发打满光看单次延迟没意义得看并发承载。发了 10 个并发请求用信号量限制最多 5 个同时在飞实测数据指标数值成功率10/10100%总耗时25.19s平均延迟12.10sP5012.32sP9514.87s最大延迟14.87sQPS0.40总成本¥0.043793几个观察零失败——蓝耘在 5 并发下完全稳定P95 - P50 只差 2.5 秒——延迟分布很平没有长尾QPS 0.4 不算高——这是推理型大模型的常态对比 GPT-4 同级10 次调用成本不到 5 分钱——便宜到可以忽略如果要更高 QPS可以开大Semaphore或者在网关上做请求队列 批量提交。场景 4综合业务模拟 成本分析最后模拟一天的真实流量覆盖 8 种业务场景客服、代码助手、内容创作、闲聊、Review、文档总结、快速问答、故障演示终端报表一目了然总调用: 8 总成本: ¥0.069227 故障转移: 1 次 模型 调用数 平均延迟 累计成本 -------------------------------------------------------------------------- qwen3.6-flash 5 10.92s ¥0.055959 deepseek-v4-flash 2 8.64s ¥0.001311 glm-5.3 1 13.17s ¥0.011957成本占比可视化qwen3.6-flash 80.8% ██████████████████████████ glm-5.3 17.3% █████ deepseek-v4-flash 1.9%这就是 Metering 模块的价值——一眼看出 80% 的成本花在 qwen3.6-flash 上因为它被调用最多glm-5.3 虽然贵但只被路由了一次所以总成本可控。如果想再优化下一步可以给每个业务线打 tag按业务线统计成本做预算熔断——某个业务当天超 ¥10 自动降级到便宜模型把 records 落库到 SQLite/PG用 Grafana 画实时大盘五、关键工程经验这次实测下来对蓝耘 MaaS 的平台能力有几个直接判断优点OpenAI 协议兼容度极高——我的网关代码可以无缝切到 OpenAI/DeepSeek 官方只需要换 base_url key模型间切换无差异——qwen/deepseek/glm 三个模型用同一份代码调message 结构、usage 字段完全一致错误码规范——404模型不存在、402余额不足、429限流让容错逻辑能精确编程Token 计量精准——每个响应都带usage.prompt_tokens/completion_tokens分账零误差45 个模型统一入口——意味着我的 FALLBACK_CHAIN 可以写得很激进反正备胎有的是踩过的坑不同模型延迟差异大qwen3.6-flash 平均 10sdeepseek-v4-flash 8sglm-5.3 13s——路由策略也得考虑延迟不能只看价格max_tokens不能给太小推理型模型 reasoning 也占 quota给 200 会返回空 content上一篇踩过stream failover 组合复杂流式响应一旦开始输出就没法切备胎了所以生产环境建议先 streamfalse 失败再 failoverstreamtrue 不重试Token 单位是元/千 token 不是 “元/百万”算成本时千万别搞错数量级六、这套网关的价值把这次实验放到生产语境下算笔账假设一个中型 AI 应用日调用量50,000 次如果全用最贵的 glm-5.350,000 × ¥0.012 ¥600/天 ¥18,000/月用 mini-gateway 智能路由80% 走便宜的 qwen 15% 走 deepseek 5% 走 glm40,000 × ¥0.0016 7,500 × ¥0.0007 2,500 × ¥0.012 ¥64 ¥5.25 ¥30 ¥99/天 ¥2,970/月每月省 ¥15,000省 83%而这套网关代码只有 200 行跑在业务进程内零额外基础设施成本。总结回到最初的问题中小团队如何低成本用上多模型我的答案是分两步选一个统一 MaaS 上游——蓝耘这种一个 Key 调 45 个模型的平台刚好填补这个空白省掉逐一对接 DeepSeek/通义/Kimi 的工程成本在前面加一层薄网关——用 200 行 Python 解决路由、容错、计费这三个工程问题比引入 OpenRouter/One-API 这种重型方案轻得多大模型时代的工程竞争力不在于你调了哪个模型而在于你能不能用最低的边际成本把模型的能力稳定地交付给业务。这次用蓝耘 MaaS 200 行 Python 搭出来的 mini-gateway是我目前看到的最小可行方案。

相关新闻

understand2.0:基于AST与调用图的代码理解工具实践指南

understand2.0:基于AST与调用图的代码理解工具实践指南

简介:Understand 2.0是一款面向开发者与维护人员的专业代码分析与理解工具,尤其适合在大型项目、遗留代码梳理和跨语言工程中使用。它支持C、C、Java、C#、Python等主流编程语言,通过深度解析类、函数、变量之间的依赖关系与调用层次&#xf…

2026/10/9 15:45:32 阅读更多 →
多商户多仓库SaaS进销存源码:数据隔离与库存并发实践

多商户多仓库SaaS进销存源码:数据隔离与库存并发实践

简介:这是一套面向企业信息化与进销存SaaS开发场景的多商户ERP管理系统源码包。系统支持总公司—子公司—门店三级组织架构,各企业数据完全隔离,同门店多仓库共享基础数据但单据隔离,不同门店的仓库也支持调拨,总公司与…

2026/10/9 15:45:32 阅读更多 →
联众电子病历表结构文档:EMR数据字典与二次开发实战指南

联众电子病历表结构文档:EMR数据字典与二次开发实战指南

简介:《联众电子病历表结构文档》面向ZJHIS、EMR3、EMR及EMRJK等系统的开发、运维与数据管理人员,系统梳理电子病历核心数据表的字段定义与设计逻辑,帮助读者理解并高效管理临床与运营数据。文档由占贵顺、葛向东多次修订完善,内容…

2026/10/9 15:45:32 阅读更多 →

最新新闻

基于卷积神经网络的海洋垃圾识别分类:从数据清洗到模型部署全流程

基于卷积神经网络的海洋垃圾识别分类:从数据清洗到模型部署全流程

简介:这是一套面向计算机相关专业学生的毕业设计资源,主题为基于卷积神经网络的海洋垃圾识别分类,适合正在准备毕设、课程设计或期末大作业的学习者,也可作为深度学习项目实战练习的参考。资源包共101个文件,约74.62MB…

2026/10/9 17:27:35 阅读更多 →
爆款复刻提示词怎么写?2026年爆款视频复刻,5款工具怎么选

爆款复刻提示词怎么写?2026年爆款视频复刻,5款工具怎么选

做短视频矩阵或技术型自媒体时,看到对标账号起量却来不及拆解,是常见痛点。爆款复刻提示词怎么写?本质是用结构化自然语言指令,将原视频的钩子、节奏与信息层转化为可执行的生成参数。鲸剪(WhaleClip)是一款…

2026/10/9 17:27:35 阅读更多 →
Claude Code 速查手册:命令、快捷键与高效工作流实战

Claude Code 速查手册:命令、快捷键与高效工作流实战

1. 为什么我要整理这份 Claude Code 速查手册 用 Claude Code 有一段时间了,从最初把它当成一个"能跑命令的聊天窗口",到后来真正把它嵌进日常开发流里,中间踩的坑不算少。最典型的一个场景是:明明知道有个命令能解决当…

2026/10/9 17:27:35 阅读更多 →
pc-lint plus 1.2 试用实战:C/C++ 静态分析工具集成与避坑指南

pc-lint plus 1.2 试用实战:C/C++ 静态分析工具集成与避坑指南

简介:pc-lint plus 1.2 是 Gimpel Software 于 2019 年 4 月发布的 C/C 静态代码分析工具版本,面向嵌入式开发、系统底层编程及对代码质量要求较高的工程师,用于在编译前发现潜在缺陷、类型不匹配、未定义行为与可移植性问题。压缩包为 zip 格…

2026/10/9 17:27:34 阅读更多 →
OpenWorkMate:用开源架构打造能干活的企业AI工作伙伴

OpenWorkMate:用开源架构打造能干活的企业AI工作伙伴

1. 从“只会聊天”到“真能干活”:企业AI工作伙伴的破局思路公司里那套AI工具,说实话,前两年就是个高级玩具。你问它“帮我写个周报”,它能洋洋洒洒给你整出八百字废话;你问它“上季度的客户投诉主要集中在哪些环节”&…

2026/10/9 17:27:34 阅读更多 →
AI编程IDE卡成PPT?低配电脑用TaoToken把Base URL改到统一通道的实测

AI编程IDE卡成PPT?低配电脑用TaoToken把Base URL改到统一通道的实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 17:26:33 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →