dsh-llm-ustc 0.2.1 → 0.3.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/README.md +10 -4
- package/lib/adapter.js +5 -8
- package/lib/adapter.js.map +1 -1
- package/lib/client.js +158 -14
- package/lib/config.js +1 -0
- package/lib/config.js.map +1 -1
- package/lib/constants.js +1 -0
- package/lib/constants.js.map +1 -1
- package/lib/index.js +17 -4
- package/lib/index.js.map +1 -1
- package/lib/model-catalog.js +5 -9
- package/lib/model-catalog.js.map +1 -1
- package/lib/state.js +6 -2
- package/lib/state.js.map +1 -1
- package/lib/tokenworks.js +379 -0
- package/lib/tokenworks.js.map +1 -0
- package/lib/types/adapter.d.ts +2 -1
- package/lib/types/adapter.d.ts.map +1 -1
- package/lib/types/client/index.d.ts +22 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/config.d.ts +3 -0
- package/lib/types/config.d.ts.map +1 -1
- package/lib/types/constants.d.ts +1 -0
- package/lib/types/constants.d.ts.map +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/model-catalog.d.ts +2 -3
- package/lib/types/model-catalog.d.ts.map +1 -1
- package/lib/types/state.d.ts +1 -0
- package/lib/types/state.d.ts.map +1 -1
- package/lib/types/tokenworks.d.ts +44 -0
- package/lib/types/tokenworks.d.ts.map +1 -0
- package/lib/types/web.d.ts +20 -1
- package/lib/types/web.d.ts.map +1 -1
- package/lib/web.js +36 -2
- package/lib/web.js.map +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ DeepSeek Harness `ustc` LLM Provider,访问中国科学技术大学
|
|
|
9
9
|
- DeepSeek Harness `0.2.0-rc.2`
|
|
10
10
|
- Node.js 24(也支持 Node.js `^22.19.0`)
|
|
11
11
|
- Windows、macOS 或 Linux,x64/ARM64
|
|
12
|
-
- 科大 LLM API Key
|
|
12
|
+
- 科大 LLM API Key,或词元工坊账号
|
|
13
13
|
- 公网环境需要完成 iWAN 登录并显式选择线路
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
@@ -32,11 +32,16 @@ DSH Web 进程。
|
|
|
32
32
|
|
|
33
33
|
在 DSH Web 主页左上角打开“插件”,从“已安装”进入“科大大模型”的详情页:
|
|
34
34
|
|
|
35
|
-
1.
|
|
36
|
-
2.
|
|
35
|
+
1. 选择 Key 来源:手动输入 API Key,或登录词元工坊。词元工坊登录时点击“打开登录页面”,在浏览器完成科大认证后会自动返回本机回调,无需粘贴 URL。
|
|
36
|
+
2. 同步模型目录。两种来源都使用相同的科大 API、模型目录和聊天链路;切换来源不会回退到另一种凭据。
|
|
37
|
+
3. 公网使用时还需单独完成 iWAN 登录:在浏览器认证后粘贴完整回调 URL,再显式选择一条线路。词元工坊登录不替代 iWAN 登录。
|
|
38
|
+
|
|
39
|
+
词元工坊只用于从官方 bootstrap 服务获取网关 Key。插件验证发布配置签名和 OIDC ID token,使用 PKCE 与十分钟有效的单次本机回调;登录令牌可自动续期,网关 Key 仅缓存在内存中,按官方有效期和重检间隔在请求前刷新。
|
|
40
|
+
浏览器须与 DSH Host 在同一台机器上,才能完成 `127.0.0.1` 回调。
|
|
37
41
|
|
|
38
42
|
模型 ID 直接来自 `/v1/models`。首次离线时仅显示
|
|
39
43
|
`deepseek-flash` 引导项;同步成功后会缓存最近可用目录。
|
|
44
|
+
目录中的条目可手动删除,结果保存在本地缓存中,再次同步会恢复服务端提供的模型。删除不改变“刷新时间”。
|
|
40
45
|
|
|
41
46
|
## 网络边界
|
|
42
47
|
|
|
@@ -58,8 +63,9 @@ DSH Web 进程。
|
|
|
58
63
|
## 凭据与本地状态
|
|
59
64
|
|
|
60
65
|
- `USTC_LLM_API_KEY`:科大 LLM API Key。
|
|
66
|
+
- `USTC_LLM_TOKENWORKS_SESSION`:插件私有词元工坊登录令牌,存入 DSH 凭据服务,不写入 Provider 配置或返回给 Web UI;退出登录时清除。手动 Key 独立保存,切换来源时不会删除。
|
|
61
67
|
- `USTC_LLM_IWAN_CONFIG`:插件私有 iWAN 凭据,不写入 Provider 配置。
|
|
62
|
-
- `$DSH_HOME/profiles/web/cordis.patch.yml
|
|
68
|
+
- `$DSH_HOME/profiles/web/cordis.patch.yml`:Key 来源、所选 iWAN 线路和直连恢复间隔,归属 `llm-ustc` 插件配置行;其他 profile 使用自己的同名文件。
|
|
63
69
|
- `$DSH_HOME/cache/dsh-llm-ustc/models.json`:可重新同步的模型目录缓存。升级后旧缓存不会迁移,可在插件详情页手动同步。
|
|
64
70
|
|
|
65
71
|
升级到 DSH 0.2 后,DSH 会在首次启动时把旧 `$DSH_HOME/settings.yaml` 中的插件设置导入当前 profile,并将旧文件改名为 `settings.yaml.imported`。请确保导入时已启用本插件。
|
package/lib/adapter.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
2
|
-
import {
|
|
2
|
+
import { LlmAdapter, LlmError, ReasoningEffortId, resolveRetryPolicy, } from '@deepseek-ai/dsh-llm';
|
|
3
3
|
import { PiAiAdapter } from '@deepseek-ai/dsh-llm-pi-ai';
|
|
4
4
|
import { createProvider, defaultProviderAuthContext, InMemoryCredentialStore } from '@earendil-works/pi-ai';
|
|
5
5
|
import { openAICompletionsApi } from '@earendil-works/pi-ai/api/openai-completions.lazy';
|
|
@@ -16,13 +16,15 @@ export class UstcAdapter extends LlmAdapter {
|
|
|
16
16
|
ctx;
|
|
17
17
|
helper;
|
|
18
18
|
catalog;
|
|
19
|
+
resolveApiKey;
|
|
19
20
|
delegate;
|
|
20
21
|
auth = { credentials: new InMemoryCredentialStore(), authContext: defaultProviderAuthContext() };
|
|
21
|
-
constructor(ctx, helper, catalog) {
|
|
22
|
+
constructor(ctx, helper, catalog, resolveApiKey) {
|
|
22
23
|
super();
|
|
23
24
|
this.ctx = ctx;
|
|
24
25
|
this.helper = helper;
|
|
25
26
|
this.catalog = catalog;
|
|
27
|
+
this.resolveApiKey = resolveApiKey;
|
|
26
28
|
}
|
|
27
29
|
providerInfo(provider) {
|
|
28
30
|
this.assertProvider(provider);
|
|
@@ -84,12 +86,7 @@ export class UstcAdapter extends LlmAdapter {
|
|
|
84
86
|
const adapter = new PiAiAdapter({
|
|
85
87
|
profiles: () => profiles,
|
|
86
88
|
auth: this.auth,
|
|
87
|
-
resolveApiKey:
|
|
88
|
-
const hit = await this.ctx.credentials.resolve(credentialRef(API_KEY_REF));
|
|
89
|
-
if (hit === undefined)
|
|
90
|
-
throw new LlmError(`USTC LLM credential ${API_KEY_REF} is not configured`, 'MISSING_CREDENTIAL');
|
|
91
|
-
return assertUsableApiKey(hit.value, 'dsh-llm-ustc', API_KEY_REF);
|
|
92
|
-
},
|
|
89
|
+
resolveApiKey: this.resolveApiKey,
|
|
93
90
|
resolveAttachments: () => this.ctx.get('attachments'),
|
|
94
91
|
});
|
|
95
92
|
this.delegate = { key, adapter };
|
package/lib/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -12,6 +12,13 @@ const LOCALE_NS = "llm-ustc";
|
|
|
12
12
|
const SETTINGS_ROUTE = "/api/llm-ustc/settings";
|
|
13
13
|
const en = {
|
|
14
14
|
apiKeyLabel: "USTC API Key",
|
|
15
|
+
keySource: "Key source",
|
|
16
|
+
manualKey: "Enter API Key",
|
|
17
|
+
tokenworksKey: "Tokenworks sign-in",
|
|
18
|
+
beginTokenworks: "Sign in to Tokenworks",
|
|
19
|
+
awaitingLogin: "Waiting for browser sign-in...",
|
|
20
|
+
cancelLogin: "Cancel sign-in",
|
|
21
|
+
signedIn: "Signed in",
|
|
15
22
|
apiKeyPlaceholder: "Enter a new key",
|
|
16
23
|
configured: "Configured",
|
|
17
24
|
readOnly: "The active credential or settings provider is read-only.",
|
|
@@ -38,6 +45,8 @@ const en = {
|
|
|
38
45
|
models: "Model catalog",
|
|
39
46
|
syncModels: "Sync models",
|
|
40
47
|
syncingModels: "Syncing...",
|
|
48
|
+
removeModel: "Remove model",
|
|
49
|
+
modelsEmpty: "No models",
|
|
41
50
|
refreshedAt: "Refreshed",
|
|
42
51
|
never: "Never",
|
|
43
52
|
loading: "Loading...",
|
|
@@ -46,6 +55,13 @@ const en = {
|
|
|
46
55
|
};
|
|
47
56
|
const zh = {
|
|
48
57
|
apiKeyLabel: "科大 API Key",
|
|
58
|
+
keySource: "Key 来源",
|
|
59
|
+
manualKey: "手动输入 API Key",
|
|
60
|
+
tokenworksKey: "词元工坊登录",
|
|
61
|
+
beginTokenworks: "登录词元工坊",
|
|
62
|
+
awaitingLogin: "等待浏览器登录...",
|
|
63
|
+
cancelLogin: "取消登录",
|
|
64
|
+
signedIn: "已登录",
|
|
49
65
|
apiKeyPlaceholder: "输入新的 Key",
|
|
50
66
|
configured: "已配置",
|
|
51
67
|
readOnly: "当前凭据或设置提供方为只读。",
|
|
@@ -72,6 +88,8 @@ const zh = {
|
|
|
72
88
|
models: "模型目录",
|
|
73
89
|
syncModels: "同步模型",
|
|
74
90
|
syncingModels: "正在同步...",
|
|
91
|
+
removeModel: "删除模型",
|
|
92
|
+
modelsEmpty: "暂无模型",
|
|
75
93
|
refreshedAt: "刷新时间",
|
|
76
94
|
never: "从未",
|
|
77
95
|
loading: "正在加载...",
|
|
@@ -93,6 +111,7 @@ var UstcSettingsController = class {
|
|
|
93
111
|
current = { status: "idle" };
|
|
94
112
|
listeners = /* @__PURE__ */ new Set();
|
|
95
113
|
generation = 0;
|
|
114
|
+
polling = false;
|
|
96
115
|
subscribe = (listener) => {
|
|
97
116
|
this.listeners.add(listener);
|
|
98
117
|
return () => {
|
|
@@ -119,7 +138,8 @@ var UstcSettingsController = class {
|
|
|
119
138
|
this.set({
|
|
120
139
|
status: "ready",
|
|
121
140
|
snapshot,
|
|
122
|
-
oidc: this.current.oidc
|
|
141
|
+
oidc: this.current.oidc,
|
|
142
|
+
tokenworksUrl: snapshot.tokenworks.pending ? this.current.tokenworksUrl : void 0
|
|
123
143
|
});
|
|
124
144
|
} catch (error) {
|
|
125
145
|
if (generation !== this.generation) return;
|
|
@@ -136,6 +156,7 @@ var UstcSettingsController = class {
|
|
|
136
156
|
if (this.current.status !== "idle" && this.current.action === void 0) this.load();
|
|
137
157
|
}
|
|
138
158
|
async run(action, request, apply) {
|
|
159
|
+
++this.generation;
|
|
139
160
|
this.set({
|
|
140
161
|
...this.current,
|
|
141
162
|
action,
|
|
@@ -161,7 +182,8 @@ var UstcSettingsController = class {
|
|
|
161
182
|
return this.run(action, request, (snapshot, state) => ({
|
|
162
183
|
status: "ready",
|
|
163
184
|
snapshot,
|
|
164
|
-
oidc: state.oidc
|
|
185
|
+
oidc: state.oidc,
|
|
186
|
+
tokenworksUrl: snapshot.tokenworks.pending ? state.tokenworksUrl : void 0
|
|
165
187
|
}));
|
|
166
188
|
}
|
|
167
189
|
beginOidc() {
|
|
@@ -171,6 +193,37 @@ var UstcSettingsController = class {
|
|
|
171
193
|
oidc
|
|
172
194
|
}));
|
|
173
195
|
}
|
|
196
|
+
beginTokenworks() {
|
|
197
|
+
return this.run("beginTokenworks", {}, (value, state) => ({
|
|
198
|
+
...state,
|
|
199
|
+
status: "ready",
|
|
200
|
+
action: void 0,
|
|
201
|
+
snapshot: value.snapshot,
|
|
202
|
+
tokenworksUrl: value.authUrl
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
async pollLogin() {
|
|
206
|
+
if (this.current.action !== void 0 || this.polling) return;
|
|
207
|
+
this.polling = true;
|
|
208
|
+
const generation = this.generation;
|
|
209
|
+
try {
|
|
210
|
+
const snapshot = await apiRequest();
|
|
211
|
+
if (generation !== this.generation) return;
|
|
212
|
+
this.set({
|
|
213
|
+
...this.current,
|
|
214
|
+
snapshot,
|
|
215
|
+
tokenworksUrl: snapshot.tokenworks.pending ? this.current.tokenworksUrl : void 0
|
|
216
|
+
});
|
|
217
|
+
} catch (error) {
|
|
218
|
+
if (generation === this.generation) this.set({
|
|
219
|
+
...this.current,
|
|
220
|
+
error: messageOf(error),
|
|
221
|
+
errorAction: "beginTokenworks"
|
|
222
|
+
});
|
|
223
|
+
} finally {
|
|
224
|
+
this.polling = false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
174
227
|
completeOidc(callbackUrl) {
|
|
175
228
|
return this.run("completeOidc", { callbackUrl }, (value) => ({
|
|
176
229
|
status: "ready",
|
|
@@ -193,6 +246,16 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
193
246
|
(0, react.useEffect)(() => {
|
|
194
247
|
setSelectedServerId(snapshot?.selectedServerId ?? "");
|
|
195
248
|
}, [snapshot?.selectedServerId]);
|
|
249
|
+
(0, react.useEffect)(() => {
|
|
250
|
+
setApiKey("");
|
|
251
|
+
}, [snapshot?.keySource]);
|
|
252
|
+
(0, react.useEffect)(() => {
|
|
253
|
+
if (!snapshot?.tokenworks.pending) return;
|
|
254
|
+
const timer = setInterval(() => {
|
|
255
|
+
controller.pollLogin();
|
|
256
|
+
}, 1500);
|
|
257
|
+
return () => clearInterval(timer);
|
|
258
|
+
}, [controller, snapshot?.tokenworks.pending]);
|
|
196
259
|
if ((state.status === "idle" || state.status === "loading") && snapshot === void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
197
260
|
className: "ulu-loading",
|
|
198
261
|
children: t("loading")
|
|
@@ -216,7 +279,7 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
216
279
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
217
280
|
className: "ulu-settings",
|
|
218
281
|
children: [
|
|
219
|
-
!snapshot.writable || !snapshot.apiKey.writable || !snapshot.iwan.writable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
282
|
+
!snapshot.writable || !(snapshot.keySource === "manual" ? snapshot.apiKey.writable : snapshot.tokenworks.writable) || !snapshot.iwan.writable ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
220
283
|
className: "ulu-alert warning",
|
|
221
284
|
children: t("readOnly")
|
|
222
285
|
}) : null,
|
|
@@ -227,7 +290,26 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
227
290
|
className: "ulu-section-title",
|
|
228
291
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", { children: t("apiKeyLabel") })
|
|
229
292
|
}),
|
|
230
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
293
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
|
|
294
|
+
className: "ulu-line-select",
|
|
295
|
+
"aria-label": t("keySource"),
|
|
296
|
+
value: snapshot.keySource,
|
|
297
|
+
disabled: busy || !snapshot.writable,
|
|
298
|
+
onChange: (event) => {
|
|
299
|
+
controller.mutateSnapshot("selectKeySource", {
|
|
300
|
+
keySource: event.target.value,
|
|
301
|
+
expectedRevision: snapshot.revision
|
|
302
|
+
});
|
|
303
|
+
},
|
|
304
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
305
|
+
value: "manual",
|
|
306
|
+
children: t("manualKey")
|
|
307
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
|
|
308
|
+
value: "tokenworks",
|
|
309
|
+
children: t("tokenworksKey")
|
|
310
|
+
})]
|
|
311
|
+
}),
|
|
312
|
+
snapshot.keySource === "manual" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
|
|
231
313
|
className: "ulu-input",
|
|
232
314
|
type: "password",
|
|
233
315
|
autoComplete: "new-password",
|
|
@@ -237,8 +319,7 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
237
319
|
onChange: (event) => {
|
|
238
320
|
setApiKey(event.target.value);
|
|
239
321
|
}
|
|
240
|
-
}),
|
|
241
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
322
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
242
323
|
className: "ulu-actions",
|
|
243
324
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
244
325
|
size: "sm",
|
|
@@ -259,10 +340,53 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
259
340
|
},
|
|
260
341
|
children: t("remove")
|
|
261
342
|
})]
|
|
343
|
+
})] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
344
|
+
className: "ulu-login-row",
|
|
345
|
+
children: snapshot.tokenworks.pending ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [state.tokenworksUrl === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
346
|
+
className: "ulu-login-state",
|
|
347
|
+
children: t("awaitingLogin")
|
|
348
|
+
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
349
|
+
className: "ulu-link",
|
|
350
|
+
href: state.tokenworksUrl,
|
|
351
|
+
target: "_blank",
|
|
352
|
+
rel: "noopener noreferrer",
|
|
353
|
+
children: t("openLogin")
|
|
354
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
355
|
+
size: "sm",
|
|
356
|
+
variant: "outline",
|
|
357
|
+
disabled: busy,
|
|
358
|
+
onClick: () => {
|
|
359
|
+
controller.mutateSnapshot("cancelTokenworks");
|
|
360
|
+
},
|
|
361
|
+
children: t("cancelLogin")
|
|
362
|
+
})] }) : snapshot.tokenworks.configured ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
363
|
+
className: "ulu-login-state",
|
|
364
|
+
children: snapshot.tokenworks.name ?? t("signedIn")
|
|
365
|
+
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
366
|
+
size: "sm",
|
|
367
|
+
variant: "outline",
|
|
368
|
+
disabled: busy || !snapshot.tokenworks.writable,
|
|
369
|
+
onClick: () => {
|
|
370
|
+
controller.mutateSnapshot("logoutTokenworks");
|
|
371
|
+
},
|
|
372
|
+
children: state.action === "logoutTokenworks" ? t("loggingOut") : t("logoutIwan")
|
|
373
|
+
})] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
374
|
+
size: "sm",
|
|
375
|
+
variant: "primary",
|
|
376
|
+
disabled: busy || !snapshot.tokenworks.writable,
|
|
377
|
+
onClick: () => {
|
|
378
|
+
controller.beginTokenworks();
|
|
379
|
+
},
|
|
380
|
+
children: state.action === "beginTokenworks" ? t("startingOidc") : t("beginTokenworks")
|
|
381
|
+
})
|
|
262
382
|
}),
|
|
263
|
-
state.errorAction === "saveApiKey" || state.errorAction === "unsetApiKey" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
383
|
+
state.errorAction === "saveApiKey" || state.errorAction === "unsetApiKey" || state.errorAction === "selectKeySource" || state.errorAction === "beginTokenworks" || state.errorAction === "cancelTokenworks" || state.errorAction === "logoutTokenworks" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
264
384
|
className: "ulu-alert error",
|
|
265
385
|
children: state.error
|
|
386
|
+
}) : null,
|
|
387
|
+
snapshot.keySource === "tokenworks" && snapshot.tokenworks.error ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
388
|
+
className: "ulu-alert error",
|
|
389
|
+
children: snapshot.tokenworks.error
|
|
266
390
|
}) : null
|
|
267
391
|
]
|
|
268
392
|
}),
|
|
@@ -398,21 +522,38 @@ function UstcBundleConfig({ controller, t }) {
|
|
|
398
522
|
] })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
399
523
|
size: "sm",
|
|
400
524
|
variant: "outline",
|
|
401
|
-
disabled: busy || !snapshot.apiKey.configured,
|
|
525
|
+
disabled: busy || !(snapshot.keySource === "manual" ? snapshot.apiKey.configured : snapshot.tokenworks.configured),
|
|
402
526
|
onClick: () => {
|
|
403
527
|
controller.mutateSnapshot("syncModels");
|
|
404
528
|
},
|
|
405
529
|
children: state.action === "syncModels" ? t("syncingModels") : t("syncModels")
|
|
406
530
|
})]
|
|
407
531
|
}),
|
|
408
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
532
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
409
533
|
className: "ulu-model-list",
|
|
410
|
-
children: snapshot.models.map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
534
|
+
children: [snapshot.models.map((model) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
411
535
|
className: "ulu-model-entry",
|
|
412
|
-
children: [
|
|
413
|
-
|
|
536
|
+
children: [
|
|
537
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", { children: model.id }),
|
|
538
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: model.name === model.id ? "" : model.name }),
|
|
539
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
540
|
+
className: "ulu-model-remove",
|
|
541
|
+
type: "button",
|
|
542
|
+
title: t("removeModel"),
|
|
543
|
+
"aria-label": `${t("removeModel")}: ${model.id}`,
|
|
544
|
+
disabled: busy,
|
|
545
|
+
onClick: () => {
|
|
546
|
+
controller.mutateSnapshot("removeModel", { modelId: model.id });
|
|
547
|
+
},
|
|
548
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutlineRegular, {})
|
|
549
|
+
})
|
|
550
|
+
]
|
|
551
|
+
}, model.id)), snapshot.models.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
552
|
+
className: "ulu-model-empty",
|
|
553
|
+
children: t("modelsEmpty")
|
|
554
|
+
}) : null]
|
|
414
555
|
}),
|
|
415
|
-
state.errorAction === "syncModels" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
556
|
+
state.errorAction === "syncModels" || state.errorAction === "removeModel" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
416
557
|
className: "ulu-alert error",
|
|
417
558
|
children: state.error
|
|
418
559
|
}) : null
|
|
@@ -438,12 +579,15 @@ const CSS = `
|
|
|
438
579
|
.ulu-row{display:grid;min-width:0;grid-template-columns:minmax(0,1fr) auto;align-items:end;gap:10px}.ulu-field{display:grid;min-width:0;gap:6px}.ulu-field>*{min-width:0}
|
|
439
580
|
.ulu-actions,.ulu-login-row{display:flex;min-width:0;align-items:center;gap:8px}.ulu-actions{padding-top:16px}.ulu-actions button:first-child,.ulu-login-row button,.ulu-row>button{min-height:31px;padding:5px 14px;border-radius:var(--dsw-radius-md);font-size:13px;line-height:1.5}
|
|
440
581
|
.ulu-link{display:inline-flex;min-height:31px;align-items:center;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5;text-decoration:none}.ulu-link:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}
|
|
582
|
+
.ulu-login-state{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.5}
|
|
441
583
|
.ulu-spin{animation:ulu-spin .7s linear infinite}@keyframes ulu-spin{to{transform:rotate(360deg)}}
|
|
442
584
|
.ulu-alert{margin:0;padding:10px 0;border-top:0.5px solid var(--dsw-alias-border-l2);font-size:12px;line-height:1.5}.ulu-alert.warning{color:var(--dsw-alias-label-tertiary)}.ulu-alert.error{color:var(--dsw-alias-label-error)}
|
|
443
585
|
.ulu-loading{padding:12px 0;color:var(--dsw-alias-label-tertiary);font-size:12px}.ulu-load-error{display:flex;align-items:center;justify-content:space-between;gap:12px}.ulu-load-error .ulu-alert{flex:1;border-top:0}
|
|
444
586
|
.ulu-model-list{display:flex;max-height:300px;min-width:0;flex-direction:column;overflow:auto;border-top:0.5px solid var(--dsw-alias-border-l2)}
|
|
445
|
-
.ulu-model-entry{display:grid;min-width:0;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:8px;padding:9px 2px;border-bottom:0.5px solid var(--dsw-alias-border-l2);font-size:12px;line-height:18px}
|
|
587
|
+
.ulu-model-entry{display:grid;min-width:0;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) auto;align-items:center;gap:8px;padding:9px 2px;border-bottom:0.5px solid var(--dsw-alias-border-l2);font-size:12px;line-height:18px}
|
|
446
588
|
.ulu-model-entry code,.ulu-model-entry span{min-width:0;overflow-wrap:anywhere}.ulu-model-entry span{color:var(--dsw-alias-label-tertiary)}
|
|
589
|
+
.ulu-model-remove{display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;padding:0;border:0;background:transparent;color:var(--dsw-alias-label-tertiary);cursor:pointer}.ulu-model-remove:hover:not(:disabled){color:var(--dsw-alias-label-primary)}.ulu-model-remove:disabled{opacity:.5;cursor:default}
|
|
590
|
+
.ulu-model-empty{padding:9px 2px;color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:18px}
|
|
447
591
|
`;
|
|
448
592
|
function installStyles() {
|
|
449
593
|
const id = "dsh-llm-ustc/client";
|
package/lib/config.js
CHANGED
|
@@ -2,6 +2,7 @@ import z from '@deepseek-ai/schemastery';
|
|
|
2
2
|
import { API_KEY_REF } from "./constants.js";
|
|
3
3
|
export const Config = z.object({
|
|
4
4
|
apiKeyEnv: z.union([API_KEY_REF]).role('credential-ref').default(API_KEY_REF).volatile(),
|
|
5
|
+
keySource: z.union(['manual', 'tokenworks']).default('manual').volatile(),
|
|
5
6
|
selectedServerId: z.string().volatile(),
|
|
6
7
|
directRecoverySeconds: z.number().step(1).min(30).max(86_400).default(300).volatile(),
|
|
7
8
|
});
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAS5C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IACxF,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE;IACzE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACtF,CAAC,CAAA;AAOF,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAA;IAChE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,qBAAqB,GAAG,EAAE,IAAI,qBAAqB,GAAG,MAAM,EAAE,CAAC;QACjH,MAAM,IAAI,SAAS,CAAC,oEAAoE,CAAC,CAAA;IAC3F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAA;IACtD,OAAO;QACL,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QAC1F,qBAAqB;KACtB,CAAA;AACH,CAAC"}
|
package/lib/constants.js
CHANGED
|
@@ -2,6 +2,7 @@ export const PROVIDER = 'ustc';
|
|
|
2
2
|
export const PROVIDER_NAME = 'USTC LLM';
|
|
3
3
|
export const SETTINGS_NS = 'llm-ustc';
|
|
4
4
|
export const API_KEY_REF = 'USTC_LLM_API_KEY';
|
|
5
|
+
export const TOKENWORKS_SESSION_REF = 'USTC_LLM_TOKENWORKS_SESSION';
|
|
5
6
|
export const IWAN_CONFIG_REF = 'USTC_LLM_IWAN_CONFIG';
|
|
6
7
|
export const DEFAULT_MODEL = 'deepseek-flash';
|
|
7
8
|
export const DEFAULT_CONTEXT_WINDOW = 262_144;
|
package/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAA;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAA;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAA;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAA;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAA"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAA;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAA;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,6BAA6B,CAAA;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAA;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAA;AAC7C,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAAA;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAA;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAA"}
|
package/lib/index.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
2
|
+
import { assertUsableApiKey, LlmError } from '@deepseek-ai/dsh-llm';
|
|
1
3
|
import { UstcAdapter } from "./adapter.js";
|
|
2
4
|
import { Config, resolveConfig } from "./config.js";
|
|
3
|
-
import { PROVIDER, PROVIDER_NAME, SETTINGS_NS } from "./constants.js";
|
|
5
|
+
import { API_KEY_REF, PROVIDER, PROVIDER_NAME, SETTINGS_NS } from "./constants.js";
|
|
4
6
|
import { HelperManager } from "./helper.js";
|
|
5
7
|
import { ModelCatalog } from "./model-catalog.js";
|
|
6
8
|
import { StateStore } from "./state.js";
|
|
9
|
+
import { TokenworksAuth } from "./tokenworks.js";
|
|
7
10
|
import { installWeb, UstcWebBackend } from "./web.js";
|
|
8
11
|
export const name = 'dsh-llm-ustc';
|
|
9
12
|
export const inject = ['llm', 'credentials', 'settings'];
|
|
@@ -14,8 +17,17 @@ export async function apply(ctx, config) {
|
|
|
14
17
|
const store = new StateStore();
|
|
15
18
|
await store.load();
|
|
16
19
|
const helper = new HelperManager(ctx, resolveConfig(config));
|
|
17
|
-
const
|
|
18
|
-
const
|
|
20
|
+
const tokenworks = new TokenworksAuth(ctx);
|
|
21
|
+
const resolveApiKey = async () => {
|
|
22
|
+
if (config.keySource.get() === 'tokenworks')
|
|
23
|
+
return tokenworks.apiKey();
|
|
24
|
+
const hit = await ctx.credentials.resolve(credentialRef(API_KEY_REF));
|
|
25
|
+
if (hit === undefined)
|
|
26
|
+
throw new LlmError(`USTC LLM credential ${API_KEY_REF} is not configured`, 'MISSING_CREDENTIAL');
|
|
27
|
+
return assertUsableApiKey(hit.value, name, API_KEY_REF);
|
|
28
|
+
};
|
|
29
|
+
const catalog = new ModelCatalog(resolveApiKey, helper, store);
|
|
30
|
+
const adapter = new UstcAdapter(ctx, helper, catalog, resolveApiKey);
|
|
19
31
|
const registration = ctx.llm.registerAdapter([PROVIDER], adapter);
|
|
20
32
|
const directory = ctx.llm.registerConfigurableProviders([{
|
|
21
33
|
provider: PROVIDER,
|
|
@@ -28,10 +40,11 @@ export async function apply(ctx, config) {
|
|
|
28
40
|
if (ns === settingsId)
|
|
29
41
|
helper.reconfigure(resolveConfig(config));
|
|
30
42
|
});
|
|
31
|
-
installWeb(ctx, new UstcWebBackend(ctx, helper, catalog, store, undefined, settingsId, config));
|
|
43
|
+
installWeb(ctx, new UstcWebBackend(ctx, helper, catalog, store, undefined, settingsId, config, tokenworks));
|
|
32
44
|
return async () => {
|
|
33
45
|
directory();
|
|
34
46
|
registration();
|
|
47
|
+
tokenworks.dispose();
|
|
35
48
|
await helper.dispose();
|
|
36
49
|
};
|
|
37
50
|
}
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,aAAa,EAA+B,MAAM,aAAa,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/model-catalog.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { credentialRef } from '@deepseek-ai/dsh-credentials';
|
|
2
|
-
import { API_KEY_REF } from "./constants.js";
|
|
3
1
|
import { normalizeModels } from "./state.js";
|
|
4
2
|
export class ModelCatalog {
|
|
5
|
-
|
|
3
|
+
resolveApiKey;
|
|
6
4
|
helper;
|
|
7
5
|
store;
|
|
8
|
-
constructor(
|
|
9
|
-
this.
|
|
6
|
+
constructor(resolveApiKey, helper, store) {
|
|
7
|
+
this.resolveApiKey = resolveApiKey;
|
|
10
8
|
this.helper = helper;
|
|
11
9
|
this.store = store;
|
|
12
10
|
this.helper.onDirectRecovered(async () => { await this.refresh(); });
|
|
@@ -15,15 +13,13 @@ export class ModelCatalog {
|
|
|
15
13
|
return this.store.models();
|
|
16
14
|
}
|
|
17
15
|
async refresh(signal) {
|
|
18
|
-
const
|
|
19
|
-
if (credential === undefined)
|
|
20
|
-
throw new Error(`${API_KEY_REF} is not configured`);
|
|
16
|
+
const key = await this.resolveApiKey();
|
|
21
17
|
const timeout = AbortSignal.timeout(20_000);
|
|
22
18
|
const response = await this.helper.fetch('/v1/models', {
|
|
23
19
|
signal: signal === undefined ? timeout : AbortSignal.any([signal, timeout]),
|
|
24
20
|
headers: {
|
|
25
21
|
accept: 'application/json',
|
|
26
|
-
authorization: `Bearer ${
|
|
22
|
+
authorization: `Bearer ${key}`,
|
|
27
23
|
},
|
|
28
24
|
});
|
|
29
25
|
if (!response.ok)
|
package/lib/model-catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../src/model-catalog.ts"],"names":[],"mappings":"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"}
|
package/lib/state.js
CHANGED
|
@@ -39,6 +39,10 @@ export class StateStore {
|
|
|
39
39
|
};
|
|
40
40
|
await this.persist();
|
|
41
41
|
}
|
|
42
|
+
async removeModel(id) {
|
|
43
|
+
this.current = { ...this.current, models: this.current.models.filter(model => model.id !== id) };
|
|
44
|
+
await this.persist();
|
|
45
|
+
}
|
|
42
46
|
async persist() {
|
|
43
47
|
const snapshot = `${JSON.stringify(this.current, null, 2)}\n`;
|
|
44
48
|
this.writes = this.writes.then(async () => {
|
|
@@ -54,7 +58,7 @@ export function normalizeModels(models) {
|
|
|
54
58
|
const unique = new Map();
|
|
55
59
|
for (const model of models) {
|
|
56
60
|
const id = model.id.trim();
|
|
57
|
-
if (id.length === 0 || id.length > 256 || /^claude/iu.test(id) || unique.has(id))
|
|
61
|
+
if (id.length === 0 || id.length > 256 || /^(?:claude|smart)/iu.test(id) || id.toLowerCase() === 'unlimited-ocr' || unique.has(id))
|
|
58
62
|
continue;
|
|
59
63
|
const name = model.name.trim();
|
|
60
64
|
unique.set(id, { id, name: name.length === 0 ? id : name });
|
|
@@ -74,7 +78,7 @@ function parseState(value) {
|
|
|
74
78
|
return structuredClone(FALLBACK);
|
|
75
79
|
let models;
|
|
76
80
|
try {
|
|
77
|
-
models = normalizeModels(value.models.filter(isCachedModel));
|
|
81
|
+
models = value.models.length === 0 ? [] : normalizeModels(value.models.filter(isCachedModel));
|
|
78
82
|
}
|
|
79
83
|
catch {
|
|
80
84
|
models = structuredClone(FALLBACK.models);
|
package/lib/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|