mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
通读参考 zcode-identity.ts 的 withContextPrefix 后发现我的实现漏了两条官方行为, 且其中一条藏着真实 bug: ## ① ★ 幂等判断 off-by-one(真 bug) `"<system-reminder>"` 是 **17** 个字符,而我写的是 `c:sub(1, 16) == SR` —— 判断**永远为假** ⇒ 幂等完全失效:同一请求重试/多次 transform 时日期块 会叠加成多层,改变 content 的前缀结构(上游检查的正是这个结构)。 修法:用 `#SR` 算长度,不写死数字。 ## ② 只看**第一条**消息,且它必须 role == "user" 我原来实现成「往后扫第一个 user 消息」。官方行为是:只处理 `messages[0]`, 且若它不是 user 就**完全不动** —— 不是去找后面那条 user。已对齐。 ## ③ 其它类型兜底 参考对非字符串/非数组的 content 也会置为 `[prefix]`,照做。 判据 2 条(新增): - TestZcodeContextPrefixIsIdempotent 已含日期块时不重复插 - TestZcodeContextPrefixOnlyTouchesFirstMessage 首条非 user 时不动、首条 user 时插入 变异 2/2 咬住:把 #SR 改回写死的 16 → 报红;去掉幂等判断 → 报红。 ★ 我自己在写这条判据时又犯了一个错并当场自查出来:断言「文本 content 应保持 字符串」,而 anthropic 基座把文本转成块数组是**正常**的协议转换行为 —— 差点把 正确的实现判成错。判据要验的是「**日期块**有没有被插进来」这个事实,不是 content 的容器类型。 验证:internal/core 335s + internal/gateway 207s 全绿。