@wengine-ai/llms 2.3.2392 → 2.3.2395

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -93,6 +93,9 @@ npm install -g @wengine-ai/claude-code-router-next@latest && ccr restart
93
93
 
94
94
  | 版本 | 发布内容 |
95
95
  | --- | --- |
96
+ | **v2.3.2395** | <ul><li>**UI 转换器参数支持嵌套 JSON/布尔/数字**: 参数值此前一律按字符串保存,`customparams` 的 deep merge 无法应用字符串参数,结构化参数(如强制 reasoning 端点的 `{"enabled":true,"effort":"max"}`)在 UI 里配了也无效;现在按类型解析(畸形 JSON 保留原文),参数回显不再显示 `[object Object]`。</li></ul> |
97
+ | **v2.3.2394** | <ul><li>**严格项目路由不再因熔断目标返回 503**: 项目目标仅因 health fail-pool 不可用且无备用模型时,CCR 跳过健康检查继续请求项目配置的同一模型,让客户端收到真实上游结果;供应商/模型缺失、禁用、格式或额度错误仍拒绝,不逃逸项目边界。</li><li>**修复非流式 TTFT 与 token 速率统计**: 非流式响应不再把总耗时冒充 TTFT(显示 `-`),速率改为输出 token ÷ 总耗时,并阻止假 TTFT 污染平均值。</li></ul> |
98
+ | **v2.3.2393** | <ul><li>**项目接管按项目 Router 封顶上下文窗口**: 项目级接管此前只按全局 Router/ContextWindow 写 auto-compact 窗口,全局开 `[1m]` 而项目未启用扩展上下文时项目仍带 >200k 窗口,超 200k 后无可用模型;现在项目默认 family 或顶层 `enableExtendedContext` 未启用时窗口封顶 `min(ContextWindow, 200000)` 并清除陈旧 `[1m]` alias,保存项目 Router 与全局配置后都会刷新自定义 Router 项目的接管。用户手写窗口与 state 审计行为不变。</li><li>**opencode go 缓存命中从 0% 恢复**: zen 上游的提示词缓存以显式 `cache_control` 为前提(实测带标记第 2 次起 ≈98% 命中),transformer 此前把标记全部剥除导致永不缓存;现在保留标记,并在 `cached_tokens` 缺失时兜底映射 DeepSeek 风格 `prompt_cache_hit_tokens`。</li></ul> |
96
99
  | **v2.3.2392** | <ul><li>**用量按日统计按本地时区分组**: `byDay` 此前取 UTC 日期,本地 0:00–8:00 的请求(UTC 仍是昨天)被归到前一天——表现为「过了零点后昨天的消耗还在涨、今天的偏少」;改用 `date(timestamp,'localtime')` 按进程时区分组,历史记录无需迁移即自动重新归类。</li></ul> |
97
100
  | **v2.3.239** | <ul><li>**供应商慢网探测与黄色 ⚠️ 告警**: 后台对每个供应商的 `/models` 可达性探测现在记录延迟,超过 `PROBE_SLOW_THRESHOLD_MS`(默认 3000ms)在 provider 卡片显示黄色 ⚠️;`GET /api/providers/health` 追加 `probes`,手动探测返回 latency/status/isSlow。慢但成功不开熔断,仅作 UI 提示。</li><li>**用量汇总改 SQL 聚合,UI 不再随机卡顿**: `/api/providers/quota`、`/api/usage` 的 summary 此前 `SELECT *` 全量物化 + JS 聚合阻塞 event loop,是 health/quota 随机卡顿的共享根因;改为 SQL `COUNT/SUM/AVG/GROUP BY`,语义不变。</li><li>**UI 刷新循环重做,杜绝请求重叠**: Providers health/quota 改 60s 自调度 single-flight;Usage 改 30s 串行队列(上一个未返回下一个顺延);`/api/clients` 仅 mount 刷新(操作后复用响应、不再 visibility 补拉);页面隐藏时暂停。</li><li>**Image 路由根因修复**: image agent 此前在路由前改写 `req.body.model`,导致用量记录丢失客户端真实模型(如 ccr-opus)并绕过 family image 路由;现按客户端原始模型识别 family 路由图片。同时修复 `promoteToolResultImages` 把所有数组型 tool_result 内容替换为占位符、丢失文本/结构化内容的问题。</li><li>**移除已弃用的 Codex 多账号管理**: 删除账号列表、切换、后台自动维护及对应 API/CLI/UI;Codex 仍作为普通 provider/client 完整支持(检测、`/v1/responses`、transformer、takeover、用量归属),历史账号文件与 `~/.codex/auth.json` 保持不动。</li><li>**路由优先级:模型族优先于 explicit `provider,model`**: 开启 family routing 时请求先走模型族映射,命中即用;family 未命中才解析客户端显式指定,最后落默认路由。</li></ul> |
