@dsh-plus/llm-pi 0.1.14 → 0.1.16

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
@@ -810,10 +810,6 @@ const GATES_BY_PROTOCOL = {
810
810
  supportsToolReferences: "withhold"
811
811
  }
812
812
  };
813
- /** 某协议某字段的可配性('offer'/'withhold';未列出 = 无此字段)。 */
814
- function compatDispositionOf(api, field) {
815
- return GATES_BY_PROTOCOL[api][field];
816
- }
817
813
  /**
818
814
  * 字段取值约束(对齐官方 config.ts compatProfile schema):
819
815
  * boolean 字段 → 'boolean';maxTokensField/thinkingFormat/cacheControlFormat
@@ -1239,7 +1235,6 @@ function materializeModel(route, profile, entry, base, routeApi, defaultInput, d
1239
1235
  validateCompat(api, profile.compat, `provider "${route}"`);
1240
1236
  validateCompat(api, entry.compat, `provider "${route}" model "${entry.id}"`);
1241
1237
  const compat = mergeCompat(base.api === api ? base.compat : void 0, profile.compat, entry.compat);
1242
- if (compat !== void 0) validateCompat(api, compat, `provider "${route}" model "${entry.id}"`);
1243
1238
  return {
1244
1239
  entry: {
1245
1240
  id: entry.id,
@@ -1396,14 +1391,16 @@ function resolveModelReasoning(entry) {
1396
1391
  thinkingLevelMap: map
1397
1392
  };
1398
1393
  }
1399
- /** 官方 resolveModelCompat 的插件侧镜像:门控表过滤 + 模型级拒绝不适配字段。 */
1400
- function resolveModelCompat(provider, entry, api) {
1394
+ /**
1395
+ * 官方 resolveModelCompat 的插件侧镜像(fallback 专用):透传物化条目的 compat。
1396
+ * 与官方的差异是有意的:官方校验的是用户原始条目(写时拒绝非 offer 字段),
1397
+ * 而本 fallback 收到的条目已经归一化物化(继承值落定、用户层在 materializeModel
1398
+ * 经 validateCompat 门控校验过)——compat 里可能合法携带内置目录的 withhold 键
1399
+ * (如 supportsOpenAIGrammarTools),再做门控只会误杀目录继承值。
1400
+ */
1401
+ function resolveModelCompat(provider, entry, _api) {
1401
1402
  const configured = {};
1402
1403
  for (const [field, value] of Object.entries(entry.compat ?? {})) {
1403
- if (compatDispositionOf(api, field) !== "offer") {
1404
- const offered = compatFieldsOf(api);
1405
- invalid(provider, `model "${entry.id}" 的 compat.${field} 不适用于协议 ${api};该协议可配置字段:${offered.length === 0 ? "无" : offered.join(", ")}`);
1406
- }
1407
1404
  if (value === void 0 || value === null) invalid(provider, `model "${entry.id}" 的 compat.${field} 未设置值;给出值或移除该键`);
1408
1405
  configured[field] = value;
1409
1406
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-plus/llm-pi",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "dsh-plus service+ui plugin: 基于 PiAiAdapter 的自定义 LLM 路由(全量 compat、模型继承、models.dev 目录兜底)",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
package/src/profiles.ts CHANGED
@@ -39,7 +39,7 @@ import {
39
39
  type ModelBase,
40
40
  } from './catalog/builtin.ts'
41
41
  import type { ModelsDevSource } from './catalog/models-dev.ts'
42
- import { compatDispositionOf, compatFieldsOf, mergeCompat, validateCompat } from './compat.ts'
42
+ import { mergeCompat, validateCompat } from './compat.ts'
43
43
  import {
44
44
  DEFAULT_CONTEXT_WINDOW,
45
45
  DEFAULT_MAX_REQUEST_IMAGE_BYTES,
@@ -218,9 +218,9 @@ function materializeModel(
218
218
  profile.compat as Record<string, unknown> | undefined,
219
219
  entry.compat as Record<string, unknown> | undefined,
220
220
  )
221
- if (compat !== undefined) {
222
- validateCompat(api, compat, `provider "${route}" model "${entry.id}"`)
223
- }
221
+ // 注意:不再对合并结果复验——base.compat 来自官方内置目录(extends),
222
+ // 目录自身有权携带 withhold 键(如 supportsOpenAIGrammarTools);门控只约束
223
+ // 用户手写层(上面两次 validateCompat)。
224
224
  return {
225
225
  entry: {
226
226
  id: entry.id,
@@ -481,22 +481,20 @@ function resolveModelReasoning(entry: PiAiModelProfile): {
481
481
  return { reasoning: true, thinkingLevelMap: map }
482
482
  }
483
483
 
484
- /** 官方 resolveModelCompat 的插件侧镜像:门控表过滤 + 模型级拒绝不适配字段。 */
484
+ /**
485
+ * 官方 resolveModelCompat 的插件侧镜像(fallback 专用):透传物化条目的 compat。
486
+ * 与官方的差异是有意的:官方校验的是用户原始条目(写时拒绝非 offer 字段),
487
+ * 而本 fallback 收到的条目已经归一化物化(继承值落定、用户层在 materializeModel
488
+ * 经 validateCompat 门控校验过)——compat 里可能合法携带内置目录的 withhold 键
489
+ * (如 supportsOpenAIGrammarTools),再做门控只会误杀目录继承值。
490
+ */
485
491
  function resolveModelCompat(
486
492
  provider: string,
487
493
  entry: PiAiModelProfile,
488
- api: string,
494
+ _api: string,
489
495
  ): { compat: Record<string, unknown> } | Record<string, never> {
490
496
  const configured: Record<string, unknown> = {}
491
497
  for (const [field, value] of Object.entries(entry.compat ?? {})) {
492
- if (compatDispositionOf(api as never, field) !== 'offer') {
493
- const offered = compatFieldsOf(api as never)
494
- invalid(
495
- provider,
496
- `model "${entry.id}" 的 compat.${field} 不适用于协议 ${api};` +
497
- `该协议可配置字段:${offered.length === 0 ? '无' : offered.join(', ')}`,
498
- )
499
- }
500
498
  if (value === undefined || value === null) {
501
499
  invalid(provider, `model "${entry.id}" 的 compat.${field} 未设置值;给出值或移除该键`)
502
500
  }