@fgv/ts-extras 5.1.0-37 → 5.1.0-39

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 (128) hide show
  1. package/dist/packlets/ai-assist/apiClient.js +66 -111
  2. package/dist/packlets/ai-assist/apiClient.js.map +1 -1
  3. package/dist/packlets/ai-assist/converters.js +16 -3
  4. package/dist/packlets/ai-assist/converters.js.map +1 -1
  5. package/dist/packlets/ai-assist/embeddingClient.js +5 -6
  6. package/dist/packlets/ai-assist/embeddingClient.js.map +1 -1
  7. package/dist/packlets/ai-assist/imageOptionsResolver.js +0 -19
  8. package/dist/packlets/ai-assist/imageOptionsResolver.js.map +1 -1
  9. package/dist/packlets/ai-assist/index.js +2 -2
  10. package/dist/packlets/ai-assist/index.js.map +1 -1
  11. package/dist/packlets/ai-assist/model.js +139 -7
  12. package/dist/packlets/ai-assist/model.js.map +1 -1
  13. package/dist/packlets/ai-assist/registry.js +58 -51
  14. package/dist/packlets/ai-assist/registry.js.map +1 -1
  15. package/dist/packlets/ai-assist/streamingAdapters/anthropic.js +38 -11
  16. package/dist/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -1
  17. package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +187 -36
  18. package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -1
  19. package/dist/packlets/ai-assist/streamingAdapters/common.js +13 -0
  20. package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  21. package/dist/packlets/ai-assist/streamingAdapters/gemini.js +12 -4
  22. package/dist/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -1
  23. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +6 -1
  24. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  25. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +10 -3
  26. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  27. package/dist/packlets/ai-assist/streamingAdapters/proxy.js +5 -2
  28. package/dist/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -1
  29. package/dist/packlets/ai-assist/streamingClient.js +16 -16
  30. package/dist/packlets/ai-assist/streamingClient.js.map +1 -1
  31. package/dist/packlets/crypto-utils/converters.js +18 -0
  32. package/dist/packlets/crypto-utils/converters.js.map +1 -1
  33. package/dist/packlets/crypto-utils/index.browser.js +2 -2
  34. package/dist/packlets/crypto-utils/index.browser.js.map +1 -1
  35. package/dist/packlets/crypto-utils/index.js +2 -2
  36. package/dist/packlets/crypto-utils/index.js.map +1 -1
  37. package/dist/packlets/crypto-utils/keystore/keyStore.js +19 -4
  38. package/dist/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
  39. package/dist/packlets/crypto-utils/keystore/model.js.map +1 -1
  40. package/dist/packlets/crypto-utils/model.js.map +1 -1
  41. package/dist/packlets/crypto-utils/spkiHelpers.js +104 -25
  42. package/dist/packlets/crypto-utils/spkiHelpers.js.map +1 -1
  43. package/dist/ts-extras.d.ts +377 -132
  44. package/dist/tsdoc-metadata.json +1 -1
  45. package/lib/packlets/ai-assist/apiClient.d.ts +12 -2
  46. package/lib/packlets/ai-assist/apiClient.d.ts.map +1 -1
  47. package/lib/packlets/ai-assist/apiClient.js +65 -110
  48. package/lib/packlets/ai-assist/apiClient.js.map +1 -1
  49. package/lib/packlets/ai-assist/converters.d.ts +8 -2
  50. package/lib/packlets/ai-assist/converters.d.ts.map +1 -1
  51. package/lib/packlets/ai-assist/converters.js +17 -4
  52. package/lib/packlets/ai-assist/converters.js.map +1 -1
  53. package/lib/packlets/ai-assist/embeddingClient.d.ts.map +1 -1
  54. package/lib/packlets/ai-assist/embeddingClient.js +4 -5
  55. package/lib/packlets/ai-assist/embeddingClient.js.map +1 -1
  56. package/lib/packlets/ai-assist/imageOptionsResolver.d.ts +0 -8
  57. package/lib/packlets/ai-assist/imageOptionsResolver.d.ts.map +1 -1
  58. package/lib/packlets/ai-assist/imageOptionsResolver.js +0 -19
  59. package/lib/packlets/ai-assist/imageOptionsResolver.js.map +1 -1
  60. package/lib/packlets/ai-assist/index.d.ts +3 -3
  61. package/lib/packlets/ai-assist/index.d.ts.map +1 -1
  62. package/lib/packlets/ai-assist/index.js +6 -1
  63. package/lib/packlets/ai-assist/index.js.map +1 -1
  64. package/lib/packlets/ai-assist/model.d.ts +181 -98
  65. package/lib/packlets/ai-assist/model.d.ts.map +1 -1
  66. package/lib/packlets/ai-assist/model.js +143 -8
  67. package/lib/packlets/ai-assist/model.js.map +1 -1
  68. package/lib/packlets/ai-assist/registry.d.ts.map +1 -1
  69. package/lib/packlets/ai-assist/registry.js +58 -51
  70. package/lib/packlets/ai-assist/registry.js.map +1 -1
  71. package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts +1 -1
  72. package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts.map +1 -1
  73. package/lib/packlets/ai-assist/streamingAdapters/anthropic.js +37 -10
  74. package/lib/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -1
  75. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts +82 -3
  76. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts.map +1 -1
  77. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +187 -35
  78. package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -1
  79. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +24 -1
  80. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -1
  81. package/lib/packlets/ai-assist/streamingAdapters/common.js +14 -1
  82. package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  83. package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts +10 -1
  84. package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts.map +1 -1
  85. package/lib/packlets/ai-assist/streamingAdapters/gemini.js +12 -4
  86. package/lib/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -1
  87. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts +1 -1
  88. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -1
  89. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +6 -1
  90. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  91. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts +1 -1
  92. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -1
  93. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +10 -3
  94. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  95. package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts.map +1 -1
  96. package/lib/packlets/ai-assist/streamingAdapters/proxy.js +5 -2
  97. package/lib/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -1
  98. package/lib/packlets/ai-assist/streamingClient.d.ts +1 -1
  99. package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -1
  100. package/lib/packlets/ai-assist/streamingClient.js +15 -15
  101. package/lib/packlets/ai-assist/streamingClient.js.map +1 -1
  102. package/lib/packlets/crypto-utils/converters.d.ts +9 -1
  103. package/lib/packlets/crypto-utils/converters.d.ts.map +1 -1
  104. package/lib/packlets/crypto-utils/converters.js +19 -1
  105. package/lib/packlets/crypto-utils/converters.js.map +1 -1
  106. package/lib/packlets/crypto-utils/index.browser.d.ts +1 -1
  107. package/lib/packlets/crypto-utils/index.browser.d.ts.map +1 -1
  108. package/lib/packlets/crypto-utils/index.browser.js +6 -2
  109. package/lib/packlets/crypto-utils/index.browser.js.map +1 -1
  110. package/lib/packlets/crypto-utils/index.d.ts +1 -1
  111. package/lib/packlets/crypto-utils/index.d.ts.map +1 -1
  112. package/lib/packlets/crypto-utils/index.js +6 -2
  113. package/lib/packlets/crypto-utils/index.js.map +1 -1
  114. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts +9 -2
  115. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts.map +1 -1
  116. package/lib/packlets/crypto-utils/keystore/keyStore.js +19 -4
  117. package/lib/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
  118. package/lib/packlets/crypto-utils/keystore/model.d.ts +7 -0
  119. package/lib/packlets/crypto-utils/keystore/model.d.ts.map +1 -1
  120. package/lib/packlets/crypto-utils/keystore/model.js.map +1 -1
  121. package/lib/packlets/crypto-utils/model.d.ts +11 -1
  122. package/lib/packlets/crypto-utils/model.d.ts.map +1 -1
  123. package/lib/packlets/crypto-utils/model.js.map +1 -1
  124. package/lib/packlets/crypto-utils/spkiHelpers.d.ts +59 -2
  125. package/lib/packlets/crypto-utils/spkiHelpers.d.ts.map +1 -1
  126. package/lib/packlets/crypto-utils/spkiHelpers.js +108 -25
  127. package/lib/packlets/crypto-utils/spkiHelpers.js.map +1 -1
  128. package/package.json +7 -7
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.58.7"
8
+ "packageVersion": "7.58.9"
9
9
  }
