claude-code-router 请求改写实战:给路由挂上自定义转换器
【免费下载链接】claude-code-routerOne local control plane for every AI agent: route across models, fuse new capabilities, orchestrate tools, and stay fully in control.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-router
你正在给内部网关接入 claude-code-router,但这个网关要求每个请求都带上x-tenant-id头,缺失就直接拒绝。标准转发不会替你加这个头,手动改上游业务代码又不现实——请求改写(request rewrite)机制就是为这种场景准备的:在请求到达上游之前,按规则悄悄改一下它。
看懂请求改写能碰什么
路由规则的rewrites字段接受一组改写指令,命中规则的请求会在转发前被逐条修改:可以改请求头、增删改请求体里的任意 JSON 字段,操作类型包括 set、delete 以及数组的 append / prepend / remove / replace。如果逻辑无法用静态规则表达,还有 script 类型的路由规则,让你用一段 JavaScript 脚本读取请求内容、动态决定怎么改。整个过程都发生在网关层,业务侧完全无感。
给路由规则挂一个自定义头注入
先做最简单的事:往匹配路由的所有请求里注入一个租户头。改写指令写在规则的rewrites数组里,每条指令由key、operation、value组成,key必须以request开头,request.header.xxx指向头,request.body.a.b指向请求体字段。
// 路由规则的 rewrites 字段:每条都是一条改写指令 rewrites: [ { key: "request.header.x-tenant-id", operation: "set", value: "acme" }, { key: "request.body.max_tokens", operation: "set", value: "4096" }, { key: "request.header.x-legacy-flag", operation: "delete" } ]写起来像声明配置,但有几个细节值得知道:字符串 value 会被自动解析成 JSON 字面量,"4096"落进 body 的是数字而不是字符串;delete不需要 value;数组操作用array-append、array-replace等,其中array-replace还要求带match指定要替换的元素。每次改写的 before / after 值都会记录到请求日志里,验证"到底改了没有"不用靠猜。
在桌面端 UI 的路由管理页面里,你可以直接为规则增删改写项,配合匹配条件(如 model 前缀、请求头 contains 等)把注入范围圈定在需要的流量上。
用路由脚本写条件转换逻辑
静态 rewrites 的问题在于"无脑全改"。当改写依赖请求内容时,换成 script 规则:指向一个.js/.mjs/.cjs文件,脚本运行在独立 worker 沙箱里,超时上限 30 秒,输入对象input提供body、headers、summary(含最后一条用户消息文本、system 文本、工具名列表)等字段。
// 路由脚本:只在命中"billing"的请求上切换模型并打标 if (!input.summary.lastUserText.includes("billing")) return null; return { model: "Provider/audit", rewrites: [{ key: "request.header.x-routed-by", operation: "set", value: "script" }] };返回null或false表示不匹配,路由继续尝试下一条规则;返回对象则同时指定目标模型和动态 rewrites,它们会与规则上静态配置的 rewrites 按顺序叠加生效。脚本还能返回fallback(retry / model-chain 模式)覆盖该规则的降级策略。
改写不生效时怎么查
- 报
Route rewrite cannot modify protected header:authorization、api-key、x-api-key 以及x-auth-*、x-ccr-*前缀的头受保护,无法被改写覆盖——改注入x-tenant-id这类自定义头。 - 改写静默没生效:多半是规则未命中或
key没以request开头——查请求日志里该规则的 before / after 记录即可定位。 - 脚本返回了 model 却报未配置:脚本指定的模型必须先在提供方配置里存在,先加模型再挂脚本。
下一步
先跑通最小场景:clone 仓库git clone https://gitcode.com/GitHub_Trending/cl/claude-code-router,启动后在一条路由上写一条头注入改写,发一个真实请求核对日志里的 before / after。改写的完整操作集和脚本沙箱的校验、超时、熔断逻辑,分别看 rewrite.ts 与 route-script-runtime.ts。
【免费下载链接】claude-code-routerOne local control plane for every AI agent: route across models, fuse new capabilities, orchestrate tools, and stay fully in control.项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-router
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考