@deepseek-ai/dsh-llm 0.1.6-alpha.1 → 0.1.6-alpha.2

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.i18n.yaml CHANGED
@@ -2,5 +2,5 @@
2
2
  # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
3
  # after editing either side, bring the other along and re-record with:
4
4
  # pnpm run verify-translation-pairing --write packages/llm/llm/README.md
5
- README.md: 8e4e547190a039959f7db29898945f2ed68ff874
6
- README.zh.md: 9164f4a6e6107e439b732539cddeb14716bc3fdc
5
+ README.md: 7192ee58eaffb153231268095feb3d9c7ddda37a
6
+ README.zh.md: 6898833c6eb5199ce8a93b7ec33cbf4ce7a31cb3
package/README.md CHANGED
@@ -61,7 +61,7 @@ After a successful mount, `ctx.llm.listProviders()` reports the registered route
61
61
  - **Stream one model call** — `ctx.llm.stream(options)` yields raw chunks (token-level deltas) for any registered provider and model; consumers assemble them with `BlockAssembler`.
62
62
  - **Register provider adapters** — an adapter owns one or more provider routes, and its registration captures that route's retry policy; registering the same route twice fails with `DUPLICATE_ADAPTER`.
63
63
  - **Expose and activate providers through configuration** — adapters declare configurable-provider routes plus a settings namespace, so configuration surfaces can activate dormant providers and edit connection facts without a restart. `LlmConfigurableProvider.error` reports a configuration diagnostic for repair; unaffected models can remain serviceable.
64
- - **Discover and resolve models** — list the models an adapter advertises, interrogate an endpoint for the models it serves, and resolve one exact model's context window, output default, reasoning efforts, input modalities, and system prompt update mode: `LlmResolvedModelInfo.systemPromptUpdate` is `'in-history'` when the model reads the latest `system` message at any position as the effective system prompt and absent when only a leading system message is read; `normalizeModelInfo` rejects any other value with `INVALID_MODEL_INFO`.
64
+ - **Discover and resolve models** — List the models an adapter advertises, interrogate an endpoint for the models it serves (candidates carry optional `inputModalities`; absence means unknown), and resolve one exact model's context window, output default, reasoning efforts, input modalities, and system prompt update mode: `LlmResolvedModelInfo.systemPromptUpdate` is `'in-history'` when the model reads the latest `system` message at any position as the effective system prompt and absent when only a leading system message is read; `normalizeModelInfo` rejects any other value with `INVALID_MODEL_INFO`.
65
65
  - **Validate call config** — an explicit or configured reasoning effort is checked against the exact model before any provider I/O, and an adapter-configured output cap is materialized when the request omits one.
66
66
  - **Read an embedded Assistant stream without expanding it** — `assistantStreamFirstTokenTime` (first token), `assistantStreamHasVisibleContent` (any visible content), and `assistantStreamHasVisibleText` (any visible text) answer their questions from the compact records with early exit; `lastAssistantStreamChunk` scans backward to the last raw chunk of one type, `assistantStreamChunks` and `joinAssistantStreamText` scan the whole stream, and `assembleAssistantStream` feeds a `BlockAssembler` one joined delta per run with the same blocks, usage, and replay state as the per-member expansion. `runFirstTokenTime` and `runFirstVisibleTime` do the early-exit scan for one packed run, and `isTokenDelta`, `isVisibleChunk`, and `chunkHasVisibleText` define the token and visibility rules for a single chunk. `expandAssistantStream` remains the validating path for records read at a durable boundary; it is not memoized, because a retained expansion costs roughly ten times the compact stream for as long as the event lives.
67
67
 