10
10
  ]
11
11
  }
@@ -11,10 +11,20 @@ export interface IProviderCompletionParams extends IChatRequest {
11
11
  readonly descriptor: IAiProviderDescriptor;
12
12
  /** API key for authentication */
13
13
  readonly apiKey: string;
14
- /** Sampling temperature (default: 0.7) */
14
+ /**
15
+ * Sampling temperature. Sent to the provider only when explicitly provided; omitted otherwise
16
+ * so the provider's own default applies (current-gen models reject a caller-supplied default).
17
+ */
15
18
  readonly temperature?: number;
16
19
  /** Optional model override — string or context-aware map (uses descriptor.defaultModel otherwise) */
17
20
  readonly modelOverride?: ModelSpec;
21
+ /**
22
+ * Optional quality tier selecting which completion model to use. `undefined`
23
+ * selects the `base` tier; `'frontier'` cascades to `advanced` then `base`
24
+ * when a tier is unset for a provider. Orthogonal to `thinking` and `tools`,
25
+ * which never select a model.
26
+ */
27
+ readonly tier?: 'advanced' | 'frontier';
18
28
  /** Optional logger for request/response observability. */
19
29
  readonly logger?: Logging.ILogger;
20
30
  /** Server-side tools to include in the request. Overrides settings-level tool config when provided. */
@@ -64,7 +74,7 @@ export interface IProviderImageGenerationParams {
64
74
  /**
65
75
  * Calls the appropriate image-generation API for a given provider. Routes by the
66
76
  * `format` field of the resolved {@link IAiImageModelCapability}:
67
- * `'openai-images'`, `'xai-images'`, `'xai-images-edits'`, `'gemini-imagen'`, or
77
+ * `'openai-images'`, `'xai-images'`, `'xai-images-edits'`, or
68
78
  * `'gemini-image-out'`. Rejects up front if `referenceImages` is set but the
69
79
  * capability does not declare `acceptsImageReferenceInput`.
70
80
  * @param params - Request parameters including descriptor, API key, and prompt
@@ -1 +1 @@
1
- {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/apiClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/apiClient.ts"],"names":[],"mappings":"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"}
@@ -229,14 +229,14 @@ const geminiResponse = ts_utils_1.Validators.object({
229
229
  * Works for xAI Grok, OpenAI, Groq, and Mistral.
230
230
  * @internal
231
231
  */
232
- async function callOpenAiCompletion(config, prompt, head, temperature = 0.7, logger, signal, resolvedThinking) {
232
+ async function callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking) {
233
233
  var _a;
234
234
  const url = `${config.baseUrl}/chat/completions`;
235
235
  const messages = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiChatUserContent)(prompt), {
236
236
  head
237
237
  });
238
238
  const effort = (_a = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.openAiEffort) !== null && _a !== void 0 ? _a : resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.xaiEffort;
239
- const body = Object.assign(Object.assign({ model: config.model, messages }, (effort === undefined || effort === 'none' ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning_effort: effort } : {}));
239
+ const body = Object.assign(Object.assign({ model: config.model, messages }, (temperature !== undefined ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning_effort: effort } : {}));
240
240
  if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
241
241
  Object.assign(body, resolvedThinking.otherParams);
242
242
  }
