mslxdff 0.1.237 → 0.1.238
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/package.json
CHANGED
|
@@ -10,6 +10,8 @@ import { AUTH_DOC_PROVIDER_IDS } from "../../../runtime/provider-gate.js";
|
|
|
10
10
|
// 保留子命令:这些词归 provider/ 下别的 handler 管,掉到 keys 兜底 = 该 provider 没接线。
|
|
11
11
|
// 名单 = 各 handler 实际比对的 sub 值全集(keys.js 自己认的 list/status/add/remove/clear 不在内)。
|
|
12
12
|
// 新增 handler 时同步这里;漏收的后果是那个词能被当 key 写盘。
|
|
13
|
+
/** 覆盖式写 keys 时,单个候选 token 的最小可信长度(闸 3 判据:真 key 都远长于此)。 */
|
|
14
|
+
export const MIN_KEY_CHARS = 11;
|
|
13
15
|
export const RESERVED_PROVIDER_SUBS = new Set([
|
|
14
16
|
"login", "auth", "oauth", "checkin", "signin", "quota", "credits", "balance",
|
|
15
17
|
"migrate", "free", "bench", "benchmark", "eval", "test",
|
|
@@ -17,6 +19,7 @@ export const RESERVED_PROVIDER_SUBS = new Set([
|
|
|
17
19
|
"set-url", "set-models-path", "set-chat-path", "url", "seturl", "setmodelspath", "setchatpath",
|
|
18
20
|
"allowlist", "allow", "allowed", "allowany", "allow-any", "allow_any", "whitelist",
|
|
19
21
|
"del", "delete", "rm", "remove-provider", "del-provider", "import", "import-desktop", "from-desktop",
|
|
22
|
+
"help", "usage", "usage-all",
|
|
20
23
|
]);
|
|
21
24
|
|
|
22
25
|
/**
|
|
@@ -46,5 +49,22 @@ export function keysWriteDenial(id, sub, rest = []) {
|
|
|
46
49
|
` 确知自己在做什么 → 末尾加 --force 重跑`,
|
|
47
50
|
];
|
|
48
51
|
}
|
|
52
|
+
// 闸 3:形状闸。2026-10-24 复现同类事故 —— `mslxdff -provider codearts help` 里 `help` 既不是
|
|
53
|
+
// 保留 verb(闸 1 名单里没有它),codearts 又不属于 auth 号型六家(闸 2 不管它),于是 `help` 一路
|
|
54
|
+
// 掉进「未知即当 key」的兜底分支,把 providerConfigs.codearts.keys 的 2 条真凭据整组覆盖成 "help"。
|
|
55
|
+
// 判据:真 key 的长度都远超 10 字符(openrouter ~73、traework accessToken 实测 1004、codearts blob
|
|
56
|
+
// 上千),而 ≤10 字符的裸词几乎必然是打错位置的子命令/模型名/文件名 —— 覆盖式 set 写进去就是当场废号。
|
|
57
|
+
// 逃生阀:`--force`,或改走只追加、不覆盖的 `add`。
|
|
58
|
+
const shortTokens = rest
|
|
59
|
+
.map((k) => String(k || "").trim())
|
|
60
|
+
.filter((k) => k && !k.startsWith("-") && k.length < MIN_KEY_CHARS);
|
|
61
|
+
if (shortTokens.length && !rest.includes("--force")) {
|
|
62
|
+
return [
|
|
63
|
+
`✗ -provider ${id} ${sub}:疑似把「${shortTokens.join("、")}」当 API key 覆盖 ${id} 现有 keys —— 已拒绝,配置未改动`,
|
|
64
|
+
` 拦截原因:key 长度不足 ${MIN_KEY_CHARS} 字符(真 key 都远长于此),多半是子命令/模型名打错了位置。`,
|
|
65
|
+
` ${id} 支持什么:mslxdff -provider ${id} list`,
|
|
66
|
+
` 确知是短 key(自建桩服务)→ 末尾加 --force 重跑,或走只追加的 mslxdff -provider ${id} add <key>`,
|
|
67
|
+
];
|
|
68
|
+
}
|
|
49
69
|
return null;
|
|
50
70
|
}
|
|
@@ -44,12 +44,19 @@ export const MAAS_TYPE_HEADER = "maas_type";
|
|
|
44
44
|
export const MAAS_BENEFIT = "benefit";
|
|
45
45
|
|
|
46
46
|
// 冷启动种子:福利套餐轮换后新模型在首次发现前也按福利路由(宁多带不少带,少带即 404)。
|
|
47
|
-
// 现网取证 2026-10-16(福利网关 /api/v1/gateway/config,error_code=0000)共 4 位:下列
|
|
48
|
-
|
|
49
|
-
//
|
|
47
|
+
// 现网取证 2026-10-16(福利网关 /api/v1/gateway/config,error_code=0000)共 4 位:下列 id 逐字对齐上游。
|
|
48
|
+
// 2026-10-24 再取证:`deepseek-v4.1-flash` 已转 builtin 正式模型(福利网关该号已空)。它留在福利种子里
|
|
49
|
+
// 是有害的 —— preheat 未回来时带福利头 → InferHub.4004.200 benefit not found,不带才 200。故移出、转入正式表。
|
|
50
|
+
export const SEED_BENEFIT_MODELS = ["deepseek-v4-flash-0731", "deepseek-v4-pro-0813", "glm-5.3-flash"];
|
|
51
|
+
// 内置模型种子(仅用于大小写归一,不标福利)。id 一律写上游真正的 model_id 大小写:
|
|
52
|
+
// `deepseek-v4.1-flash` 是全小写,`GLM-5.2` 就是混合大小写——猜错即 InferHub.002002009.404。
|
|
50
53
|
export const SEED_KNOWN_MODELS = [
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
// 现网取证 2026-10-24(builtin 路真 model_id 逐字):这些就是全小写,展示名(OpenPangu-2.0-Pro /
|
|
55
|
+
// GLM-5.3 / Kimi-K3)出自 agent-center 的 model_name,当 id 发上去必 InferHub.002002009.404。
|
|
56
|
+
// 同名漂移记在 name 字段,不占用 id:GLM-5.2-ArkTS-SPARK 的真 id 是 glm-5.2-sft-harmony。
|
|
57
|
+
"deepseek-v4.1-flash", "glm-5.3", "kimi-k3", "openpangu-2.0-pro", "openpangu-2.0-flash",
|
|
58
|
+
"glm-5.2-sft-harmony", "kimi-k2.6-vl",
|
|
59
|
+
"GLM-5.2", "GLM-5.1", "GLM-4.7",
|
|
53
60
|
"Qwen3-VL-235B", "Qwen3.5-397B-A17B-VL", "Qwen3.6-27B-VL",
|
|
54
61
|
];
|
|
55
62
|
|
|
@@ -14,8 +14,19 @@ const lower = (s) => String(s || "").trim().toLowerCase();
|
|
|
14
14
|
|
|
15
15
|
export function createCatalog() {
|
|
16
16
|
const known = new Map(); // lower → 精确 ID(种子 + 已发现,大小写归一单点)
|
|
17
|
+
const knownReal = new Set(); // 该精确 ID 出自上游真正的 model_id(不是展示名兜底)
|
|
18
|
+
|
|
19
|
+
// id 权威性:真正的 model_id > 展示名(agent-center 无 model_id 时拿 model_name 顶包,
|
|
20
|
+
// 发上去必 InferHub.002002009.404);同级才用历史规则「非小写的精确大小写覆盖小写」。
|
|
21
|
+
function noteKnown(key, id, byModelId) {
|
|
22
|
+
if (!known.has(key)) { known.set(key, id); if (byModelId) knownReal.add(key); return; }
|
|
23
|
+
if (byModelId && !knownReal.has(key)) { known.set(key, id); knownReal.add(key); return; }
|
|
24
|
+
if (!!byModelId === knownReal.has(key) && id !== key && known.get(key) === key) known.set(key, id);
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
for (const id of [...SEED_KNOWN_MODELS, ...SEED_BENEFIT_MODELS]) {
|
|
18
|
-
|
|
28
|
+
const key = lower(id);
|
|
29
|
+
if (key) noteKnown(key, id, false); // 种子按展示名记账:真 model_id 一发现就覆盖它
|
|
19
30
|
}
|
|
20
31
|
const accounts = new Map(); // userId → {models, benefit:Set, knows:Set, lastBenefit:Map, fetched}
|
|
21
32
|
|
|
@@ -28,7 +39,7 @@ export function createCatalog() {
|
|
|
28
39
|
const key = lower(m.id);
|
|
29
40
|
ac.knows.add(key);
|
|
30
41
|
if (m.benefit) { ac.benefit.add(key); ac.lastBenefit.set(key, m); }
|
|
31
|
-
|
|
42
|
+
noteKnown(key, m.id, m.byModelId);
|
|
32
43
|
ac.models.push(m);
|
|
33
44
|
}
|
|
34
45
|
if (keepBenefit) {
|
|
@@ -38,7 +49,7 @@ export function createCatalog() {
|
|
|
38
49
|
ac.benefit.add(key);
|
|
39
50
|
ac.knows.add(key);
|
|
40
51
|
ac.models.push(mi);
|
|
41
|
-
|
|
52
|
+
noteKnown(key, mi.id, mi.byModelId);
|
|
42
53
|
}
|
|
43
54
|
ac.models.sort((a, b) => (lower(a.id) < lower(b.id) ? -1 : lower(a.id) > lower(b.id) ? 1 : (a.id < b.id ? -1 : 1)));
|
|
44
55
|
}
|
|
@@ -72,7 +83,7 @@ export function createCatalog() {
|
|
|
72
83
|
return { setAccount, isBenefit, canonical, accountModels, isStale };
|
|
73
84
|
}
|
|
74
85
|
|
|
75
|
-
/** 多路合并:按小写 ID
|
|
86
|
+
/** 多路合并:按小写 ID 去重,福利标记取或,真 model_id 优先 > 参数更全 > 精确大小写,按小写 ID 排序。 */
|
|
76
87
|
export function mergeModels(sets) {
|
|
77
88
|
const merged = new Map();
|
|
78
89
|
for (const set of sets || []) {
|
|
@@ -81,7 +92,11 @@ export function mergeModels(sets) {
|
|
|
81
92
|
const key = lower(m.id);
|
|
82
93
|
const cur = merged.get(key);
|
|
83
94
|
if (!cur) { merged.set(key, { ...m }); continue; }
|
|
84
|
-
|
|
95
|
+
// 上游真正的 model_id 优先于展示名:agent-center 那份只有 model_name(DeepSeek-V4.1-Flash),
|
|
96
|
+
// builtin 那份才是可请求的 id(deepseek-v4.1-flash);发错大小写 = InferHub.002002009.404。
|
|
97
|
+
const keep = !!m.byModelId !== !!cur.byModelId
|
|
98
|
+
? (m.byModelId ? m : cur)
|
|
99
|
+
: ((m.contextWindow > 0 && !cur.contextWindow) || (m.id !== lower(m.id) && cur.id === lower(cur.id)) ? m : cur);
|
|
85
100
|
const drop = keep === m ? cur : m;
|
|
86
101
|
merged.set(key, {
|
|
87
102
|
...keep,
|
|
@@ -130,6 +145,9 @@ const toModelInfo = (m, { benefit = false } = {}) => {
|
|
|
130
145
|
if (!id) return null;
|
|
131
146
|
return {
|
|
132
147
|
id: String(id),
|
|
148
|
+
// 出处记账:只有真正的 model_id 字段才敢当「发给上游的 id」;靠 model_name/modelAlias
|
|
149
|
+
// 兜底出来的是展示名,上游 InferHub 不认(现网 2026-10-24:DeepSeek-V4.1-Flash 必 404)。
|
|
150
|
+
byModelId: !!m?.model_id,
|
|
133
151
|
name: String(m?.model_name || id),
|
|
134
152
|
contextWindow: Number(m?.context_window) || 0,
|
|
135
153
|
maxTokens: Number(m?.max_tokens) || 0,
|