mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
按发布纪律回流。**注意这是内容对齐而非 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 ./...` 通过。
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package core
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"os"
|
||
"testing"
|
||
|
||
"llmsproxy/internal/lua"
|
||
)
|
||
|
||
// 手工移植的确定性派生必须与参考**逐字节一致**,否则签名的设备身份是错的
|
||
// 且不会报错(上游只会返回风控/失败)。所以拿参考实现(Node + node:crypto)
|
||
// 生成期望值,再让插件的 Lua 实现算同一组输入做差分。
|
||
//
|
||
// 期望值由 tools/trae_derive_expected.json 提供(用参考 seededStream 生成)。
|
||
func TestTraeDeriveMatchesReference(t *testing.T) {
|
||
raw, err := os.ReadFile("trae_derive_expected.json")
|
||
if err != nil {
|
||
t.Skipf("缺差分数据(跳过): %v", err)
|
||
}
|
||
var cases []struct {
|
||
U string `json:"u"`
|
||
Devid string `json:"devid"`
|
||
Market string `json:"market"`
|
||
Sess string `json:"sess"`
|
||
}
|
||
if err := json.Unmarshal(raw, &cases); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
c := kernelTestCore(t)
|
||
ps := c.Plugins()
|
||
src, err := readBundledChannels(t)
|
||
if err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
if err := ps.LoadSource("channels", src); err != nil {
|
||
t.Fatal(err)
|
||
}
|
||
|
||
for _, tc := range cases {
|
||
got, err := ps.Call("channels", "__trae_derive_probe", map[string]interface{}{"uid": tc.U})
|
||
if err != nil {
|
||
t.Fatalf("probe %q: %v", tc.U, err)
|
||
}
|
||
wrapped, _ := got.(map[string]interface{})
|
||
m, _ := wrapped["json"].(map[string]interface{})
|
||
if m == nil {
|
||
t.Fatalf("probe %q 无 json: %#v", tc.U, got)
|
||
}
|
||
if fmt.Sprint(m["devid"]) != tc.Devid {
|
||
t.Errorf("devid(%q) = %v,参考 %s", tc.U, m["devid"], tc.Devid)
|
||
}
|
||
if fmt.Sprint(m["market"]) != tc.Market {
|
||
t.Errorf("market(%q) = %v,参考 %s", tc.U, m["market"], tc.Market)
|
||
}
|
||
if fmt.Sprint(m["sess"]) != tc.Sess {
|
||
t.Errorf("sess(%q) = %v,参考 %s", tc.U, m["sess"], tc.Sess)
|
||
}
|
||
}
|
||
_ = lua.HandlerRequest{}
|
||
}
|