RepoDaily · 2026-08-30 · Infrastructure / Runtime

workweave/router:宁可返回 503 也不猜模型的 Go 路由器

#13 Infrastructure / Runtime Go +284 workweave/router 打开仓库

Workweave 的 router 自述 50ms 内为每条 prompt 选好模型,只改端点即可接入;兼容 OpenAI 与 Anthropic 协议,配 Postgres 决策日志,但许可证是 Elastic License 2.0,用前必读。

项目类型Infrastructure / Runtime
最适合已在使用 Claude Code、Codex 等 agentic 编码工具、想按 prompt 自动选模型又不想改客户端的工程团队。
风险等级中等——Elastic License 2.0 禁止对外提供托管服务;自托管需要 Go 1.25+ 和 Postgres
评估时间半天:make db、make setup、make dev,再把一个客户端指过来并读 analytics 导出

核心问题: 按 prompt 路由、打分器挂了就硬失败,是否值得你多运维一个 Go 服务加一个 Postgres?请用你自己的路由决策数据来回答。

91/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 91/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 6 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

100可安装/可试用性

检测到 5 个工作流步骤、5 个下一步动作,以及 3 个命令/安装信号。

61维护可信度

趋势热度为 +284 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

93生产准备度

采纳风险标记为 medium,并包含 5 条安全说明与 4 条跳过条件。

100差异化

3 个机会视角、4 个替代方案,以及 4 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

90Agent / AI 适配度

文章正文和元数据中检测到 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 意义上的开源——对多数内部采用者无碍,对产品本身是路由服务的公司则直接出局。

解决什么问题

  • agentic 编码工具把读文件、格式化、样板 diff 这类琐碎子任务也发给名册上最贵的模型
  • 每家供应商一套请求格式,同时用 Anthropic、OpenAI、Google 与 OpenAI 兼容端点就要维护多套集成;TRANSLATION_COMPATIBILITY.md 正是为跨格式翻译与上线模式而设
  • 成本归因不透明:没有行级路由决策,就无法回答哪些请求发到了哪个模型、为什么
  • 先便宜模型的降级会静默失败——质量下滑时没人知道哪条请求被降级;维护者说旧启发式正是因此被退役

工作原理

  1. 客户端(Claude Code、Codex 或任何 OpenAI/Anthropic 兼容 SDK)把请求发给 router 端点而不是供应商
  2. router 为 prompt 打分并交给 cluster scorer 选择模型 arm;HMM_GO_SELECTION.md 描述了在 flag 阶梯之后把名册所有权和确定性选择迁入 Go
  3. 请求在 internal/translate 翻译成目标供应商格式,经 anthropic、openai、google 或 openaicompat 适配器转发
  4. 每条路由决策写入 Postgres(pgx/v5,SQLC 从 db/queries/ 生成查询),可经 /v1/analytics/* 用只读 key 和游标分页导出
  5. 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 中站得住。

下一步建议

让一个项目路由一天,然后读决策日志

可信的测试是并排对照:对照项目保持原端点,另一个项目走 router,判断依据用 router 自己的 analytics 导出,而不是 README 里 40-70% 的说法。

  1. 克隆仓库并运行 make db,在 5433 端口启动 Postgres
  2. 在 .env.local 写入 DATABASE_URL=postgresql://router:router@localhost:5433/router?sslmode=disable,随后运行 make setup 与 make dev
  3. 把一个 Claude Code 或 Codex 项目用种入的 rk_ key 指向 router
  4. 正常工作一天后,用只读 key 从 /v1/analytics/* 导出决策,按模型拆分开销
  5. 与对照项目的开销和质量对比,用你自己的数据做决定

RepoDaily 判断

一个纪律罕见的 Go 路由器——fail-closed、严格分层、自带行级 analytics 导出——对已经在跑 Postgres 的 agentic 编码团队值得一试;Elastic License 2.0 的托管禁令与进行中的 HMM 迁 Go,则划清了谁该采用、谁不该。

信息来源