@diy-agent/model-config-page 0.0.0-stage → 0.1.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/actions.d.ts +8 -0
- package/actions.js +140 -0
- package/actions.js.map +1 -0
- package/errors.d.ts +4 -0
- package/errors.js +10 -0
- package/errors.js.map +1 -0
- package/format.d.ts +9 -0
- package/format.js +29 -0
- package/format.js.map +1 -0
- package/index.d.ts +11 -0
- package/index.js +47 -0
- package/index.js.map +1 -0
- package/package.json +27 -4
- package/shared.d.ts +51 -0
- package/shared.js +6 -0
- package/shared.js.map +1 -0
- package/view.d.ts +3 -0
- package/view.js +386 -0
- package/view.js.map +1 -0
- package/README.md +0 -3
package/actions.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ConfigSnapshot, WriteResult } from './shared.js';
|
|
2
|
+
/** 读整页快照(**不含任何 key 值**) */
|
|
3
|
+
export declare function readSnapshot(home: string): ConfigSnapshot;
|
|
4
|
+
export { accountLabel, groupModels, modelKeyOf, savedAccountLabel } from "./format.js";
|
|
5
|
+
export declare function saveProviderAction(home: string, args: unknown): ConfigSnapshot;
|
|
6
|
+
export declare function removeProviderAction(home: string, args: unknown): ConfigSnapshot;
|
|
7
|
+
export declare function saveAccountAction(home: string, args: unknown): WriteResult;
|
|
8
|
+
export declare function saveDefaultModelAction(home: string, args: unknown): ConfigSnapshot;
|
package/actions.js
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// actions.ts — 读 / 写配置的**纯函数**(不碰 DOM、不认识 Electron)。
|
|
2
|
+
//
|
|
3
|
+
// 文件 I/O 全部落在 @diy-agent/model-catalog(读侧 catalog.ts / 写侧 write.ts);
|
|
4
|
+
// 本文件只做三件事:
|
|
5
|
+
// ① 把「文件内容」投影成页面要的 ConfigSnapshot(脱敏在这一层完成,key 到此为止)
|
|
6
|
+
// ② 把 renderer 传来的 unknown 参数校验成 catalog 的入参(形状不对就抛,不猜)
|
|
7
|
+
// ③ 写后回一份新快照,renderer 不必自己拼第二份状态
|
|
8
|
+
import { listAccountStates, listProviders, loadCatalog, readDefaultModel, removeProvider, saveAccount, saveDefaultModel, saveProvider, } from '@diy-agent/model-catalog';
|
|
9
|
+
import { ModelConfigPageError } from './errors.js';
|
|
10
|
+
/** 读整页快照(**不含任何 key 值**) */
|
|
11
|
+
export function readSnapshot(home) {
|
|
12
|
+
const states = new Map(listAccountStates(home).map((item) => [item.providerId, item.accounts]));
|
|
13
|
+
const models = loadCatalog(home).map((entry) => ({
|
|
14
|
+
providerId: entry.providerId,
|
|
15
|
+
modelId: entry.modelId,
|
|
16
|
+
name: entry.name,
|
|
17
|
+
...(entry.contextWindow === undefined ? {} : { contextWindow: entry.contextWindow }),
|
|
18
|
+
...(entry.cost === undefined ? {} : { cost: entry.cost }),
|
|
19
|
+
}));
|
|
20
|
+
return {
|
|
21
|
+
home,
|
|
22
|
+
providers: listProviders(home).map((item) => ({
|
|
23
|
+
...item,
|
|
24
|
+
accounts: (states.get(item.providerId) ?? []).map(accountView),
|
|
25
|
+
})),
|
|
26
|
+
models,
|
|
27
|
+
defaultModel: readDefaultModel(home),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function accountView(state) {
|
|
31
|
+
return {
|
|
32
|
+
name: state.name,
|
|
33
|
+
configured: state.configured,
|
|
34
|
+
env: state.env,
|
|
35
|
+
...(state.chars === undefined ? {} : { chars: state.chars }),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export { accountLabel, groupModels, modelKeyOf, savedAccountLabel } from "./format.js";
|
|
39
|
+
// ── 写方法(参数校验 + 调用 catalog + 回快照) ──────────
|
|
40
|
+
export function saveProviderAction(home, args) {
|
|
41
|
+
const input = recordOf(args, 'saveProvider');
|
|
42
|
+
const providerId = stringOf(input['providerId'], 'providerId');
|
|
43
|
+
const kind = input['kind'] === undefined ? undefined : kindOf(input['kind']);
|
|
44
|
+
const spec = input['spec'] === undefined ? undefined : specOf(input['spec']);
|
|
45
|
+
const models = input['models'] === undefined ? undefined : modelsOf(input['models']);
|
|
46
|
+
saveProvider(home, {
|
|
47
|
+
providerId,
|
|
48
|
+
...(kind === undefined ? {} : { kind }),
|
|
49
|
+
...(spec === undefined ? {} : { spec }),
|
|
50
|
+
...(models === undefined ? {} : { models }),
|
|
51
|
+
});
|
|
52
|
+
return readSnapshot(home);
|
|
53
|
+
}
|
|
54
|
+
export function removeProviderAction(home, args) {
|
|
55
|
+
const input = recordOf(args, 'removeProvider');
|
|
56
|
+
removeProvider(home, stringOf(input['providerId'], 'providerId'));
|
|
57
|
+
return readSnapshot(home);
|
|
58
|
+
}
|
|
59
|
+
export function saveAccountAction(home, args) {
|
|
60
|
+
const input = recordOf(args, 'saveAccount');
|
|
61
|
+
const providerId = stringOf(input['providerId'], 'providerId');
|
|
62
|
+
const name = stringOf(input['name'], 'name');
|
|
63
|
+
const value = stringOf(input['value'], 'value');
|
|
64
|
+
const saved = saveAccount(home, { providerId, name, value });
|
|
65
|
+
return {
|
|
66
|
+
snapshot: readSnapshot(home),
|
|
67
|
+
saved: { providerId: saved.providerId, name: saved.name, chars: saved.chars },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function saveDefaultModelAction(home, args) {
|
|
71
|
+
const input = recordOf(args, 'saveDefaultModel');
|
|
72
|
+
const modelKey = input['modelKey'];
|
|
73
|
+
if (modelKey !== null && typeof modelKey !== 'string') {
|
|
74
|
+
throw new ModelConfigPageError('model-config/bad-args', 'modelKey 必须是字符串或 null');
|
|
75
|
+
}
|
|
76
|
+
saveDefaultModel(home, modelKey === null ? null : stringOf(modelKey, 'modelKey'));
|
|
77
|
+
return readSnapshot(home);
|
|
78
|
+
}
|
|
79
|
+
// ── 内部校验 ─────────────────────────────────────
|
|
80
|
+
function recordOf(args, method) {
|
|
81
|
+
if (args === null || typeof args !== 'object' || Array.isArray(args)) {
|
|
82
|
+
throw new ModelConfigPageError('model-config/bad-args', `${method} 需要对象参数`);
|
|
83
|
+
}
|
|
84
|
+
return args;
|
|
85
|
+
}
|
|
86
|
+
function stringOf(value, field) {
|
|
87
|
+
if (typeof value !== 'string') {
|
|
88
|
+
throw new ModelConfigPageError('model-config/bad-args', `${field} 必须是字符串`);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
function kindOf(value) {
|
|
93
|
+
if (value !== 'std' && value !== 'custom') {
|
|
94
|
+
throw new ModelConfigPageError('model-config/bad-args', 'kind 只能是 std / custom');
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
function specOf(value) {
|
|
99
|
+
const input = recordOf(value, 'spec');
|
|
100
|
+
const out = {};
|
|
101
|
+
for (const key of ['id', 'npm', 'api']) {
|
|
102
|
+
const raw = input[key];
|
|
103
|
+
if (raw === undefined)
|
|
104
|
+
continue;
|
|
105
|
+
out[key] = stringOf(raw, `spec.${key}`);
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
function modelsOf(value) {
|
|
110
|
+
const input = recordOf(value, 'models');
|
|
111
|
+
const out = {};
|
|
112
|
+
for (const [modelId, raw] of Object.entries(input)) {
|
|
113
|
+
const patch = recordOf(raw, `models.${modelId}`);
|
|
114
|
+
const name = patch['name'] === undefined ? undefined : stringOf(patch['name'], 'name');
|
|
115
|
+
const contextWindow = patch['contextWindow'] === undefined ? undefined : numberOf(patch['contextWindow']);
|
|
116
|
+
const cost = patch['cost'] === undefined ? undefined : costOf(patch['cost']);
|
|
117
|
+
out[modelId] = {
|
|
118
|
+
...(name === undefined ? {} : { name }),
|
|
119
|
+
...(contextWindow === undefined ? {} : { contextWindow }),
|
|
120
|
+
...(cost === undefined ? {} : { cost }),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
function costOf(value) {
|
|
126
|
+
const input = recordOf(value, 'cost');
|
|
127
|
+
return {
|
|
128
|
+
input: numberOf(input['input']),
|
|
129
|
+
output: numberOf(input['output']),
|
|
130
|
+
...(input['cacheRead'] === undefined ? {} : { cacheRead: numberOf(input['cacheRead']) }),
|
|
131
|
+
...(input['cacheWrite'] === undefined ? {} : { cacheWrite: numberOf(input['cacheWrite']) }),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function numberOf(value) {
|
|
135
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
136
|
+
throw new ModelConfigPageError('model-config/bad-args', '数值字段必须是有限数字');
|
|
137
|
+
}
|
|
138
|
+
return value;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=actions.js.map
|
package/actions.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,EAAE;AACF,qEAAqE;AACrE,YAAY;AACZ,uDAAuD;AACvD,0DAA0D;AAC1D,mCAAmC;AAEnC,OAAO,EACH,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,YAAY,GAIf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,4BAA4B;AAC5B,MAAM,UAAU,YAAY,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,MAAM,GAAgB,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1D,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;QACpF,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;KAC5D,CAAC,CAAC,CAAC;IACJ,OAAO;QACH,IAAI;QACJ,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1C,GAAG,IAAI;YACP,QAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;SACjE,CAAC,CAAC;QACH,MAAM;QACN,YAAY,EAAE,gBAAgB,CAAC,IAAI,CAAC;KACvC,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,KAKpB;IACG,OAAO;QACH,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,GAAG,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;KAC/D,CAAC;AACN,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEvF,6CAA6C;AAE7C,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,IAAa;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrF,YAAY,CAAC,IAAI,EAAE;QACf,UAAU;QACV,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9C,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAa;IAC5D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC/C,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;IAClE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAa;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,GAAiB,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,OAAO;QACH,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC;QAC5B,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;KAChF,CAAC;AACN,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,IAAa;IAC9D,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;IACrF,CAAC;IACD,gBAAgB,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAClF,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,gDAAgD;AAEhD,SAAS,QAAQ,CAAC,IAAa,EAAE,MAAc;IAC3C,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,GAAG,MAAM,SAAS,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAA+B,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAa;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC1B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,uBAAuB,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,GAAG,GAAgD,EAAE,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAU,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,GAAG,KAAK,SAAS;YAAE,SAAS;QAChC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,GAAG,GAAuC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,OAAO,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACvF,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,GAAG,CAAC,OAAO,CAAC,GAAG;YACX,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YACvC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;YACzD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SAC1C,CAAC;IACN,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO;QACH,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;KAC9F,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,aAAa,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
|
package/errors.d.ts
ADDED
package/errors.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// errors.ts — 页面侧参数校验错误(配置文件的错误沿用 model-catalog 的 CatalogError)。
|
|
2
|
+
export class ModelConfigPageError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'ModelConfigPageError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.js.map
|
package/errors.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAClC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;CACJ"}
|
package/format.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AccountStateView, ModelView, SavedAccountView } from "./shared.js";
|
|
2
|
+
/** 账号状态的一行文字 —— 只有长度 / 环境引用,永不回显原值 */
|
|
3
|
+
export declare function accountLabel(account: AccountStateView): string;
|
|
4
|
+
/** 写后的账号提示(与 accountLabel 同一口径) */
|
|
5
|
+
export declare function savedAccountLabel(saved: SavedAccountView): string;
|
|
6
|
+
/** 模型限定名 `providerId/modelId`(modelId 自身可含 `/`,反解按第一个 `/`) */
|
|
7
|
+
export declare function modelKeyOf(providerId: string, modelId: string): string;
|
|
8
|
+
/** 把模型按 provider 分组(保持目录顺序) */
|
|
9
|
+
export declare function groupModels(models: readonly ModelView[]): Map<string, ModelView[]>;
|
package/format.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** 账号状态的一行文字 —— 只有长度 / 环境引用,永不回显原值 */
|
|
2
|
+
export function accountLabel(account) {
|
|
3
|
+
if (!account.configured)
|
|
4
|
+
return "未设置";
|
|
5
|
+
if (account.env)
|
|
6
|
+
return "已设置(环境变量)";
|
|
7
|
+
if (account.chars !== undefined)
|
|
8
|
+
return `已设置(${account.chars} 字符)`;
|
|
9
|
+
return "已设置";
|
|
10
|
+
}
|
|
11
|
+
/** 写后的账号提示(与 accountLabel 同一口径) */
|
|
12
|
+
export function savedAccountLabel(saved) {
|
|
13
|
+
return `已设置(${saved.chars} 字符)`;
|
|
14
|
+
}
|
|
15
|
+
/** 模型限定名 `providerId/modelId`(modelId 自身可含 `/`,反解按第一个 `/`) */
|
|
16
|
+
export function modelKeyOf(providerId, modelId) {
|
|
17
|
+
return `${providerId}/${modelId}`;
|
|
18
|
+
}
|
|
19
|
+
/** 把模型按 provider 分组(保持目录顺序) */
|
|
20
|
+
export function groupModels(models) {
|
|
21
|
+
const out = new Map();
|
|
22
|
+
for (const model of models) {
|
|
23
|
+
const list = out.get(model.providerId) ?? [];
|
|
24
|
+
list.push(model);
|
|
25
|
+
out.set(model.providerId, list);
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=format.js.map
|
package/format.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAMA,sCAAsC;AACtC,MAAM,UAAU,YAAY,CAAC,OAAyB;IAClD,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,OAAO,OAAO,CAAC,KAAK,MAAM,CAAC;IACnE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACrD,OAAO,OAAO,KAAK,CAAC,KAAK,MAAM,CAAC;AACpC,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,UAAU,CAAC,UAAkB,EAAE,OAAe;IAC1D,OAAO,GAAG,UAAU,IAAI,OAAO,EAAE,CAAC;AACtC,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,MAA4B;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PageContribution } from '@diy-agent/workbench';
|
|
2
|
+
export interface ModelConfigPageOptions {
|
|
3
|
+
/** 数据根(`$DIY_HOME`);缺省 = `process.env.DIY_HOME` */
|
|
4
|
+
readonly home?: string;
|
|
5
|
+
}
|
|
6
|
+
/** 插件加载器会调用它(default 导出 = 本函数) */
|
|
7
|
+
export declare function createPage(config?: unknown): PageContribution;
|
|
8
|
+
export default createPage;
|
|
9
|
+
export { ModelConfigPageError } from './errors.js';
|
|
10
|
+
export { accountLabel, groupModels, modelKeyOf, readSnapshot, removeProviderAction, saveAccountAction, saveDefaultModelAction, saveProviderAction, savedAccountLabel, } from './actions.js';
|
|
11
|
+
export type { AccountStateView, ConfigSnapshot, ModelView, ProviderView, SavedAccountView, WriteResult, } from './shared.js';
|
package/index.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// index.ts — 主进程侧的页面贡献:`model-config` 页的方法表。
|
|
2
|
+
//
|
|
3
|
+
// 装配层(apps/chat/index.ts)把它放进 `plugins` 清单 → 主进程交付页面 → 侧栏出现入口;
|
|
4
|
+
// **删掉那一行 = 主进程不交付页面 = nav 里没有「模型配置」**(renderer 侧即便注册了 view
|
|
5
|
+
// 也不会显示 —— 侧栏来自 listPages,注册表只决定「怎么画」)。
|
|
6
|
+
//
|
|
7
|
+
// 边界:
|
|
8
|
+
// · 本文件不 import electron / 不碰 DOM:宿主注入 `home`(缺省读 `DIY_HOME`)
|
|
9
|
+
// · 方法参数原样来自 renderer,统一在 actions.ts 校验
|
|
10
|
+
// · 返回值必须结构化克隆:快照里没有 key,账号只有名字 / 长度
|
|
11
|
+
import { readSnapshot, removeProviderAction, saveAccountAction, saveDefaultModelAction, saveProviderAction, } from './actions.js';
|
|
12
|
+
import { ModelConfigPageError } from './errors.js';
|
|
13
|
+
/** 插件加载器会调用它(default 导出 = 本函数) */
|
|
14
|
+
export function createPage(config) {
|
|
15
|
+
// 每次调用现取:装配时 `DIY_HOME` 可能还没设(单测 / 纯库 import),不能把 null 固化下来
|
|
16
|
+
const requireHome = () => {
|
|
17
|
+
const home = homeOf(config);
|
|
18
|
+
if (home === null) {
|
|
19
|
+
throw new ModelConfigPageError('model-config/no-home', '模型配置页没有数据根:装配层没传 config.home,环境里也没有 DIY_HOME');
|
|
20
|
+
}
|
|
21
|
+
return home;
|
|
22
|
+
};
|
|
23
|
+
return {
|
|
24
|
+
id: 'model-config',
|
|
25
|
+
title: '模型配置',
|
|
26
|
+
methods: {
|
|
27
|
+
snapshot: () => readSnapshot(requireHome()),
|
|
28
|
+
saveProvider: (args) => saveProviderAction(requireHome(), args),
|
|
29
|
+
removeProvider: (args) => removeProviderAction(requireHome(), args),
|
|
30
|
+
saveAccount: (args) => saveAccountAction(requireHome(), args),
|
|
31
|
+
saveDefaultModel: (args) => saveDefaultModelAction(requireHome(), args),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export default createPage;
|
|
36
|
+
export { ModelConfigPageError } from './errors.js';
|
|
37
|
+
export { accountLabel, groupModels, modelKeyOf, readSnapshot, removeProviderAction, saveAccountAction, saveDefaultModelAction, saveProviderAction, savedAccountLabel, } from './actions.js';
|
|
38
|
+
function homeOf(config) {
|
|
39
|
+
if (config !== null && typeof config === 'object') {
|
|
40
|
+
const home = config.home;
|
|
41
|
+
if (typeof home === 'string' && home.trim() !== '')
|
|
42
|
+
return home;
|
|
43
|
+
}
|
|
44
|
+
const fromEnv = process.env['DIY_HOME'];
|
|
45
|
+
return typeof fromEnv === 'string' && fromEnv.trim() !== '' ? fromEnv : null;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,+DAA+D;AAC/D,4DAA4D;AAC5D,wCAAwC;AACxC,EAAE;AACF,MAAM;AACN,gEAAgE;AAChE,0CAA0C;AAC1C,uCAAuC;AAGvC,OAAO,EACH,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAOnD,kCAAkC;AAClC,MAAM,UAAU,UAAU,CAAC,MAAgB;IACvC,4DAA4D;IAC5D,MAAM,WAAW,GAAG,GAAW,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,oBAAoB,CAC1B,sBAAsB,EACtB,8CAA8C,CACjD,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO;QACH,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE;YACL,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3C,YAAY,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,kBAAkB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;YACxE,cAAc,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,oBAAoB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;YAC5E,WAAW,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;YACtE,gBAAgB,EAAE,CAAC,IAAa,EAAE,EAAE,CAAC,sBAAsB,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC;SACnF;KACJ,CAAC;AACN,CAAC;AAED,eAAe,UAAU,CAAC;AAE1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACH,YAAY,EACZ,WAAW,EACX,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,cAAc,CAAC;AAUtB,SAAS,MAAM,CAAC,MAAe;IAC3B,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,GAAI,MAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;IACpE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxC,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@diy-agent/model-config-page",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "模型配置页面插件:provider / 模型 / 账号 / 默认模型(key 只写不回显);不装就没有入口",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@diy-agent/model-catalog": "^0.1.0",
|
|
8
|
+
"@diy-agent/workbench": "^0.1.0",
|
|
9
|
+
"@diy-agent/workbench-ui": "^0.1.0"
|
|
10
|
+
},
|
|
11
|
+
"main": "./index.js",
|
|
12
|
+
"types": "./index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./index.d.ts",
|
|
16
|
+
"import": "./index.js",
|
|
17
|
+
"default": "./index.js"
|
|
18
|
+
},
|
|
19
|
+
"./renderer": {
|
|
20
|
+
"types": "./view.d.ts",
|
|
21
|
+
"import": "./view.js",
|
|
22
|
+
"default": "./view.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"registry": "https://registry.npmjs.org/",
|
|
27
|
+
"access": "public"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/shared.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** 一个账号的展示状态(不含 key) */
|
|
2
|
+
export interface AccountStateView {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly configured: boolean;
|
|
5
|
+
/** 字面量 key 的字符数;`$VAR` 引用时缺省 */
|
|
6
|
+
readonly chars?: number;
|
|
7
|
+
/** 值是环境变量引用 */
|
|
8
|
+
readonly env: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** provider 列表的一行(不含 key) */
|
|
11
|
+
export interface ProviderView {
|
|
12
|
+
readonly providerId: string;
|
|
13
|
+
readonly kind: 'std' | 'custom';
|
|
14
|
+
readonly api?: string;
|
|
15
|
+
readonly npm?: string;
|
|
16
|
+
readonly modelCount: number;
|
|
17
|
+
readonly accounts: readonly AccountStateView[];
|
|
18
|
+
}
|
|
19
|
+
/** 模型列表的一行(模型目录的投影;不含 key) */
|
|
20
|
+
export interface ModelView {
|
|
21
|
+
readonly providerId: string;
|
|
22
|
+
readonly modelId: string;
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly contextWindow?: number;
|
|
25
|
+
readonly cost?: {
|
|
26
|
+
readonly input: number;
|
|
27
|
+
readonly output: number;
|
|
28
|
+
readonly cacheRead?: number;
|
|
29
|
+
readonly cacheWrite?: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** 整页快照 */
|
|
33
|
+
export interface ConfigSnapshot {
|
|
34
|
+
/** 数据根(`$DIY_HOME`);页头显示用 */
|
|
35
|
+
readonly home: string;
|
|
36
|
+
readonly providers: readonly ProviderView[];
|
|
37
|
+
readonly models: readonly ModelView[];
|
|
38
|
+
/** `model.yaml` 顶层 `defaultModel`(`provider/model`);没设 = null */
|
|
39
|
+
readonly defaultModel: string | null;
|
|
40
|
+
}
|
|
41
|
+
/** `saveAccount` 的返回:只有长度,没有原值 */
|
|
42
|
+
export interface SavedAccountView {
|
|
43
|
+
readonly providerId: string;
|
|
44
|
+
readonly name: string;
|
|
45
|
+
readonly chars: number;
|
|
46
|
+
}
|
|
47
|
+
/** 写方法的统一返回:更新后的快照 + 可选提示 */
|
|
48
|
+
export interface WriteResult {
|
|
49
|
+
readonly snapshot: ConfigSnapshot;
|
|
50
|
+
readonly saved?: SavedAccountView;
|
|
51
|
+
}
|
package/shared.js
ADDED
package/shared.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,+CAA+C;AAC/C,6DAA6D"}
|
package/view.d.ts
ADDED
package/view.js
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
// view.ts — 页面插件的 renderer 侧:provider / 模型 / 账号 / 当前选择。
|
|
2
|
+
//
|
|
3
|
+
// 只做展示与转发:整页状态来自 `ctx.invoke('snapshot')`,每次写操作后再拿一份新快照重画。
|
|
4
|
+
// 本文件不认识 Electron / IPC / 文件系统,也拿不到任何算法 —— key 只从 `<input type=password>`
|
|
5
|
+
// 单向送进主进程,回来后只有 `{ chars }`。
|
|
6
|
+
//
|
|
7
|
+
// 硬规则(##467 判据 3):**任何情况下都不把 key 写进 DOM**。页面上关于 key 的文字只有
|
|
8
|
+
// 「未设置 / 已设置(N 字符)/ 已设置(环境变量)」,输入框写后立刻清空。
|
|
9
|
+
import { accountLabel, groupModels, modelKeyOf, savedAccountLabel } from './format.js';
|
|
10
|
+
const STYLE_ID = 'model-config-page-style';
|
|
11
|
+
const STYLE = `
|
|
12
|
+
.mc-page { display: flex; flex-direction: column; height: 100%; min-height: 0; box-sizing: border-box; }
|
|
13
|
+
.mc-head { flex: none; display: flex; align-items: center; gap: 12px; padding: 12px 20px; border-bottom: 1px solid #e4e7eb; }
|
|
14
|
+
.mc-title { font-size: 15px; font-weight: 600; }
|
|
15
|
+
.mc-home { flex: 1; font-size: 12px; color: #8b95a1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
16
|
+
.mc-btn { appearance: none; border: 1px solid #cbd5e1; border-radius: 6px; background: #fff; padding: 4px 10px; font: inherit; font-size: 13px; cursor: pointer; }
|
|
17
|
+
.mc-btn:disabled { color: #a9b7cc; cursor: default; }
|
|
18
|
+
.mc-btn[data-danger="true"] { border-color: #e3b4b4; color: #b23b3b; }
|
|
19
|
+
.mc-status { flex: none; padding: 0 20px; font-size: 12px; color: #4b5563; min-height: 20px; line-height: 20px; }
|
|
20
|
+
.mc-status[data-kind="error"] { color: #b23b3b; }
|
|
21
|
+
.mc-body { flex: 1; min-height: 0; overflow: auto; padding: 0 20px 24px; }
|
|
22
|
+
.mc-section { margin-top: 18px; }
|
|
23
|
+
.mc-section-title { font-size: 13px; font-weight: 600; color: #1f2937; margin: 0 0 8px; }
|
|
24
|
+
.mc-table { width: 100%; border-collapse: collapse; font-size: 13px; }
|
|
25
|
+
.mc-table th, .mc-table td { text-align: left; padding: 6px 8px; border-bottom: 1px solid #eef0f3; vertical-align: middle; }
|
|
26
|
+
.mc-table th { color: #6b7280; font-weight: 500; font-size: 12px; }
|
|
27
|
+
.mc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
|
|
28
|
+
.mc-muted { color: #8b95a1; }
|
|
29
|
+
.mc-input { padding: 4px 8px; border: 1px solid #d3d8de; border-radius: 6px; font: inherit; font-size: 13px; box-sizing: border-box; }
|
|
30
|
+
.mc-input:focus { outline: 2px solid #b9c9e4; outline-offset: 0; }
|
|
31
|
+
.mc-name { width: 100%; min-width: 120px; }
|
|
32
|
+
.mc-add { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; margin: 8px 0 4px; }
|
|
33
|
+
.mc-account-row td { border-bottom: 1px dashed #eef0f3; }
|
|
34
|
+
.mc-key { width: 200px; }
|
|
35
|
+
`;
|
|
36
|
+
export const modelConfigPageView = {
|
|
37
|
+
id: 'model-config',
|
|
38
|
+
title: '模型配置',
|
|
39
|
+
render(root, ctx) {
|
|
40
|
+
const doc = root.ownerDocument;
|
|
41
|
+
ensureStyle(doc);
|
|
42
|
+
root.replaceChildren();
|
|
43
|
+
const page = el(doc, 'div', 'mc-page');
|
|
44
|
+
const head = el(doc, 'div', 'mc-head');
|
|
45
|
+
const title = el(doc, 'span', 'mc-title');
|
|
46
|
+
title.textContent = '模型配置';
|
|
47
|
+
const homeText = el(doc, 'code', 'mc-home');
|
|
48
|
+
homeText.textContent = '加载中…';
|
|
49
|
+
const refresh = el(doc, 'button', 'mc-btn');
|
|
50
|
+
refresh.type = 'button';
|
|
51
|
+
refresh.textContent = '刷新';
|
|
52
|
+
head.append(title, homeText, refresh);
|
|
53
|
+
const status = el(doc, 'div', 'mc-status');
|
|
54
|
+
const body = el(doc, 'div', 'mc-body');
|
|
55
|
+
page.append(head, status, body);
|
|
56
|
+
root.append(page);
|
|
57
|
+
let busy = false;
|
|
58
|
+
const setStatus = (text, kind) => {
|
|
59
|
+
status.textContent = text;
|
|
60
|
+
if (kind === 'error')
|
|
61
|
+
status.dataset['kind'] = 'error';
|
|
62
|
+
else
|
|
63
|
+
delete status.dataset['kind'];
|
|
64
|
+
};
|
|
65
|
+
const api = {
|
|
66
|
+
invoke: (method, args) => ctx.invoke(method, args),
|
|
67
|
+
act: async (label, task, done) => {
|
|
68
|
+
if (busy) {
|
|
69
|
+
setStatus('上一个操作还没结束…', 'error');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
busy = true;
|
|
73
|
+
refresh.disabled = true;
|
|
74
|
+
setStatus(`${label}…`);
|
|
75
|
+
try {
|
|
76
|
+
const result = await task();
|
|
77
|
+
setStatus(done(result));
|
|
78
|
+
}
|
|
79
|
+
catch (cause) {
|
|
80
|
+
setStatus(`${label}失败:${messageOf(cause)}`, 'error');
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
busy = false;
|
|
84
|
+
refresh.disabled = false;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const paint = (snapshot) => {
|
|
89
|
+
homeText.textContent = `数据根:${snapshot.home}`;
|
|
90
|
+
body.replaceChildren(defaultSection(doc, snapshot, api), providerSection(doc, snapshot, api), modelSection(doc, snapshot, api), accountSection(doc, snapshot, api));
|
|
91
|
+
};
|
|
92
|
+
const load = () => {
|
|
93
|
+
void api.act('读取配置', () => api.invoke('snapshot'), (snapshot) => {
|
|
94
|
+
paint(snapshot);
|
|
95
|
+
return `已加载 ${snapshot.providers.length} 个 provider、${snapshot.models.length} 个模型`;
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
refresh.addEventListener('click', load);
|
|
99
|
+
load();
|
|
100
|
+
return () => {
|
|
101
|
+
root.replaceChildren();
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
export default modelConfigPageView;
|
|
106
|
+
// ── 各区块(快照 + PageApi 进,DOM 出) ────────────
|
|
107
|
+
function defaultSection(doc, snapshot, api) {
|
|
108
|
+
const section = el(doc, 'section', 'mc-section');
|
|
109
|
+
section.append(titleNode(doc, '当前选择'));
|
|
110
|
+
const line = el(doc, 'div', 'mc-add');
|
|
111
|
+
const select = el(doc, 'select', 'mc-input');
|
|
112
|
+
const none = doc.createElement('option');
|
|
113
|
+
none.value = '';
|
|
114
|
+
none.textContent = '(未设置)';
|
|
115
|
+
select.append(none);
|
|
116
|
+
for (const model of snapshot.models) {
|
|
117
|
+
const option = doc.createElement('option');
|
|
118
|
+
option.value = modelKeyOf(model.providerId, model.modelId);
|
|
119
|
+
option.textContent = `${model.providerId} · ${model.name}`;
|
|
120
|
+
select.append(option);
|
|
121
|
+
}
|
|
122
|
+
select.value = snapshot.defaultModel ?? '';
|
|
123
|
+
select.addEventListener('change', () => {
|
|
124
|
+
const modelKey = select.value === '' ? null : select.value;
|
|
125
|
+
void api.act('保存默认模型', () => api.invoke('saveDefaultModel', { modelKey }), () => '默认模型已保存(写入 model.yaml 的 defaultModel)');
|
|
126
|
+
});
|
|
127
|
+
line.append(select);
|
|
128
|
+
section.append(line);
|
|
129
|
+
return section;
|
|
130
|
+
}
|
|
131
|
+
function providerSection(doc, snapshot, api) {
|
|
132
|
+
const section = el(doc, 'section', 'mc-section');
|
|
133
|
+
section.append(titleNode(doc, 'Provider'));
|
|
134
|
+
const table = el(doc, 'table', 'mc-table');
|
|
135
|
+
const thead = doc.createElement('thead');
|
|
136
|
+
const hr = doc.createElement('tr');
|
|
137
|
+
for (const text of ['id', '类型', 'api', 'npm', '模型数', '账号', '操作']) {
|
|
138
|
+
const th = doc.createElement('th');
|
|
139
|
+
th.textContent = text;
|
|
140
|
+
hr.append(th);
|
|
141
|
+
}
|
|
142
|
+
thead.append(hr);
|
|
143
|
+
const tbody = doc.createElement('tbody');
|
|
144
|
+
for (const provider of snapshot.providers) {
|
|
145
|
+
const tr = doc.createElement('tr');
|
|
146
|
+
tr.append(cell(doc, provider.providerId, 'mc-mono'), cell(doc, provider.kind), cell(doc, provider.api ?? '(未写 api)', 'mc-mono'), cell(doc, provider.npm ?? '—', 'mc-mono'), cell(doc, String(provider.modelCount)), cell(doc, String(provider.accounts.length)));
|
|
147
|
+
const actions = doc.createElement('td');
|
|
148
|
+
const remove = el(doc, 'button', 'mc-btn');
|
|
149
|
+
remove.type = 'button';
|
|
150
|
+
remove.textContent = '删除';
|
|
151
|
+
remove.dataset['danger'] = 'true';
|
|
152
|
+
remove.addEventListener('click', () => {
|
|
153
|
+
if (!confirmIfPossible(doc, `删除 provider「${provider.providerId}」?`))
|
|
154
|
+
return;
|
|
155
|
+
void api.act('删除 provider', () => api.invoke('removeProvider', { providerId: provider.providerId }), () => `已删除 provider「${provider.providerId}」`);
|
|
156
|
+
});
|
|
157
|
+
actions.append(remove);
|
|
158
|
+
tr.append(actions);
|
|
159
|
+
tbody.append(tr);
|
|
160
|
+
}
|
|
161
|
+
table.append(thead, tbody);
|
|
162
|
+
section.append(table);
|
|
163
|
+
// 新增 / 更新 provider(custom spec)
|
|
164
|
+
const form = el(doc, 'div', 'mc-add');
|
|
165
|
+
const idInput = input(doc, 'id', '(provider id)');
|
|
166
|
+
const apiInput = input(doc, 'api', 'https://…(custom 的 api)');
|
|
167
|
+
const npmInput = input(doc, 'npm', '@ai-sdk/openai-compatible');
|
|
168
|
+
const add = el(doc, 'button', 'mc-btn');
|
|
169
|
+
add.type = 'button';
|
|
170
|
+
add.textContent = '添加 / 更新';
|
|
171
|
+
add.addEventListener('click', () => {
|
|
172
|
+
const providerId = idInput.value.trim();
|
|
173
|
+
if (providerId === '') {
|
|
174
|
+
setError(api, 'provider id 不能为空');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const spec = {};
|
|
178
|
+
if (apiInput.value.trim() !== '')
|
|
179
|
+
spec['api'] = apiInput.value.trim();
|
|
180
|
+
if (npmInput.value.trim() !== '')
|
|
181
|
+
spec['npm'] = npmInput.value.trim();
|
|
182
|
+
const existing = snapshot.providers.find((item) => item.providerId === providerId);
|
|
183
|
+
const kind = existing?.kind ?? 'custom';
|
|
184
|
+
void api.act('保存 provider', () => api.invoke('saveProvider', {
|
|
185
|
+
providerId,
|
|
186
|
+
kind,
|
|
187
|
+
...(Object.keys(spec).length === 0 ? {} : { spec }),
|
|
188
|
+
}), () => `已保存 provider「${providerId}」`);
|
|
189
|
+
});
|
|
190
|
+
form.append(idInput, apiInput, npmInput, add);
|
|
191
|
+
section.append(form);
|
|
192
|
+
return section;
|
|
193
|
+
}
|
|
194
|
+
function modelSection(doc, snapshot, api) {
|
|
195
|
+
const section = el(doc, 'section', 'mc-section');
|
|
196
|
+
section.append(titleNode(doc, '模型(改 name 后保存即写回 model.yaml 覆盖)'));
|
|
197
|
+
if (snapshot.models.length === 0) {
|
|
198
|
+
const empty = el(doc, 'div', 'mc-muted');
|
|
199
|
+
empty.textContent =
|
|
200
|
+
'目录里没有可用模型 —— 先给 provider 写 api(custom 还要在 providers.custom.yaml 写 models)。';
|
|
201
|
+
section.append(empty);
|
|
202
|
+
return section;
|
|
203
|
+
}
|
|
204
|
+
const grouped = groupModels(snapshot.models);
|
|
205
|
+
for (const [providerId, models] of grouped) {
|
|
206
|
+
const caption = el(doc, 'div', 'mc-muted');
|
|
207
|
+
caption.textContent = `${providerId} · ${models.length} 个模型`;
|
|
208
|
+
const table = el(doc, 'table', 'mc-table');
|
|
209
|
+
const thead = doc.createElement('thead');
|
|
210
|
+
const hr = doc.createElement('tr');
|
|
211
|
+
for (const text of ['模型 id', 'name', 'contextWindow', 'cost(input/output)', '操作']) {
|
|
212
|
+
const th = doc.createElement('th');
|
|
213
|
+
th.textContent = text;
|
|
214
|
+
hr.append(th);
|
|
215
|
+
}
|
|
216
|
+
thead.append(hr);
|
|
217
|
+
const tbody = doc.createElement('tbody');
|
|
218
|
+
for (const model of models)
|
|
219
|
+
tbody.append(modelRow(doc, model, api));
|
|
220
|
+
table.append(thead, tbody);
|
|
221
|
+
section.append(caption, table);
|
|
222
|
+
}
|
|
223
|
+
return section;
|
|
224
|
+
}
|
|
225
|
+
function modelRow(doc, model, api) {
|
|
226
|
+
const tr = doc.createElement('tr');
|
|
227
|
+
const nameInput = input(doc, 'name');
|
|
228
|
+
nameInput.value = model.name;
|
|
229
|
+
nameInput.className = 'mc-input mc-name';
|
|
230
|
+
nameInput.dataset['model'] = model.modelId;
|
|
231
|
+
const save = el(doc, 'button', 'mc-btn');
|
|
232
|
+
save.type = 'button';
|
|
233
|
+
save.textContent = '保存';
|
|
234
|
+
save.dataset['action'] = 'save-model';
|
|
235
|
+
save.addEventListener('click', () => {
|
|
236
|
+
const name = nameInput.value.trim();
|
|
237
|
+
if (name === '') {
|
|
238
|
+
setError(api, '模型 name 不能为空');
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
void api.act('保存模型', () => api.invoke('saveProvider', {
|
|
242
|
+
providerId: model.providerId,
|
|
243
|
+
models: { [model.modelId]: { name } },
|
|
244
|
+
}), () => `已保存 ${model.providerId}/${model.modelId} 的 name`);
|
|
245
|
+
});
|
|
246
|
+
const actions = doc.createElement('td');
|
|
247
|
+
actions.append(save);
|
|
248
|
+
tr.append(cell(doc, model.modelId, 'mc-mono'), tdWith(doc, nameInput), cell(doc, model.contextWindow === undefined ? '—' : String(model.contextWindow)), cell(doc, model.cost === undefined ? '—' : `${model.cost.input} / ${model.cost.output}`), actions);
|
|
249
|
+
return tr;
|
|
250
|
+
}
|
|
251
|
+
function accountSection(doc, snapshot, api) {
|
|
252
|
+
const section = el(doc, 'section', 'mc-section');
|
|
253
|
+
section.append(titleNode(doc, '账号(key 只写不回显)'));
|
|
254
|
+
const table = el(doc, 'table', 'mc-table');
|
|
255
|
+
const tbody = doc.createElement('tbody');
|
|
256
|
+
for (const provider of snapshot.providers) {
|
|
257
|
+
tbody.append(accountHeaderRow(doc, provider));
|
|
258
|
+
for (const account of provider.accounts)
|
|
259
|
+
tbody.append(accountRow(doc, provider, account, api));
|
|
260
|
+
tbody.append(newAccountRow(doc, provider, api));
|
|
261
|
+
}
|
|
262
|
+
table.append(tbody);
|
|
263
|
+
section.append(table);
|
|
264
|
+
return section;
|
|
265
|
+
}
|
|
266
|
+
function accountHeaderRow(doc, provider) {
|
|
267
|
+
const tr = doc.createElement('tr');
|
|
268
|
+
const th = doc.createElement('th');
|
|
269
|
+
th.colSpan = 4;
|
|
270
|
+
th.textContent = `${provider.providerId}(${provider.kind})`;
|
|
271
|
+
tr.append(th);
|
|
272
|
+
return tr;
|
|
273
|
+
}
|
|
274
|
+
function accountRow(doc, provider, account, api) {
|
|
275
|
+
return keyRow(doc, provider, account.name, accountLabel(account), api);
|
|
276
|
+
}
|
|
277
|
+
function newAccountRow(doc, provider, api) {
|
|
278
|
+
const tr = doc.createElement('tr');
|
|
279
|
+
tr.className = 'mc-account-row';
|
|
280
|
+
const nameInput = input(doc, 'name', '新账号名');
|
|
281
|
+
const keyInput = keyField(doc);
|
|
282
|
+
const save = el(doc, 'button', 'mc-btn');
|
|
283
|
+
save.type = 'button';
|
|
284
|
+
save.textContent = '新增';
|
|
285
|
+
save.addEventListener('click', () => {
|
|
286
|
+
const name = nameInput.value.trim();
|
|
287
|
+
if (name === '') {
|
|
288
|
+
setError(api, '账号名不能为空');
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
submitKey(provider, name, keyInput, api);
|
|
292
|
+
});
|
|
293
|
+
const actions = doc.createElement('td');
|
|
294
|
+
actions.append(save);
|
|
295
|
+
tr.append(tdWith(doc, nameInput), cell(doc, '未设置', 'mc-muted'), tdWith(doc, keyInput), actions);
|
|
296
|
+
return tr;
|
|
297
|
+
}
|
|
298
|
+
function keyRow(doc, provider, name, label, api) {
|
|
299
|
+
const tr = doc.createElement('tr');
|
|
300
|
+
tr.className = 'mc-account-row';
|
|
301
|
+
const keyInput = keyField(doc);
|
|
302
|
+
const save = el(doc, 'button', 'mc-btn');
|
|
303
|
+
save.type = 'button';
|
|
304
|
+
save.textContent = '设置 key';
|
|
305
|
+
save.addEventListener('click', () => submitKey(provider, name, keyInput, api));
|
|
306
|
+
const actions = doc.createElement('td');
|
|
307
|
+
actions.append(save);
|
|
308
|
+
const labelCell = cell(doc, label, 'mc-muted');
|
|
309
|
+
labelCell.dataset['account'] = name;
|
|
310
|
+
tr.append(cell(doc, name, 'mc-mono'), labelCell, tdWith(doc, keyInput), actions);
|
|
311
|
+
return tr;
|
|
312
|
+
}
|
|
313
|
+
function submitKey(provider, name, keyInput, api) {
|
|
314
|
+
const value = keyInput.value;
|
|
315
|
+
if (value.trim() === '') {
|
|
316
|
+
setError(api, 'key 不能为空');
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
void api.act('保存 key', () => api.invoke('saveAccount', { providerId: provider.providerId, name, value }), (result) => {
|
|
320
|
+
keyInput.value = '';
|
|
321
|
+
const saved = result.saved;
|
|
322
|
+
return saved === undefined
|
|
323
|
+
? `已保存 ${provider.providerId}/${name} 的 key`
|
|
324
|
+
: `${provider.providerId}/${name}:${savedAccountLabel(saved)}`;
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
function setError(api, message) {
|
|
328
|
+
void api.act('校验', () => Promise.reject(new Error(message)), () => message);
|
|
329
|
+
}
|
|
330
|
+
// ── DOM 小工具 ───────────────────────────────────
|
|
331
|
+
function el(doc, tag, className = '') {
|
|
332
|
+
const node = doc.createElement(tag);
|
|
333
|
+
if (className !== '')
|
|
334
|
+
node.className = className;
|
|
335
|
+
return node;
|
|
336
|
+
}
|
|
337
|
+
function titleNode(doc, text) {
|
|
338
|
+
const node = el(doc, 'h2', 'mc-section-title');
|
|
339
|
+
node.textContent = text;
|
|
340
|
+
return node;
|
|
341
|
+
}
|
|
342
|
+
function cell(doc, text, className = '') {
|
|
343
|
+
const td = doc.createElement('td');
|
|
344
|
+
if (className !== '')
|
|
345
|
+
td.className = className;
|
|
346
|
+
td.textContent = text;
|
|
347
|
+
return td;
|
|
348
|
+
}
|
|
349
|
+
function tdWith(doc, child) {
|
|
350
|
+
const td = doc.createElement('td');
|
|
351
|
+
td.append(child);
|
|
352
|
+
return td;
|
|
353
|
+
}
|
|
354
|
+
function input(doc, name, placeholder = '') {
|
|
355
|
+
const node = doc.createElement('input');
|
|
356
|
+
node.type = 'text';
|
|
357
|
+
node.className = 'mc-input';
|
|
358
|
+
node.name = name;
|
|
359
|
+
if (placeholder !== '')
|
|
360
|
+
node.placeholder = placeholder;
|
|
361
|
+
return node;
|
|
362
|
+
}
|
|
363
|
+
function keyField(doc) {
|
|
364
|
+
const node = doc.createElement('input');
|
|
365
|
+
node.type = 'password';
|
|
366
|
+
node.className = 'mc-input mc-key';
|
|
367
|
+
node.autocomplete = 'off';
|
|
368
|
+
node.placeholder = '输入新 key(写入后不回显)';
|
|
369
|
+
return node;
|
|
370
|
+
}
|
|
371
|
+
function confirmIfPossible(doc, message) {
|
|
372
|
+
const view = doc.defaultView;
|
|
373
|
+
return view?.confirm === undefined ? true : view.confirm(message);
|
|
374
|
+
}
|
|
375
|
+
function messageOf(cause) {
|
|
376
|
+
return cause instanceof Error ? cause.message : String(cause);
|
|
377
|
+
}
|
|
378
|
+
function ensureStyle(doc) {
|
|
379
|
+
if (doc.getElementById(STYLE_ID) !== null)
|
|
380
|
+
return;
|
|
381
|
+
const style = doc.createElement('style');
|
|
382
|
+
style.id = STYLE_ID;
|
|
383
|
+
style.textContent = STYLE;
|
|
384
|
+
doc.head.append(style);
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=view.js.map
|
package/view.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.js","sourceRoot":"","sources":["../src/view.ts"],"names":[],"mappings":"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"}
|
package/README.md
DELETED