mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
## 问题(实测) `channels.lua` 的主 chunk **顶到 Lua 上限 200 个 local** —— 往文件顶部加**哪怕 1 个**顶层 local 就报: `main function has more than 200 local variables` 实测(LuaJIT 与 luac 5.4 一致,**响亮失败**,不是静默降级)。 后果不是"某个功能出错",而是**整个渠道插件编译失败 ⇒ 全渠道不可用**。 换句话说:这个文件此前**一个顶层 local 都加不了**,任何后续改动都会立刻炸。 ## 修法 把 20 个**纯常量**(字符串/数字/自闭合字面量)从裸 `local` 收进 `plugin.K` 表 —— **挂表字段不占 local 槽位**。只搬常量,**函数一律保留 local**: 函数之间存在真实的调用顺序依赖(前向引用),搬迁风险与收益不成比例。 搬迁是纯机械的,且脚本带**长字符串保护**:替换时逐行跳过 `[===[ ... ]===]` 区间,绝不改动适配器源码文本 (本文件里那 7 段长字符串是适配器代码,误改会直接弄坏适配器)。 ### 实测结果 | 指标 | 前 | 后 | |---|---|---| | 加 1 个顶层 local | ✗ 编译失败 | ✓ 通过 | | 加 10 / 20 个 | ✗ | ✓ 通过 | | 字节数 | 589195 | 590042 | ## 判据(2 条 + 变异 2/2) - `TestChannelsLuaHasLocalHeadroom`:注入 1 与 10 个顶层 local 后**仍能编译**。 为什么用 **luajit** 而不是 `luac`:内核链接 `libluajit-5.1.so.2`, 而 luac(Lua 5.4)对同一文件给出**不同结论**,用错工具会得到假绿。 为什么不"数一遍 local":主 chunk 的 local 数受作用域嵌套影响, 静态计数不可靠(同一文件被不同脚本数出 228/232/248 三个数); 而"能不能再加"是**决定性**的,也正是我们需要的性质。 - `TestChannelsConstantsLiveInPluginK`(配对):抽样断言这些常量确实在 `plugin.K` 内、且**没有**变回裸 local —— 否则余量会再次归零。 - 变异:用重构前的文件 → 报红;把常量改回裸 local → 报红。 ## ★ 顺带更正两处我先前的错误说法(本轮实测推翻) 1. **不是静默失败**。我先前说"超出的 local 静默退化为全局" —— 错。 LuaJIT 与 luac 都在第 201 个报**编译错误**。危险度远低于我所说。 2. **`adaptersDir` 为 nil 的真实原因不是"local 被顶掉"** —— 它定义在 **`ZCODE_ADAPTER_SRC` 长字符串内部**(适配器源码文本), 在**适配器沙箱**里执行,而那里没有 `__llmsproxy_plugin_dir`、没有文件系统。 所以 zcode 的 `loadAnthropic` 必然返回 nil、BASE=nil (它自写了全部转换所以功能没问题,但"复用 anthropic、协议不漂移"的 设计意图从未生效)。 ⇒ **教训**:读 10000+ 行的 Lua 文件时,先扫出所有长字符串区间; 落在里面的"函数定义"只是文本,不属于插件作用域。