package/README.zh.md CHANGED
@@ -61,7 +61,7 @@ for await (const chunk of ctx.llm.stream({
61
61
  - **流式发起一次模型调用**——`ctx.llm.stream(options)` 为任何已注册提供方与模型产出原始分片(token 级增量);消费方用 `BlockAssembler` 组装。
62
62
  - **注册提供方适配器**——一个适配器拥有一个或多个提供方路由,其注册会捕获该路由的重试策略;重复注册同一路由会以 `DUPLICATE_ADAPTER` 失败。
63
63
  - **通过配置暴露并激活提供方**——适配器声明可配置提供方路由与 settings namespace,配置界面因此可以激活休眠提供方并编辑连接信息,无需重启。`LlmConfigurableProvider.error` 报告供修复的配置诊断;未受影响的模型仍可提供服务。
64
- - **发现与解析模型**——列出适配器公布的模型、询问端点它提供哪些模型,并解析某个精确模型的上下文窗口、输出默认值、推理(reasoning)强度、输入模态与系统提示词更新模式:当模型把任意位置最新的 `system` 消息读作有效系统提示词时,`LlmResolvedModelInfo.systemPromptUpdate` 为 `'in-history'`;只读取开头 system 消息时该字段缺失;`normalizeModelInfo` 以 `INVALID_MODEL_INFO` 拒绝任何其他值。
64
+ - **发现与解析模型**——列出适配器公布的模型、询问端点它提供哪些模型(候选携带可选的 `inputModalities`;缺省表示未知),并解析某个精确模型的上下文窗口、输出默认值、推理(reasoning)强度、输入模态与系统提示词更新模式:当模型把任意位置最新的 `system` 消息读作有效系统提示词时,`LlmResolvedModelInfo.systemPromptUpdate` 为 `'in-history'`;只读取开头 system 消息时该字段缺失;`normalizeModelInfo` 以 `INVALID_MODEL_INFO` 拒绝任何其他值。
65
65
  - **校验调用配置**——显式或配置的推理强度会在任何提供方 I/O 之前对照精确模型校验;请求省略输出上限时,会填入适配器配置的输出上限。
66
66
  - **不展开即读取内嵌 Assistant 流**——`assistantStreamFirstTokenTime`(首 token)、`assistantStreamHasVisibleContent`(任一可见内容)与 `assistantStreamHasVisibleText`(任一可见文本)通过可提前退出的扫描直接从紧凑记录得出结果;`lastAssistantStreamChunk` 反向扫描到某一类型的最后一个原始 chunk,`assistantStreamChunks` 与 `joinAssistantStreamText` 扫描整个流,`assembleAssistantStream` 向 `BlockAssembler` 每个 run 喂一段拼接 delta,blocks/usage/replayState 与逐成员展开相同。`runFirstTokenTime` 与 `runFirstVisibleTime` 对单个打包 run 做提前退出扫描,`isTokenDelta`、`isVisibleChunk` 与 `chunkHasVisibleText` 定义单个 chunk 的 token 与可见性规则。`expandAssistantStream` 仍是持久边界读取记录的校验路径;它不被记忆化,因为保留的展开在事件生命周期内约花费紧凑流的十倍内存。
67
67
 
package/lib/index.js CHANGED
@@ -1977,7 +1977,8 @@ let LlmRuntime = (() => {
1977
1977
  id: model.id,
1978
1978
  ...model.name === void 0 ? {} : { name: model.name },
1979
1979
  ...model.contextWindow === void 0 ? {} : { contextWindow: model.contextWindow },
1980
- ...model.maxTokens === void 0 ? {} : { maxTokens: model.maxTokens }
1980
+ ...model.maxTokens === void 0 ? {} : { maxTokens: model.maxTokens },
1981
+ ...model.inputModalities === void 0 ? {} : { inputModalities: [...model.inputModalities] }
1981
1982
  });
1982
1983
  }
1983
1984
  return models;
@@ -1,31 +1,37 @@
1
1
  /* Generated by @deepseek-ai/dsh-typert-generator from FaceModel — do not edit. */
2
2
  import { z } from 'zod'
3
3
 
4
- const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema = z.string()
5
- const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema = z.object({
4
+ let _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema$value
5
+ const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema$value ??= z.string())
6
+ let _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema$value
7
+ const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema$value ??= z.object({
6
8
  'provider': z.string().optional(),
7
9
  'baseURL': z.string().optional(),
8
10
  'api': z.string().optional(),
9
11
  'apiKey': z.string().optional(),
10
- })
11
- const _deepseek_ai_dsh_llm_llm_discoverModels_result$schema = z.array(z.object({
12
+ }))
13
+ let _deepseek_ai_dsh_llm_llm_discoverModels_result$schema$value
14
+ const _deepseek_ai_dsh_llm_llm_discoverModels_result$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_result$schema$value ??= z.array(z.object({
12
15
  'id': z.string(),
13
16
  'name': z.string().optional(),
14
17
  'contextWindow': z.number().optional(),
15
18
  'maxTokens': z.number().optional(),
16
- }))
17
- const _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema = z.array(z.object({
19
+ 'inputModalities': z.array(z.union([z.literal("text"), z.literal("image")])).optional(),
20
+ })))
21
+ let _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema$value
22
+ const _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema = () => (_deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema$value ??= z.array(z.object({
18
23
  'provider': z.string(),
19
24
  'displayName': z.string(),
20
25
  'settingsNs': z.string(),
21
26
  'settingsPath': z.array(z.string()),
22
27
  'declared': z.boolean().optional(),
23
28
  'error': z.string().optional(),
24
- }))
25
- const _deepseek_ai_dsh_llm_llm_listProviders_result$schema = z.array(z.object({
29
+ })))
30
+ let _deepseek_ai_dsh_llm_llm_listProviders_result$schema$value
31
+ const _deepseek_ai_dsh_llm_llm_listProviders_result$schema = () => (_deepseek_ai_dsh_llm_llm_listProviders_result$schema$value ??= z.array(z.object({
26
32
  'id': z.string(),
27
33
  'name': z.string(),
28
- }))
34
+ })))
29
35
 
