@fgv/ts-extras 5.1.0-20 → 5.1.0-22

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 (89) hide show
  1. package/dist/packlets/ai-assist/apiClient.js +30 -25
  2. package/dist/packlets/ai-assist/apiClient.js.map +1 -1
  3. package/dist/packlets/ai-assist/converters.js +2 -1
  4. package/dist/packlets/ai-assist/converters.js.map +1 -1
  5. package/dist/packlets/ai-assist/endpoint.js +78 -0
  6. package/dist/packlets/ai-assist/endpoint.js.map +1 -0
  7. package/dist/packlets/ai-assist/index.js +2 -0
  8. package/dist/packlets/ai-assist/index.js.map +1 -1
  9. package/dist/packlets/ai-assist/jsonCompletion.js +95 -0
  10. package/dist/packlets/ai-assist/jsonCompletion.js.map +1 -0
  11. package/dist/packlets/ai-assist/jsonResponse.js +149 -0
  12. package/dist/packlets/ai-assist/jsonResponse.js.map +1 -0
  13. package/dist/packlets/ai-assist/model.js.map +1 -1
  14. package/dist/packlets/ai-assist/registry.js +26 -0
  15. package/dist/packlets/ai-assist/registry.js.map +1 -1
  16. package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  17. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  18. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  19. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  20. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  21. package/dist/packlets/ai-assist/streamingClient.js +11 -5
  22. package/dist/packlets/ai-assist/streamingClient.js.map +1 -1
  23. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  24. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  25. package/dist/packlets/crypto-utils/keystore/keyStore.js +81 -0
  26. package/dist/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
  27. package/dist/packlets/crypto-utils/model.js +2 -1
  28. package/dist/packlets/crypto-utils/model.js.map +1 -1
  29. package/dist/packlets/crypto-utils/nodeCryptoProvider.js +21 -2
  30. package/dist/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  31. package/dist/ts-extras.d.ts +301 -6
  32. package/lib/packlets/ai-assist/apiClient.d.ts +29 -0
  33. package/lib/packlets/ai-assist/apiClient.d.ts.map +1 -1
  34. package/lib/packlets/ai-assist/apiClient.js +30 -25
  35. package/lib/packlets/ai-assist/apiClient.js.map +1 -1
  36. package/lib/packlets/ai-assist/converters.d.ts.map +1 -1
  37. package/lib/packlets/ai-assist/converters.js +2 -1
  38. package/lib/packlets/ai-assist/converters.js.map +1 -1
  39. package/lib/packlets/ai-assist/endpoint.d.ts +28 -0
  40. package/lib/packlets/ai-assist/endpoint.d.ts.map +1 -0
  41. package/lib/packlets/ai-assist/endpoint.js +82 -0
  42. package/lib/packlets/ai-assist/endpoint.js.map +1 -0
  43. package/lib/packlets/ai-assist/index.d.ts +2 -0
  44. package/lib/packlets/ai-assist/index.d.ts.map +1 -1
  45. package/lib/packlets/ai-assist/index.js +7 -1
  46. package/lib/packlets/ai-assist/index.js.map +1 -1
  47. package/lib/packlets/ai-assist/jsonCompletion.d.ts +93 -0
  48. package/lib/packlets/ai-assist/jsonCompletion.d.ts.map +1 -0
  49. package/lib/packlets/ai-assist/jsonCompletion.js +99 -0
  50. package/lib/packlets/ai-assist/jsonCompletion.js.map +1 -0
  51. package/lib/packlets/ai-assist/jsonResponse.d.ts +91 -0
  52. package/lib/packlets/ai-assist/jsonResponse.d.ts.map +1 -0
  53. package/lib/packlets/ai-assist/jsonResponse.js +154 -0
  54. package/lib/packlets/ai-assist/jsonResponse.js.map +1 -0
  55. package/lib/packlets/ai-assist/model.d.ts +9 -1
  56. package/lib/packlets/ai-assist/model.d.ts.map +1 -1
  57. package/lib/packlets/ai-assist/model.js.map +1 -1
  58. package/lib/packlets/ai-assist/registry.d.ts.map +1 -1
  59. package/lib/packlets/ai-assist/registry.js +26 -0
  60. package/lib/packlets/ai-assist/registry.js.map +1 -1
  61. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +8 -0
  62. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -1
  63. package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  64. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -1
  65. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  66. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  67. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -1
  68. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  69. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  70. package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -1
  71. package/lib/packlets/ai-assist/streamingClient.js +11 -5
  72. package/lib/packlets/ai-assist/streamingClient.js.map +1 -1
  73. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts +14 -3
  74. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts.map +1 -1
  75. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  76. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  77. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts +43 -1
  78. package/lib/packlets/crypto-utils/keystore/keyStore.d.ts.map +1 -1
  79. package/lib/packlets/crypto-utils/keystore/keyStore.js +81 -0
  80. package/lib/packlets/crypto-utils/keystore/keyStore.js.map +1 -1
  81. package/lib/packlets/crypto-utils/model.d.ts +16 -2
  82. package/lib/packlets/crypto-utils/model.d.ts.map +1 -1
  83. package/lib/packlets/crypto-utils/model.js +2 -1
  84. package/lib/packlets/crypto-utils/model.js.map +1 -1
  85. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts +7 -1
  86. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts.map +1 -1
  87. package/lib/packlets/crypto-utils/nodeCryptoProvider.js +20 -1
  88. package/lib/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  89. package/package.json +7 -7
