@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.
- package/dist/packlets/ai-assist/apiClient.js +66 -111
- package/dist/packlets/ai-assist/apiClient.js.map +1 -1
- package/dist/packlets/ai-assist/converters.js +16 -3
- package/dist/packlets/ai-assist/converters.js.map +1 -1
- package/dist/packlets/ai-assist/embeddingClient.js +5 -6
- package/dist/packlets/ai-assist/embeddingClient.js.map +1 -1
- package/dist/packlets/ai-assist/imageOptionsResolver.js +0 -19
- package/dist/packlets/ai-assist/imageOptionsResolver.js.map +1 -1
- package/dist/packlets/ai-assist/index.js +2 -2
- package/dist/packlets/ai-assist/index.js.map +1 -1
- package/dist/packlets/ai-assist/model.js +139 -7
- package/dist/packlets/ai-assist/model.js.map +1 -1
- package/dist/packlets/ai-assist/registry.js +58 -51
- package/dist/packlets/ai-assist/registry.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/anthropic.js +38 -11
- package/dist/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +187 -36
- package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/common.js +13 -0
- package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/gemini.js +12 -4
- package/dist/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +6 -1
- package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +10 -3
- package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
- package/dist/packlets/ai-assist/streamingAdapters/proxy.js +5 -2
- package/dist/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -1
- package/dist/packlets/ai-assist/streamingClient.js +16 -16
- package/dist/packlets/ai-assist/streamingClient.js.map +1 -1
- package/dist/packlets/crypto-utils/converters.js +18 -0
- package/dist/packlets/crypto-utils/converters.js.map +1 -1
- package/dist/packlets/crypto-utils/index.browser.js +2 -2
- package/dist/packlets/crypto-utils/index.browser.js.map +1 -1
- package/dist/packlets/crypto-utils/index.js +2 -2
- package/dist/packlets/crypto-utils/index.js.map +1 -1
- package/dist/packlets/crypto-utils/keystore/keyStore.js +19 -4
- package/dist/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
- package/dist/packlets/crypto-utils/keystore/model.js.map +1 -1
- package/dist/packlets/crypto-utils/model.js.map +1 -1
- package/dist/packlets/crypto-utils/spkiHelpers.js +104 -25
- package/dist/packlets/crypto-utils/spkiHelpers.js.map +1 -1
- package/dist/ts-extras.d.ts +377 -132
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/packlets/ai-assist/apiClient.d.ts +12 -2
- package/lib/packlets/ai-assist/apiClient.d.ts.map +1 -1
- package/lib/packlets/ai-assist/apiClient.js +65 -110
- package/lib/packlets/ai-assist/apiClient.js.map +1 -1
- package/lib/packlets/ai-assist/converters.d.ts +8 -2
- package/lib/packlets/ai-assist/converters.d.ts.map +1 -1
- package/lib/packlets/ai-assist/converters.js +17 -4
- package/lib/packlets/ai-assist/converters.js.map +1 -1
- package/lib/packlets/ai-assist/embeddingClient.d.ts.map +1 -1
- package/lib/packlets/ai-assist/embeddingClient.js +4 -5
- package/lib/packlets/ai-assist/embeddingClient.js.map +1 -1
- package/lib/packlets/ai-assist/imageOptionsResolver.d.ts +0 -8
- package/lib/packlets/ai-assist/imageOptionsResolver.d.ts.map +1 -1
- package/lib/packlets/ai-assist/imageOptionsResolver.js +0 -19
- package/lib/packlets/ai-assist/imageOptionsResolver.js.map +1 -1
- package/lib/packlets/ai-assist/index.d.ts +3 -3
- package/lib/packlets/ai-assist/index.d.ts.map +1 -1
- package/lib/packlets/ai-assist/index.js +6 -1
- package/lib/packlets/ai-assist/index.js.map +1 -1
- package/lib/packlets/ai-assist/model.d.ts +181 -98
- package/lib/packlets/ai-assist/model.d.ts.map +1 -1
- package/lib/packlets/ai-assist/model.js +143 -8
- package/lib/packlets/ai-assist/model.js.map +1 -1
- package/lib/packlets/ai-assist/registry.d.ts.map +1 -1
- package/lib/packlets/ai-assist/registry.js +58 -51
- package/lib/packlets/ai-assist/registry.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.js +37 -10
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts +82 -3
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +187 -35
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +24 -1
- package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/common.js +14 -1
- package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts +10 -1
- package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/gemini.js +12 -4
- package/lib/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +6 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +10 -3
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingAdapters/proxy.js +5 -2
- package/lib/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -1
- package/lib/packlets/ai-assist/streamingClient.d.ts +1 -1
- package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -1
- package/lib/packlets/ai-assist/streamingClient.js +15 -15
- package/lib/packlets/ai-assist/streamingClient.js.map +1 -1
- package/lib/packlets/crypto-utils/converters.d.ts +9 -1
- package/lib/packlets/crypto-utils/converters.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/converters.js +19 -1
- package/lib/packlets/crypto-utils/converters.js.map +1 -1
- package/lib/packlets/crypto-utils/index.browser.d.ts +1 -1
- package/lib/packlets/crypto-utils/index.browser.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/index.browser.js +6 -2
- package/lib/packlets/crypto-utils/index.browser.js.map +1 -1
- package/lib/packlets/crypto-utils/index.d.ts +1 -1
- package/lib/packlets/crypto-utils/index.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/index.js +6 -2
- package/lib/packlets/crypto-utils/index.js.map +1 -1
- package/lib/packlets/crypto-utils/keystore/keyStore.d.ts +9 -2
- package/lib/packlets/crypto-utils/keystore/keyStore.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/keystore/keyStore.js +19 -4
- package/lib/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
- package/lib/packlets/crypto-utils/keystore/model.d.ts +7 -0
- package/lib/packlets/crypto-utils/keystore/model.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/keystore/model.js.map +1 -1
- package/lib/packlets/crypto-utils/model.d.ts +11 -1
- package/lib/packlets/crypto-utils/model.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/model.js.map +1 -1
- package/lib/packlets/crypto-utils/spkiHelpers.d.ts +59 -2
- package/lib/packlets/crypto-utils/spkiHelpers.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/spkiHelpers.js +108 -25
- package/lib/packlets/crypto-utils/spkiHelpers.js.map +1 -1
- package/package.json +7 -7
package/dist/tsdoc-metadata.json
CHANGED
|
@@ -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
|
-
/**
|
|
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'`,
|
|
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":"AA+BA,OAAO,EAAQ,KAAK,OAAO,EAAc,MAAM,EAAuC,MAAM,eAAe,CAAC;AAE5G,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAG1B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAE/B,KAAK,wBAAwB,EAE7B,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAE1B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,SAAS,
|
|
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
|
|
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 }, (
|
|
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
|
|
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) }, (
|
|
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
|
|
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 }, (
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
const
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
-
|
|
496
|
-
|
|
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,
|
|
502
|
+
return callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking);
|
|
499
503
|
case 'anthropic':
|
|
500
|
-
return callAnthropicCompletion(config, prompt, head,
|
|
504
|
+
return callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking);
|
|
501
505
|
case 'gemini':
|
|
502
|
-
return callGeminiCompletion(config, prompt, head,
|
|
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)
|
|
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'`,
|
|
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
|
|
845
|
-
if (
|
|
846
|
-
return (0, ts_utils_1.fail)(
|
|
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
|
}
|