98
101
  | **v2.3.238** | <ul><li>**更新成功后服务自动重启**: 修复 `performUpdate` 跑完 `npm install -g` 只返回“请手动重启”、从不真正重启的问题;现在成功后复用 `/api/restart` 的自重启模式自动重启服务,前端轮询 `checkForUpdates` 返回 `hasUpdate:false` 后自动刷新页面加载新前端。</li><li>**更新请求并发锁**: 新增模块级 `updateInProgress` 守卫,刷新页面丢失 UI 状态后再次点击“立即更新”不会再触发第二次 `npm install -g`。</li><li>**超时文案补全包名**: `app.update_timeout` 改为“手动执行 `npm install -g @wengine-ai/claude-code-router-next@latest`”,照抄即可成功。</li></ul> |
@@ -100,9 +103,6 @@ npm install -g @wengine-ai/claude-code-router-next@latest && ccr restart
100
103
  | **v2.3.236** | <ul><li>**阿里云 Token Plan 用量查询(5h/7d 额度)**: 为 `*.maas.aliyuncs.com` 网关新增专用 `AliyunTokenPlanQuotaAdapter`,走 Token Plan 专用 BroadScope 用量接口并把 `per5HourPercentage`/`per1WeekPercentage` 映射为 5h/7d 百分比展示。</li><li>**`quota_sec_token` 配置项与官方网关 + legacy 回退**: provider 可选 `quota_sec_token` 与 UI 密码输入;配置后走官方 `bailian-cs.console.aliyun.com` 网关(对齐真实控制台请求,`_v=undefined`、动态 trace、不含 spm),失败安全降级到 `cs-data` cookie-only 端点。</li><li>**pi 扩展上下文触发统一为绝对阈值**: 移除 pi 的 `extendedContextRatio`,统一走 family → Router → 200000 的绝对阈值链。</li><li>**测试 HOME 隔离真正到达 vitest worker**: 修复 core/shared 测试套件此前落在真实 `~/.claude-code-router` 的隔离失效问题。</li></ul> |
101
104
  | **v2.3.235** | <ul><li>**修复 npm 全局安装静默失败**: 此前 `@wengine-ai/llms` 发布包把运行时 shared 依赖保留为 pnpm 的 `workspace:*` 协议,npm 在解析依赖树时无法识别并 exit 1。发布流程现在先发布同版本 `@wengine-ai/claude-code-router-shared`,再把 core 中所有 `workspace:` 范围转换为真实 npm version range 后发布,最后发布 CLI;shared/core/CLI 三个发布 manifest 都新增 `workspace:` 拦截校验,防止再次发布 npm 无法安装的包。</li></ul> |
102
105
  | **v2.3.234** | <ul><li>**修复全局 ContextWindow 变更不传递到已接管项目(auto-compact 窗口冻结)**: 项目在 v2.3.22 之前被接管、或经历 disable→enable 循环导致 `ccr-state.json` 缺失时,`CLAUDE_CODE_AUTO_COMPACT_WINDOW` 会停留在旧值(如 200000);旧守门把该旧值误判为用户手写值并永久保留,之后任何全局 `ContextWindow` 变更都不再生效,UI 重开关 takeover 也无效。现在 state 缺失时重新视为 CCR-managed,写入当前全局值并重建 state,被覆盖旧值记入 `previousAutoCompactWindow` 留痕;state 存在时仍保留用户手写值不被覆盖的原保证。</li></ul> |
