dsh-llm-ustc 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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +69 -0
  3. package/cordis.patch.yml +4 -0
  4. package/lib/adapter.js +211 -0
  5. package/lib/adapter.js.map +1 -0
  6. package/lib/client.js +506 -0
  7. package/lib/config.js +17 -0
  8. package/lib/config.js.map +1 -0
  9. package/lib/constants.js +11 -0
  10. package/lib/constants.js.map +1 -0
  11. package/lib/helper.js +302 -0
  12. package/lib/helper.js.map +1 -0
  13. package/lib/index.js +43 -0
  14. package/lib/index.js.map +1 -0
  15. package/lib/model-catalog.js +59 -0
  16. package/lib/model-catalog.js.map +1 -0
  17. package/lib/native.js +47 -0
  18. package/lib/native.js.map +1 -0
  19. package/lib/state.js +97 -0
  20. package/lib/state.js.map +1 -0
  21. package/lib/types/adapter.d.ts +24 -0
  22. package/lib/types/adapter.d.ts.map +1 -0
  23. package/lib/types/client/index.d.ts +112 -0
  24. package/lib/types/client/index.d.ts.map +1 -0
  25. package/lib/types/config.d.ts +12 -0
  26. package/lib/types/config.d.ts.map +1 -0
  27. package/lib/types/constants.d.ts +11 -0
  28. package/lib/types/constants.d.ts.map +1 -0
  29. package/lib/types/helper.d.ts +51 -0
  30. package/lib/types/helper.d.ts.map +1 -0
  31. package/lib/types/index.d.ts +7 -0
  32. package/lib/types/index.d.ts.map +1 -0
  33. package/lib/types/model-catalog.d.ts +14 -0
  34. package/lib/types/model-catalog.d.ts.map +1 -0
  35. package/lib/types/native.d.ts +7 -0
  36. package/lib/types/native.d.ts.map +1 -0
  37. package/lib/types/state.d.ts +15 -0
  38. package/lib/types/state.d.ts.map +1 -0
  39. package/lib/types/types.d.ts +34 -0
  40. package/lib/types/types.d.ts.map +1 -0
  41. package/lib/types/web.d.ts +64 -0
  42. package/lib/types/web.d.ts.map +1 -0
  43. package/lib/types.js +2 -0
  44. package/lib/types.js.map +1 -0
  45. package/lib/web.js +221 -0
  46. package/lib/web.js.map +1 -0
  47. package/package.json +112 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 XeF2
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,69 @@
1
+ # dsh-llm-ustc
2
+
3
+ DeepSeek Harness `ustc` LLM Provider,访问中国科学技术大学
4
+ `https://api.llm.ustc.edu.cn`。插件始终优先直连;仅当 DNS、TCP 或 TLS
5
+ 建连失败时,才为这个 Provider 的固定目标启动内置 iWAN 用户态隧道。
6
+
7
+ ## 要求
8
+
9
+ - DeepSeek Harness `0.1.0-rc.6`
10
+ - Node.js 24(也支持 Node.js `^22.19.0`)
11
+ - Windows、macOS 或 Linux,x64/ARM64
12
+ - 科大 LLM API Key
13
+ - 公网环境需要完成 iWAN 登录并显式选择线路
14
+
15
+ ## 安装
16
+
17
+ 从 npm 安装到 DSH Web profile:
18
+
19
+ ```sh
20
+ dsh plugin --profile web add dsh-llm-ustc@latest
21
+ ```
22
+
23
+ 如需固定版本,可以将 `latest` 换成具体版本号:
24
+
25
+ ```sh
26
+ dsh plugin --profile web add dsh-llm-ustc@0.1.0
27
+ ```
28
+
29
+ 安装时 npm 会通过六个 `optionalDependencies` 之一自动选择当前操作系统和架构的
30
+ 原生 helper;不支持的平台或缺失的原生包会返回明确错误。安装完成后重启正在运行的
31
+ DSH Web 进程。
32
+
33
+ 打开 DSH Web 的“设置 -> 插件 -> 插件配置”,展开“科大大模型”:
34
+
35
+ 1. 保存 API Key(凭据引用固定为 `USTC_LLM_API_KEY`),并同步模型目录。
36
+ 2. 公网使用时启动 USTC 登录,在浏览器完成认证后粘贴完整回调 URL,再显式选择一条线路。
37
+
38
+ 模型 ID 直接来自 `/v1/models`。首次离线时仅显示
39
+ `deepseek-v4-flash-ascend` 引导项;同步成功后会缓存最近可用目录。
40
+
41
+ ## 网络边界
42
+
43
+ - helper 只监听随机 `127.0.0.1` 端口,并要求每次启动生成的会话令牌。
44
+ - 数据面只接受 `GET /v1/models` 和 `POST /v1/chat/completions`。
45
+ - 上游固定为 `api.llm.ustc.edu.cn:443`,Host 和 TLS SNI 不可配置。
46
+ - 拒绝绝对 URL、`CONNECT`、任意路径、任意 Host 和 SOCKS IP 目标。
47
+ - helper 和 OIDC/控制面客户端忽略 `HTTP_PROXY`、`HTTPS_PROXY`、`ALL_PROXY` 与
48
+ `NO_PROXY`;插件不会修改进程外的环境变量。
49
+ - 不创建 TUN 设备,不修改系统 DNS、代理、路由表或其他 DSH Provider 的网络流量。
50
+ - `401/403/429/5xx` 是合法 HTTP 响应,不触发 iWAN 切换。
51
+ - 请求收到响应头或响应字节后不会重放;流中断只会影响下一次请求的路由。
52
+
53
+ 进入 iWAN 模式后,helper 每五分钟(带抖动)执行一次直连探测,任意合法 HTTP
54
+ 响应都会恢复直连。隧道断线按 1 秒起步、30 秒封顶的抖动指数退避重建。
55
+
56
+ ## 凭据与本地状态
57
+
58
+ - `USTC_LLM_API_KEY`:科大 LLM API Key。
59
+ - `USTC_LLM_IWAN_CONFIG`:插件私有 iWAN 凭据,不写入 Provider 配置。
60
+ - `$DSH_HOME/plugins/dsh-llm-ustc/state.json`:模型缓存与非敏感状态。
61
+
62
+ ## 验证
63
+
64
+ ```sh
65
+ pnpm check
66
+ pnpm test:ts
67
+ cargo test --manifest-path helper/Cargo.toml
68
+ pnpm build
69
+ ```
@@ -0,0 +1,4 @@
1
+ # Mount the USTC LLM provider into the selected DSH profile.
2
+ - insert:
3
+ - id: llm-ustc
4
+ name: dsh-llm-ustc
package/lib/adapter.js ADDED
@@ -0,0 +1,211 @@
1
+ import { credentialRef } from '@deepseek-ai/dsh-credentials';
2
+ import { assertUsableApiKey, LlmAdapter, LlmError, ReasoningEffortId, resolveRetryPolicy, } from '@deepseek-ai/dsh-llm';
3
+ import { PiAiAdapter } from '@deepseek-ai/dsh-llm-pi-ai';
4
+ import { createProvider } from '@earendil-works/pi-ai';
5
+ import { openAICompletionsApi } from '@earendil-works/pi-ai/api/openai-completions.lazy';
6
+ import { API_KEY_REF, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_TOKENS, PROVIDER, PROVIDER_NAME, } from "./constants.js";
7
+ const RETRY_POLICY = resolveRetryPolicy({
8
+ mode: 'normal',
9
+ maxRetries: 0,
10
+ retryableCodes: ['STREAM_CLOSED'],
11
+ }, 'llm-ustc.retryPolicy');
12
+ const USTC_REASONING_EFFORTS = [
13
+ { id: ReasoningEffortId('off'), name: 'Off' },
14
+ { id: ReasoningEffortId('high'), name: 'High' },
15
+ { id: ReasoningEffortId('max'), name: 'Max' },
16
+ ];
17
+ const LONG_CONTEXT_WINDOW = 1_000_000;
18
+ const K3_CONTEXT_WINDOW = 600_000;
19
+ export class UstcAdapter extends LlmAdapter {
20
+ ctx;
21
+ helper;
22
+ catalog;
23
+ delegate;
24
+ constructor(ctx, helper, catalog) {
25
+ super();
26
+ this.ctx = ctx;
27
+ this.helper = helper;
28
+ this.catalog = catalog;
29
+ }
30
+ providerInfo(provider) {
31
+ this.assertProvider(provider);
32
+ return { id: PROVIDER, name: PROVIDER_NAME };
33
+ }
34
+ providerRetryPolicy(provider) {
35
+ this.assertProvider(provider);
36
+ return RETRY_POLICY;
37
+ }
38
+ async listModels(provider) {
39
+ this.assertProvider(provider);
40
+ return this.catalog.models().map(model => ({
41
+ provider: PROVIDER,
42
+ id: model.id,
43
+ name: model.name,
44
+ inputModalities: ['text'],
45
+ }));
46
+ }
47
+ async resolveModel(provider, model) {
48
+ this.assertProvider(provider);
49
+ const match = this.catalog.models().find(candidate => candidate.id === model);
50
+ const capabilities = modelCapabilities(model);
51
+ return {
52
+ provider: PROVIDER,
53
+ id: model,
54
+ name: match?.name ?? model,
55
+ inputModalities: ['text'],
56
+ context: { contextWindow: capabilities.contextWindow },
57
+ defaultMaxTokens: DEFAULT_MAX_TOKENS,
58
+ ...(capabilities.reasoning ? { reasoning: { efforts: USTC_REASONING_EFFORTS } } : {}),
59
+ };
60
+ }
61
+ async *stream(options) {
62
+ this.assertProvider(options.provider);
63
+ const adapter = await this.currentDelegate();
64
+ try {
65
+ for await (const chunk of adapter.stream(options)) {
66
+ yield normalizeChunk(chunk);
67
+ }
68
+ }
69
+ catch (error) {
70
+ throw normalizeThrownError(error);
71
+ }
72
+ }
73
+ invalidate() {
74
+ this.delegate = undefined;
75
+ }
76
+ async currentDelegate() {
77
+ const endpoint = await this.helper.endpoint();
78
+ const models = this.catalog.models();
79
+ const key = `${endpoint.baseURL}\0${endpoint.generation}\0${models.map(model => `${model.id}\0${model.name}`).join('\0')}`;
80
+ if (this.delegate?.key === key)
81
+ return this.delegate.adapter;
82
+ const profile = makeProfile(endpoint.baseURL, models, endpoint.headers);
83
+ const profiles = new Map([[PROVIDER, profile]]);
84
+ const adapter = new PiAiAdapter({
85
+ profiles: () => profiles,
86
+ resolveApiKey: async () => {
87
+ const hit = await this.ctx.credentials.resolve(credentialRef(API_KEY_REF));
88
+ if (hit === undefined)
89
+ throw new LlmError(`USTC LLM credential ${API_KEY_REF} is not configured`, 'MISSING_CREDENTIAL');
90
+ return assertUsableApiKey(hit.value, 'dsh-llm-ustc', API_KEY_REF);
91
+ },
92
+ resolveAttachments: () => this.ctx.get('attachments'),
93
+ });
94
+ this.delegate = { key, adapter };
95
+ return adapter;
96
+ }
97
+ assertProvider(provider) {
98
+ if (provider !== PROVIDER)
99
+ throw new LlmError(`USTC adapter does not own provider ${JSON.stringify(provider)}`, 'NO_ADAPTER');
100
+ }
101
+ }
102
+ export function normalizeFailure(message, code) {
103
+ if (/\b(?:401|403)\b|unauthori[sz]ed|invalid.*(?:api[ -]?key|credential)/iu.test(message))
104
+ return 'AUTH';
105
+ if (/\b429\b|rate.?limit/iu.test(message))
106
+ return 'RATE_LIMIT';
107
+ if (/\b404\b|model.*(?:not found|does not exist|unknown)/iu.test(message))
108
+ return 'UNKNOWN_MODEL';
109
+ if (/\b5\d\d\b|service unavailable/iu.test(message))
110
+ return 'SERVER';
111
+ if (/\b(?:dns|network|connection|socket|fetch|transport)\b|\bECONN[A-Z]+\b/u.test(message))
112
+ return 'TRANSPORT';
113
+ return code;
114
+ }
115
+ function normalizeChunk(chunk) {
116
+ if (chunk.type !== 'finish' || chunk.reason.kind !== 'error')
117
+ return chunk;
118
+ const failure = chunk.reason.failure;
119
+ return {
120
+ ...chunk,
121
+ reason: {
122
+ kind: 'error',
123
+ failure: { ...failure, code: normalizeFailure(failure.message, failure.code) },
124
+ },
125
+ };
126
+ }
127
+ function normalizeThrownError(error) {
128
+ if (!(error instanceof LlmError))
129
+ return error;
130
+ const code = normalizeFailure(error.message, error.code);
131
+ return code === error.code ? error : new LlmError(error.message, code, { cause: error });
132
+ }
133
+ function makeProfile(baseURL, cached, headers) {
134
+ const models = cached.map(model => {
135
+ const capabilities = modelCapabilities(model.id);
136
+ return {
137
+ id: model.id,
138
+ name: model.name,
139
+ api: 'openai-completions',
140
+ provider: PROVIDER,
141
+ baseUrl: baseURL,
142
+ reasoning: capabilities.reasoning,
143
+ ...(capabilities.reasoning ? {
144
+ thinkingLevelMap: {
145
+ minimal: null,
146
+ low: null,
147
+ medium: null,
148
+ high: 'high',
149
+ xhigh: null,
150
+ max: 'max',
151
+ },
152
+ } : {}),
153
+ input: ['text'],
154
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
155
+ contextWindow: capabilities.contextWindow,
156
+ maxTokens: DEFAULT_MAX_TOKENS,
157
+ compat: {
158
+ supportsStore: false,
159
+ supportsDeveloperRole: false,
160
+ supportsReasoningEffort: capabilities.reasoning,
161
+ ...(capabilities.reasoning ? { thinkingFormat: 'deepseek' } : {}),
162
+ requiresReasoningContentOnAssistantMessages: capabilities.reasoning,
163
+ supportsUsageInStreaming: true,
164
+ maxTokensField: 'max_tokens',
165
+ supportsStrictMode: false,
166
+ supportsLongCacheRetention: false,
167
+ },
168
+ };
169
+ });
170
+ const provider = createProvider({
171
+ id: PROVIDER,
172
+ name: PROVIDER_NAME,
173
+ baseUrl: baseURL,
174
+ auth: {
175
+ apiKey: {
176
+ name: PROVIDER_NAME,
177
+ resolve: ({ credential }) => Promise.resolve({
178
+ auth: credential?.key === undefined ? {} : { apiKey: credential.key },
179
+ source: API_KEY_REF,
180
+ }),
181
+ },
182
+ },
183
+ models,
184
+ api: openAICompletionsApi(),
185
+ });
186
+ return {
187
+ provider: PROVIDER,
188
+ displayName: PROVIDER_NAME,
189
+ apiKeyEnv: credentialRef(API_KEY_REF),
190
+ api: 'openai-completions',
191
+ baseURL,
192
+ headers: { ...headers },
193
+ defaultContextWindow: DEFAULT_CONTEXT_WINDOW,
194
+ defaultMaxTokens: DEFAULT_MAX_TOKENS,
195
+ defaultInput: ['text'],
196
+ streamIdleTimeoutMs: 300_000,
197
+ retryPolicy: RETRY_POLICY,
198
+ piProvider: provider,
199
+ configuredMaxTokens: new Map(models.map(model => [model.id, DEFAULT_MAX_TOKENS])),
200
+ };
201
+ }
202
+ function modelCapabilities(model) {
203
+ const id = model.toLowerCase();
204
+ if (id.startsWith('deepseek-v4') || id.startsWith('glm-5')) {
205
+ return { contextWindow: LONG_CONTEXT_WINDOW, reasoning: true };
206
+ }
207
+ if (id === 'k3')
208
+ return { contextWindow: K3_CONTEXT_WINDOW, reasoning: true };
209
+ return { contextWindow: DEFAULT_CONTEXT_WINDOW, reasoning: false };
210
+ }
211
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}