shaw
10c8b70203
fix(cn-providers): 修复 CN 分组五项功能缺陷(调度闸门/计费/断开漏记/count_tokens/403)
对已合并 PR #5666 + 分组入口放行后的全量功能审计发现的 P0/P1 修复,
全部先经代码与厂商文档实证再实施:
1. /v1/messages 调度闸门(P0):sanitizeGroupMessagesDispatchFields 对非
openai 平台恒置 AllowMessagesDispatch=false,而闸门豁免名单只有 grok,
CN 分组经正常途径创建后恒 403——原生 Anthropic 直通(Claude Code 主用例)
完全不可达。修复:闸门对 CN 与 grok 同语义豁免;count_tokens 处的内联
裸检查统一走同一 helper;ResolveMessagesDispatchModel 对 CN 早退,避免
openai 专属的 gpt-5.x 默认映射发给 CN 上游。
2. 计费候选链(P0):候选链兜底含客户端原始模型名,配合 getFallbackPricing
的 claude→Sonnet 统一兜底,映射的 CN 模型无价时 CN 流量会按 Claude 原价
(数倍~数十倍)静默误计,且 usage 日志显示 claude-* 名无从察觉。修复:
CN 账号的 claude-* 候选仅在显式分组/渠道定价时放行;候选全滤空时按
ErrModelPricingUnavailable 走零成本+告警落账(顺带修复原空候选错误会
丢弃整条 usage 记录的次生问题)。
3. 断开/中断漏记(P0,#5148 对齐,惠及 openai 平台):messages/responses/
chat_completions 三个 handler 的错误路径此前在 err!=nil 时丢弃携带的
部分 result——客户端断开排水后的完整 usage 被丢,payg 上游照常计费而
平台漏记(anthropic 网关早有同修复,openai 网关缺失)。修复:错误路径
result 非空时照常提交 usage;failover 错误恒 result=nil 无重复计费。
Responses×anthropic 流式转换器同时改为断开后继续排水至流自然结束
(末尾 message_delta 的 output_tokens 不再丢),finalize 帧补工具名反转
与客户端工具还原、仅在客户端仍连接时写出。
4. count_tokens(P1,证据修正):经实证三家 Anthropic 兼容层均无
/v1/messages/count_tokens(DeepSeek 官方文档无此端点且注明
anthropic-version 被忽略;OpenModel 标注该端点 Anthropic only),
anthropic 协议转发上游=常态 404,且错误处置缺模型上下文会把不计费的
探测放大成整账号停调。修复:CN 全协议一律本地 tiktoken 估算(与 Grok
同方案),删除上游转发死代码。
5. 403 处置(P1):CN 此前落入通用 handleAuthError,单次 HTML 403(CDN/
代理拦截页)即永久禁用,且 403 在 failover 集里会逐账号重放连环禁用
整组。修复:CN 与 openai 同口径——HTML 豁免 + 3 次累计 + 临时冷却。
新增回归测试 8 项:闸门豁免(含 openai 仍受控断言)、CN 调度映射空返回、
候选过滤三态、空候选零成本落账、断开排水 usage 完整性、HTML-403 零处罚、
结构化 403 首次临时停调。handler/service 全包测试通过。
2026-08-17 17:28:53 +08:00
..
2026-08-17 17:28:51 +08:00
2026-08-13 07:49:08 +08:00
2026-05-26 10:49:20 +08:00
2026-02-02 22:13:50 +08:00
2026-08-09 22:42:51 +08:00
2026-08-09 22:42:51 +08:00
2026-08-06 20:34:37 +08:00
2026-04-22 13:19:28 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-08-04 20:57:15 +08:00
2026-06-11 18:55:27 +08:00
2026-08-04 20:57:15 +08:00
2026-08-04 15:09:29 +08:00
2026-07-16 13:47:50 +08:00
2026-08-04 20:57:15 +08:00
2026-08-04 20:57:15 +08:00
2026-08-04 20:57:15 +08:00
2026-04-22 12:30:00 +08:00
2026-08-09 15:53:40 +08:00
2026-08-07 03:09:57 +08:00
2026-05-21 15:19:29 +08:00
2026-05-21 15:19:29 +08:00
2026-08-04 20:57:15 +08:00
2026-07-28 17:21:32 +08:00
2026-05-26 10:49:20 +08:00
2026-08-04 20:57:15 +08:00
2026-07-29 12:32:44 +08:00
2026-07-29 12:32:44 +08:00
2026-07-24 01:22:34 +08:00
2026-08-08 01:59:44 +08:00
2026-08-07 11:05:32 +08:00
2026-08-07 11:05:32 +08:00
2026-07-15 22:22:51 +08:00
2026-08-01 21:15:44 +08:00
2026-08-01 21:15:44 +08:00
2026-05-28 10:03:41 +00:00
2026-06-16 11:41:54 +08:00
2026-07-23 09:20:52 +08:00
2026-07-26 20:23:50 +09:00
2026-07-26 20:23:50 +09:00
2026-08-01 22:39:33 +08:00
2026-08-08 01:02:02 +08:00
2026-08-08 01:02:02 +08:00
2026-05-26 10:49:20 +08:00
2026-07-23 09:20:52 +08:00
2026-08-01 22:39:33 +08:00
2026-07-26 20:23:50 +09:00
2026-07-27 15:20:03 +00:00
2026-08-01 22:39:33 +08:00
2026-03-15 16:21:49 +08:00
2026-07-13 11:35:46 +08:00
2026-07-27 15:20:03 +00:00
2026-08-13 01:23:45 +08:00
2026-02-07 22:14:07 +08:00
2026-07-13 15:32:42 +08:00
2026-07-06 16:45:15 +08:00
2026-07-14 14:55:30 +08:00
2026-07-14 14:55:30 +08:00
2026-07-23 09:20:52 +08:00
2026-07-15 22:42:53 +08:00
2026-07-23 09:20:52 +08:00
2026-08-13 07:49:19 +08:00
2026-02-07 17:12:15 +08:00
2026-04-01 02:20:13 +08:00
2026-08-01 22:39:33 +08:00
2026-08-13 08:38:10 +08:00
2026-08-13 08:38:10 +08:00
2026-08-07 16:29:57 +08:00
2026-08-08 09:45:12 +08:00
2026-08-15 10:37:51 +00:00
2026-02-23 12:45:37 +08:00
2026-02-23 12:45:37 +08:00
2026-05-26 10:49:20 +08:00
2026-05-05 03:26:54 +08:00
2026-07-20 15:20:51 +08:00
2026-07-15 19:57:37 -07:00
2026-07-19 00:56:21 -07:00
2026-02-12 19:01:09 +08:00
2026-08-04 13:48:19 +08:00
2026-08-04 13:48:19 +08:00
2026-07-17 22:10:18 +08:00
2026-07-23 09:19:24 +08:00
2026-08-01 22:39:33 +08:00
2026-07-16 00:52:26 +08:00
2026-08-17 17:28:53 +08:00
2026-07-16 17:10:44 +08:00
2026-07-27 18:42:34 +08:00
2026-08-01 22:39:33 +08:00
2026-08-17 17:28:53 +08:00
2026-08-14 18:18:53 +08:00
2026-08-14 18:18:53 +08:00
2026-08-17 17:28:53 +08:00
2026-07-23 00:06:04 +08:00
2026-07-26 20:23:50 +09:00
2026-06-12 01:47:01 +08:00
2026-03-15 22:13:42 +08:00
2026-07-15 13:01:16 +08:00
2026-08-11 14:09:07 +08:00
2026-08-17 17:28:53 +08:00
2026-07-26 13:33:56 +08:00
2026-07-26 13:33:56 +08:00
2026-05-28 22:44:25 +08:00
2026-07-17 15:29:14 +08:00
2026-07-15 04:20:11 +08:00
2026-05-05 03:26:54 +08:00
2026-07-23 23:04:00 +08:00
2026-08-07 20:49:39 +08:00
2026-07-25 12:50:46 +08:00
2026-07-25 12:51:20 +08:00
2026-08-14 16:23:52 +08:00
2026-08-01 22:39:33 +08:00
2026-06-28 11:13:09 +08:00
2026-07-15 09:29:05 +08:00
2026-07-19 18:49:08 +08:00
2026-06-03 14:18:12 +08:00
2026-06-03 14:18:12 +08:00
2026-08-01 22:39:33 +08:00
2026-08-13 08:37:57 +08:00
2026-08-13 08:37:57 +08:00
2026-07-12 04:53:41 +08:00
2026-07-18 00:11:18 +08:00
2026-06-12 01:47:01 +08:00
2026-07-18 20:46:50 +08:00
2026-07-23 09:20:18 +08:00
2026-07-18 00:11:18 +08:00
2026-07-23 09:19:25 +08:00
2026-05-12 15:21:31 +08:00
2026-06-10 14:16:51 +08:00
2026-08-04 15:09:29 +08:00
2026-08-04 20:57:15 +08:00
2026-07-13 15:22:39 +08:00
2026-07-22 19:18:04 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2025-12-26 16:45:40 +08:00
2025-12-31 08:50:12 +08:00
2026-07-09 11:15:52 +08:00
2026-07-07 13:53:39 +08:00
2026-07-07 13:53:39 +08:00
2026-07-17 00:39:39 +08:00
2026-07-17 00:39:39 +08:00
2026-08-11 11:56:46 +08:00
2026-08-11 11:56:46 +08:00
2026-07-17 00:39:39 +08:00
2026-07-17 00:39:39 +08:00
2026-08-06 20:34:37 +08:00
2026-08-09 15:53:40 +08:00
2026-05-25 18:16:46 +08:00
2026-07-07 10:20:23 +08:00
2025-12-26 16:45:40 +08:00
2026-07-16 16:49:08 +08:00
2026-06-05 14:00:57 +08:00
2026-08-07 09:40:11 -04:00
2026-04-09 18:14:28 +08:00
2026-07-08 13:50:49 +08:00
2026-08-07 17:58:23 +08:00
2026-08-01 11:29:58 +08:00
2026-07-28 17:21:32 +08:00
2026-05-26 10:49:20 +08:00
2026-03-03 01:05:11 +08:00
2026-05-26 10:49:20 +08:00
2026-08-15 10:37:51 +00:00