@@ -33,6 +33,7 @@ import { isJsonObject } from '@fgv/ts-json-base';
33
33
  import { fail, mapResults, succeed, Validators } from '@fgv/ts-utils';
34
34
  import { resolveModel } from './model';
35
35
  import { buildAnthropicMessages, buildGeminiContents, buildMessages, buildOpenAiChatUserContent, buildOpenAiResponsesUserContent } from './chatRequestBuilders';
36
+ import { bearerAuthHeader, resolveEffectiveBaseUrl } from './endpoint';
36
37
  import { DEFAULT_MODEL_CAPABILITY_CONFIG, resolveImageCapability, supportsImageGeneration } from './registry';
37
38
  import { toAnthropicTools, toGeminiTools, toResponsesApiTools } from './toolFormats';
38
39
  // ============================================================================
@@ -279,9 +280,7 @@ async function callOpenAiCompletion(config, prompt, additionalMessages, temperat
279
280
  tail: additionalMessages
280
281
  });
281
282
  const body = { model: config.model, messages, temperature };
282
- const headers = {
283
- Authorization: `Bearer ${config.apiKey}`
284
- };
283
+ const headers = bearerAuthHeader(config.apiKey);
285
284
  /* c8 ignore next 1 - optional logger */
286
285
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI completion: model=${config.model}`);
287
286
  const jsonResult = await fetchJson(url, headers, body, logger, signal);
@@ -334,9 +333,7 @@ async function callOpenAiResponsesCompletion(config, prompt, tools, additionalMe
334
333
  tools: toResponsesApiTools(tools),
335
334
  temperature
336
335
  };
337
- const headers = {
338
- Authorization: `Bearer ${config.apiKey}`
339
- };
336
+ const headers = bearerAuthHeader(config.apiKey);
340
337
  /* c8 ignore next 1 - optional logger */
341
338
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);
342
339
  const jsonResult = await fetchJson(url, headers, body, logger, signal);
@@ -501,19 +498,24 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
501
498
  * @public
502
499
  */
503
500
  export async function callProviderCompletion(params) {
504
- const { descriptor, apiKey, prompt, additionalMessages, temperature = 0.7, modelOverride, logger, tools, signal } = params;
505
- if (!descriptor.baseUrl) {
506
- return fail(`provider "${descriptor.id}" has no API endpoint configured`);
501
+ const { descriptor, apiKey, prompt, additionalMessages, temperature = 0.7, modelOverride, logger, tools, signal, endpoint } = params;
502
+ const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);
503
+ if (baseUrlResult.isFailure()) {
504
+ return fail(baseUrlResult.message);
507
505
  }
508
506
  if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
509
507
  return fail(`provider "${descriptor.id}" does not accept image input`);
510
508
  }
511
509
  const hasTools = tools !== undefined && tools.length > 0;
512
510
  const modelContext = hasTools ? 'tools' : undefined;
511
+ const model = resolveModel(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext);
512
+ if (model.length === 0) {
513
+ return fail(`provider "${descriptor.id}": no model resolved; pass modelOverride or set descriptor.defaultModel`);
514
+ }
513
515
  const config = {
514
- baseUrl: descriptor.baseUrl,
516
+ baseUrl: baseUrlResult.value,
515
517
  apiKey,
516
- model: resolveModel(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext)
518
+ model
517
519
  };
518
520
  /* c8 ignore next 8 - optional logger diagnostic output */
519
521
  if (logger) {
@@ -607,9 +609,7 @@ async function callOpenAiImageGeneration(config, request, defaultMimeType, logge
607
609
  var _a, _b, _c;
608
610
  const opts = (_a = request.options) !== null && _a !== void 0 ? _a : {};
609
611
  const refs = (_b = request.referenceImages) !== null && _b !== void 0 ? _b : [];
610
- const headers = {
611
- Authorization: `Bearer ${config.apiKey}`
612
- };
612
+ const headers = bearerAuthHeader(config.apiKey);
613
613
  const n = (_c = opts.count) !== null && _c !== void 0 ? _c : 1;
614
614
  const fetched = refs.length > 0
615
615
  ? await callOpenAiImagesEdits(config, request, headers, n, refs, logger, signal)
@@ -795,14 +795,20 @@ async function callImagenGeneration(config, request, logger, signal) {
795
795
  */
796
796
  export async function callProviderImageGeneration(params) {
797
797
  var _a, _b;
798
- const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;
798
+ const { descriptor, apiKey, params: request, modelOverride, logger, signal, endpoint } = params;
799
799
  if (!supportsImageGeneration(descriptor)) {
800
800
  return fail(`provider "${descriptor.id}" does not support image generation`);
801
801
  }
802
- if (!descriptor.baseUrl) {
803
- return fail(`provider "${descriptor.id}" has no API endpoint configured`);
802
+ const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);
803
+ if (baseUrlResult.isFailure()) {
804
+ return fail(baseUrlResult.message);
804
805
  }
805
806
  const model = resolveModel(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, 'image');
807
+ if (model.length === 0) {
808
+ return fail(`provider "${descriptor.id}": no image model resolved; ` +
809
+ `pass modelOverride or set descriptor.defaultModel ` +
810
+ `(a plain string, or an object with an "image" entry)`);
811
+ }
806
812
  const capability = resolveImageCapability(descriptor, model);
807
813
  if (capability === undefined) {
808
814
  return fail(`provider "${descriptor.id}" does not support image generation for model "${model}"`);
@@ -811,7 +817,7 @@ export async function callProviderImageGeneration(params) {
811
817
  return fail(`model "${model}" does not support reference images`);
812
818
  }
813
819
  const config = {
814
- baseUrl: descriptor.baseUrl,
820
+ baseUrl: baseUrlResult.value,
815
821
  apiKey,
816
822
  model
817
823
  };
@@ -938,9 +944,7 @@ function buildModelInfo(providerId, id, nativeCapabilities, nativeDisplayName, c
938
944
  */
939
945
  async function callOpenAiListModels(config, providerId, capabilityConfig, logger, signal) {
940
946
  const url = `${config.baseUrl}/models`;
941
- const headers = {
942
- Authorization: `Bearer ${config.apiKey}`
943
- };
947
+ const headers = bearerAuthHeader(config.apiKey);
944
948
  /* c8 ignore next 1 - optional logger */
945
949
  logger === null || logger === void 0 ? void 0 : logger.info(`List models: provider=${providerId}, format=openai`);
946
950
  const jsonResult = await fetchGetJson(url, headers, logger, signal);
@@ -1027,12 +1031,13 @@ async function callGeminiListModels(config, providerId, capabilityConfig, logger
1027
1031
  * @public
1028
1032
  */
1029
1033
  export async function callProviderListModels(params) {
1030
- const { descriptor, apiKey, capability, capabilityConfig, logger, signal } = params;
1031
- if (!descriptor.baseUrl) {
1032
- return fail(`provider "${descriptor.id}" has no API endpoint configured`);
1034
+ const { descriptor, apiKey, capability, capabilityConfig, logger, signal, endpoint } = params;
1035
+ const baseUrlResult = resolveEffectiveBaseUrl(descriptor, endpoint);
1036
+ if (baseUrlResult.isFailure()) {
1037
+ return fail(baseUrlResult.message);
1033
1038
  }
1034
1039
  const config = {
1035
- baseUrl: descriptor.baseUrl,
1040
+ baseUrl: baseUrlResult.value,
1036
1041
  apiKey,
1037
1042
  model: '' // unused by listing
1038
1043
  };