前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9258
  • DeepSeek V4与GPT-5.6实测对比:价格差异可达96倍
  • AI Agent 越界行动:英国安全研究院报告
  • Lovable应用移植React Native的组件对照表
  • 2026年用10美元预算开发AI SaaS原型完整指南
  • 2026 年 GPU 选型指南:H100 与 A100 成本效益对比
  • AI Agent 测试方法论:从单元测试到混沌工程
  • AI Skill跑通一次不算测试
  • 用Milvus+Ollama自建私有RAG实战
  • 上下文窗口不是记忆:AI Agent 记忆机制的深层误解
  • 上下文窗口不是记忆:AI Agent 记忆机制的深层误解
  • 智谱 GLM-5.3 发布:编程能力最强开源模型,Terminal-Bench 得分暴涨 5 倍
  • LLM 可解释性实战:用 Sparse Autoencoder 破解 Transformer 黑盒
  • Gemini 3.7 Flash发布,Google AI开发重回焦点
  • AI编程时代:系统设计比写代码更重要
  • 智谱GLM 5.3正式发布,推理能力与效率进一步提升
  • 十七行Python检查LLM网关是否抽成
  • LLM选型矩阵:按功能挑最便宜可靠模型
  • Figma MCP 做 UI 代码:截图只能验证布局,数值必须从节点读取
  • 苹果在中国训练本地AI模型,集成阿里千问
  • Obsidian Skills:让 AI 编程助手读懂你的笔记库
  • 一行Python代码构建OpenAI兼容网关,支持多模型代理
  • AI 生成数据库迁移的正确姿势:先在临时库重放验证
  • holaOS:一个空间运行任意 Agent,共享记忆
  • AI 代码补丁三验 Loop:合同、执行、回归
  • 用 AI 给 CI 失败先分类再读日志
  • AI 时代面试已失效:会做题≠会工程
  • DeepSeek V4-Pro 对 token 上限参数置若罔闻
  • Unsloth Desktop:本地一键跑大模型和训练,集成Claude Code/Codex/MCP
  • AI 在自动化工作流中的四种核心角色
  • ChatGPT工作原理深度解析
  • 通过单一Chatbot API接入三个降级模型:JSON Schema校验与回退策略
  • LLM 工单分类实战:用 JSON Schema 控制输出+重试+成本计量
  • Node.js 应用添加 OpenAI 兼容模型降级方案
  • 成功 AI 产品中反复出现的 3 种 Agent 模式
  • GitHub Copilot 8月10日更新:便携插件与Agent工作流
  • 未提供的上下文会被模型自行补全——这是安全漏洞的根源
  • 从零构建推理小模型:SupraLabs 推理语料流式微调实战
  • 金额不能用浮点数:AI演示里那个隐藏的经典Bug
  • Google 发布 Gemini 3.7 Flash:编程能力提升33%,$0.75/1M tokens
  • 何时该用LangGraph而非简单Tool-Calling
  • AI 生成代码:看起来对≠真的对
  • AI Agent 实战:七个生产环境失败模式及修复方案
  • Cerebras + OpenAI 实现 750 tokens/s 推理
  • 架构文档约束失效,AI 编程代理的隐性风险
  • AI编程工具成团队依赖瓶颈:Copilot用尽后的协作困境
  • OpenAI 收购 Astral:Python 基础设施可能被重构
  • AI 蠕虫已真实存在:多伦多大学 self-replicating 攻击研究解析
  • DeepSeek V4:稀疏注意力实现低成本百万 token
  • 别把巨型 OpenAPI spec 一股脑塞给 AI Agent
  • Biome:56 倍速替代 ESLint+Prettier 的 Rust 工具链
  • 为何每个AI Agent不应重复学习你的数据模型
  • 已加载 51 / 9258
8.0
热点
AI SCORE
编程提效2026-08-14 12:37

一行Python代码构建OpenAI兼容网关,支持多模型代理

dev.to · AI#Python#AI#API网关
Editor brief · 编辑速览

单文件FastAPI网关通过UPSTREAMS字典配置代理deepseek/qwen/glm等模型,代码可直接复用。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

