| Files | Last commit | Last update |
|---|---|---|
fix(plugins): 三个坏渠道 + 三插件图标 + 计费可见性 用户报障:「检查一下,同时修复坏渠道,还有插件不是可以自己决定注册 哪些渠道吗?你怎么不修一下,还有除了 billing 以外的两个插件都没有正确的 图标,而且另外两个插件计费也不正确」 ## 一、坏渠道(都在插件里修,不动内核) ### 1. zcode —— base_url 吞掉了 endpoint 路径(404) base_url = https://zcode.z.ai/api/v1/zcode-plan/anthropic endpoint = /api/v1/zcode-plan/anthropic/v1/messages 内核 URL = base_url + endpoint(provider.go ChatURL)⇒ 路径拼两遍: .../anthropic/api/v1/zcode-plan/anthropic/v1/messages → 404 page not found。 修:base_url 只留 host,完整路径进 endpoint。与 v2.0.30 「12 平台 base_url 侵占 endpoint」同族。 ### 2. minimax —— 打到 Web 前端(404「简单指令,无限可能」) base_url 只到 host + adapter=openai ⇒ 请求 /chat/completions,那是 Web 前端。 照参考 minimax-product.ts: MINIMAX_INFER_PATH = /mavis/api/v1/llm/v1/messages(**Anthropic Messages**) 实测(2026-10-19): /mavis/api/v1/llm/v1/messages → 401 invalid access token(路径对) 裸 /chat/completions → 404 page not found /mavis/api/v1/chat/completions → 404 修:endpoint 指向真实推理路径 + adapter 改 anthropic(第二层:协议形状)。 修后从 404 变 401(凭据问题,不再是路由问题)。 ### 3. codearts —— 只声明"可续期"却没声明"怎么续" account_refresh 走 refreshCredential(),要求 plat.refresh.url 或 refresh_fn 存在。codearts 只有 accountView 里硬编码的 refreshable=true ⇒ 恒返回「该平台未声明续期方式」,自动续期链空转,日志反复 模型刷新失败 HTTP 400。而 STS security_token 只有 1 小时寿命,过期后 每个请求都是 APIG.0602: the security token has expired。 修法(三层,每层都有独立的坑): a) 加 refresh_fn 钩子。华为云 STS 要 **DPoP 头**(jwk 在凭据里), 声明式 REFRESH_STYLES 拿不到私钥 ⇒ 必须用钩子挂已有的 codeartsRequestToken。 b) **JWK → PEM 重建**。codeartsNewDpop() 返回 {pem,public,private},但 凭据只持久化了 private(JWK),pem 是登录临时文件。而 codeartsDpopSign 走 openssl 命令行要 key.pem 字符串 ⇒ 直接传会报 bad argument #1 to 'write' (string expected, got nil)。 手工组 SEC1 EC PRIVATE KEY 的 DER(INTEGER 1 / OCTET STRING d / [0] OID prime256v1 / [1] BIT STRING 04||X||Y)再 PEM 包装。 c) 绑定放在**文件末尾的绑定循环**(与 claim_fn 同处)。在 PLATFORMS 表里 内联会闭包捕获当时的全局 nil —— 与 trae headers_fn 那次同一坑。 ## 二、插件图标(3 个坏 1 个) billing 有 SVG 但**缺 stroke/fill=currentColor**(深色主题下不可见); channels 声明 icon = ""(侧边栏空白);quota 连 icon 字段都没有。 统一成 inline SVG + stroke="currentColor"(照参考 src/sponsor.js:52 的 图标工厂形状)。 ## 三、判据(4 条,全部做过变异验证) - TestChannelBaseURLDoesNotSwallowEndpoint:base_url 里的路径段不得在 endpoint 重复出现。**走真实加载插件**而非正则读源码 —— PLATFORMS 是 Lua 表,有注释/条件拼装/末尾绑定循环,正则会给出假绿。 - TestMinimaxUsesAnthropicProtocolAndRealInferPath:路径 + 协议双断言。 - TestCodeartsDeclaresRefreshHook:分开报 has_refresh_fn / has_refresh_decl。 只看 refreshable 不够 —— 那是"凭据类型可续",与"平台实现了续期"是两件事。 - TestCodeartsRebuildsPemFromJwkAndSigns:**必须真签名**。DER 结构错、 长度错、base64 换行错都得到"非空但无效"的 PEM,只断言非空等于没验。 - TestB64urlDecodeHandlesLongInput:补一个真实测漏 —— 我的 b64urlDecode 第一版在输出字节后没清高位(缺 buf = buf % (2^nbits)),43 字符的 JWK 字段(32 字节)测出来**完全正确**,于是 PEM 判据在变异后依然全绿。 只有 86 字符的长输入才暴露(double 精度耗尽 → string.char 抛 invalid value)。 这条判据就是为"能跑、能返回、产物错"那类缺陷写的。 - TestEveryPagePluginDeclaresSVGIcon / TestIconUsesCurrentColor: 按**页面插件清单**遍历而不是只覆盖 billing。billing 当年空串的判据只管 它自己,于是 channels 空串、quota 缺字段时全绿 —— 同类缺陷换文件复发 没有任何东西会响。这条测试还当场咬出了 billing 自己缺 currentColor。 变异验证:zcode base_url 回退 ✓ / minimax adapter 回退 ✓ / 删 refresh_fn 绑定 ✓ / 去掉 buf 掩码 ✓ / OID 多套一层 TLV ✓(5/5 全部咬住) ## 四、计费(诊断,未改价) 查清"计费不正确"的根因:prices.models 只配了 **2 条** (deepseek-v4.1-flash + 它的 / 前缀形式),而实际在用 **193 个模型** ⇒ 112006 次请求里 **35672 次(31.8%)成本按 $0 计**。 其中 28203 次集中在 2026-10-05 一天(历史一次性事件); 当前每天 27~137 次,且**渠道模型全部未定价** (Doubao-Seed-2.1-Pro / GLM-5.3-Flash / MiniMax-* / qwen3.6-plus / hy3)。 调研:参考插件从 **models.dev** 拉模型目录(含 cost.input/output)。 实测 models.dev 覆盖我们 139/193 模型(72%),但**不能取中位数** —— 同一模型不同 provider 价差可达数千倍(glm-5.2 从 0 到 1.82), 0 价多是订阅制/coding plan。按 host 匹配 provider 只覆盖 6/24 源。 ⇒ 价格口径需要用户确认,本轮不动价表。 6 个新探针(仅测试/诊断用):__platform_def_probe(平台定义真相)、 __codearts_jwk_pem_probe(PEM 重建 + 真签名)、__b64_probe(解码字节)。 | 20 days ago | |
fix(codearts): 上游限流改为可声明重试(内核通用能力)+ 会话/连接两处真因 用户连续报「codeart 还是不可用 / empty stream」。把上游原始响应打出来逐条对齐, 三个症状同源,且都不是"模型坏了": | 场景 | 上游实际返回 | |---|---| | 流式、短时间连续请求 | HTTP **200** + 只带 error 的帧 ⇒ 内核判 empty stream | | 非流式、同一条件 | HTTP 400 TM.00001041: 并发会话数已达上限(3个) | | 突发请求 | HTTP 429 TPM limit … 500000 tokens per minute | 实测:最后一个请求结束后约 **44~60 秒**释放;同一账号连续请求 3~4 次即占满。 参考实现(示例插件 llm-adapter.ts)的做法是**每 10s 轮询后重试 chat**(最多 30 分钟),所以用户那边"看起来没事"。 ## 我们的改法(内核只做通用机制,厂商知识留在插件) 1. **内核新增声明式重试策略** source.retry(纯数据:状态码列表 + 响应体子串 + 间隔 + 次数)。内核不认识任何厂商;命中即在同一网关请求内每 10s 重试一次。 流式只在**握手阶段**重试(首帧尚未下发,不会重复输出),非流式整体重试。 2. **插件为 codearts 声明**:400/429 + 命中 TM.00001041 / TPM limit / 并发会话数已达上限 → 10s × 最多 18 次(≈3 分钟)。 3. **适配器补两个会话细节**:Connection: close(keep-alive 空闲连接会被上游 计入并发会话)与稳定 Session-Id(同一账号恒定,避免每次请求新建会话)。 4. 错误文案补可行动提示(并发会话上限 / TPM 限流,约 1 分钟释放)。 ## 验证(生产) - 连续 6 次**流式**:6/6 成功(撞上限时自动等 10s 再试,客户端只感觉慢): +0s / +12s / +34s / +86s / +100s / +144s - 连续 5 次**非流式**:5/5 成功(+0 / +11 / +20 / +28 / +38s) - 修复前:第 4 个请求起必然 TM.00001041 / empty stream。 > 注:TM.00001005 无正常可用套餐 属于账号权益问题(不重试、如实报出), > 与限流要分开处理。 (cherry picked from commit 6454b094bc5cfa0ff2a07597785da3ab898aec7f) | 19 days ago | |
fix(plugins): 三个坏渠道 + 三插件图标 + 计费可见性 用户报障:「检查一下,同时修复坏渠道,还有插件不是可以自己决定注册 哪些渠道吗?你怎么不修一下,还有除了 billing 以外的两个插件都没有正确的 图标,而且另外两个插件计费也不正确」 ## 一、坏渠道(都在插件里修,不动内核) ### 1. zcode —— base_url 吞掉了 endpoint 路径(404) base_url = https://zcode.z.ai/api/v1/zcode-plan/anthropic endpoint = /api/v1/zcode-plan/anthropic/v1/messages 内核 URL = base_url + endpoint(provider.go ChatURL)⇒ 路径拼两遍: .../anthropic/api/v1/zcode-plan/anthropic/v1/messages → 404 page not found。 修:base_url 只留 host,完整路径进 endpoint。与 v2.0.30 「12 平台 base_url 侵占 endpoint」同族。 ### 2. minimax —— 打到 Web 前端(404「简单指令,无限可能」) base_url 只到 host + adapter=openai ⇒ 请求 /chat/completions,那是 Web 前端。 照参考 minimax-product.ts: MINIMAX_INFER_PATH = /mavis/api/v1/llm/v1/messages(**Anthropic Messages**) 实测(2026-10-19): /mavis/api/v1/llm/v1/messages → 401 invalid access token(路径对) 裸 /chat/completions → 404 page not found /mavis/api/v1/chat/completions → 404 修:endpoint 指向真实推理路径 + adapter 改 anthropic(第二层:协议形状)。 修后从 404 变 401(凭据问题,不再是路由问题)。 ### 3. codearts —— 只声明"可续期"却没声明"怎么续" account_refresh 走 refreshCredential(),要求 plat.refresh.url 或 refresh_fn 存在。codearts 只有 accountView 里硬编码的 refreshable=true ⇒ 恒返回「该平台未声明续期方式」,自动续期链空转,日志反复 模型刷新失败 HTTP 400。而 STS security_token 只有 1 小时寿命,过期后 每个请求都是 APIG.0602: the security token has expired。 修法(三层,每层都有独立的坑): a) 加 refresh_fn 钩子。华为云 STS 要 **DPoP 头**(jwk 在凭据里), 声明式 REFRESH_STYLES 拿不到私钥 ⇒ 必须用钩子挂已有的 codeartsRequestToken。 b) **JWK → PEM 重建**。codeartsNewDpop() 返回 {pem,public,private},但 凭据只持久化了 private(JWK),pem 是登录临时文件。而 codeartsDpopSign 走 openssl 命令行要 key.pem 字符串 ⇒ 直接传会报 bad argument #1 to 'write' (string expected, got nil)。 手工组 SEC1 EC PRIVATE KEY 的 DER(INTEGER 1 / OCTET STRING d / [0] OID prime256v1 / [1] BIT STRING 04||X||Y)再 PEM 包装。 c) 绑定放在**文件末尾的绑定循环**(与 claim_fn 同处)。在 PLATFORMS 表里 内联会闭包捕获当时的全局 nil —— 与 trae headers_fn 那次同一坑。 ## 二、插件图标(3 个坏 1 个) billing 有 SVG 但**缺 stroke/fill=currentColor**(深色主题下不可见); channels 声明 icon = ""(侧边栏空白);quota 连 icon 字段都没有。 统一成 inline SVG + stroke="currentColor"(照参考 src/sponsor.js:52 的 图标工厂形状)。 ## 三、判据(4 条,全部做过变异验证) - TestChannelBaseURLDoesNotSwallowEndpoint:base_url 里的路径段不得在 endpoint 重复出现。**走真实加载插件**而非正则读源码 —— PLATFORMS 是 Lua 表,有注释/条件拼装/末尾绑定循环,正则会给出假绿。 - TestMinimaxUsesAnthropicProtocolAndRealInferPath:路径 + 协议双断言。 - TestCodeartsDeclaresRefreshHook:分开报 has_refresh_fn / has_refresh_decl。 只看 refreshable 不够 —— 那是"凭据类型可续",与"平台实现了续期"是两件事。 - TestCodeartsRebuildsPemFromJwkAndSigns:**必须真签名**。DER 结构错、 长度错、base64 换行错都得到"非空但无效"的 PEM,只断言非空等于没验。 - TestB64urlDecodeHandlesLongInput:补一个真实测漏 —— 我的 b64urlDecode 第一版在输出字节后没清高位(缺 buf = buf % (2^nbits)),43 字符的 JWK 字段(32 字节)测出来**完全正确**,于是 PEM 判据在变异后依然全绿。 只有 86 字符的长输入才暴露(double 精度耗尽 → string.char 抛 invalid value)。 这条判据就是为"能跑、能返回、产物错"那类缺陷写的。 - TestEveryPagePluginDeclaresSVGIcon / TestIconUsesCurrentColor: 按**页面插件清单**遍历而不是只覆盖 billing。billing 当年空串的判据只管 它自己,于是 channels 空串、quota 缺字段时全绿 —— 同类缺陷换文件复发 没有任何东西会响。这条测试还当场咬出了 billing 自己缺 currentColor。 变异验证:zcode base_url 回退 ✓ / minimax adapter 回退 ✓ / 删 refresh_fn 绑定 ✓ / 去掉 buf 掩码 ✓ / OID 多套一层 TLV ✓(5/5 全部咬住) ## 四、计费(诊断,未改价) 查清"计费不正确"的根因:prices.models 只配了 **2 条** (deepseek-v4.1-flash + 它的 / 前缀形式),而实际在用 **193 个模型** ⇒ 112006 次请求里 **35672 次(31.8%)成本按 $0 计**。 其中 28203 次集中在 2026-10-05 一天(历史一次性事件); 当前每天 27~137 次,且**渠道模型全部未定价** (Doubao-Seed-2.1-Pro / GLM-5.3-Flash / MiniMax-* / qwen3.6-plus / hy3)。 调研:参考插件从 **models.dev** 拉模型目录(含 cost.input/output)。 实测 models.dev 覆盖我们 139/193 模型(72%),但**不能取中位数** —— 同一模型不同 provider 价差可达数千倍(glm-5.2 从 0 到 1.82), 0 价多是订阅制/coding plan。按 host 匹配 provider 只覆盖 6/24 源。 ⇒ 价格口径需要用户确认,本轮不动价表。 6 个新探针(仅测试/诊断用):__platform_def_probe(平台定义真相)、 __codearts_jwk_pem_probe(PEM 重建 + 真签名)、__b64_probe(解码字节)。 | 20 days ago | |
chore(main): 回流 release/v2.0.x(v2.0.12)—— 内容对齐,main 无独有内容 按发布纪律回流。**注意这是内容对齐而非 merge**,理由与依据: 1. 纪律禁止 merge 回主干,因为 merge 会把发布分支的**版本号变更**带进 main。 本项目版本号**只由 git describe --tags 推导**(Makefile VERSION), 仓库里没有任何文件存放版本号 ⇒ 回流不存在版本污染风险。 2. 逐项核对确认 **main 是 release 的内容严格子集**: - main 独有的**文件**:0 个; - internal/lua/plugins.go / internal/core/kernel_actions.go 等内核文件 main 独有行数:0; - deploy.sh 那 14 行只是 emoji 清理(release 刻意去掉了 emoji); - channels.lua 那 333 行是**旧版内容**(旧 exports 表、旧模型名单)。 - main 独有的 9 个提交按 patch-id **全部已在 release 中等效存在** (git cherry 逐条列出均为 -,即已合入)。 3. 故回流 = 把 release 的内容带到 main,等价于"只捡拾修复、不带版本号", 且不会丢任何 main 独有的修复。 本次带回 v2.0.12 的全部内容(37 个提交): - 源串行 + 按模型节流(照 model-gate) - 已失效模型存储 + 远端目录闸门 - 余额分档选号 - 模型能力元数据(models.dev,isFree 权威判定) - **凭据续期修复**(此前恒报 ok:true 却一个请求都不发) - 通用件 TTL 缓存 + 串行锁;account_test/account_adopt/account_delete 修正 - 内核级:出站授权持久化重启后不生效、__llmsproxy_plugin_dir ground truth 校验:git diff release/v2.0.x = 0 行;go build -tags luajit ./... 通过。 | 25 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 20 days ago | ||
| 19 days ago | ||
| 20 days ago | ||
| 25 days ago |