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

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 (64) 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/model.js.map +1 -1
  8. package/dist/packlets/ai-assist/registry.js +26 -0
  9. package/dist/packlets/ai-assist/registry.js.map +1 -1
  10. package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  11. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  12. package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  13. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  14. package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  15. package/dist/packlets/ai-assist/streamingClient.js +11 -5
  16. package/dist/packlets/ai-assist/streamingClient.js.map +1 -1
  17. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  18. package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  19. package/dist/packlets/crypto-utils/model.js +2 -1
  20. package/dist/packlets/crypto-utils/model.js.map +1 -1
  21. package/dist/packlets/crypto-utils/nodeCryptoProvider.js +12 -1
  22. package/dist/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  23. package/dist/ts-extras.d.ts +66 -5
  24. package/lib/packlets/ai-assist/apiClient.d.ts +29 -0
  25. package/lib/packlets/ai-assist/apiClient.d.ts.map +1 -1
  26. package/lib/packlets/ai-assist/apiClient.js +30 -25
  27. package/lib/packlets/ai-assist/apiClient.js.map +1 -1
  28. package/lib/packlets/ai-assist/converters.d.ts.map +1 -1
  29. package/lib/packlets/ai-assist/converters.js +2 -1
  30. package/lib/packlets/ai-assist/converters.js.map +1 -1
  31. package/lib/packlets/ai-assist/endpoint.d.ts +28 -0
  32. package/lib/packlets/ai-assist/endpoint.d.ts.map +1 -0
  33. package/lib/packlets/ai-assist/endpoint.js +82 -0
  34. package/lib/packlets/ai-assist/endpoint.js.map +1 -0
  35. package/lib/packlets/ai-assist/model.d.ts +9 -1
  36. package/lib/packlets/ai-assist/model.d.ts.map +1 -1
  37. package/lib/packlets/ai-assist/model.js.map +1 -1
  38. package/lib/packlets/ai-assist/registry.d.ts.map +1 -1
  39. package/lib/packlets/ai-assist/registry.js +26 -0
  40. package/lib/packlets/ai-assist/registry.js.map +1 -1
  41. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +8 -0
  42. package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -1
  43. package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -1
  44. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -1
  45. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +2 -1
  46. package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -1
  47. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -1
  48. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +2 -1
  49. package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -1
  50. package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -1
  51. package/lib/packlets/ai-assist/streamingClient.js +11 -5
  52. package/lib/packlets/ai-assist/streamingClient.js.map +1 -1
  53. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts +14 -3
  54. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts.map +1 -1
  55. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js +6 -0
  56. package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -1
  57. package/lib/packlets/crypto-utils/model.d.ts +6 -1
  58. package/lib/packlets/crypto-utils/model.d.ts.map +1 -1
  59. package/lib/packlets/crypto-utils/model.js +2 -1
  60. package/lib/packlets/crypto-utils/model.js.map +1 -1
  61. package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts.map +1 -1
  62. package/lib/packlets/crypto-utils/nodeCryptoProvider.js +12 -1
  63. package/lib/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -1
  64. package/package.json +7 -7
@@ -41,6 +41,7 @@ const ts_json_base_1 = require("@fgv/ts-json-base");
41
41
  const ts_utils_1 = require("@fgv/ts-utils");
42
42
  const model_1 = require("./model");
43
43
  const chatRequestBuilders_1 = require("./chatRequestBuilders");
44
+ const endpoint_1 = require("./endpoint");
44
45
  const registry_1 = require("./registry");
45
46
  const toolFormats_1 = require("./toolFormats");
46
47
  // ============================================================================
@@ -287,9 +288,7 @@ async function callOpenAiCompletion(config, prompt, additionalMessages, temperat
287
288
  tail: additionalMessages
288
289
  });
289
290
  const body = { model: config.model, messages, temperature };
290
- const headers = {
291
- Authorization: `Bearer ${config.apiKey}`
292
- };
291
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
293
292
  /* c8 ignore next 1 - optional logger */
294
293
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI completion: model=${config.model}`);
295
294
  const jsonResult = await fetchJson(url, headers, body, logger, signal);
@@ -342,9 +341,7 @@ async function callOpenAiResponsesCompletion(config, prompt, tools, additionalMe
342
341
  tools: (0, toolFormats_1.toResponsesApiTools)(tools),
343
342
  temperature
344
343
  };
345
- const headers = {
346
- Authorization: `Bearer ${config.apiKey}`
347
- };
344
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
348
345
  /* c8 ignore next 1 - optional logger */
349
346
  logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);
350
347
  const jsonResult = await fetchJson(url, headers, body, logger, signal);
@@ -509,19 +506,24 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
509
506
  * @public
510
507
  */
511
508
  async function callProviderCompletion(params) {
512
- const { descriptor, apiKey, prompt, additionalMessages, temperature = 0.7, modelOverride, logger, tools, signal } = params;
513
- if (!descriptor.baseUrl) {
514
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}" has no API endpoint configured`);
509
+ const { descriptor, apiKey, prompt, additionalMessages, temperature = 0.7, modelOverride, logger, tools, signal, endpoint } = params;
510
+ const baseUrlResult = (0, endpoint_1.resolveEffectiveBaseUrl)(descriptor, endpoint);
511
+ if (baseUrlResult.isFailure()) {
512
+ return (0, ts_utils_1.fail)(baseUrlResult.message);
515
513
  }
