核心问题: 按 prompt 路由、打分器挂了就硬失败,是否值得你多运维一个 Go 服务加一个 Postgres?请用你自己的路由决策数据来回答。
RepoDaily 采用评分
RepoDaily 将该项目的采用分评为 91/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。
包含 6 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。
检测到 5 个工作流步骤、5 个下一步动作,以及 3 个命令/安装信号。
趋势热度为 +284 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。
采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。
3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。
文章中包含许可证来源或许可证表述。
文章正文和元数据中检测到 8 个 AI/Agent 相关信号。
项目概览
workweave/router 是一个用 Go 写的模型路由服务,夹在编码 agent 与模型供应商之间,为每条 prompt 选模型。本周期拿下 284 颗星、趋势榜第 13 名。项目自述的承诺很具体:每条 prompt 50ms 内完成路由,只改一个端点就能省 40-70% 成本。topics 直接写着 claude-code、codex、anthropic、openai-compatible、ai-gateway——它瞄准的就是 agentic 编码工具的账单:琐碎子任务也在烧旗舰模型的 token。
源码里最显眼的是架构纪律,同类新项目里少见。CONTRIBUTING.md 定义了三层同心圆,import 只能向内流动。内环(internal/auth、internal/proxy、internal/router、internal/providers、internal/translate)是纯领域逻辑,除 Service 方法外不做 I/O;internal/router 与 internal/providers 只有接口、禁止互相 import。适配层——internal/postgres、internal/router/cluster,以及 anthropic、openai、google、openaicompat 的 provider 包——只依赖内环、彼此不依赖。HTTP 适配在 internal/api/* 与 internal/server*,cmd/router/main.go 是唯一允许构造具体适配器的文件。跨层引用直接 block review;维护者明确拒绝 DI 容器、反射式装配和 service locator。
路由引擎本身被文档描述为进行中的工程。HMM_GO_SELECTION.md 给出目标架构、flag 阶梯和回滚方案,把 HMM 名册所有权和确定性 arm 选择迁入 Go。go.mod 也支持「打分在进程内」的判断:直接依赖 knights-analytics/hugot 与 dmitryikh/leaves——分别对应 ONNX 与梯度提升树推理的 Go 库——再加 golang-lru 缓存、tink-go 密钥加密,以及一整套 OpenTelemetry(otelgin、OTLP trace/metric exporter)。状态存在 Postgres,走 pgx/v5,查询由 SQLC 从 db/queries/ 生成。
动手前先读 LICENSE。这是 Elastic License 2.0,版权 2025 Workweave, Inc.:内部使用和修改没问题,但不得作为托管或管理服务提供给第三方,也不得触碰 license key 功能。所以它是 source-available,不是 OSI 意义上的开源——对多数内部采用者无碍,对产品本身是路由服务的公司则直接出局。
为什么现在变热
- 本周期 284 星、排名第 13,topics 直指 agentic 编码:claude-code、codex、anthropic
- 接入卖点是零客户端改造:任何 OpenAI 或 Anthropic 兼容 SDK 只需换一个 base URL
- 自述 <50ms 路由、40-70% 成本下降,直击 agentic 工具最大开销项(厂商自述,请用 analytics 导出自行验证)
- 策略上 fail-closed:cluster scorer 跑不动时返回 HTTP 503,绝不静默降级;重新引入 fail-open 的 PR 会被拒
- 文档先行:SEMANTICS.md 定义 session、round、turn、action、step 的规范术语,并要求先读它
解决什么问题
- agentic 编码工具把读文件、格式化、样板 diff 这类琐碎子任务也发给名册上最贵的模型
- 每家供应商一套请求格式,同时用 Anthropic、OpenAI、Google 与 OpenAI 兼容端点就要维护多套集成;TRANSLATION_COMPATIBILITY.md 正是为跨格式翻译与上线模式而设
- 成本归因不透明:没有行级路由决策,就无法回答哪些请求发到了哪个模型、为什么
- 先便宜模型的降级会静默失败——质量下滑时没人知道哪条请求被降级;维护者说旧启发式正是因此被退役
工作原理
- 客户端(Claude Code、Codex 或任何 OpenAI/Anthropic 兼容 SDK)把请求发给 router 端点而不是供应商
- router 为 prompt 打分并交给 cluster scorer 选择模型 arm;HMM_GO_SELECTION.md 描述了在 flag 阶梯之后把名册所有权和确定性选择迁入 Go
- 请求在 internal/translate 翻译成目标供应商格式,经 anthropic、openai、google 或 openaicompat 适配器转发
- 每条路由决策写入 Postgres(pgx/v5,SQLC 从 db/queries/ 生成查询),可经 /v1/analytics/* 用只读 key 和游标分页导出
- scorer 不可用时请求以 HTTP 503 失败——永远不会静默回退到默认模型
架构解读:三层同心圆,一个组装点
CONTRIBUTING.md 里的分层规则是整个仓库最具体的东西。内环——internal/auth、internal/proxy、internal/router、internal/providers、internal/translate——是纯领域逻辑,除 Service 方法外不做 I/O。internal/router 与 internal/providers 只有接口且禁止互相 import,选择策略因此与供应商细节解耦。
适配层(internal/postgres、internal/router/cluster、internal/providers/{anthropic,openai,google,openaicompat})只能依赖内环、彼此禁止依赖。internal/api/* 与 internal/server* 把 HTTP 适配成 Service 调用,禁止 import internal/postgres 或具体 provider 包。cmd/router/main.go 是唯一构造具体适配器的文件——组装就是普通函数调用,没有 DI 容器、没有反射、没有 service locator。跨层违规直接 block review。
命令面:真正重要的 make 目标
- make full-setup——克隆后一键启动整套栈
- make check——重新生成代码 + 构建 + 测试;这是 CI 必须检查项,配合 make generate 之后的 git diff --quiet 抓未提交的生成代码
- make generate——从 db/queries/ 重新生成 internal/sqlc/ 下的 SQLC 代码;手改生成文件会被直接还原
- make build / make test——全模块类型检查 / 跑全部测试
- 热重载循环:make db(只起 Postgres,端口 5433)、make setup(初始化 schema + 迁移 + 种入一个 rk_ key)、make dev(CompileDaemon 热重载跑服务)
上手路径:从 clone 到第一条被路由的请求
- 前置条件:Go 1.25+(go.mod 锁定 go 1.25.0、toolchain go1.25.9)、golang-migrate、CompileDaemon
- 运行 make db,在 5433 端口只起 Postgres
- 向 .env.local 追加 DATABASE_URL=postgresql://router:router@localhost:5433/router?sslmode=disable
- 运行 make setup——初始化 schema、跑迁移、种入 rk_ key
- 运行 make dev,把一个 Claude Code 或 Codex 项目用种入的 key 指到该端点,正常干一天活
- 用只读 key 从 /v1/analytics/* 拉出当天决策,按模型拆分开销,与未路由的对照项目比较
维护风险:需要盯住的点
- Elastic License 2.0 禁止把软件作为托管或管理服务提供,也禁止绕过 license key 功能——如果你的产品本身就是 AI 网关,直接出局
- 每个 commit 都要 DCO 签名(git commit -s 追加 Signed-off-by 尾注);缺签名的 PR 会被要求补
- HMM 选择逻辑迁入 Go 走的是 flag 阶梯并附带回滚方案——这是进行中的迁移,升级前固定版本并读 HMM_GO_SELECTION.md
- fail-closed 的 503 行为靠 review 执行的程度不亚于靠代码(重引 fail-open 会被拒 PR),重试和 scorer 健康检查要在你这边准备好
- provider 与模型名必须用 providers.ProviderAnthropic 这类常量——魔法字符串会被拒,这也约束了你 fork 之后的配置化空间
谁适合关注
适合关注
- 在多个仓库统一使用 Claude Code 或 Codex、想按 prompt 选模型又不想改客户端的团队
- 需要路由审计数据的平台组:/v1/analytics/* 提供行级粒度、游标分页、只读 key 的原始决策导出
- 本来就在运维 Go 和 Postgres 的团队——pgx/v5、golang-migrate、OTel exporter 都属于标准内部工具箱
- 明确偏好 fail-closed 的场景:503 可观测,静默降级不可观测
可以先跳过
- 想把路由包装成托管服务对外销售的公司——许可证明文禁止
- 没有 Go 或 Postgres 运维能力的团队;源包未记录单二进制或内嵌数据库模式
- 合规上只允许 OSI 认证开源许可证的团队——Elastic License 2.0 不在其中
- 固定一个便宜模型就够用的负载——prompt 难度不变化时,多一跳网络和一套状态存储只是损耗
风险与注意事项
内部自托管完全在许可证允许范围内,但托管服务禁令、Postgres 与 Go 1.25 的运维面,以及仍在迁入 Go 的路由引擎,都会带来实际采用阻力。
- Elastic License 2.0:不得作为托管服务提供、不得绕过 license key 功能、不得移除许可方声明
- 运行前提:Go 1.25+、golang-migrate、CompileDaemon,以及一个 Postgres 实例(开发默认端口 5433)
- HMM 名册所有权与确定性 arm 选择正随 flag 阶梯迁入 Go——上线过程中接口可能变动
- fail-closed 设计在 cluster scorer 不可用时返回 HTTP 503;调用方需要重试逻辑和 scorer 健康监控
- CONFIGURATION.md 把 BYOK 加密与密钥对认证列为一等配置项,go.mod 中的 tink-crypto/tink-go/v2 提供底层支持
- /v1/analytics/* 导出支持专用只读 key,报表消费方不需要可写凭据
- 自定义路由策略按 POLICY_ROUTER_HARNESS.md 的 sidecar 契约在进程外运行,把组织规则与代理路径隔离
- provider 与模型标识必须用常量(如 providers.ProviderAnthropic),降低字符串拼写导致的误路由
- 许可证禁止移除或遮挡受 license key 保护的功能——自托管时的任何改造计划都要绕开这一条
替代方案比较
| 方案 | 适用场景 | 代价 |
|---|---|---|
LiteLLM | 需要 Python 生态网关、广泛的供应商适配器与简单回退规则 | MIT 许可,自托管免费 |
Portkey AI Gateway | 需要轻量网关,侧重负载均衡、防护与边缘部署 | MIT 许可,自托管免费 |
RouteLLM | 要的是便宜-强模型路由框架,而非完整网关服务 | 开源,自托管免费 |
OpenRouter | 不想运维任何基础设施、接受按 token 的路由加价 | 商业服务,按用量计费 |
这个趋势说明了什么
把 analytics 导出做成成本归因
/v1/analytics/* 已经输出带游标分页、行级粒度和字段参考的原始路由决策,但文档索引里没有覆盖其上的看板或按团队 chargeback;SEMANTICS.md 又给出 session/round/turn/action/step 的规范分组词汇。
读 ANALYTICS_EXPORT.md,用只读 key 拉一天数据,验证按 session 的成本拆分能否回答财务侧现在答不出的问题。
先写一个 policy sidecar
POLICY_ROUTER_HARNESS.md 定义了进程外策略 sidecar 的契约,这是给组织加定制规则(例如给受监管项目锁定单一模型)而不用 fork 代理层的正路。
写一个强制某个打标项目用单一模型的 sidecar,对着 make dev 跑通,确认契约在你的延迟预算内成立。
补齐 provider 矩阵
internal/providers 下已有 anthropic、openai、google、openaicompat 四个适配器,CONTRIBUTING.md 指向 AGENTS.md 的新增供应商配方;任何没有 OpenAI 兼容端点的供应商都是候选贡献。
挑一个你已在付费的供应商,按 AGENTS.md 配方加适配器,并验证「适配器互不 import」的分层规则在 review 中站得住。
RepoDaily 判断
一个纪律罕见的 Go 路由器——fail-closed、严格分层、自带行级 analytics 导出——对已经在跑 Postgres 的 agentic 编码团队值得一试;Elastic License 2.0 的托管禁令与进行中的 HMM 迁 Go,则划清了谁该采用、谁不该。