@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 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
- resolveApiKey: this.resolveApiKey,
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.35",
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.24"
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.1.7-rc.1",
40
- "@deepseek-ai/dsh-credentials": "^0.1.7-rc.1",
41
- "@deepseek-ai/dsh-home-paths": "^0.1.7-rc.1",
42
- "@deepseek-ai/dsh-host-webserver": "^0.1.7-rc.1",
43
- "@deepseek-ai/dsh-launch-environment": "^0.1.7-rc.1",
44
- "@deepseek-ai/dsh-llm": "^0.1.7-rc.1",
45
- "@deepseek-ai/dsh-llm-deepseek": "^0.1.7-rc.1",
46
- "@deepseek-ai/dsh-llm-pi-ai": "^0.1.7-rc.1",
47
- "@deepseek-ai/dsh-settings": "^0.1.7-rc.1",
48
- "@deepseek-ai/dsh-util-values": "^0.1.7-rc.1",
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.1.7-rc.1",
55
- "@deepseek-ai/dsh-atomic-write": "0.1.7-rc.1",
56
- "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
57
- "@deepseek-ai/dsh-credentials": "0.1.7-rc.1",
58
- "@deepseek-ai/dsh-home-paths": "0.1.7-rc.1",
59
- "@deepseek-ai/dsh-host-webserver": "0.1.7-rc.1",
60
- "@deepseek-ai/dsh-launch-environment": "0.1.7-rc.1",
61
- "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
62
- "@deepseek-ai/dsh-llm-deepseek": "0.1.7-rc.1",
63
- "@deepseek-ai/dsh-llm-pi-ai": "0.1.7-rc.1",
64
- "@deepseek-ai/dsh-settings": "0.1.7-rc.1",
65
- "@deepseek-ai/dsh-timeout": "0.1.7-rc.1",
66
- "@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.1",
67
- "@deepseek-ai/dsh-util-crypto": "0.1.7-rc.1",
68
- "@deepseek-ai/dsh-util-values": "0.1.7-rc.1",
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",
@@ -130,7 +130,19 @@ export class DeepseekRouteRegistrar {
130
130
  }
131
131
  return current.connection
132
132
  },
133
- resolveApiKey: this.resolveApiKey as never,
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
  // 附件宿主路径 → 模型工具执行世界只读路径桥(官方接线同款,见
@@ -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
  }