@@ -282,14 +282,14 @@ function extractResponsesApiText(output) {
282
282
  * Used when tools are configured for an openai-format provider.
283
283
  * @internal
284
284
  */
285
- async function callOpenAiResponsesCompletion(config, prompt, tools, head, temperature = 0.7, logger, signal, resolvedThinking) {
285
+ async function callOpenAiResponsesCompletion(config, prompt, tools = [], head, temperature, logger, signal, resolvedThinking) {
286
286
  var _a;
287
287
  const url = `${config.baseUrl}/responses`;
288
288
  const input = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiResponsesUserContent)(prompt), {
289
289
  head
290
290
  });
291
291
  const effort = (_a = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.openAiEffort) !== null && _a !== void 0 ? _a : resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.xaiEffort;
292
- const body = Object.assign(Object.assign({ model: config.model, input, tools: (0, toolFormats_1.toResponsesApiTools)(tools) }, (effort === undefined || effort === 'none' ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning: { effort } } : {}));
292
+ const body = Object.assign(Object.assign(Object.assign({ model: config.model, input }, (tools.length > 0 ? { tools: (0, toolFormats_1.toResponsesApiTools)(tools) } : {})), (temperature !== undefined ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning: { effort } } : {}));
293
293
  if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
294
294
  Object.assign(body, resolvedThinking.otherParams);
295
295
  }
@@ -336,10 +336,10 @@ function extractAnthropicText(content) {
336
336
  return (0, ts_utils_1.succeed)(textParts.join(''));
337
337
  }
