模型 / 数据集
ENTERPILOT/GoModel avatar
ENTERPILOT/GoModel

GoModel:用 Go 写一个自托管的 LLM 网关,值不值得换掉 LiteLLM

AI gateway / AI control plane / AI proxy written in Go. Unified OpenAI-compatible and Anthropic-compatible API for OpenAI, Anthropic, Gemini, Groq, xAI, Ollama, vLLM and more. A LiteLLM alternative with observability, guardrails, streaming, cost tracking, intelligent routing, sticky sessions, failover, real-time logs and usage tracking. Prod ready.

1,157 个 Star101 个 ForkGoMIT

秒懂

它是什么?
GoModel 把 OpenAI、Anthropic、Gemini、Ollama 等上游统一到 /v1 与 /v1/messages 两个入口,附带成本统计、缓存、预算与故障转移。本文只看仓库与文档能确认的部分,重点讲配置解析顺序、SDK 兼容边界,以及它目前还不适合谁。
适合谁用?
GoModel 适合已经同时使用多家模型、需要把密钥和成本收拢到一处、并且愿意自己维护一个 Go 服务的团队;如果你的调用量很小、只用一家供应商、或者不希望引入 Redis、PostgreSQL 这类外部依赖,直接调用官方 SDK 更省事。决定采用之前,先确认三件事:你的 SDK 是否只依赖 base URL 改写(OpenAI SDK 指向 http://localhost:8080/v1,Anthropic SDK 指向 http://localhost:8080);你需要的上游是否在 Providers Overview 的逐项功能矩阵里被标注为支持;以及缓存、预算这类功能在你的部署形态下依赖哪些组件。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库在最近一天内有新的提交。
用什么语言写的?
主要是 Go(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

GoModel 要解决的是密钥散落与账单不可见

一个团队开始同时用 OpenAI 和 Anthropic,通常是从两套 SDK、两个环境变量、两份账单开始的。等到再加一个 Groq 做低延迟兜底、加一个 Ollama 跑本地模型,代码里就会出现按供应商分支的调用逻辑,密钥散落在各个服务的环境变量里,月底没人说得清哪个功能花了多少钱。GoModel 针对的就是这个位置:它把自己放在应用和上游之间,对外暴露统一的 HTTP 接口,对内持有各家密钥。README 里列出的上游包括 OpenAI、Anthropic、xAI、Google Gemini、Cohere、Vertex AI、DeepSeek、Groq、Fireworks AI、Meta、OpenRouter、Z.ai、阿里云百炼、MiniMax、Azure OpenAI、Oracle、Ollama、SGLang、vLLM、Amazon Bedrock、ElevenLabs,以及所有 OpenAI 兼容的供应商。目标读者是自托管倾向明显的工程团队:他们不排斥跑一个 Docker 容器,但希望网关本身足够轻,且能自己看到日志和用量。README 用“saves you money and nerves”概括动机,落到功能上就是缓存、成本追踪、预算、限流这几项,它们都要求网关处在请求路径上,这也是它存在的理由。

两个入口:/v1 与 /v1/messages 的分工

GoModel 接受两种格式的请求。OpenAI 兼容格式在 /v1,Anthropic 兼容格式在 /v1/messages。README 明确说明官方 SDK 无需改动即可使用,只需改 base URL:OpenAI SDK 配成 http://localhost:8080/v1,Anthropic SDK 配成 http://localhost:8080,因为该 SDK 会自己追加 /v1/messages。这个设计的好处是迁移成本低,应用侧几乎不用动代码。代价是兼容层必须持续跟住两家的接口演进,任何一方改动请求或响应结构,网关都要跟着改,而 README 没有说明这种跟进的时间承诺。README 给出的调用示例走的是 /v1/responses,请求体里只有 model 和 input 两个字段,model 用的是 gpt-5-chat-latest。这里能看出它同时覆盖了 chat 与 responses 一类的端点,但仓库材料没有列出完整的端点清单,具体支持哪些路径需要查 API Endpoints 文档。

配置解析顺序决定了你该把密钥放在哪里

GoModel 的配置按固定优先级合并,README 写得很清楚:内置默认值 → config.yaml → .env → 已导出的环境变量,右边的覆盖左边的。这个顺序有一个实际后果:环境变量优先级最高,因此在容器编排里注入的环境变量会盖掉镜像内或挂载的配置文件。如果你用 config.yaml 管理大部分设置、只在 CI 里临时改一两个值,这个顺序是顺手的;反过来,如果你把密钥写进 config.yaml 又同时在部署里导出了同名环境变量,排查问题时容易看错来源。README 提到可以用 .env、config.yaml,或者在 dashboard 里直接管理最重要的几项设置,但没说 dashboard 的修改落在哪一层、是否会被环境变量覆盖。这一点在把 dashboard 当作日常运维界面之前值得先确认。完整的环境变量列表在 .env.template,完整的设置项在 Configuration reference 文档里。

从安装到第一次请求的四步

macOS 和 Linux 上,README 给的方式是 curl -fsSL https://gomodel.enterpilot.io/install.sh | sh 安装,然后直接运行 gomodel;Windows 用 PowerShell 的 irm https://gomodel.enterpilot.io/install.ps1 | iex。Docker 方式是一条命令:docker run --rm -p 8080:8080 -e OPENAI_API_KEY="your-openai-key" enterpilot/gomodel。容器起来后,dashboard 在 http://localhost:8080/admin/dashboard。第一次请求可以用 README 里的 curl,向 http://localhost:8080/v1/responses 发一个 JSON,body 里指定 model 和 input。如果需要 Redis、PostgreSQL、MongoDB、Adminer 这些基础设施,README 给了 docker compose up -d 或 make infra,只起基础设施不起应用;要连 GoModel 和 Prometheus 一起起,用 docker compose --profile app up -d 或 make image,注意后者会构建应用镜像。OPENAI_API_KEY 在示例里标注为可选,也就是说没有密钥也能把服务跑起来,只是上游调用会失败,这一点对先验证部署链路是有用的。

缓存、预算、粘性会话各自改变了什么

README 的功能列表里,缓存分为精确缓存和语义缓存,描述是重复的 prompt 不再产生费用。语义缓存意味着判定标准不是字符串相等,而是语义接近,这会引入命中边界的判断问题:什么算接近、由谁决定,README 没有说明,需要看 Cache 文档。成本追踪提供逐请求的费用估算、用量分析和支出拆分,这些数据出现在 dashboard 上。预算按用户、团队或密钥设置硬性支出上限,限流则覆盖请求数、token 数和并发数,可以按用户路径、供应商或模型配置。虚拟模型提供别名以及轮询或基于成本的负载均衡,让上游切换对调用方透明。会话保持会识别客户端会话并把它固定到一个目标和供应商密钥上,README 给出的理由是让供应商侧的 prompt 缓存保持热度,同时让审计日志读起来像一条条对话线程。Usage API 允许客户端用自己已有的推理密钥查询用量、剩余预算和限流余量,不需要额外发一套凭证。故障转移会在上游失败时自动改道到备用供应商,并配合重试与熔断器。这些机制都依赖网关持有请求上下文,因此也意味着网关本身成为关键路径。

它可能不适合你的几种情况

第一,只用一家供应商且调用量不大的项目。网关带来的收益主要来自多上游统一、成本可见和故障转移,单供应商场景下这些收益很薄,却要多维护一个进程。第二,不愿引入外部依赖的部署。README 的 Docker Compose 部分把 Redis、PostgreSQL、MongoDB 列为基础设施,虽然没说明哪些功能强依赖它们,但缓存、预算、用量统计这类需要持久状态的功能,很难想象在没有存储的情况下完整工作,具体依赖关系需要查文档。第三,对延迟极度敏感且无法接受多一跳的场景:请求路径上多一个代理,就多一次网络往返和一次序列化,README 声称在资源效率上有优势并提供了可自行复现的基准,但这些数字来自项目自己的基准页面,本文没有独立验证。第四,需要长期稳定接口契约的团队。当前版本号是 v0.1.90,最近三个版本集中在 2026 年 9 月的几天内发布,迭代节奏较快,接入前应确认升级是否会引入破坏性变更。

与 LiteLLM 的差别在于实现语言和部署形态

README 直接把 LiteLLM 和 Portkey 列为对照对象,并说明选择理由是 LiteLLM 近期发生过安全事件、Portkey 在 GitHub 上已不再维护。这些是项目方的表述,本文无法独立核实,读者应自行确认。从技术路线看,两者的定位接近,都是把多家模型收敛到统一接口,差别主要在实现与运维形态:GoModel 用 Go 编写,交付物是一个可执行文件或一个容器,README 用“最快、最省资源”来描述它,并指向自托管的基准页面;LiteLLM 是 Python 生态,通常以 Python 包或服务形式部署,接入方式与扩展方式都围绕 Python 展开。如果你的团队已经在 Python 里做 LLM 相关工具链,LiteLLM 的扩展路径更顺;如果你希望网关是一个编译产物、不想在运行时维护 Python 环境,GoModel 的形态更直接。这个选择更多取决于运维习惯,而不是功能清单的长短。

许可证与升级成本

GoModel 使用 MIT 许可证,仓库信息里没有附加条款。MIT 允许修改和再分发,商用没有额外限制,但具体到你的合规要求仍需自行判断,本文不构成法律意见。升级成本方面,能从仓库材料确认的是:版本号处于 0.1.x 阶段,2026 年 9 月 6 日到 9 月 8 日之间连续发布了 v0.1.88、v0.1.89、v0.1.90 三个版本,发布密度较高。这意味着跟进上游接口变化的速度可能较快,同时也意味着接口和行为在 1.0 之前存在调整空间。配置层面,由于解析顺序是默认值 → config.yaml → .env → 环境变量,升级时如果新增了配置项,旧配置文件不会自动获得新默认值以外的行为,需要对照 Configuration reference 检查。真正需要提前确认的是数据存储的兼容性:如果缓存和用量数据落在 Redis 或 PostgreSQL 里,版本升级是否涉及 schema 变更,README 没有提及。

编辑结论

GoModel 适合已经同时使用多家模型、需要把密钥和成本收拢到一处、并且愿意自己维护一个 Go 服务的团队;如果你的调用量很小、只用一家供应商、或者不希望引入 Redis、PostgreSQL 这类外部依赖,直接调用官方 SDK 更省事。决定采用之前,先确认三件事:你的 SDK 是否只依赖 base URL 改写(OpenAI SDK 指向 http://localhost:8080/v1,Anthropic SDK 指向 http://localhost:8080);你需要的上游是否在 Providers Overview 的逐项功能矩阵里被标注为支持;以及缓存、预算这类功能在你的部署形态下依赖哪些组件。README 里没有给出各上游的功能差异细节,也没有说明缓存与语义缓存的命中判定方式,这两点必须去文档站点核对后再决定是否上线。

官方来源

  1. ENTERPILOT/GoModel on GitHub
  2. License: MIT
  3. Project website
  4. README
  5. Releases
社区笔记

社区笔记