mirror of
https://gitcode.com/JianFeeeee/ModelRouter.git
synced 2026-11-07 09:47:23 +00:00
G-Star 合规要求下,把"模拟官方客户端、复刻私有协议、自动领取平台额度"这一类 能力整体移出仓库。这些实现依赖各平台未公开的端点、签名算法与官方 client id, 属于绕过客户端校验获取额度,风险高于普通协议适配。 移除(93 个文件): - 适配器:opencodezen(伪装 UA 取免费池)、trae、buddy、kimicode - 插件:channels.lua(12 个平台登录/领额度/签到)、quota.lua(厂商额度探针) - 随之删除的 78 个渠道/额度专用测试与 3 份渠道文档 同时修掉的既有问题: - **硬编码第三方 OAuth client_secret**(Google Cloud Code 的 GOCSPX-…,两处) 随 channels.lua 一起消失。 - `deploy.sh` 的 `sync_plugins` 整段删除:它仍按"内置插件是发行物"的旧前提 把插件复制/覆盖进 plugin_dir,与"插件属运维资产、网关不安装不覆盖"的契约 冲突。现在部署脚本只同步适配器与二进制/配置。 - 适配器清单去掉已移除项;e2e 配置改用显式 `auto:` 链(`models.priority` 早已 移除,该测试此前已失效)。 保留(公开协议):openai / anthropic / gemini / deepseek / github / groq / mistral / ollama / qwen38 / sensenova = 10 个适配器;插件示例 billing / usage。 验证:go build -tags luajit ./... OK;internal/lua 21.4s、provider、core 51s、 gateway 122.8s、e2e 9.0s 全绿。
116 lines
4.0 KiB
Go
116 lines
4.0 KiB
Go
package lua
|
||
|
||
import (
|
||
"os"
|
||
"regexp"
|
||
"strings"
|
||
"testing"
|
||
)
|
||
|
||
// 侧边栏图标判据 —— 覆盖**所有**带页面的插件,不只是 billing。
|
||
//
|
||
// 为什么需要这个测试
|
||
// ------------------
|
||
// billing 当年声明了 icon = "",WebUI 把空串原样塞进按钮 ⇒ 侧边栏那条是空白。
|
||
// 当时只给 billing 加了判据(TestPluginIconIsNotARawEmoji)。后来 channels
|
||
// 声明 icon = ""、quota 连 icon 字段都没有 ⇒ 同样的"空白条目"缺陷又一次出现,
|
||
// 而判据只管 billing,所以全绿。
|
||
//
|
||
// 这就是"判据只覆盖出错的那一个文件"的代价:同类缺陷换个文件复发时没有任何
|
||
// 东西会响。本文件把范围改成**按页面遍历**,新增带页面的插件自动纳入。
|
||
|
||
// pageIcons 返回 插件文件 -> 其 page.icon 的声明值。
|
||
//
|
||
// 只认 page.icon(侧边栏读的就是它),不认顶层的其他 icon 字段 —— 那些不影响
|
||
// 侧边栏渲染,混进来会给出假绿。
|
||
func pageIcons(t *testing.T, path string) []string {
|
||
t.Helper()
|
||
b, err := os.ReadFile(path)
|
||
if err != nil {
|
||
t.Fatalf("读 %s 失败: %v", path, err)
|
||
}
|
||
src := string(b)
|
||
|
||
// 短字符串:icon = "..."
|
||
shortRe := regexp.MustCompile(`(?m)^\s*icon\s*=\s*"([^"]*)"`)
|
||
// 长字符串:icon = [==[ ... ]==](inline SVG 没法写成短字符串而不转义所有引号)
|
||
longRe := regexp.MustCompile(`(?s)\bicon\s*=\s*\[==\[(.*?)\]==\]`)
|
||
|
||
var out []string
|
||
for _, m := range shortRe.FindAllStringSubmatch(src, -1) {
|
||
out = append(out, m[1])
|
||
}
|
||
for _, m := range longRe.FindAllStringSubmatch(src, -1) {
|
||
out = append(out, m[1])
|
||
}
|
||
return out
|
||
}
|
||
|
||
// 带页面(plugin.ui.page)的插件。新增页面插件要登记在这里 ——
|
||
// 这是一份"必须被覆盖的清单",漏登记会让新插件逃避判据。
|
||
var pagePlugins = []string{
|
||
"plugins/billing.lua",
|
||
}
|
||
|
||
// TestEveryPagePluginDeclaresSVGIcon 钉住"每个带页面的插件都有 inline SVG 图标"。
|
||
//
|
||
// 两个必查项,各自对应一种真实缺陷:
|
||
// - 缺 icon / 空串 ⇒ 侧边栏空白(实测症状)
|
||
// - emoji ⇒ 尺寸不跟原生 tab、忽略主题色(billing 的历史缺陷)
|
||
func TestEveryPagePluginDeclaresSVGIcon(t *testing.T) {
|
||
for _, p := range pagePlugins {
|
||
t.Run(p, func(t *testing.T) {
|
||
icons := pageIcons(t, p)
|
||
if len(icons) == 0 {
|
||
t.Fatalf("%s 有任何 page 却没有任何 icon 声明 —— 侧边栏那条会是空白", p)
|
||
}
|
||
// 只断言"至少有一个非空且是 SVG":一个文件可能有多个页面,
|
||
// 但不能为了通过而声明一个空图标。
|
||
var ok bool
|
||
for _, ic := range icons {
|
||
if strings.TrimSpace(ic) == "" {
|
||
continue
|
||
}
|
||
if isEmojiIcon(ic) {
|
||
t.Errorf("%s 的 page icon 是 emoji %q —— 原生 tab 用 inline SVG"+
|
||
"(stroke: currentColor),emoji 尺寸不一致且不跟主题", p, ic)
|
||
continue
|
||
}
|
||
if !strings.Contains(ic, "<svg") {
|
||
t.Errorf("%s 的 page icon 不是 SVG 标记: %q", p, ic)
|
||
continue
|
||
}
|
||
ok = true
|
||
}
|
||
if !ok {
|
||
t.Errorf("%s 没有可用的 SVG page icon(声明的全是空串/emoji/非 SVG)", p)
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
// TestIconUsesCurrentColor 钉住图标**跟随主题色**。
|
||
//
|
||
// 参考插件的图标工厂(src/sponsor.js:52)统一用
|
||
// `stroke="currentColor"` + `strokeWidth 1.6`。写死颜色("#333"、"black")
|
||
// 会让图标在深色主题下几乎看不见 —— 那是同一个"图标不对"投诉的另一半。
|
||
func TestIconUsesCurrentColor(t *testing.T) {
|
||
for _, p := range pagePlugins {
|
||
t.Run(p, func(t *testing.T) {
|
||
for _, ic := range pageIcons(t, p) {
|
||
if strings.TrimSpace(ic) == "" || isEmojiIcon(ic) {
|
||
continue
|
||
}
|
||
if !strings.Contains(ic, "currentColor") {
|
||
t.Errorf("%s 的 icon 没写 stroke/fill=currentColor —— "+
|
||
"写死颜色在深色主题下不可见: %s", p, ic)
|
||
}
|
||
// 写死颜色的显式反例:出现 #rrggbb 或 rgb( 就报
|
||
if regexp.MustCompile(`#[0-9a-fA-F]{3,8}\b|rgba?\(`).MatchString(ic) {
|
||
t.Errorf("%s 的 icon 里含写死颜色: %s", p, ic)
|
||
}
|
||
}
|
||
})
|
||
}
|
||
}
|