338
338
  /** Calls the Anthropic Messages API with optional tool support. @internal */
339
- async function callAnthropicCompletion(config, prompt, head, temperature = 0.7, logger, tools, signal, resolvedThinking) {
339
+ async function callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking) {
340
340
  const url = `${config.baseUrl}/messages`;
341
341
  const messages = (0, chatRequestBuilders_1.buildAnthropicMessages)(prompt, { head });
342
- const body = Object.assign({ model: config.model, system: prompt.system, messages, max_tokens: 4096 }, ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.anthropicEffort) === undefined ? { temperature } : {}));
342
+ const body = Object.assign({ model: config.model, system: prompt.system, messages, max_tokens: 4096 }, (temperature !== undefined ? { temperature } : {}));
343
343
  const effort = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.anthropicEffort;
344
344
  if (effort !== undefined) {
345
345
  body.thinking = { type: 'enabled', budget_tokens: (0, thinkingOptionsResolver_1.anthropicEffortToBudgetTokens)(effort) };
@@ -386,10 +386,14 @@ async function callAnthropicCompletion(config, prompt, head, temperature = 0.7,
386
386
  * When tools are configured, includes Google Search grounding.
387
387
  * @internal
388
388
  */
389
- async function callGeminiCompletion(config, prompt, head, temperature = 0.7, logger, tools, signal, resolvedThinking) {
389
+ async function callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking) {
390
390
  const url = `${config.baseUrl}/models/${config.model}:generateContent`;
391
391
  const contents = (0, chatRequestBuilders_1.buildGeminiContents)(prompt, { head });
392
- const generationConfig = { temperature };
392
+ // Temperature is sent only when explicitly provided; otherwise Gemini's default applies.
393
+ const generationConfig = {};
394
+ if (temperature !== undefined) {
395
+ generationConfig.temperature = temperature;
396
+ }
393
397
  if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.geminiThinkingBudget) !== undefined) {
394
398
  generationConfig.thinkingConfig = { thinkingBudget: resolvedThinking.geminiThinkingBudget };
395
399
  }
@@ -438,8 +442,7 @@ async function callGeminiCompletion(config, prompt, head, temperature = 0.7, log
438
442
  * @public
439
443
  */
440
444
  async function callProviderCompletion(params) {
441
- var _a;
442
- const { descriptor, apiKey, system, messages, temperature, modelOverride, logger, tools, signal, endpoint, thinking } = params;
445
+ const { descriptor, apiKey, system, messages, temperature, modelOverride, tier, logger, tools, signal, endpoint, thinking } = params;
443
446
  const splitResult = (0, chatRequestBuilders_1.splitChatRequest)(system, messages);
444
447
  if (splitResult.isFailure()) {
445
448
  return (0, ts_utils_1.fail)(splitResult.message);
@@ -454,14 +457,14 @@ async function callProviderCompletion(params) {
454
457
  }
455
458
  const hasTools = tools !== undefined && tools.length > 0;
456
459
  const discriminator = (0, thinkingOptionsResolver_1.providerDiscriminatorForId)(descriptor.id);
457
- const hasThinkingConfig = discriminator !== undefined &&
458
- ((thinking === null || thinking === void 0 ? void 0 : thinking.effort) !== undefined ||
459
- ((_a = thinking === null || thinking === void 0 ? void 0 : thinking.providers) === null || _a === void 0 ? void 0 : _a.some((b) => b.provider === 'other' || b.provider === discriminator)) === true);
460
- const modelContext = hasThinkingConfig ? 'thinking' : hasTools ? 'tools' : undefined;
461
- const model = (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext);
462
- if (model.length === 0) {
463
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}": no model resolved; pass modelOverride or set descriptor.defaultModel`);
464
- }
460
+ // The quality tier is the only completion-model selector; thinking and tools
461
+ // are orthogonal request params/capabilities and never pick a model.
462
+ const modelContext = tier;
463
+ const modelResult = (0, model_1.resolveProviderModel)(descriptor, modelOverride, modelContext);
464
+ if (modelResult.isFailure()) {
465
+ return (0, ts_utils_1.fail)(modelResult.message);
466
+ }
467
+ const model = modelResult.value;
465
468
  let resolvedThinking;
466
469
  if (thinking !== undefined) {
467
470
  if (discriminator !== undefined) {
@@ -477,7 +480,6 @@ async function callProviderCompletion(params) {
477
480
  }
478
481
  }
479
482
  }
480
- const effectiveTemperature = temperature !== null && temperature !== void 0 ? temperature : 0.7;
481
483
  const config = {
482
484
  baseUrl: baseUrlResult.value,
483
485
  apiKey,
@@ -492,14 +494,16 @@ async function callProviderCompletion(params) {
492
494
  }
493
495
  switch (descriptor.apiFormat) {
494
496
  case 'openai':
495
- if (hasTools) {
496
- return callOpenAiResponsesCompletion(config, prompt, tools, head, effectiveTemperature, logger, signal, resolvedThinking);
497
+ // Responses-API-only models (e.g. gpt-5.5-pro) 400 on /chat/completions, so they route
498
+ // to the Responses path even with no tools requested same path the tools case uses.
499
+ if (hasTools || (0, model_1.isResponsesOnlyModel)(descriptor, config.model)) {
500
+ return callOpenAiResponsesCompletion(config, prompt, tools, head, temperature, logger, signal, resolvedThinking);
497
501
  }
498
- return callOpenAiCompletion(config, prompt, head, effectiveTemperature, logger, signal, resolvedThinking);
502
+ return callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking);
499
503
  case 'anthropic':
500
- return callAnthropicCompletion(config, prompt, head, effectiveTemperature, logger, tools, signal, resolvedThinking);
504
+ return callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking);
501
505
  case 'gemini':
502
- return callGeminiCompletion(config, prompt, head, effectiveTemperature, logger, tools, signal, resolvedThinking);
506
+ return callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking);
503
507
  /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */
504
508
  default: {
505
509
  const _exhaustive = descriptor.apiFormat;
@@ -514,13 +518,6 @@ const openAiImageItem = ts_utils_1.Validators.object({
514
518
  const openAiImageResponse = ts_utils_1.Validators.object({
515
519
  data: ts_utils_1.Validators.arrayOf(openAiImageItem).withConstraint((arr) => arr.length > 0)
516
520
  });
517
- const imagenPrediction = ts_utils_1.Validators.object({
518
- bytesBase64Encoded: ts_utils_1.Validators.string,
519
- mimeType: ts_utils_1.Validators.string.optional()
520
- });
521
- const imagenResponse = ts_utils_1.Validators.object({
522
- predictions: ts_utils_1.Validators.arrayOf(imagenPrediction).withConstraint((arr) => arr.length > 0)
523
- });
524
521
  const geminiImageInlineData = ts_utils_1.Validators.object({
525
522
  mimeType: ts_utils_1.Validators.string,
526
523
  data: ts_utils_1.Validators.string
@@ -530,11 +527,12 @@ const geminiImageOutPart = ts_utils_1.Validators.object({
530
527
  inlineData: geminiImageInlineData.optional()
531
528
  });
532
529
  const geminiImageOutContent = ts_utils_1.Validators.object({
533
- parts: ts_utils_1.Validators.arrayOf(geminiImageOutPart).withConstraint((arr) => arr.length > 0)
530
+ parts: ts_utils_1.Validators.arrayOf(geminiImageOutPart)
534
531
  });
535
532
  const geminiImageOutCandidate = ts_utils_1.Validators.object({
536
- content: geminiImageOutContent,
537
- finishReason: ts_utils_1.Validators.string.optional()
533
+ content: geminiImageOutContent.optional(),
534
+ finishReason: ts_utils_1.Validators.string.optional(),
535
+ finishMessage: ts_utils_1.Validators.string.optional()
538
536
  });
539
537
  const geminiImageOutResponse = ts_utils_1.Validators.object({
540
538
  candidates: ts_utils_1.Validators.arrayOf(geminiImageOutCandidate).withConstraint((arr) => arr.length > 0)
@@ -601,9 +599,6 @@ function callOpenAiImagesGenerations(config, request, headers, resolved, capabil
601
599
  if (resolved.seed !== undefined) {
602
600
  body.seed = resolved.seed;
603
601
  }
604
- if (resolved.style !== undefined) {
605
- body.style = resolved.style;
606
- }
607
602
  if (resolved.background !== undefined) {
608
603
  body.background = resolved.background;
609
604
  }
@@ -711,6 +706,14 @@ async function callXaiImageGeneration(config, request, capability, resolved, log
711
706
  })
712
707
  })));
713
708
  }
709
+ /**
710
+ * Gemini `finishReason` values that indicate a normal terminal completion rather
711
+ * than a refusal. `STOP` is set on every successful generation (and on completions
712
+ * that return a text part instead of an image); `MAX_TOKENS` is a benign truncation.
713
+ * A candidate carrying only one of these is NOT a decline — treating it as one would
714
+ * mislabel an ordinary no-image outcome as a policy refusal. @internal
715
+ */
716
+ const benignGeminiImageFinishReasons = new Set(['STOP', 'MAX_TOKENS']);
714
717
  /** Calls Gemini :generateContent for image output; accepts ref images as inlineData. @internal */
715
718
  async function callGeminiImageOutGeneration(config, request, resolved, logger, signal) {
716
719
  var _a;
@@ -740,9 +743,10 @@ async function callGeminiImageOutGeneration(config, request, resolved, logger, s
740
743
  .validate(json)
741
744
  .withErrorFormat((msg) => `Gemini image API response: ${msg}`)
742
745
  .onSuccess((response) => {
746
+ var _a, _b;
743
747
  const images = [];
744
748
  for (const candidate of response.candidates) {
745
- for (const part of candidate.content.parts) {
749
+ for (const part of (_b = (_a = candidate.content) === null || _a === void 0 ? void 0 : _a.parts) !== null && _b !== void 0 ? _b : []) {
746
750
  if (part.inlineData) {
747
751
  images.push({
748
752
  mimeType: part.inlineData.mimeType,
@@ -752,80 +756,30 @@ async function callGeminiImageOutGeneration(config, request, resolved, logger, s
752
756
  }
753
757
  }
754
758
  if (images.length === 0) {
759
+ // A candidate with no image parts is a *decline* only when it carries a
760
+ // refusal-shaped finishReason — i.e. present and not a benign terminal reason
761
+ // (`STOP`/`MAX_TOKENS`). A normal completion that emitted text-instead-of-image
762
+ // carries `finishReason: 'STOP'` and must fall through to the no-image message.
763
+ const declined = response.candidates.find((candidate) => candidate.finishReason !== undefined &&
764
+ !benignGeminiImageFinishReasons.has(candidate.finishReason));
765
+ if ((declined === null || declined === void 0 ? void 0 : declined.finishReason) !== undefined) {
766
+ // Truthiness (not `!== undefined`) so an empty-string finishMessage is treated
767
+ // as "no message" and produces no dangling ` — ` separator.
768
+ const suffix = declined.finishMessage ? ` — ${declined.finishMessage}` : '';
769
+ return (0, ts_utils_1.fail)(`Gemini image generation declined: ${declined.finishReason}${suffix}`);
770
+ }
755
771
  return (0, ts_utils_1.fail)('Gemini image API response: no image parts in response');
756
772
  }
757
773
  return (0, ts_utils_1.succeed)({ images });
758
774
  }));
759
775
  }
760
- /** Calls the Gemini Imagen :predict endpoint with Imagen 4 params. @internal */
761
- async function callImagenGeneration(config, request, resolved, logger, signal) {
762
- const url = `${config.baseUrl}/models/${config.model}:predict`;
763
- const parameters = {
764
- sampleCount: resolved.n
765
- };
766
- if (resolved.imagenAspectRatio !== undefined) {
767
- parameters.aspectRatio = resolved.imagenAspectRatio;
768
- }
769
- if (resolved.imageSize !== undefined) {
770
- parameters.imageSize = resolved.imageSize;
771
- }
772
- if (resolved.addWatermark !== undefined) {
773
- parameters.addWatermark = resolved.addWatermark;
774
- }
775
- if (resolved.enhancePrompt !== undefined) {
776
- parameters.enhancePrompt = resolved.enhancePrompt;
777
- }
778
- if (resolved.imagenOutputMimeType !== undefined || resolved.imagenOutputCompressionQuality !== undefined) {
779
- const outputOptions = {};
780
- if (resolved.imagenOutputMimeType !== undefined) {
781
- outputOptions.mimeType = resolved.imagenOutputMimeType;
782
- }
783
- if (resolved.imagenOutputCompressionQuality !== undefined) {
784
- outputOptions.compressionQuality = resolved.imagenOutputCompressionQuality;
785
- }
786
- parameters.outputOptions = outputOptions;
787
- }
788
- if (resolved.personGeneration !== undefined) {
789
- parameters.personGeneration = resolved.personGeneration;
790
- }
791
- if (resolved.seed !== undefined) {
792
- parameters.seed = resolved.seed;
793
- }
794
- if (resolved.otherParams !== undefined) {
795
- Object.assign(parameters, resolved.otherParams);
796
- }
797
- const body = {
798
- instances: [{ prompt: request.prompt }],
799
- parameters
800
- };
801
- const headers = { 'x-goog-api-key': config.apiKey };
802
- /* c8 ignore next 1 - optional logger */
803
- logger === null || logger === void 0 ? void 0 : logger.info(`Imagen generation: model=${config.model}, n=${parameters.sampleCount}`);
804
- const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
805
- if (jsonResult.isFailure()) {
806
- return (0, ts_utils_1.fail)(jsonResult.message);
807
- }
808
- return imagenResponse
809
- .validate(jsonResult.value)
810
- .withErrorFormat((msg) => `Imagen API response: ${msg}`)
811
- .onSuccess((response) => {
812
- const images = response.predictions.map((p) => {
813
- var _a;
814
- return ({
815
- mimeType: (_a = p.mimeType) !== null && _a !== void 0 ? _a : 'image/png',
816
- base64: p.bytesBase64Encoded
817
- });
818
- });
819
- return (0, ts_utils_1.succeed)({ images });
820
- });
821
- }
822
776
  // ============================================================================
823
777
  // Image generation — dispatcher
824
778
  // ============================================================================
825
779
  /**
826
780
  * Calls the appropriate image-generation API for a given provider. Routes by the
827
781
  * `format` field of the resolved {@link IAiImageModelCapability}:
828
- * `'openai-images'`, `'xai-images'`, `'xai-images-edits'`, `'gemini-imagen'`, or
782
+ * `'openai-images'`, `'xai-images'`, `'xai-images-edits'`, or
829
783
  * `'gemini-image-out'`. Rejects up front if `referenceImages` is set but the
830
784
  * capability does not declare `acceptsImageReferenceInput`.
831
785
  * @param params - Request parameters including descriptor, API key, and prompt
@@ -841,12 +795,11 @@ async function callProviderImageGeneration(params) {
841
795
  if (baseUrlResult.isFailure()) {
842
796
  return (0, ts_utils_1.fail)(baseUrlResult.message);
843
797
  }
844
- const model = (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, 'image');
845
- if (model.length === 0) {
846
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}": no image model resolved; ` +
847
- `pass modelOverride or set descriptor.defaultModel ` +
848
- `(a plain string, or an object with an "image" entry)`);
798
+ const modelResult = (0, model_1.resolveProviderModel)(descriptor, modelOverride, 'image');
799
+ if (modelResult.isFailure()) {
800
+ return (0, ts_utils_1.fail)(modelResult.message);
849
801
  }
802
+ const model = modelResult.value;
850
803
  const capability = (0, registry_1.resolveImageCapability)(descriptor, model);
851
804
  if (capability === undefined) {
852
805
  return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not support image generation for model "${model}"`);
@@ -893,8 +846,6 @@ async function callProviderImageGeneration(params) {
893
846
  }
894
847
  return callXaiImageGeneration(config, request, capability, resolved, logger, signal);
895
848
  }
896
- case 'gemini-imagen':
897
- return callImagenGeneration(config, request, resolved, logger, signal);
898
849
  case 'gemini-image-out':
899
850
  return callGeminiImageOutGeneration(config, request, resolved, logger, signal);
900
851
  /* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */
@@ -1188,9 +1139,13 @@ async function callProxiedCompletion(proxyUrl, params) {
1188
1139
  const body = {
1189
1140
  providerId: descriptor.id,
1190
1141
  apiKey,
1191
- messages: (0, chatRequestBuilders_1.normalizeOutboundMessages)(splitResult.value),
1192
- temperature: temperature !== null && temperature !== void 0 ? temperature : 0.7
1142
+ messages: (0, chatRequestBuilders_1.normalizeOutboundMessages)(splitResult.value)
1193
1143
  };
1144
+ // Temperature is forwarded only when explicitly provided, matching the direct path — the proxy
1145
+ // omits it from the upstream request so the provider default applies.
1146
+ if (temperature !== undefined) {
1147
+ body.temperature = temperature;
1148
+ }
1194
1149
  if (system !== undefined) {
1195
1150
  body.system = system;
1196
1151
  }