爱意满满的作品展示区。
aaronrzh

开源一个我们自己用的大模型 API 网关,支持 OpenAI、Anthropic、DeepSeek 等

  •  
  •   aaronrzh ·
    AaronRZH · 6 days ago · 1430 views

    最近在做 AI 应用时,需要同时接入几家不同的大模型 API ( OpenAI 、Anthropic 、DeepSeek 等)。过程中遇到一些比较琐碎的重复工作,比如客户端要维护多套调用格式、不同 provider 的 key 管理比较分散、还有用量统计对账不太方便。

    为了解决这些内部的小麻烦,我们写了一个轻量的中间层,后来觉得可能对同样场景的团队有点帮助,就把它开源了 —— LLM Gateway (项目地址: https://github.com/AaronRZH/llm-gateway )。

    它的定位很简单:放在客户端和各模型 provider 之间,把常见的“对接杂活”集中处理掉,而不是替代任何已有方案。

    它主要帮我们做了几件事:

    统一输出格式:客户端只用一种习惯的格式(比如 OpenAI 风格),网关再按上游要求做转换,省去每个服务单独适配的功夫。

    灵活的路由选择:支持按优先级、轮询、延迟优先或成本优先等方式分配请求,也支持把模型分为几个级别,在服务不可用时尝试备用模型,让调用更稳定一些。

    用量统计更清晰:我们会记录每次调用的 token 消耗,存到数据库里,方便事后对账或分析成本分布。

    一些基础的保护机制:比如简单的熔断和限流,避免因为某个上游抖动影响到整体体验。

    一个简单的管理界面:方便运维同事动态调整 provider 配置和 key ,不用每次都重启服务。

    技术实现上用了 Go + Gin ,依赖 PostgreSQL 和 Redis (但是不完全依赖,可以降级到文件,内存),整体比较轻量,单机部署就能满足我们中等规模的业务。

    目前我们对接了 OpenAI 、Anthropic 、DeepSeek 、商汤、小米、GLM 、NVIDIA 等几家,但架构上新增 provider 也比较方便。

    这个项目完全是按我们自己的实际需求来做的,不一定适合所有场景,但如果你也在做类似的多模型接入,或许能省一点时间。我们也在持续完善中,欢迎感兴趣的朋友看看,有任何建议或问题都欢迎提 issue 交流。

    14 replies    2026-07-11 16:07:58 +08:00
    YAFEIML
        1
    YAFEIML  
       6 days ago
    star 支持
    k00baa
        2
    k00baa  
       6 days ago
    Token 消耗计算准吗?
    dummyx
        3
    dummyx  
       6 days ago
    我们也做了一个,不过网关是直接基于 agentgateway/envoy ,计费限额这部分用 rust 实现 ext_authz filter+oltp 入库就够了。一开始图快用 go 做了个 ext_proc 的实现最近在往 rust 这边重构。
    aaronrzh
        4
    aaronrzh  
    OP
       6 days ago
    @k00baa 问到点上了,自己测试过,会有点偏差
    aaronrzh
        5
    aaronrzh  
    OP
       6 days ago
    @dummyx 很厉害啊,统计 token 这个比较麻烦
    otakustay
        6
    otakustay  
       6 days ago
    这种中间层最害怕的是有一些转换不稳定,导致客户端控制的很好的缓存,过了中间层差了一两个字符,最后全没了
    aaronrzh
        7
    aaronrzh  
    OP
       6 days ago
    @otakustay 这个我在 deepseek 上测试过,缓存命中还是挺高的
    k00baa
        8
    k00baa  
       6 days ago
    @aaronrzh 只兼容一种模型缓存吗?
    aaronrzh
        9
    aaronrzh  
    OP
       6 days ago
    @k00baa 不是啊,其他的没测,不过感觉只做转发,不会影响缓存的
    aaronrzh
        10
    aaronrzh  
    OP
       5 days ago
    @k00baa 查了一下文档,终于发现统计不准确的地方,可能是因为 openAI 协议的流式响应默认不返回 usage,所以统计不准确,已经修复,可以更新测试一下
    SimonXxxxxxx
        11
    SimonXxxxxxx  
       5 days ago
    能不能指定主代理和子代理的模型呀,我现在是 opencode 去进行开发,用 omo 的时候一般会指定子代理模型为一些免费的模型,经常换也麻烦,也确实无法详细的自己子代理的 token 消耗
    aaronrzh
        12
    aaronrzh  
    OP
       4 days ago
    opencode 我还没用过,不过感觉可以用 tire 分级,你把免费模型设置到其中一个分级下,然后在 opencode 选中 tire 跟免费模型一致的,网关会使用同 tire 分级下的所有模型,你还可以指定选择策略,策略是在同一个分级下生效的
    aaronrzh
        13
    aaronrzh  
    OP
       4 days ago
    @SimonXxxxxxx opencode 我还没用过,不过感觉可以用 tire 分级,你把免费模型设置到其中一个分级下,然后在 opencode 选中 tire 跟免费模型一致的,网关会使用同 tire 分级下的所有模型,你还可以指定选择策略,策略是在同一个分级下生效的
    daimaosix
        14
    daimaosix  
       4 days ago via Android
    放点 web 截图啊大哥
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3226 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 11:22 · PVG 19:22 · LAX 04:22 · JFK 07:22
    ♥ Do have faith in what you're doing.