516
514
  if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
517
515
  return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not accept image input`);
518
516
  }
519
517
  const hasTools = tools !== undefined && tools.length > 0;
520
518
  const modelContext = hasTools ? 'tools' : undefined;
519
+ const model = (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext);
520
+ if (model.length === 0) {
521
+ return (0, ts_utils_1.fail)(`provider "${descriptor.id}": no model resolved; pass modelOverride or set descriptor.defaultModel`);
522
+ }
521
523
  const config = {
522
- baseUrl: descriptor.baseUrl,
524
+ baseUrl: baseUrlResult.value,
523
525
  apiKey,
524
- model: (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, modelContext)
526
+ model
525
527
  };
526
528
  /* c8 ignore next 8 - optional logger diagnostic output */
527
529
  if (logger) {
@@ -615,9 +617,7 @@ async function callOpenAiImageGeneration(config, request, defaultMimeType, logge
615
617
  var _a, _b, _c;
616
618
  const opts = (_a = request.options) !== null && _a !== void 0 ? _a : {};
617
619
  const refs = (_b = request.referenceImages) !== null && _b !== void 0 ? _b : [];
618
- const headers = {
619
- Authorization: `Bearer ${config.apiKey}`
620
- };
620
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
621
621
  const n = (_c = opts.count) !== null && _c !== void 0 ? _c : 1;
622
622
  const fetched = refs.length > 0
623
623
  ? await callOpenAiImagesEdits(config, request, headers, n, refs, logger, signal)
@@ -803,14 +803,20 @@ async function callImagenGeneration(config, request, logger, signal) {
803
803
  */
804
804
  async function callProviderImageGeneration(params) {
805
805
  var _a, _b;
806
- const { descriptor, apiKey, params: request, modelOverride, logger, signal } = params;
806
+ const { descriptor, apiKey, params: request, modelOverride, logger, signal, endpoint } = params;
807
807
  if (!(0, registry_1.supportsImageGeneration)(descriptor)) {
808
808
  return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not support image generation`);
809
809
  }
810
- if (!descriptor.baseUrl) {
811
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}" has no API endpoint configured`);
810
+ const baseUrlResult = (0, endpoint_1.resolveEffectiveBaseUrl)(descriptor, endpoint);
811
+ if (baseUrlResult.isFailure()) {
812
+ return (0, ts_utils_1.fail)(baseUrlResult.message);
812
813
  }
813
814
  const model = (0, model_1.resolveModel)(modelOverride !== null && modelOverride !== void 0 ? modelOverride : descriptor.defaultModel, 'image');
815
+ if (model.length === 0) {
816
+ return (0, ts_utils_1.fail)(`provider "${descriptor.id}": no image model resolved; ` +
817
+ `pass modelOverride or set descriptor.defaultModel ` +
818
+ `(a plain string, or an object with an "image" entry)`);
819
+ }
814
820
  const capability = (0, registry_1.resolveImageCapability)(descriptor, model);
815
821
  if (capability === undefined) {
816
822
  return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not support image generation for model "${model}"`);
@@ -819,7 +825,7 @@ async function callProviderImageGeneration(params) {
819
825
  return (0, ts_utils_1.fail)(`model "${model}" does not support reference images`);
820
826
  }
821
827
  const config = {
822
- baseUrl: descriptor.baseUrl,
828
+ baseUrl: baseUrlResult.value,
823
829
  apiKey,
824
830
  model
825
831
  };
@@ -946,9 +952,7 @@ function buildModelInfo(providerId, id, nativeCapabilities, nativeDisplayName, c
946
952
  */
947
953
  async function callOpenAiListModels(config, providerId, capabilityConfig, logger, signal) {
948
954
  const url = `${config.baseUrl}/models`;
949
- const headers = {
950
- Authorization: `Bearer ${config.apiKey}`
951
- };
955
+ const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
952
956
  /* c8 ignore next 1 - optional logger */
953
957
  logger === null || logger === void 0 ? void 0 : logger.info(`List models: provider=${providerId}, format=openai`);
954
958
  const jsonResult = await fetchGetJson(url, headers, logger, signal);
@@ -1035,12 +1039,13 @@ async function callGeminiListModels(config, providerId, capabilityConfig, logger
1035
1039
  * @public
1036
1040
  */
1037
1041
  async function callProviderListModels(params) {
1038
- const { descriptor, apiKey, capability, capabilityConfig, logger, signal } = params;
1039
- if (!descriptor.baseUrl) {
1040
- return (0, ts_utils_1.fail)(`provider "${descriptor.id}" has no API endpoint configured`);
1042
+ const { descriptor, apiKey, capability, capabilityConfig, logger, signal, endpoint } = params;
1043
+ const baseUrlResult = (0, endpoint_1.resolveEffectiveBaseUrl)(descriptor, endpoint);
1044
+ if (baseUrlResult.isFailure()) {
1045
+ return (0, ts_utils_1.fail)(baseUrlResult.message);
1041
1046
  }
1042
1047
  const config = {
1043
- baseUrl: descriptor.baseUrl,
1048
+ baseUrl: baseUrlResult.value,
1044
1049
  apiKey,
1045
1050
  model: '' // unused by listing
1046
1051
  };