103
- | **v2.3.233** | <ul><li>**修复「立即更新」点击失败(404)**: UI `ApiClient` 的 `baseUrl` 已是 `/api`,但 `performUpdate()` 又传入 `/api/update/perform` 导致实际请求变成 `/api/api/update/perform`;现改为 `/update/perform`,更新请求重新落到服务端 `/api/update/perform`。</li><li>**修复更新弹窗永远显示「暂无更新日志」**: `checkForUpdates` 此前 `changelog` 恒为空字符串。现在检测到新版本时,优先从已发布 npm 包对应版本 README 的 changelog 表提取摘要,取不到再 fallback 到 GitHub `CHANGELOG.md` 对应版本段,两级都失败才回退兜底文案,网络错误不影响版本检查。</li></ul> |
104
- | **v2.3.232** | <ul><li>**严格项目级路由成为权威边界**: 项目配置非空 `Router` 后,目标缺失、格式错误、被禁用、不健康或额度耗尽不再静默回落到全局,而是返回稳定错误码;项目内显式 fallback 仍可用,同时关闭全局 Router/custom router、全局 fallback、客户端与 subagent model override 等项目外逃逸路径。</li><li>**Provider 级代理策略**: 新增顶层 `PROXY_GLOBAL_ENABLED` 与 provider 级 `proxy_enabled`;全局关闭时仅显式标记的 provider 使用共享 `PROXY_URL`,其余直连,未配置或开启时保持全部走代理的旧行为。推理、fallback、健康探测、额度查询、wakeup、provider API tokenizer 等出站请求统一遵循该策略。</li><li>**代理安全校验与 UI 控制**: 保存配置前仅允许 `http://`、`https://`、空值或环境变量占位符,非法协议/畸形 URL 逐项报错且不覆盖原配置;设置页新增「全局生效」开关、provider 卡片新增独立代理开关,并提示仅使用可信代理。ProxyAgent 改为按 URL 缓存复用,关闭时释放,日志自动脱敏代理凭据。</li><li>**per-client adapters 与 pi 上下文路由**: runtime 下沉到 core 并用 adapter 统一 Claude Code、Codex、pi、qwen-code、opencode 的差异;pi 新增 `extendedContextRatio`(默认 80%),不再生成/消费 `[1m]` 后缀,longContext 改用绝对阈值链。</li><li>**修复严格路由、客户端识别与用量回归**: 畸形项目 target 不再逃逸全局;Codex Responses 请求不再被误判为 Claude Code;修复非流式 `upstreamModel` 丢失、失败请求串用上一请求 tokens、`response.completed` 将 usage merge base 归零、项目路由失败清除会话用量基线等问题。</li><li>**修复 runtime 生命周期与错误处理**: `createCcrServer({ port })` 正确采用传入端口,401/403 认证不再挂起,provider/transformer/tokenizer 初始化完成后才监听,preset 注册失败不再静默吞掉。</li></ul> |
105
- | **v2.3.231** | <ul><li>**项目级接管默认仅接管 Claude Code**: 此前打开项目「CCR 接管」默认接管全部客户端(Claude Code、pi、qwen-code、opencode),会把 `.pi/settings.json`、`.qwen/settings.json`、`opencode.json` 等配置写进项目目录(opencode 首次运行还会自行生成 `AGENTS.md`),污染项目根目录;现在所有默认路径(主开关、多选清空、legacy `enabled: true`)都只接管 Claude Code,其余客户端在多选中显式勾选才接管。</li><li>**修复「检查更新」永远提示已是最新(双重 bug)**: 后端 `checkForUpdates`/`performUpdate` 硬编码了已从 npm unpublish 的旧包名 `claude-code-router-next`,`npm view` 404 被 catch 静默吞掉、恒返回「无更新」,「立即更新」也因同样的错包名安装失败,现改为从 `package.json` 动态读取包名(`@wengine-ai/claude-code-router-next`),今后改包名不会再失效;另外前端更新弹窗条件要求 `changelog` 非空而后端该字段恒为空串,即使有新版本也不弹窗,现去掉该强制判断(弹窗内已有「暂无更新日志」兜底文案)。</li><li>**发布确认点闸门(release gate)**: `scripts/release.sh` 新增 `validate_release_docs`,发布前(含 dry-run)强制校验:6 个 `package.json` 版本一致、`CHANGELOG.md` 有该版本的非空段落、两份 README 表格有该版本行、版本号严格大于 npm 已发布 latest(逐段数字比较,registry 不可达时警告跳过);任一不满足即中止发布。</li><li>**版本号策略:多位 patch 日常小迭代**: 自本版本起日常小迭代在 patch 段追加一位数字(`2.3.23` → `2.3.231` → `2.3.232`),避免每日发布推高主版本数字;patch 按数字比较,用过 `2.3.23x` 后下一个功能版本是 `2.3.240`(`2.3.24` 会被闸门当降级拦截)或直接升 `2.4.0`。</li></ul> |
106
106
 
107
107
  > 仅保留最近 10 个版本,更早版本的发布摘要见 [CHANGELOG-archive.md](./CHANGELOG-archive.md),完整详细变更记录见 [CHANGELOG.md](./CHANGELOG.md)。
108
108