@dsh-plus/llm-pi 0.1.35 → 0.1.36
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 +12 -3
- package/package.json +27 -27
- package/src/deepseek-routes.ts +13 -1
- package/src/resolve-dsh.ts +6 -0
package/lib/index.js
CHANGED
|
@@ -815,7 +815,13 @@ var DeepseekRouteRegistrar = class {
|
|
|
815
815
|
if (current === void 0) throw new kit.LlmError(`llm-pi: deepseek route "${route}" 已注销`, "INVALID_REQUEST");
|
|
816
816
|
return current.connection;
|
|
817
817
|
},
|
|
818
|
-
|
|
818
|
+
resolveAuth: (async (connection) => ({ headers: { "x-api-key": await this.resolveApiKey(connection) } })),
|
|
819
|
+
discoverModels: (provider) => {
|
|
820
|
+
const connection = routes().get(route)?.connection ?? built.connection;
|
|
821
|
+
const catalogModelInfo = kit.deepseek?.catalogModelInfo;
|
|
822
|
+
if (catalogModelInfo === void 0) return Promise.resolve([]);
|
|
823
|
+
return Promise.resolve(connection.models.map((model) => catalogModelInfo(provider, model)));
|
|
824
|
+
},
|
|
819
825
|
resolveUserId: () => this.resolveUserId(),
|
|
820
826
|
resolveAttachments: () => ctx.get("attachments"),
|
|
821
827
|
resolveImageAccess: (attachments, ref) => kit.resolveImageAttachmentAccess(attachments, (hostPath) => ctx.get("fs")?.processPathFromHostPath(hostPath), ref),
|
|
@@ -1851,6 +1857,7 @@ function checkDeepseekShape(kit) {
|
|
|
1851
1857
|
if (typeof kit.DeepSeekAdapter !== "function") problems.push("DeepSeekAdapter 不是类");
|
|
1852
1858
|
else if (typeof kit.DeepSeekAdapter.prototype["stream"] !== "function") problems.push("DeepSeekAdapter.prototype.stream 缺失");
|
|
1853
1859
|
if (typeof kit.resolveAdapterOptions !== "function") problems.push("resolveAdapterOptions 缺失");
|
|
1860
|
+
if (typeof kit.catalogModelInfo !== "function") problems.push("catalogModelInfo 缺失");
|
|
1854
1861
|
if (typeof kit.getOrCreateAnonymousUserId !== "function") problems.push("getOrCreateAnonymousUserId 缺失");
|
|
1855
1862
|
return problems;
|
|
1856
1863
|
}
|
|
@@ -1915,7 +1922,8 @@ async function importTreeDeepseek(root) {
|
|
|
1915
1922
|
const kit = {
|
|
1916
1923
|
DeepSeekAdapter: deepseek["DeepSeekAdapter"],
|
|
1917
1924
|
resolveAdapterOptions: deepseek["resolveAdapterOptions"],
|
|
1918
|
-
getOrCreateAnonymousUserId: anonId["getOrCreateAnonymousUserId"]
|
|
1925
|
+
getOrCreateAnonymousUserId: anonId["getOrCreateAnonymousUserId"],
|
|
1926
|
+
catalogModelInfo: deepseek["catalogModelInfo"]
|
|
1919
1927
|
};
|
|
1920
1928
|
const problems = checkDeepseekShape(kit);
|
|
1921
1929
|
if (problems.length > 0) return { problem: `形状不兼容:${problems.join(";")}` };
|
|
@@ -2001,7 +2009,8 @@ function loadVendoredDeepseek() {
|
|
|
2001
2009
|
const kit = {
|
|
2002
2010
|
DeepSeekAdapter: vendoredDeepseek.DeepSeekAdapter,
|
|
2003
2011
|
resolveAdapterOptions: vendoredDeepseek.resolveAdapterOptions,
|
|
2004
|
-
getOrCreateAnonymousUserId: vendoredAnonId.getOrCreateAnonymousUserId
|
|
2012
|
+
getOrCreateAnonymousUserId: vendoredAnonId.getOrCreateAnonymousUserId,
|
|
2013
|
+
catalogModelInfo: vendoredDeepseek.catalogModelInfo
|
|
2005
2014
|
};
|
|
2006
2015
|
return checkDeepseekShape(kit).length === 0 ? kit : void 0;
|
|
2007
2016
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dsh-plus/llm-pi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "dsh-plus service+ui plugin: 基于 PiAiAdapter 的自定义 LLM 路由(全量 compat、模型继承、models.dev 目录兜底)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -32,40 +32,40 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"https-proxy-agent": "^9.1.0",
|
|
35
|
-
"@dsh-plus/shared": "0.1.
|
|
35
|
+
"@dsh-plus/shared": "0.1.25"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"@deepseek-ai/cordis": "^4.0.4",
|
|
39
|
-
"@deepseek-ai/dsh-anonymous-user-id": "^0.
|
|
40
|
-
"@deepseek-ai/dsh-credentials": "^0.
|
|
41
|
-
"@deepseek-ai/dsh-home-paths": "^0.
|
|
42
|
-
"@deepseek-ai/dsh-host-webserver": "^0.
|
|
43
|
-
"@deepseek-ai/dsh-launch-environment": "^0.
|
|
44
|
-
"@deepseek-ai/dsh-llm": "^0.
|
|
45
|
-
"@deepseek-ai/dsh-llm-deepseek": "^0.
|
|
46
|
-
"@deepseek-ai/dsh-llm-pi-ai": "^0.
|
|
47
|
-
"@deepseek-ai/dsh-settings": "^0.
|
|
48
|
-
"@deepseek-ai/dsh-util-values": "^0.
|
|
39
|
+
"@deepseek-ai/dsh-anonymous-user-id": "^0.2.0-rc.1",
|
|
40
|
+
"@deepseek-ai/dsh-credentials": "^0.2.0-rc.1",
|
|
41
|
+
"@deepseek-ai/dsh-home-paths": "^0.2.0-rc.1",
|
|
42
|
+
"@deepseek-ai/dsh-host-webserver": "^0.2.0-rc.1",
|
|
43
|
+
"@deepseek-ai/dsh-launch-environment": "^0.2.0-rc.1",
|
|
44
|
+
"@deepseek-ai/dsh-llm": "^0.2.0-rc.1",
|
|
45
|
+
"@deepseek-ai/dsh-llm-deepseek": "^0.2.0-rc.1",
|
|
46
|
+
"@deepseek-ai/dsh-llm-pi-ai": "^0.2.0-rc.1",
|
|
47
|
+
"@deepseek-ai/dsh-settings": "^0.2.0-rc.1",
|
|
48
|
+
"@deepseek-ai/dsh-util-values": "^0.2.0-rc.1",
|
|
49
49
|
"@deepseek-ai/schemastery": "^3.18.4",
|
|
50
50
|
"@earendil-works/pi-ai": "^0.85.1"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@deepseek-ai/cordis": "4.0.4",
|
|
54
|
-
"@deepseek-ai/dsh-anonymous-user-id": "0.
|
|
55
|
-
"@deepseek-ai/dsh-atomic-write": "0.
|
|
56
|
-
"@deepseek-ai/dsh-attachment": "0.
|
|
57
|
-
"@deepseek-ai/dsh-credentials": "0.
|
|
58
|
-
"@deepseek-ai/dsh-home-paths": "0.
|
|
59
|
-
"@deepseek-ai/dsh-host-webserver": "0.
|
|
60
|
-
"@deepseek-ai/dsh-launch-environment": "0.
|
|
61
|
-
"@deepseek-ai/dsh-llm": "0.
|
|
62
|
-
"@deepseek-ai/dsh-llm-deepseek": "0.
|
|
63
|
-
"@deepseek-ai/dsh-llm-pi-ai": "0.
|
|
64
|
-
"@deepseek-ai/dsh-settings": "0.
|
|
65
|
-
"@deepseek-ai/dsh-timeout": "0.
|
|
66
|
-
"@deepseek-ai/dsh-typert-protocol": "0.
|
|
67
|
-
"@deepseek-ai/dsh-util-crypto": "0.
|
|
68
|
-
"@deepseek-ai/dsh-util-values": "0.
|
|
54
|
+
"@deepseek-ai/dsh-anonymous-user-id": "0.2.0-rc.1",
|
|
55
|
+
"@deepseek-ai/dsh-atomic-write": "0.2.0-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-attachment": "0.2.0-rc.1",
|
|
57
|
+
"@deepseek-ai/dsh-credentials": "0.2.0-rc.1",
|
|
58
|
+
"@deepseek-ai/dsh-home-paths": "0.2.0-rc.1",
|
|
59
|
+
"@deepseek-ai/dsh-host-webserver": "0.2.0-rc.1",
|
|
60
|
+
"@deepseek-ai/dsh-launch-environment": "0.2.0-rc.1",
|
|
61
|
+
"@deepseek-ai/dsh-llm": "0.2.0-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-llm-deepseek": "0.2.0-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-llm-pi-ai": "0.2.0-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-settings": "0.2.0-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-timeout": "0.2.0-rc.1",
|
|
66
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.1",
|
|
67
|
+
"@deepseek-ai/dsh-util-crypto": "0.2.0-rc.1",
|
|
68
|
+
"@deepseek-ai/dsh-util-values": "0.2.0-rc.1",
|
|
69
69
|
"@deepseek-ai/schemastery": "3.18.4",
|
|
70
70
|
"@earendil-works/pi-ai": "0.85.1",
|
|
71
71
|
"@types/react": "~18.3.31",
|
package/src/deepseek-routes.ts
CHANGED
|
@@ -130,7 +130,19 @@ export class DeepseekRouteRegistrar {
|
|
|
130
130
|
}
|
|
131
131
|
return current.connection
|
|
132
132
|
},
|
|
133
|
-
|
|
133
|
+
// 0.2.0 起认证由 resolveAuth 一次性给出请求头(resolveApiKey 已删),
|
|
134
|
+
// 头形与官方 llm-deepseek-api-key 接线一致(x-api-key)。
|
|
135
|
+
resolveAuth: (async (connection: { apiKeyEnv: unknown }) => ({
|
|
136
|
+
headers: { 'x-api-key': await this.resolveApiKey(connection) },
|
|
137
|
+
})) as never,
|
|
138
|
+
// 0.2.0 起 listModels 改读 discoverModels(缺省即空目录,模型选择器无项):
|
|
139
|
+
// 与官方 llm-deepseek-api-key 同款——现取当前物化 connection 的 models。
|
|
140
|
+
discoverModels: (provider: string) => {
|
|
141
|
+
const connection = routes().get(route)?.connection ?? built.connection
|
|
142
|
+
const catalogModelInfo = kit.deepseek?.catalogModelInfo
|
|
143
|
+
if (catalogModelInfo === undefined) return Promise.resolve([])
|
|
144
|
+
return Promise.resolve(connection.models.map((model) => catalogModelInfo(provider, model)))
|
|
145
|
+
},
|
|
134
146
|
resolveUserId: () => this.resolveUserId() as never,
|
|
135
147
|
resolveAttachments: () => ctx.get('attachments') as never,
|
|
136
148
|
// 附件宿主路径 → 模型工具执行世界只读路径桥(官方接线同款,见
|
package/src/resolve-dsh.ts
CHANGED
|
@@ -31,6 +31,7 @@ import type { CredentialKey } from '@deepseek-ai/dsh-credentials'
|
|
|
31
31
|
import type * as DshLlm from '@deepseek-ai/dsh-llm'
|
|
32
32
|
import * as vendoredLlm from '@deepseek-ai/dsh-llm'
|
|
33
33
|
import type {
|
|
34
|
+
catalogModelInfo as catalogModelInfoType,
|
|
34
35
|
DeepSeekAdapter as DeepSeekAdapterType,
|
|
35
36
|
resolveAdapterOptions as resolveDeepSeekOptionsType,
|
|
36
37
|
} from '@deepseek-ai/dsh-llm-deepseek'
|
|
@@ -68,6 +69,8 @@ export interface DeepSeekKit {
|
|
|
68
69
|
DeepSeekAdapter: typeof DeepSeekAdapterType
|
|
69
70
|
resolveAdapterOptions: typeof resolveDeepSeekOptionsType
|
|
70
71
|
getOrCreateAnonymousUserId: typeof getAnonIdType
|
|
72
|
+
/** 目录项 → LlmModelInfo(0.2.0 起 listModels 经 discoverModels 消费)。 */
|
|
73
|
+
catalogModelInfo: typeof catalogModelInfoType
|
|
71
74
|
}
|
|
72
75
|
|
|
73
76
|
/** profile 解析面(官方 config.ts resolveProfiles 的签名;包根未导出,见文件头)。 */
|
|
@@ -178,6 +181,7 @@ function checkDeepseekShape(kit: DeepSeekKit): string[] {
|
|
|
178
181
|
problems.push('DeepSeekAdapter.prototype.stream 缺失')
|
|
179
182
|
}
|
|
180
183
|
if (typeof kit.resolveAdapterOptions !== 'function') problems.push('resolveAdapterOptions 缺失')
|
|
184
|
+
if (typeof kit.catalogModelInfo !== 'function') problems.push('catalogModelInfo 缺失')
|
|
181
185
|
if (typeof kit.getOrCreateAnonymousUserId !== 'function') {
|
|
182
186
|
problems.push('getOrCreateAnonymousUserId 缺失')
|
|
183
187
|
}
|
|
@@ -268,6 +272,7 @@ async function importTreeDeepseek(root: string): Promise<{ kit?: DeepSeekKit; pr
|
|
|
268
272
|
getOrCreateAnonymousUserId: anonId[
|
|
269
273
|
'getOrCreateAnonymousUserId'
|
|
270
274
|
] as DeepSeekKit['getOrCreateAnonymousUserId'],
|
|
275
|
+
catalogModelInfo: deepseek['catalogModelInfo'] as DeepSeekKit['catalogModelInfo'],
|
|
271
276
|
}
|
|
272
277
|
const problems = checkDeepseekShape(kit)
|
|
273
278
|
if (problems.length > 0) return { problem: `形状不兼容:${problems.join(';')}` }
|
|
@@ -381,6 +386,7 @@ function loadVendoredDeepseek(): DeepSeekKit | undefined {
|
|
|
381
386
|
DeepSeekAdapter: vendoredDeepseek.DeepSeekAdapter,
|
|
382
387
|
resolveAdapterOptions: vendoredDeepseek.resolveAdapterOptions,
|
|
383
388
|
getOrCreateAnonymousUserId: vendoredAnonId.getOrCreateAnonymousUserId,
|
|
389
|
+
catalogModelInfo: vendoredDeepseek.catalogModelInfo,
|
|
384
390
|
}
|
|
385
391
|
return checkDeepseekShape(kit).length === 0 ? kit : undefined
|
|
386
392
|
}
|