dsh-zen-free 1.1.0 → 1.2.0
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/lib/index.js +103 -0
- package/package.json +47 -47
package/lib/index.js
CHANGED
|
@@ -984,6 +984,108 @@ const adapter = {
|
|
|
984
984
|
},
|
|
985
985
|
};
|
|
986
986
|
|
|
987
|
+
/**
|
|
988
|
+
* 设置页命名空间。
|
|
989
|
+
*
|
|
990
|
+
* 必须等于本插件在 profile 里的 loader 条目 id(`cordis.patch.yml` 的
|
|
991
|
+
* `insert[].id`),因为 `settings.describe()` 用 `entry.options.id` 作为 ns,
|
|
992
|
+
* 而模型页的供应商目录用 `settingsNs` 去这张表里找 namespace 来判定「已配置」。
|
|
993
|
+
* 两者对不上,供应商就只会掉进「+ 添加模型提供商」的候选列表。
|
|
994
|
+
*/
|
|
995
|
+
const SETTINGS_NS = 'zenfree';
|
|
996
|
+
|
|
997
|
+
/**
|
|
998
|
+
* 插件 Config schema。
|
|
999
|
+
*
|
|
1000
|
+
* 这不是装饰:`settings.describe()` 只登记那些 `entry.fiber.runtime.Config`
|
|
1001
|
+
* 存在且带 `toJSON` 的条目,而 `runtime.Config` 就是插件的具名导出 `Config`。
|
|
1002
|
+
* 没有它,`zenfree` 这个 namespace 在设置页里不存在,模型页就无法把供应商
|
|
1003
|
+
* 判为已配置 —— 表现为「模型列表能用,但供应商设置里找不到它」。
|
|
1004
|
+
*
|
|
1005
|
+
* 这里刻意不 import `@deepseek-ai/schemastery`(第三方插件在 profile 的
|
|
1006
|
+
* node_modules 下解析不到官方包),而是手写它的 JSON 序列化形状。
|
|
1007
|
+
*
|
|
1008
|
+
* 形状必须是 **带 uid 引用表** 的形式(`{uid, refs}`),节点之间用 refs 的下标
|
|
1009
|
+
* 字符串互相引用 —— 这是 `toJSON()` 的产出,也是 `new z(json)` 唯一能正确
|
|
1010
|
+
* 重建 dict/inner 关系的输入形式。用内联对象写 `inner` 虽然能被 `new z()`
|
|
1011
|
+
* 接受,但 settings 的 `plainSchema()` 会先 `toJSON()` 再 `new z()`,
|
|
1012
|
+
* 往返时内联的 dict 值会被丢掉(`dict.models` 变成 undefined),随后
|
|
1013
|
+
* 设置页遍历节点时直接抛错。所以下面严格按官方 refs 形状写。
|
|
1014
|
+
*/
|
|
1015
|
+
function defineConfigSchema() {
|
|
1016
|
+
/**
|
|
1017
|
+
* refs 表:0=根 object,1=dict(models),2=模型 object,3~5=模型的三项字段,
|
|
1018
|
+
* 6=dict 的键类型(string)。
|
|
1019
|
+
*/
|
|
1020
|
+
const refs = {
|
|
1021
|
+
0: {
|
|
1022
|
+
type: 'object',
|
|
1023
|
+
meta: { default: {}, volatile: true, description: 'zenfree 免费池供应商配置' },
|
|
1024
|
+
dict: { models: 1 },
|
|
1025
|
+
},
|
|
1026
|
+
1: { type: 'dict', meta: { default: {}, volatile: true, description: '按模型 id 索引的设置' }, inner: 2, sKey: 6 },
|
|
1027
|
+
2: {
|
|
1028
|
+
type: 'object',
|
|
1029
|
+
meta: { default: {}, description: '单个 zenfree 模型的运行期设置' },
|
|
1030
|
+
dict: { contextWindow: 3, maxTokens: 4, input: 5 },
|
|
1031
|
+
},
|
|
1032
|
+
3: { type: 'number', meta: { default: CONTEXT_WINDOW, description: '上下文窗口(token)' } },
|
|
1033
|
+
4: { type: 'number', meta: { default: DEFAULT_MAX_TOKENS, description: '单次输出上限(token)' } },
|
|
1034
|
+
5: { type: 'array', meta: { default: [...MODALITIES], description: '输入模态:text / image' }, inner: 7 },
|
|
1035
|
+
6: { type: 'string', meta: {} },
|
|
1036
|
+
7: { type: 'string', meta: {} },
|
|
1037
|
+
};
|
|
1038
|
+
|
|
1039
|
+
return {
|
|
1040
|
+
/** schemastery 序列化形状;settings 的 plainSchema() 会用它重建一份可编辑副本。 */
|
|
1041
|
+
toJSON: () => ({ uid: 0, refs }),
|
|
1042
|
+
/** Standard Schema 校验入口:把插件配置归一成 {models} 形状。 */
|
|
1043
|
+
'~standard': {
|
|
1044
|
+
version: 1,
|
|
1045
|
+
vendor: PACKAGE_NAME,
|
|
1046
|
+
validate(value) {
|
|
1047
|
+
const raw = value === null || typeof value !== 'object' ? {} : value;
|
|
1048
|
+
const models = raw.models === null || typeof raw.models !== 'object' ? {} : raw.models;
|
|
1049
|
+
return { value: { ...raw, models: { ...models } } };
|
|
1050
|
+
},
|
|
1051
|
+
},
|
|
1052
|
+
};
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
/** 插件的 Config 导出:让 `zenfree` 成为设置页可解析的命名空间。 */
|
|
1056
|
+
export const Config = defineConfigSchema();
|
|
1057
|
+
|
|
1058
|
+
/**
|
|
1059
|
+
* 把 zenfree 登记进「可配置供应商目录」。
|
|
1060
|
+
*
|
|
1061
|
+
* 模型页的供应商列表来自 `llm.listConfigurableProviders()`,而它只返回
|
|
1062
|
+
* `registerConfigurableProviders()` 登记过的条目。只调 `registerAdapter()`
|
|
1063
|
+
* 时模型能用、但供应商列表里没有这一行 —— 这正是要补的那半边。
|
|
1064
|
+
*
|
|
1065
|
+
* `settingsPath` 取空数组:该供应商的配置整体就是命名空间本身(不是
|
|
1066
|
+
* `providers.<name>` 那种子路径),模型页据此把这一行判为「已配置」并
|
|
1067
|
+
* 直接渲染成可编辑的供应商卡片。
|
|
1068
|
+
*
|
|
1069
|
+
* 失败不阻断模型路由:目录只是展示层,拿不到就只是少一行。
|
|
1070
|
+
*
|
|
1071
|
+
* @param ctx - 插件上下文。
|
|
1072
|
+
*/
|
|
1073
|
+
function setupDirectory(ctx) {
|
|
1074
|
+
if (typeof ctx.llm?.registerConfigurableProviders !== 'function') return;
|
|
1075
|
+
try {
|
|
1076
|
+
ctx.llm.registerConfigurableProviders([
|
|
1077
|
+
{
|
|
1078
|
+
provider: PROVIDER_ID,
|
|
1079
|
+
displayName: PROVIDER_NAME,
|
|
1080
|
+
settingsNs: SETTINGS_NS,
|
|
1081
|
+
settingsPath: [],
|
|
1082
|
+
},
|
|
1083
|
+
]);
|
|
1084
|
+
} catch {
|
|
1085
|
+
// 目录登记失败(例如同名 provider 已被声明):模型照常可用。
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
|
|
987
1089
|
/**
|
|
988
1090
|
* 挂载:注册 zenfree 路由,并把配置/统计服务暴露给设置页。
|
|
989
1091
|
*
|
|
@@ -997,6 +1099,7 @@ const adapter = {
|
|
|
997
1099
|
export function apply(ctx, config) {
|
|
998
1100
|
modelSettings = resolveModelSettings(config);
|
|
999
1101
|
ctx.llm.registerAdapter([PROVIDER_ID], adapter);
|
|
1102
|
+
setupDirectory(ctx);
|
|
1000
1103
|
setupRemotes(ctx, config);
|
|
1001
1104
|
}
|
|
1002
1105
|
|
package/package.json
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-zen-free",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "OpenCode Zen 免费池供应商:往 DSH 注册 zenfree 路由与 ds4.1f / glm5.3f 两个免费模型,无需 API Key,请求强制直连(不走任何代理),并带模型配置与请求统计设置页。",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"main": "./lib/index.js",
|
|
8
|
-
"exports": {
|
|
9
|
-
".": "./lib/index.js",
|
|
10
|
-
"./client": "./lib/client.js",
|
|
11
|
-
"./package.json": "./package.json"
|
|
12
|
-
},
|
|
13
|
-
"files": [
|
|
14
|
-
"lib/index.js",
|
|
15
|
-
"lib/client.js",
|
|
16
|
-
"cordis.patch.yml",
|
|
17
|
-
"README.md"
|
|
18
|
-
],
|
|
19
|
-
"engines": {
|
|
20
|
-
"node": ">=18"
|
|
21
|
-
},
|
|
22
|
-
"keywords": [
|
|
23
|
-
"dsh",
|
|
24
|
-
"dsh-plugin",
|
|
25
|
-
"dshapp-plugin",
|
|
26
|
-
"llm",
|
|
27
|
-
"provider",
|
|
28
|
-
"opencode-zen",
|
|
29
|
-
"free"
|
|
30
|
-
],
|
|
31
|
-
"dsh": {
|
|
32
|
-
"bundle": {
|
|
33
|
-
"patch": "./cordis.patch.yml"
|
|
34
|
-
},
|
|
35
|
-
"client": {
|
|
36
|
-
"inject": [
|
|
37
|
-
"@deepseek-ai/dsh-client-locale",
|
|
38
|
-
"@deepseek-ai/dsh-client-ui-settings",
|
|
39
|
-
"@deepseek-ai/dsh-api-remotes"
|
|
40
|
-
],
|
|
41
|
-
"platform": "web"
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
"peerDependencies": {
|
|
45
|
-
"@deepseek-ai/cordis": "^4.0.2"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-zen-free",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "OpenCode Zen 免费池供应商:往 DSH 注册 zenfree 路由与 ds4.1f / glm5.3f 两个免费模型,无需 API Key,请求强制直连(不走任何代理),并带模型配置与请求统计设置页。",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./lib/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./lib/index.js",
|
|
10
|
+
"./client": "./lib/client.js",
|
|
11
|
+
"./package.json": "./package.json"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"lib/index.js",
|
|
15
|
+
"lib/client.js",
|
|
16
|
+
"cordis.patch.yml",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"dsh",
|
|
24
|
+
"dsh-plugin",
|
|
25
|
+
"dshapp-plugin",
|
|
26
|
+
"llm",
|
|
27
|
+
"provider",
|
|
28
|
+
"opencode-zen",
|
|
29
|
+
"free"
|
|
30
|
+
],
|
|
31
|
+
"dsh": {
|
|
32
|
+
"bundle": {
|
|
33
|
+
"patch": "./cordis.patch.yml"
|
|
34
|
+
},
|
|
35
|
+
"client": {
|
|
36
|
+
"inject": [
|
|
37
|
+
"@deepseek-ai/dsh-client-locale",
|
|
38
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
39
|
+
"@deepseek-ai/dsh-api-remotes"
|
|
40
|
+
],
|
|
41
|
+
"platform": "web"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@deepseek-ai/cordis": "^4.0.2"
|
|
46
|
+
}
|
|
47
|
+
}
|