30
36
  export const TYPERT = {
31
37
  package: '@deepseek-ai/dsh-llm',
@@ -48,7 +54,7 @@ export const TYPERT = {
48
54
  codec: {
49
55
  mode: 'strict',
50
56
  typeSymbol: '@deepseek-ai/dsh-llm#llm/discoverModels:settingsNs',
51
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema,
57
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema,
52
58
  },
53
59
  },
54
60
  {
@@ -58,7 +64,7 @@ export const TYPERT = {
58
64
  codec: {
59
65
  mode: 'strict',
60
66
  typeSymbol: '@deepseek-ai/dsh-llm/types#LlmModelDiscoveryRequest',
61
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema,
67
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema,
62
68
  },
63
69
  },
64
70
  ],
@@ -66,9 +72,9 @@ export const TYPERT = {
66
72
  result: {
67
73
  mode: 'strict',
68
74
  typeSymbol: '@deepseek-ai/dsh-llm#llm/discoverModels:result',
69
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_result$schema,
75
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_result$schema,
70
76
  },
71
- sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":631,"column":9},
77
+ sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":632,"column":9},
72
78
  },
73
79
  {
74
80
  id: '@deepseek-ai/dsh-llm#llm/listConfigurableProviders',
@@ -81,7 +87,7 @@ export const TYPERT = {
81
87
  result: {
82
88
  mode: 'strict',
83
89
  typeSymbol: '@deepseek-ai/dsh-llm#llm/listConfigurableProviders:result',
84
- schema: _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema,
90
+ create: _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema,
85
91
  },
86
92
  sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":544,"column":3},
87
93
  },
@@ -96,7 +102,7 @@ export const TYPERT = {
96
102
  result: {
97
103
  mode: 'strict',
98
104
  typeSymbol: '@deepseek-ai/dsh-llm#llm/listProviders:result',
99
- schema: _deepseek_ai_dsh_llm_llm_listProviders_result$schema,
105
+ create: _deepseek_ai_dsh_llm_llm_listProviders_result$schema,
100
106
  },
101
107
  sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":472,"column":3},
102
108
  },
@@ -324,7 +330,7 @@ export const TYPERT = {
324
330
  },
325
331
  {
326
332
  "name": "LlmDiscoveredModel",
327
- "declaration": "export interface LlmDiscoveredModel {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n}"
333
+ "declaration": "export interface LlmDiscoveredModel {\n id: string;\n name?: string;\n contextWindow?: number;\n maxTokens?: number;\n inputModalities?: readonly ModelModality[];\n}"
328
334
  },
329
335
  {
330
336
  "name": "LlmFailure",
@@ -1,31 +1,37 @@
1
1
  /* Generated by @deepseek-ai/dsh-typert-generator from the Host FaceModel — do not edit. */
2
2
  import { z } from 'zod'
3
3
 
4
- const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema = z.string()
5
- const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema = z.object({
4
+ let _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema$value
5
+ const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema$value ??= z.string())
6
+ let _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema$value
7
+ const _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema$value ??= z.object({
6
8
  'provider': z.string().optional(),
7
9
  'baseURL': z.string().optional(),
8
10
  'api': z.string().optional(),
9
11
  'apiKey': z.string().optional(),
10
- })
11
- const _deepseek_ai_dsh_llm_llm_discoverModels_result$schema = z.array(z.object({
12
+ }))
13
+ let _deepseek_ai_dsh_llm_llm_discoverModels_result$schema$value
14
+ const _deepseek_ai_dsh_llm_llm_discoverModels_result$schema = () => (_deepseek_ai_dsh_llm_llm_discoverModels_result$schema$value ??= z.array(z.object({
12
15
  'id': z.string(),
13
16
  'name': z.string().optional(),
14
17
  'contextWindow': z.number().optional(),
15
18
  'maxTokens': z.number().optional(),
16
- }))
17
- const _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema = z.array(z.object({
19
+ 'inputModalities': z.array(z.union([z.literal("text"), z.literal("image")])).optional(),
20
+ })))
21
+ let _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema$value
22
+ const _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema = () => (_deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema$value ??= z.array(z.object({
18
23
  'provider': z.string(),
19
24
  'displayName': z.string(),
20
25
  'settingsNs': z.string(),
21
26
  'settingsPath': z.array(z.string()),
22
27
  'declared': z.boolean().optional(),
23
28
  'error': z.string().optional(),
24
- }))
25
- const _deepseek_ai_dsh_llm_llm_listProviders_result$schema = z.array(z.object({
29
+ })))
30
+ let _deepseek_ai_dsh_llm_llm_listProviders_result$schema$value
31
+ const _deepseek_ai_dsh_llm_llm_listProviders_result$schema = () => (_deepseek_ai_dsh_llm_llm_listProviders_result$schema$value ??= z.array(z.object({
26
32
  'id': z.string(),
27
33
  'name': z.string(),
28
- }))
34
+ })))
29
35
 
30
36
  export const TYPERT_REMOTE = {
31
37
  package: '@deepseek-ai/dsh-llm',
@@ -45,7 +51,7 @@ export const TYPERT_REMOTE = {
45
51
  codec: {
46
52
  mode: 'strict',
47
53
  typeSymbol: '@deepseek-ai/dsh-llm#llm/discoverModels:settingsNs',
48
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema,
54
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_0$schema,
49
55
  },
50
56
  },
51
57
  {
@@ -55,7 +61,7 @@ export const TYPERT_REMOTE = {
55
61
  codec: {
56
62
  mode: 'strict',
57
63
  typeSymbol: '@deepseek-ai/dsh-llm/types#LlmModelDiscoveryRequest',
58
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema,
64
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_parameter_1$schema,
59
65
  },
60
66
  },
61
67
  ],
@@ -63,9 +69,9 @@ export const TYPERT_REMOTE = {
63
69
  result: {
64
70
  mode: 'strict',
65
71
  typeSymbol: '@deepseek-ai/dsh-llm#llm/discoverModels:result',
66
- schema: _deepseek_ai_dsh_llm_llm_discoverModels_result$schema,
72
+ create: _deepseek_ai_dsh_llm_llm_discoverModels_result$schema,
67
73
  },
68
- sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":631,"column":9},
74
+ sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":632,"column":9},
69
75
  },
70
76
  {
71
77
  id: '@deepseek-ai/dsh-llm#llm/listConfigurableProviders',
@@ -78,7 +84,7 @@ export const TYPERT_REMOTE = {
78
84
  result: {
79
85
  mode: 'strict',
80
86
  typeSymbol: '@deepseek-ai/dsh-llm#llm/listConfigurableProviders:result',
81
- schema: _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema,
87
+ create: _deepseek_ai_dsh_llm_llm_listConfigurableProviders_result$schema,
82
88
  },
83
89
  sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":544,"column":3},
84
90
  },
@@ -93,7 +99,7 @@ export const TYPERT_REMOTE = {
93
99
  result: {
94
100
  mode: 'strict',
95
101
  typeSymbol: '@deepseek-ai/dsh-llm#llm/listProviders:result',
96
- schema: _deepseek_ai_dsh_llm_llm_listProviders_result$schema,
102
+ create: _deepseek_ai_dsh_llm_llm_listProviders_result$schema,
97
103
  },
98
104
  sourceLocation: {"file":"packages/llm/llm/src/index.ts","line":472,"column":3},
99
105
  },
@@ -488,6 +488,7 @@ let LlmRuntime = (() => {
488
488
  ...model.name === undefined ? {} : { name: model.name },
489
489
  ...model.contextWindow === undefined ? {} : { contextWindow: model.contextWindow },
490
490
  ...model.maxTokens === undefined ? {} : { maxTokens: model.maxTokens },
491
+ ...model.inputModalities === undefined ? {} : { inputModalities: [...model.inputModalities] },
491
492
  });
492
493
  }
493
494
  return models;
@@ -286,6 +286,8 @@ export interface LlmDiscoveredModel {
286
286
  contextWindow?: number;
287
287
  /** Maximum output tokens, when disclosed. */
288
288
  maxTokens?: number;
289
+ /** Accepted input types when disclosed by the catalog or endpoint; absent means unknown. */
290
+ inputModalities?: readonly ModelModality[];
289
291
  }
290
292
  /** One adapter-discovered model; catalog membership is advisory, not request validation. */
291
293
  export interface LlmModelInfo {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-llm",
3
3
  "description": "Provider-neutral LLM service interface for the DeepSeek Harness",
4
- "version": "0.1.6-alpha.1",
4
+ "version": "0.1.6-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -65,16 +65,16 @@
65
65
  },
66
66
  "dependencies": {
67
67
  "zod": "^4.4.3",
68
- "@deepseek-ai/schemastery": "^3.18.2",
69
- "@deepseek-ai/dsh-timeout": "^0.1.6-alpha.1",
70
- "@deepseek-ai/dsh-brand": "^0.1.6-alpha.1",
71
- "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.1",
72
- "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.1",
73
- "@deepseek-ai/dsh-util-crypto": "^0.1.6-alpha.1"
68
+ "@deepseek-ai/dsh-brand": "^0.1.6-alpha.2",
69
+ "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.2",
70
+ "@deepseek-ai/dsh-util-crypto": "^0.1.6-alpha.2",
71
+ "@deepseek-ai/dsh-typert-protocol": "^0.1.6-alpha.2",
72
+ "@deepseek-ai/dsh-timeout": "^0.1.6-alpha.2",
73
+ "@deepseek-ai/schemastery": "^3.18.2"
74
74
  },
75
75
  "devDependencies": {
76
- "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.1",
77
- "@deepseek-ai/dsh-attachment": "^0.1.6-alpha.1",
76
+ "@deepseek-ai/dsh-attachment": "^0.1.6-alpha.2",
77
+ "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.2",
78
78
  "@deepseek-ai/cordis": "^4.0.2"
79
79
  }
80
80
  }