核心:一套端,多个上游

整个系统就是一个 FastAPI 应用,所有请求都打到同一个路径:

@app.post("/v1/chat/completions")
async def chat_completions(request: Request):
    caller = verify_key(request)
    body = await request.json()
    model = body["model"]

    # Resolve the model string to an upstream provider
    cfg = resolve_upstream(model)   # {"base_url": ..., "api_key": ..., "model": ...}

    # Forward the request, swapping in the real upstream model name
    body["model"] = cfg["model"]
    resp = await client.post(
        f"{cfg['base_url']}/chat/completions",
        headers={"Authorization": f"Bearer {cfg['api_key']}"},
        json=body,
    )
    return resp.json()

UPSTREAMS 字典是整个系统的核心:

UPSTREAMS = {
    "deepseek-chat":  {"base_url": "https://api.deepseek.com/v1", "api_key": os.getenv("DEEPSEEK_API_KEY"), "model": "deepseek-chat"},
    "qwen-max":       {"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1", "api_key": os.getenv("QWEN_API_KEY"), "model": "qwen-max"},
    "glm-4-plus":     {"base_url": "https://open.bigmodel.cn/api/paas/v4", "api_key": os.getenv("ZHIPU_API_KEY"), "model": "glm-4-plus"},
    "kimi-k3":        {"base_url": "https://api.moonshot.cn/v1", "api_key": os.getenv("MOONSHOT_API_KEY"), "model": "kimi-k3"},
    # ... 11 more
}

新增一个模型只需要在配置里加一项,不需要改代码。Kimi K3 上线时,接入它只用了 20 分钟——字典里三行,显示名映射里一行,供应商映射里一行,外加一个 models.json 条目。

核心周围的各个层

一个只会转发请求的网关没什么稀奇的。真正复杂的是周围的各个层:

认证 —— API Key 用 SHA-256 哈希。每次日志里的 caller_id 都是 sha256(api_key)[:8],所以 Key 本身永远不会出现在日志文件里。

限速 —— 每个 Key 一个滑动窗口,存在内存里。默认 60 RPM。

配额 —— 这是最棘手的。免费用户每月 50 万 token。检查和扣减必须是原子操作,否则并发请求会钻空子。我吃过这个亏——19 个用户在限额检查移入 _USERS_LOCK 临界区之前就冲破了 50 万。

流式响应 —— SSE 直通。Token 随生随发。first_token_ms 这个指标告诉你上游模型实际开始响应的速度,这比总延迟对用户体验的影响更大。

缓存 —— 只用一个响应头。X-Cache-TTL: 3600。一小时内相同的 prompt 走缓存返回。零 token,零上游费用。1200ms 变成 200ms。

可观测性 —— 一个内存环缓冲(200 条)加一个 JSONL 文件(5000 条)用于持久化。每条请求日志都记录 request_id、caller、model、latency、tokens、status。

环缓冲在启动时从磁盘加载 200 条记录,管理后台从内存读取。有一段时间管理后台显示零日志,因为过滤器把 type="response" 类型的条目(最常见的类型)排除了,导致什么都没有可显示。

修复方法是加一个兜底:优先用详细日志,没有详细日志就用基本日志。环缓冲里有 200 条记录时绝不返回零结果。听起来很简单,其实一开始并不是这样。

这个网关教给我的事

转发逻辑只有 50 行。生产级别的功能——认证、配额、限速、流式响应、缓存、可观测性、错误处理——有 5000 行。"在我机器上能跑"和"给付费用户用"之间的差距,永远比你以为的更大,而且这个差距永远出现在外层,而不是核心。

想试试吗?网关已经在线运行:

→ aibridge-api.com/playground.html(15 个模型,无需注册) → aibridge-api.com/prompts.html(24 个提示词,无需注册)

免费额度:每月 50 万 token。无需信用卡。

1

2

3

4

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
Obsidian Skills:让 AI 编程助手读懂你的笔记库
下一篇
AI 生成数据库迁移的正确姿势:先在临时库重放验证