@fgv/ts-extras 5.1.0-5 → 5.1.0-50
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/LICENSE +1 -1
- package/README.md +90 -0
- package/dist/index.browser.js +6 -2
- package/dist/index.browser.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -0
- package/dist/packlets/ai-assist/chatRequestBuilders.js +282 -0
- package/dist/packlets/ai-assist/chatRequestBuilders.js.map +1 -0
- package/dist/packlets/ai-assist/{apiClient.js → completionClient.js} +165 -214
- package/dist/packlets/ai-assist/completionClient.js.map +1 -0
- package/dist/packlets/ai-assist/converters.js +47 -3
- package/dist/packlets/ai-assist/converters.js.map +1 -0
- package/dist/packlets/ai-assist/embeddingClient.js +345 -0
- package/dist/packlets/ai-assist/embeddingClient.js.map +1 -0
- package/dist/packlets/ai-assist/endpoint.js +107 -0
- package/dist/packlets/ai-assist/endpoint.js.map +1 -0
- package/dist/packlets/ai-assist/http.js +104 -0
- package/dist/packlets/ai-assist/http.js.map +1 -0
- package/dist/packlets/ai-assist/imageGenerationClient.js +454 -0
- package/dist/packlets/ai-assist/imageGenerationClient.js.map +1 -0
- package/dist/packlets/ai-assist/imageOptionsResolver.js +193 -0
- package/dist/packlets/ai-assist/imageOptionsResolver.js.map +1 -0
- package/dist/packlets/ai-assist/index.js +12 -4
- package/dist/packlets/ai-assist/index.js.map +1 -0
- package/dist/packlets/ai-assist/jsonCompletion.js +93 -0
- package/dist/packlets/ai-assist/jsonCompletion.js.map +1 -0
- package/dist/packlets/ai-assist/jsonResponse.js +423 -0
- package/dist/packlets/ai-assist/jsonResponse.js.map +1 -0
- package/dist/packlets/ai-assist/listModelsClient.js +294 -0
- package/dist/packlets/ai-assist/listModelsClient.js.map +1 -0
- package/dist/packlets/ai-assist/model.js +301 -9
- package/dist/packlets/ai-assist/model.js.map +1 -0
- package/dist/packlets/ai-assist/registry.js +376 -12
- package/dist/packlets/ai-assist/registry.js.map +1 -0
- package/dist/packlets/ai-assist/sseParser.js +123 -0
- package/dist/packlets/ai-assist/sseParser.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/anthropic.js +376 -0
- package/dist/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +687 -0
- package/dist/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/common.js +187 -0
- package/dist/packlets/ai-assist/streamingAdapters/common.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/gemini.js +208 -0
- package/dist/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js +175 -0
- package/dist/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js +390 -0
- package/dist/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -0
- package/dist/packlets/ai-assist/streamingAdapters/proxy.js +178 -0
- package/dist/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -0
- package/dist/packlets/ai-assist/streamingClient.js +140 -0
- package/dist/packlets/ai-assist/streamingClient.js.map +1 -0
- package/dist/packlets/ai-assist/thinkingOptionsResolver.js +288 -0
- package/dist/packlets/ai-assist/thinkingOptionsResolver.js.map +1 -0
- package/dist/packlets/ai-assist/toolFormats.js +106 -10
- package/dist/packlets/ai-assist/toolFormats.js.map +1 -0
- package/dist/packlets/conversion/converters.js +35 -1
- package/dist/packlets/conversion/converters.js.map +1 -0
- package/dist/packlets/conversion/index.js.map +1 -0
- package/dist/packlets/crypto-utils/constants.js.map +1 -0
- package/dist/packlets/crypto-utils/converters.js +42 -4
- package/dist/packlets/crypto-utils/converters.js.map +1 -0
- package/dist/packlets/crypto-utils/directEncryptionProvider.js.map +1 -0
- package/dist/packlets/crypto-utils/encryptedFile.js +37 -0
- package/dist/packlets/crypto-utils/encryptedFile.js.map +1 -0
- package/dist/packlets/crypto-utils/hpkeProvider.js +355 -0
- package/dist/packlets/crypto-utils/hpkeProvider.js.map +1 -0
- package/dist/packlets/crypto-utils/index.browser.js +13 -2
- package/dist/packlets/crypto-utils/index.browser.js.map +1 -0
- package/dist/packlets/crypto-utils/index.js +9 -1
- package/dist/packlets/crypto-utils/index.js.map +1 -0
- package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js +71 -0
- package/dist/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/converters.js +111 -16
- package/dist/packlets/crypto-utils/keystore/converters.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js +287 -0
- package/dist/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/index.browser.js +36 -0
- package/dist/packlets/crypto-utils/keystore/index.browser.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/index.js +3 -0
- package/dist/packlets/crypto-utils/keystore/index.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/keyStore.js +872 -119
- package/dist/packlets/crypto-utils/keystore/keyStore.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/model.js +35 -4
- package/dist/packlets/crypto-utils/keystore/model.js.map +1 -0
- package/dist/packlets/crypto-utils/keystore/privateKeyStorage.js +21 -0
- package/dist/packlets/crypto-utils/keystore/privateKeyStorage.js.map +1 -0
- package/dist/packlets/crypto-utils/model.js +32 -0
- package/dist/packlets/crypto-utils/model.js.map +1 -0
- package/dist/packlets/crypto-utils/nodeCryptoProvider.js +347 -1
- package/dist/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -0
- package/dist/packlets/crypto-utils/seedDerivedKeyPair.js +120 -0
- package/dist/packlets/crypto-utils/seedDerivedKeyPair.js.map +1 -0
- package/dist/packlets/crypto-utils/spkiHelpers.js +284 -0
- package/dist/packlets/crypto-utils/spkiHelpers.js.map +1 -0
- package/dist/packlets/csv/csvFileHelpers.js +0 -14
- package/dist/packlets/csv/csvFileHelpers.js.map +1 -0
- package/dist/packlets/csv/csvHelpers.js +14 -0
- package/dist/packlets/csv/csvHelpers.js.map +1 -0
- package/dist/packlets/csv/index.browser.js +1 -3
- package/dist/packlets/csv/index.browser.js.map +1 -0
- package/dist/packlets/csv/index.js.map +1 -0
- package/dist/packlets/experimental/extendedArray.js.map +1 -0
- package/dist/packlets/experimental/formatter.js.map +1 -0
- package/dist/packlets/experimental/index.js.map +1 -0
- package/dist/packlets/experimental/rangeOf.js.map +1 -0
- package/dist/packlets/hash/index.browser.js.map +1 -0
- package/dist/packlets/hash/index.js.map +1 -0
- package/dist/packlets/hash/index.node.js.map +1 -0
- package/dist/packlets/hash/md5Normalizer.browser.js.map +1 -0
- package/dist/packlets/hash/md5Normalizer.js.map +1 -0
- package/dist/packlets/mustache/index.js.map +1 -0
- package/dist/packlets/mustache/interfaces.js.map +1 -0
- package/dist/packlets/mustache/mustacheTemplate.js +42 -4
- package/dist/packlets/mustache/mustacheTemplate.js.map +1 -0
- package/dist/packlets/record-jar/index.browser.js +1 -3
- package/dist/packlets/record-jar/index.browser.js.map +1 -0
- package/dist/packlets/record-jar/index.js.map +1 -0
- package/dist/packlets/record-jar/recordJarFileHelpers.js +0 -18
- package/dist/packlets/record-jar/recordJarFileHelpers.js.map +1 -0
- package/dist/packlets/record-jar/recordJarHelpers.js +18 -0
- package/dist/packlets/record-jar/recordJarHelpers.js.map +1 -0
- package/dist/packlets/safer-fetch/addressClassification.js +438 -0
- package/dist/packlets/safer-fetch/addressClassification.js.map +1 -0
- package/dist/packlets/safer-fetch/addressPolicy.js +119 -0
- package/dist/packlets/safer-fetch/addressPolicy.js.map +1 -0
- package/dist/packlets/safer-fetch/contentType.js +120 -0
- package/dist/packlets/safer-fetch/contentType.js.map +1 -0
- package/dist/packlets/safer-fetch/deadline.js +254 -0
- package/dist/packlets/safer-fetch/deadline.js.map +1 -0
- package/dist/packlets/safer-fetch/defaults.js +131 -0
- package/dist/packlets/safer-fetch/defaults.js.map +1 -0
- package/dist/packlets/safer-fetch/failureReason.js +21 -0
- package/dist/packlets/safer-fetch/failureReason.js.map +1 -0
- package/dist/packlets/safer-fetch/guards.js +148 -0
- package/dist/packlets/safer-fetch/guards.js.map +1 -0
- package/dist/packlets/safer-fetch/index.browser.js +58 -0
- package/dist/packlets/safer-fetch/index.browser.js.map +1 -0
- package/dist/packlets/safer-fetch/index.js +52 -0
- package/dist/packlets/safer-fetch/index.js.map +1 -0
- package/dist/packlets/safer-fetch/model.js +21 -0
- package/dist/packlets/safer-fetch/model.js.map +1 -0
- package/dist/packlets/safer-fetch/nodeAddressGuard.js +191 -0
- package/dist/packlets/safer-fetch/nodeAddressGuard.js.map +1 -0
- package/dist/packlets/safer-fetch/redirect.js +93 -0
- package/dist/packlets/safer-fetch/redirect.js.map +1 -0
- package/dist/packlets/safer-fetch/retry.js +188 -0
- package/dist/packlets/safer-fetch/retry.js.map +1 -0
- package/dist/packlets/safer-fetch/saferFetch.js +755 -0
- package/dist/packlets/safer-fetch/saferFetch.js.map +1 -0
- package/dist/packlets/safer-fetch/transport.js +50 -0
- package/dist/packlets/safer-fetch/transport.js.map +1 -0
- package/dist/packlets/yaml/converters.js.map +1 -0
- package/dist/packlets/yaml/index.js +1 -0
- package/dist/packlets/yaml/index.js.map +1 -0
- package/dist/packlets/yaml/serializers.js +48 -0
- package/dist/packlets/yaml/serializers.js.map +1 -0
- package/dist/packlets/zip-file-tree/index.js.map +1 -0
- package/dist/packlets/zip-file-tree/zipFileTreeAccessors.js +99 -9
- package/dist/packlets/zip-file-tree/zipFileTreeAccessors.js.map +1 -0
- package/dist/packlets/zip-file-tree/zipFileTreeWriter.js +16 -1
- package/dist/packlets/zip-file-tree/zipFileTreeWriter.js.map +1 -0
- package/dist/ts-extras.d.ts +6648 -553
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/index.browser.d.ts +5 -2
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js +11 -3
- package/lib/index.browser.js.map +1 -0
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -0
- package/lib/packlets/ai-assist/chatRequestBuilders.d.ts +149 -0
- package/lib/packlets/ai-assist/chatRequestBuilders.d.ts.map +1 -0
- package/lib/packlets/ai-assist/chatRequestBuilders.js +293 -0
- package/lib/packlets/ai-assist/chatRequestBuilders.js.map +1 -0
- package/lib/packlets/ai-assist/completionClient.d.ts +74 -0
- package/lib/packlets/ai-assist/completionClient.d.ts.map +1 -0
- package/lib/packlets/ai-assist/{apiClient.js → completionClient.js} +164 -213
- package/lib/packlets/ai-assist/completionClient.js.map +1 -0
- package/lib/packlets/ai-assist/converters.d.ts +15 -1
- package/lib/packlets/ai-assist/converters.d.ts.map +1 -0
- package/lib/packlets/ai-assist/converters.js +47 -3
- package/lib/packlets/ai-assist/converters.js.map +1 -0
- package/lib/packlets/ai-assist/embeddingClient.d.ts +69 -0
- package/lib/packlets/ai-assist/embeddingClient.d.ts.map +1 -0
- package/lib/packlets/ai-assist/embeddingClient.js +349 -0
- package/lib/packlets/ai-assist/embeddingClient.js.map +1 -0
- package/lib/packlets/ai-assist/endpoint.d.ts +49 -0
- package/lib/packlets/ai-assist/endpoint.d.ts.map +1 -0
- package/lib/packlets/ai-assist/endpoint.js +113 -0
- package/lib/packlets/ai-assist/endpoint.js.map +1 -0
- package/lib/packlets/ai-assist/http.d.ts +34 -0
- package/lib/packlets/ai-assist/http.d.ts.map +1 -0
- package/lib/packlets/ai-assist/http.js +109 -0
- package/lib/packlets/ai-assist/http.js.map +1 -0
- package/lib/packlets/ai-assist/imageGenerationClient.d.ts +46 -0
- package/lib/packlets/ai-assist/imageGenerationClient.d.ts.map +1 -0
- package/lib/packlets/ai-assist/imageGenerationClient.js +458 -0
- package/lib/packlets/ai-assist/imageGenerationClient.js.map +1 -0
- package/lib/packlets/ai-assist/imageOptionsResolver.d.ts +66 -0
- package/lib/packlets/ai-assist/imageOptionsResolver.d.ts.map +1 -0
- package/lib/packlets/ai-assist/imageOptionsResolver.js +197 -0
- package/lib/packlets/ai-assist/imageOptionsResolver.js.map +1 -0
- package/lib/packlets/ai-assist/index.d.ts +12 -4
- package/lib/packlets/ai-assist/index.d.ts.map +1 -0
- package/lib/packlets/ai-assist/index.js +47 -4
- package/lib/packlets/ai-assist/index.js.map +1 -0
- package/lib/packlets/ai-assist/jsonCompletion.d.ts +93 -0
- package/lib/packlets/ai-assist/jsonCompletion.d.ts.map +1 -0
- package/lib/packlets/ai-assist/jsonCompletion.js +97 -0
- package/lib/packlets/ai-assist/jsonCompletion.js.map +1 -0
- package/lib/packlets/ai-assist/jsonResponse.d.ts +194 -0
- package/lib/packlets/ai-assist/jsonResponse.d.ts.map +1 -0
- package/lib/packlets/ai-assist/jsonResponse.js +429 -0
- package/lib/packlets/ai-assist/jsonResponse.js.map +1 -0
- package/lib/packlets/ai-assist/listModelsClient.d.ts +46 -0
- package/lib/packlets/ai-assist/listModelsClient.d.ts.map +1 -0
- package/lib/packlets/ai-assist/listModelsClient.js +298 -0
- package/lib/packlets/ai-assist/listModelsClient.js.map +1 -0
- package/lib/packlets/ai-assist/model.d.ts +1346 -12
- package/lib/packlets/ai-assist/model.d.ts.map +1 -0
- package/lib/packlets/ai-assist/model.js +309 -10
- package/lib/packlets/ai-assist/model.js.map +1 -0
- package/lib/packlets/ai-assist/registry.d.ts +76 -1
- package/lib/packlets/ai-assist/registry.d.ts.map +1 -0
- package/lib/packlets/ai-assist/registry.js +381 -13
- package/lib/packlets/ai-assist/registry.js.map +1 -0
- package/lib/packlets/ai-assist/sseParser.d.ts +45 -0
- package/lib/packlets/ai-assist/sseParser.d.ts.map +1 -0
- package/lib/packlets/ai-assist/sseParser.js +128 -0
- package/lib/packlets/ai-assist/sseParser.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts +72 -0
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.js +379 -0
- package/lib/packlets/ai-assist/streamingAdapters/anthropic.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts +269 -0
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js +694 -0
- package/lib/packlets/ai-assist/streamingAdapters/clientToolContinuationBuilder.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/common.d.ts +163 -0
- package/lib/packlets/ai-assist/streamingAdapters/common.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/common.js +193 -0
- package/lib/packlets/ai-assist/streamingAdapters/common.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts +43 -0
- package/lib/packlets/ai-assist/streamingAdapters/gemini.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/gemini.js +211 -0
- package/lib/packlets/ai-assist/streamingAdapters/gemini.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts +19 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js +178 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiChat.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts +33 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js +393 -0
- package/lib/packlets/ai-assist/streamingAdapters/openaiResponses.js.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts +34 -0
- package/lib/packlets/ai-assist/streamingAdapters/proxy.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingAdapters/proxy.js +181 -0
- package/lib/packlets/ai-assist/streamingAdapters/proxy.js.map +1 -0
- package/lib/packlets/ai-assist/streamingClient.d.ts +50 -0
- package/lib/packlets/ai-assist/streamingClient.d.ts.map +1 -0
- package/lib/packlets/ai-assist/streamingClient.js +146 -0
- package/lib/packlets/ai-assist/streamingClient.js.map +1 -0
- package/lib/packlets/ai-assist/thinkingOptionsResolver.d.ts +87 -0
- package/lib/packlets/ai-assist/thinkingOptionsResolver.d.ts.map +1 -0
- package/lib/packlets/ai-assist/thinkingOptionsResolver.js +294 -0
- package/lib/packlets/ai-assist/thinkingOptionsResolver.js.map +1 -0
- package/lib/packlets/ai-assist/toolFormats.d.ts +40 -9
- package/lib/packlets/ai-assist/toolFormats.d.ts.map +1 -0
- package/lib/packlets/ai-assist/toolFormats.js +107 -10
- package/lib/packlets/ai-assist/toolFormats.js.map +1 -0
- package/lib/packlets/conversion/converters.d.ts +8 -1
- package/lib/packlets/conversion/converters.d.ts.map +1 -0
- package/lib/packlets/conversion/converters.js +36 -2
- package/lib/packlets/conversion/converters.js.map +1 -0
- package/lib/packlets/conversion/index.d.ts.map +1 -0
- package/lib/packlets/conversion/index.js.map +1 -0
- package/lib/packlets/crypto-utils/constants.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/constants.js.map +1 -0
- package/lib/packlets/crypto-utils/converters.d.ts +20 -1
- package/lib/packlets/crypto-utils/converters.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/converters.js +43 -5
- package/lib/packlets/crypto-utils/converters.js.map +1 -0
- package/lib/packlets/crypto-utils/directEncryptionProvider.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/directEncryptionProvider.js.map +1 -0
- package/lib/packlets/crypto-utils/encryptedFile.d.ts +25 -0
- package/lib/packlets/crypto-utils/encryptedFile.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/encryptedFile.js +38 -0
- package/lib/packlets/crypto-utils/encryptedFile.js.map +1 -0
- package/lib/packlets/crypto-utils/hpkeProvider.d.ts +150 -0
- package/lib/packlets/crypto-utils/hpkeProvider.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/hpkeProvider.js +359 -0
- package/lib/packlets/crypto-utils/hpkeProvider.js.map +1 -0
- package/lib/packlets/crypto-utils/index.browser.d.ts +5 -1
- package/lib/packlets/crypto-utils/index.browser.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/index.browser.js +28 -3
- package/lib/packlets/crypto-utils/index.browser.js.map +1 -0
- package/lib/packlets/crypto-utils/index.d.ts +5 -1
- package/lib/packlets/crypto-utils/index.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/index.js +24 -1
- package/lib/packlets/crypto-utils/index.js.map +1 -0
- package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts +54 -0
- package/lib/packlets/crypto-utils/keyPairAlgorithmParams.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js +74 -0
- package/lib/packlets/crypto-utils/keyPairAlgorithmParams.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/converters.d.ts +68 -6
- package/lib/packlets/crypto-utils/keystore/converters.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/converters.js +109 -14
- package/lib/packlets/crypto-utils/keystore/converters.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.d.ts +148 -0
- package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js +324 -0
- package/lib/packlets/crypto-utils/keystore/encryptedFilePrivateKeyStorage.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/index.browser.d.ts +10 -0
- package/lib/packlets/crypto-utils/keystore/index.browser.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/index.browser.js +76 -0
- package/lib/packlets/crypto-utils/keystore/index.browser.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/index.d.ts +2 -0
- package/lib/packlets/crypto-utils/keystore/index.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/index.js +5 -1
- package/lib/packlets/crypto-utils/keystore/index.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/keyStore.d.ts +314 -13
- package/lib/packlets/crypto-utils/keystore/keyStore.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/keyStore.js +877 -124
- package/lib/packlets/crypto-utils/keystore/keyStore.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/model.d.ts +404 -21
- package/lib/packlets/crypto-utils/keystore/model.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/model.js +37 -5
- package/lib/packlets/crypto-utils/keystore/model.js.map +1 -0
- package/lib/packlets/crypto-utils/keystore/privateKeyStorage.d.ts +53 -0
- package/lib/packlets/crypto-utils/keystore/privateKeyStorage.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/keystore/privateKeyStorage.js +22 -0
- package/lib/packlets/crypto-utils/keystore/privateKeyStorage.js.map +1 -0
- package/lib/packlets/crypto-utils/model.d.ts +518 -10
- package/lib/packlets/crypto-utils/model.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/model.js +33 -1
- package/lib/packlets/crypto-utils/model.js.map +1 -0
- package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts +142 -2
- package/lib/packlets/crypto-utils/nodeCryptoProvider.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/nodeCryptoProvider.js +346 -0
- package/lib/packlets/crypto-utils/nodeCryptoProvider.js.map +1 -0
- package/lib/packlets/crypto-utils/seedDerivedKeyPair.d.ts +42 -0
- package/lib/packlets/crypto-utils/seedDerivedKeyPair.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/seedDerivedKeyPair.js +123 -0
- package/lib/packlets/crypto-utils/seedDerivedKeyPair.js.map +1 -0
- package/lib/packlets/crypto-utils/spkiHelpers.d.ts +151 -0
- package/lib/packlets/crypto-utils/spkiHelpers.d.ts.map +1 -0
- package/lib/packlets/crypto-utils/spkiHelpers.js +297 -0
- package/lib/packlets/crypto-utils/spkiHelpers.js.map +1 -0
- package/lib/packlets/csv/csvFileHelpers.d.ts +0 -10
- package/lib/packlets/csv/csvFileHelpers.d.ts.map +1 -0
- package/lib/packlets/csv/csvFileHelpers.js +0 -15
- package/lib/packlets/csv/csvFileHelpers.js.map +1 -0
- package/lib/packlets/csv/csvHelpers.d.ts +10 -0
- package/lib/packlets/csv/csvHelpers.d.ts.map +1 -0
- package/lib/packlets/csv/csvHelpers.js +15 -0
- package/lib/packlets/csv/csvHelpers.js.map +1 -0
- package/lib/packlets/csv/index.browser.d.ts +0 -1
- package/lib/packlets/csv/index.browser.d.ts.map +1 -0
- package/lib/packlets/csv/index.browser.js +1 -5
- package/lib/packlets/csv/index.browser.js.map +1 -0
- package/lib/packlets/csv/index.d.ts.map +1 -0
- package/lib/packlets/csv/index.js.map +1 -0
- package/lib/packlets/experimental/extendedArray.d.ts.map +1 -0
- package/lib/packlets/experimental/extendedArray.js.map +1 -0
- package/lib/packlets/experimental/formatter.d.ts.map +1 -0
- package/lib/packlets/experimental/formatter.js.map +1 -0
- package/lib/packlets/experimental/index.d.ts.map +1 -0
- package/lib/packlets/experimental/index.js.map +1 -0
- package/lib/packlets/experimental/rangeOf.d.ts.map +1 -0
- package/lib/packlets/experimental/rangeOf.js.map +1 -0
- package/lib/packlets/hash/index.browser.d.ts.map +1 -0
- package/lib/packlets/hash/index.browser.js.map +1 -0
- package/lib/packlets/hash/index.d.ts.map +1 -0
- package/lib/packlets/hash/index.js.map +1 -0
- package/lib/packlets/hash/index.node.d.ts.map +1 -0
- package/lib/packlets/hash/index.node.js.map +1 -0
- package/lib/packlets/hash/md5Normalizer.browser.d.ts.map +1 -0
- package/lib/packlets/hash/md5Normalizer.browser.js.map +1 -0
- package/lib/packlets/hash/md5Normalizer.d.ts.map +1 -0
- package/lib/packlets/hash/md5Normalizer.js.map +1 -0
- package/lib/packlets/mustache/index.d.ts +1 -1
- package/lib/packlets/mustache/index.d.ts.map +1 -0
- package/lib/packlets/mustache/index.js.map +1 -0
- package/lib/packlets/mustache/interfaces.d.ts +34 -0
- package/lib/packlets/mustache/interfaces.d.ts.map +1 -0
- package/lib/packlets/mustache/interfaces.js.map +1 -0
- package/lib/packlets/mustache/mustacheTemplate.d.ts +2 -0
- package/lib/packlets/mustache/mustacheTemplate.d.ts.map +1 -0
- package/lib/packlets/mustache/mustacheTemplate.js +42 -4
- package/lib/packlets/mustache/mustacheTemplate.js.map +1 -0
- package/lib/packlets/record-jar/index.browser.d.ts +0 -1
- package/lib/packlets/record-jar/index.browser.d.ts.map +1 -0
- package/lib/packlets/record-jar/index.browser.js +1 -5
- package/lib/packlets/record-jar/index.browser.js.map +1 -0
- package/lib/packlets/record-jar/index.d.ts.map +1 -0
- package/lib/packlets/record-jar/index.js.map +1 -0
- package/lib/packlets/record-jar/recordJarFileHelpers.d.ts +0 -11
- package/lib/packlets/record-jar/recordJarFileHelpers.d.ts.map +1 -0
- package/lib/packlets/record-jar/recordJarFileHelpers.js +0 -19
- package/lib/packlets/record-jar/recordJarFileHelpers.js.map +1 -0
- package/lib/packlets/record-jar/recordJarHelpers.d.ts +11 -0
- package/lib/packlets/record-jar/recordJarHelpers.d.ts.map +1 -0
- package/lib/packlets/record-jar/recordJarHelpers.js +19 -0
- package/lib/packlets/record-jar/recordJarHelpers.js.map +1 -0
- package/lib/packlets/safer-fetch/addressClassification.d.ts +144 -0
- package/lib/packlets/safer-fetch/addressClassification.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/addressClassification.js +441 -0
- package/lib/packlets/safer-fetch/addressClassification.js.map +1 -0
- package/lib/packlets/safer-fetch/addressPolicy.d.ts +113 -0
- package/lib/packlets/safer-fetch/addressPolicy.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/addressPolicy.js +123 -0
- package/lib/packlets/safer-fetch/addressPolicy.js.map +1 -0
- package/lib/packlets/safer-fetch/contentType.d.ts +51 -0
- package/lib/packlets/safer-fetch/contentType.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/contentType.js +127 -0
- package/lib/packlets/safer-fetch/contentType.js.map +1 -0
- package/lib/packlets/safer-fetch/deadline.d.ts +138 -0
- package/lib/packlets/safer-fetch/deadline.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/deadline.js +258 -0
- package/lib/packlets/safer-fetch/deadline.js.map +1 -0
- package/lib/packlets/safer-fetch/defaults.d.ts +108 -0
- package/lib/packlets/safer-fetch/defaults.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/defaults.js +134 -0
- package/lib/packlets/safer-fetch/defaults.js.map +1 -0
- package/lib/packlets/safer-fetch/failureReason.d.ts +148 -0
- package/lib/packlets/safer-fetch/failureReason.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/failureReason.js +22 -0
- package/lib/packlets/safer-fetch/failureReason.js.map +1 -0
- package/lib/packlets/safer-fetch/guards.d.ts +62 -0
- package/lib/packlets/safer-fetch/guards.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/guards.js +153 -0
- package/lib/packlets/safer-fetch/guards.js.map +1 -0
- package/lib/packlets/safer-fetch/index.browser.d.ts +33 -0
- package/lib/packlets/safer-fetch/index.browser.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/index.browser.js +82 -0
- package/lib/packlets/safer-fetch/index.browser.js.map +1 -0
- package/lib/packlets/safer-fetch/index.d.ts +27 -0
- package/lib/packlets/safer-fetch/index.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/index.js +78 -0
- package/lib/packlets/safer-fetch/index.js.map +1 -0
- package/lib/packlets/safer-fetch/model.d.ts +373 -0
- package/lib/packlets/safer-fetch/model.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/model.js +22 -0
- package/lib/packlets/safer-fetch/model.js.map +1 -0
- package/lib/packlets/safer-fetch/nodeAddressGuard.d.ts +129 -0
- package/lib/packlets/safer-fetch/nodeAddressGuard.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/nodeAddressGuard.js +196 -0
- package/lib/packlets/safer-fetch/nodeAddressGuard.js.map +1 -0
- package/lib/packlets/safer-fetch/redirect.d.ts +62 -0
- package/lib/packlets/safer-fetch/redirect.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/redirect.js +98 -0
- package/lib/packlets/safer-fetch/redirect.js.map +1 -0
- package/lib/packlets/safer-fetch/retry.d.ts +162 -0
- package/lib/packlets/safer-fetch/retry.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/retry.js +197 -0
- package/lib/packlets/safer-fetch/retry.js.map +1 -0
- package/lib/packlets/safer-fetch/saferFetch.d.ts +108 -0
- package/lib/packlets/safer-fetch/saferFetch.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/saferFetch.js +760 -0
- package/lib/packlets/safer-fetch/saferFetch.js.map +1 -0
- package/lib/packlets/safer-fetch/transport.d.ts +18 -0
- package/lib/packlets/safer-fetch/transport.d.ts.map +1 -0
- package/lib/packlets/safer-fetch/transport.js +53 -0
- package/lib/packlets/safer-fetch/transport.js.map +1 -0
- package/lib/packlets/yaml/converters.d.ts.map +1 -0
- package/lib/packlets/yaml/converters.js.map +1 -0
- package/lib/packlets/yaml/index.d.ts +1 -0
- package/lib/packlets/yaml/index.d.ts.map +1 -0
- package/lib/packlets/yaml/index.js +1 -0
- package/lib/packlets/yaml/index.js.map +1 -0
- package/lib/packlets/yaml/serializers.d.ts +45 -0
- package/lib/packlets/yaml/serializers.d.ts.map +1 -0
- package/lib/packlets/yaml/serializers.js +84 -0
- package/lib/packlets/yaml/serializers.js.map +1 -0
- package/lib/packlets/zip-file-tree/index.d.ts.map +1 -0
- package/lib/packlets/zip-file-tree/index.js.map +1 -0
- package/lib/packlets/zip-file-tree/zipFileTreeAccessors.d.ts +84 -8
- package/lib/packlets/zip-file-tree/zipFileTreeAccessors.d.ts.map +1 -0
- package/lib/packlets/zip-file-tree/zipFileTreeAccessors.js +99 -9
- package/lib/packlets/zip-file-tree/zipFileTreeAccessors.js.map +1 -0
- package/lib/packlets/zip-file-tree/zipFileTreeWriter.d.ts +26 -1
- package/lib/packlets/zip-file-tree/zipFileTreeWriter.d.ts.map +1 -0
- package/lib/packlets/zip-file-tree/zipFileTreeWriter.js +17 -1
- package/lib/packlets/zip-file-tree/zipFileTreeWriter.js.map +1 -0
- package/package.json +30 -15
- package/lib/packlets/ai-assist/apiClient.d.ts +0 -60
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type Logging, Result } from '@fgv/ts-utils';
|
|
2
|
+
import { type AiServerToolConfig, type IAiCompletionResponse, type IAiProviderDescriptor, type IChatRequest, type IThinkingConfig, type ModelSpec } from './model';
|
|
3
|
+
/**
|
|
4
|
+
* Parameters for a provider completion request. Carries the unified
|
|
5
|
+
* {@link AiAssist.IChatRequest} shape (`system?` + ordered `messages`, last =
|
|
6
|
+
* current user turn); history is linearized before the current turn.
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export interface IProviderCompletionParams extends IChatRequest {
|
|
10
|
+
/** The provider descriptor */
|
|
11
|
+
readonly descriptor: IAiProviderDescriptor;
|
|
12
|
+
/** API key for authentication */
|
|
13
|
+
readonly apiKey: string;
|
|
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
|
+
*/
|
|
18
|
+
readonly temperature?: number;
|
|
19
|
+
/** Optional model override — string or context-aware map (uses descriptor.defaultModel otherwise) */
|
|
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';
|
|
28
|
+
/** Optional logger for request/response observability. */
|
|
29
|
+
readonly logger?: Logging.ILogger;
|
|
30
|
+
/** Server-side tools to include in the request. Overrides settings-level tool config when provided. */
|
|
31
|
+
readonly tools?: ReadonlyArray<AiServerToolConfig>;
|
|
32
|
+
/** Optional abort signal for cancelling the in-flight request. */
|
|
33
|
+
readonly signal?: AbortSignal;
|
|
34
|
+
/**
|
|
35
|
+
* Optional override of the descriptor's default base URL (scheme + host +
|
|
36
|
+
* optional port + path prefix). The per-route suffix (e.g. `/chat/completions`)
|
|
37
|
+
* is appended unchanged. Must be a well-formed `http`/`https` URL. Auth shape
|
|
38
|
+
* is unchanged: `needsSecret` providers still require an API key.
|
|
39
|
+
*/
|
|
40
|
+
readonly endpoint?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Optional thinking/reasoning config. Anthropic, OpenAI, and xAI reject `temperature` when
|
|
43
|
+
* the effective merged effort is non-`'none'`; Gemini always accepts both.
|
|
44
|
+
*/
|
|
45
|
+
readonly thinking?: IThinkingConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Optional cap on generated output tokens, mapped to each provider's native field:
|
|
48
|
+
* Anthropic `max_tokens`, OpenAI Chat Completions `max_completion_tokens`, OpenAI/xAI
|
|
49
|
+
* Responses `max_output_tokens`, Gemini `generationConfig.maxOutputTokens`, and the
|
|
50
|
+
* xAI/Groq/Mistral/Ollama/`openai-compat` chat-completions path `max_tokens`. When unset,
|
|
51
|
+
* every provider except Anthropic omits the field and applies its own default; Anthropic's
|
|
52
|
+
* Messages API requires the field, so it falls back to `DEFAULT_ANTHROPIC_MAX_TOKENS`.
|
|
53
|
+
*/
|
|
54
|
+
readonly maxTokens?: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Calls the appropriate chat completion API for a given provider. Routes by
|
|
58
|
+
* `apiFormat`: `'openai'` (xAI/OpenAI/Groq/Mistral — switches to Responses API
|
|
59
|
+
* when tools are set), `'anthropic'`, or `'gemini'`.
|
|
60
|
+
* @public
|
|
61
|
+
*/
|
|
62
|
+
export declare function callProviderCompletion(params: IProviderCompletionParams): Promise<Result<IAiCompletionResponse>>;
|
|
63
|
+
/**
|
|
64
|
+
* Calls the AI completion endpoint on a proxy server instead of calling the
|
|
65
|
+
* provider API directly from the browser. The proxy handles provider dispatch,
|
|
66
|
+
* CORS, and API key forwarding. The request body serializes the unified
|
|
67
|
+
* {@link AiAssist.IChatRequest} shape (`system?` + `messages`). Enforces the same
|
|
68
|
+
* non-empty / trailing-user-turn and image-input invariants as the direct path.
|
|
69
|
+
* @param proxyUrl - Base URL of the proxy server
|
|
70
|
+
* @param params - Same parameters as {@link callProviderCompletion}
|
|
71
|
+
* @public
|
|
72
|
+
*/
|
|
73
|
+
export declare function callProxiedCompletion(proxyUrl: string, params: IProviderCompletionParams): Promise<Result<IAiCompletionResponse>>;
|
|
74
|
+
//# sourceMappingURL=completionClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completionClient.d.ts","sourceRoot":"","sources":["../../../src/packlets/ai-assist/completionClient.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAQ,KAAK,OAAO,EAAE,MAAM,EAAuC,MAAM,eAAe,CAAC;AAEhG,OAAO,EAEL,KAAK,kBAAkB,EAEvB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAE1B,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,SAAS,EAMf,MAAM,SAAS,CAAC;AA8BjB;;;;;GAKG;AACH,MAAM,WAAW,yBAA0B,SAAQ,YAAY;IAC7D,8BAA8B;IAC9B,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,qGAAqG;IACrG,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;IAClC,uGAAuG;IACvG,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACnD,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA0aD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAqIxC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAwExC"}
|
|
@@ -21,86 +21,13 @@
|
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.callProviderCompletion = callProviderCompletion;
|
|
23
23
|
exports.callProxiedCompletion = callProxiedCompletion;
|
|
24
|
-
/**
|
|
25
|
-
* Chat completion client for AI assist with support for multiple provider APIs.
|
|
26
|
-
*
|
|
27
|
-
* Supports OpenAI-compatible providers (xAI, OpenAI, Groq, Mistral) directly,
|
|
28
|
-
* plus adapters for Anthropic and Google Gemini.
|
|
29
|
-
*
|
|
30
|
-
* When server-side tools (e.g. web_search) are configured, providers that support
|
|
31
|
-
* them will include tool configuration in the request and handle tool-augmented
|
|
32
|
-
* responses.
|
|
33
|
-
*
|
|
34
|
-
* @packageDocumentation
|
|
35
|
-
*/
|
|
36
|
-
const ts_json_base_1 = require("@fgv/ts-json-base");
|
|
37
24
|
const ts_utils_1 = require("@fgv/ts-utils");
|
|
38
25
|
const model_1 = require("./model");
|
|
26
|
+
const thinkingOptionsResolver_1 = require("./thinkingOptionsResolver");
|
|
27
|
+
const chatRequestBuilders_1 = require("./chatRequestBuilders");
|
|
28
|
+
const endpoint_1 = require("./endpoint");
|
|
29
|
+
const http_1 = require("./http");
|
|
39
30
|
const toolFormats_1 = require("./toolFormats");
|
|
40
|
-
// ============================================================================
|
|
41
|
-
// Shared helpers
|
|
42
|
-
// ============================================================================
|
|
43
|
-
/**
|
|
44
|
-
* Builds the messages array from prompt + optional correction messages.
|
|
45
|
-
* @internal
|
|
46
|
-
*/
|
|
47
|
-
function buildMessages(prompt, additionalMessages) {
|
|
48
|
-
const messages = [
|
|
49
|
-
{ role: 'system', content: prompt.system },
|
|
50
|
-
{ role: 'user', content: prompt.user }
|
|
51
|
-
];
|
|
52
|
-
if (additionalMessages) {
|
|
53
|
-
for (const msg of additionalMessages) {
|
|
54
|
-
messages.push({ role: msg.role, content: msg.content });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return messages;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Makes an HTTP request and returns the parsed JSON, or a failure.
|
|
61
|
-
* @internal
|
|
62
|
-
*/
|
|
63
|
-
async function fetchJson(url, headers, body, logger) {
|
|
64
|
-
/* c8 ignore next 1 - optional logger */
|
|
65
|
-
logger === null || logger === void 0 ? void 0 : logger.detail(`AI API request: POST ${url}`);
|
|
66
|
-
let response;
|
|
67
|
-
try {
|
|
68
|
-
response = await fetch(url, {
|
|
69
|
-
method: 'POST',
|
|
70
|
-
headers: Object.assign({ 'Content-Type': 'application/json' }, headers),
|
|
71
|
-
body: JSON.stringify(body)
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
catch (err) {
|
|
75
|
-
const detail = err instanceof Error ? err.message : String(err);
|
|
76
|
-
/* c8 ignore next 1 - optional logger */
|
|
77
|
-
logger === null || logger === void 0 ? void 0 : logger.error(`AI API request failed: ${detail}`);
|
|
78
|
-
return (0, ts_utils_1.fail)(`AI API request failed: ${detail}`);
|
|
79
|
-
}
|
|
80
|
-
if (!response.ok) {
|
|
81
|
-
const errorText = await response.text().catch(() => 'unknown error');
|
|
82
|
-
/* c8 ignore next 1 - optional logger */
|
|
83
|
-
logger === null || logger === void 0 ? void 0 : logger.error(`AI API returned ${response.status}: ${errorText}`);
|
|
84
|
-
return (0, ts_utils_1.fail)(`AI API returned ${response.status}: ${errorText}`);
|
|
85
|
-
}
|
|
86
|
-
/* c8 ignore next 1 - optional logger */
|
|
87
|
-
logger === null || logger === void 0 ? void 0 : logger.detail(`AI API response: ${response.status}`);
|
|
88
|
-
let json;
|
|
89
|
-
try {
|
|
90
|
-
json = await response.json();
|
|
91
|
-
}
|
|
92
|
-
catch (_a) {
|
|
93
|
-
/* c8 ignore next 1 - optional logger */
|
|
94
|
-
logger === null || logger === void 0 ? void 0 : logger.error('AI API returned invalid JSON response');
|
|
95
|
-
return (0, ts_utils_1.fail)('AI API returned invalid JSON response');
|
|
96
|
-
}
|
|
97
|
-
if (!(0, ts_json_base_1.isJsonObject)(json)) {
|
|
98
|
-
/* c8 ignore next 1 - optional logger */
|
|
99
|
-
logger === null || logger === void 0 ? void 0 : logger.error('AI API returned non-object JSON response');
|
|
100
|
-
return (0, ts_utils_1.fail)('AI API returned non-object JSON response');
|
|
101
|
-
}
|
|
102
|
-
return (0, ts_utils_1.succeed)(json);
|
|
103
|
-
}
|
|
104
31
|
const openAiMessage = ts_utils_1.Validators.object({
|
|
105
32
|
content: ts_utils_1.Validators.string
|
|
106
33
|
});
|
|
@@ -125,13 +52,6 @@ const responsesApiResponse = ts_utils_1.Validators.object({
|
|
|
125
52
|
output: ts_utils_1.Validators.arrayOf(responsesApiOutputItem).withConstraint((arr) => arr.length > 0),
|
|
126
53
|
status: ts_utils_1.Validators.string
|
|
127
54
|
});
|
|
128
|
-
const anthropicContentBlock = ts_utils_1.Validators.object({
|
|
129
|
-
text: ts_utils_1.Validators.string
|
|
130
|
-
});
|
|
131
|
-
const anthropicResponse = ts_utils_1.Validators.object({
|
|
132
|
-
content: ts_utils_1.Validators.arrayOf(anthropicContentBlock).withConstraint((arr) => arr.length > 0),
|
|
133
|
-
stop_reason: ts_utils_1.Validators.string
|
|
134
|
-
});
|
|
135
55
|
const geminiPart = ts_utils_1.Validators.object({
|
|
136
56
|
text: ts_utils_1.Validators.string
|
|
137
57
|
});
|
|
@@ -153,16 +73,22 @@ const geminiResponse = ts_utils_1.Validators.object({
|
|
|
153
73
|
* Works for xAI Grok, OpenAI, Groq, and Mistral.
|
|
154
74
|
* @internal
|
|
155
75
|
*/
|
|
156
|
-
async function callOpenAiCompletion(config, prompt,
|
|
76
|
+
async function callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking, maxTokens, useMaxCompletionTokensField = false) {
|
|
77
|
+
var _a;
|
|
157
78
|
const url = `${config.baseUrl}/chat/completions`;
|
|
158
|
-
const messages = buildMessages(prompt,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
79
|
+
const messages = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiChatUserContent)(prompt), {
|
|
80
|
+
head
|
|
81
|
+
});
|
|
82
|
+
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;
|
|
83
|
+
const maxTokensField = useMaxCompletionTokensField ? 'max_completion_tokens' : 'max_tokens';
|
|
84
|
+
const body = Object.assign(Object.assign(Object.assign({ model: config.model, messages }, (temperature !== undefined ? { temperature } : {})), (effort !== undefined && config.model !== 'grok-4' ? { reasoning_effort: effort } : {})), (maxTokens !== undefined ? { [maxTokensField]: maxTokens } : {}));
|
|
85
|
+
if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
|
|
86
|
+
Object.assign(body, resolvedThinking.otherParams);
|
|
87
|
+
}
|
|
88
|
+
const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
|
|
163
89
|
/* c8 ignore next 1 - optional logger */
|
|
164
90
|
logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI completion: model=${config.model}`);
|
|
165
|
-
const jsonResult = await fetchJson(url, headers, body, logger);
|
|
91
|
+
const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
|
|
166
92
|
if (jsonResult.isFailure()) {
|
|
167
93
|
return (0, ts_utils_1.fail)(jsonResult.message);
|
|
168
94
|
}
|
|
@@ -201,21 +127,25 @@ function extractResponsesApiText(output) {
|
|
|
201
127
|
* Used when tools are configured for an openai-format provider.
|
|
202
128
|
* @internal
|
|
203
129
|
*/
|
|
204
|
-
async function callOpenAiResponsesCompletion(config, prompt, tools,
|
|
130
|
+
async function callOpenAiResponsesCompletion(config, prompt, tools = [], head, temperature, logger, signal, resolvedThinking, maxTokens) {
|
|
131
|
+
var _a;
|
|
205
132
|
const url = `${config.baseUrl}/responses`;
|
|
206
|
-
const input = buildMessages(prompt,
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
133
|
+
const input = (0, chatRequestBuilders_1.buildMessages)(prompt.system, (0, chatRequestBuilders_1.buildOpenAiResponsesUserContent)(prompt), {
|
|
134
|
+
head
|
|
135
|
+
});
|
|
136
|
+
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;
|
|
137
|
+
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 } } : {}));
|
|
138
|
+
// Shared by OpenAI and xAI — both route through the Responses API with the same field name.
|
|
139
|
+
if (maxTokens !== undefined) {
|
|
140
|
+
body.max_output_tokens = maxTokens;
|
|
141
|
+
}
|
|
142
|
+
if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
|
|
143
|
+
Object.assign(body, resolvedThinking.otherParams);
|
|
144
|
+
}
|
|
145
|
+
const headers = (0, endpoint_1.bearerAuthHeader)(config.apiKey);
|
|
216
146
|
/* c8 ignore next 1 - optional logger */
|
|
217
147
|
logger === null || logger === void 0 ? void 0 : logger.info(`OpenAI Responses API: model=${config.model}, tools=${tools.map((t) => t.type).join(',')}`);
|
|
218
|
-
const jsonResult = await fetchJson(url, headers, body, logger);
|
|
148
|
+
const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
|
|
219
149
|
if (jsonResult.isFailure()) {
|
|
220
150
|
return (0, ts_utils_1.fail)(jsonResult.message);
|
|
221
151
|
}
|
|
@@ -254,31 +184,29 @@ function extractAnthropicText(content) {
|
|
|
254
184
|
}
|
|
255
185
|
return (0, ts_utils_1.succeed)(textParts.join(''));
|
|
256
186
|
}
|
|
257
|
-
/**
|
|
258
|
-
|
|
259
|
-
* When tools are configured, includes them in the request and handles
|
|
260
|
-
* mixed content block responses.
|
|
261
|
-
* @internal
|
|
262
|
-
*/
|
|
263
|
-
async function callAnthropicCompletion(config, prompt, additionalMessages, temperature = 0.7, logger, tools) {
|
|
187
|
+
/** Calls the Anthropic Messages API with optional tool support. @internal */
|
|
188
|
+
async function callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, useAdaptiveThinking = false, maxTokens) {
|
|
264
189
|
const url = `${config.baseUrl}/messages`;
|
|
265
|
-
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
for
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
190
|
+
const messages = (0, chatRequestBuilders_1.buildAnthropicMessages)(prompt, { head });
|
|
191
|
+
const body = Object.assign({ model: config.model, system: prompt.system, messages,
|
|
192
|
+
// Anthropic's Messages API requires max_tokens on every request — see
|
|
193
|
+
// AiAssist.DEFAULT_ANTHROPIC_MAX_TOKENS for why only this provider defaults it.
|
|
194
|
+
max_tokens: maxTokens !== null && maxTokens !== void 0 ? maxTokens : model_1.DEFAULT_ANTHROPIC_MAX_TOKENS }, (temperature !== undefined ? { temperature } : {}));
|
|
195
|
+
const effort = resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.anthropicEffort;
|
|
196
|
+
if (effort !== undefined) {
|
|
197
|
+
if (useAdaptiveThinking) {
|
|
198
|
+
// Claude 5 family: adaptive thinking — no budget_tokens; effort moves to the
|
|
199
|
+
// top-level output_config block. See AiAssist.isAdaptiveThinkingModel.
|
|
200
|
+
body.thinking = { type: 'adaptive' };
|
|
201
|
+
body.output_config = { effort };
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
body.thinking = { type: 'enabled', budget_tokens: (0, thinkingOptionsResolver_1.anthropicEffortToBudgetTokens)(effort) };
|
|
273
205
|
}
|
|
274
206
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
messages,
|
|
279
|
-
max_tokens: 4096,
|
|
280
|
-
temperature
|
|
281
|
-
};
|
|
207
|
+
if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
|
|
208
|
+
Object.assign(body, resolvedThinking.otherParams);
|
|
209
|
+
}
|
|
282
210
|
if (tools && tools.length > 0) {
|
|
283
211
|
body.tools = (0, toolFormats_1.toAnthropicTools)(tools);
|
|
284
212
|
/* c8 ignore next 3 - optional logger diagnostic output */
|
|
@@ -288,37 +216,23 @@ async function callAnthropicCompletion(config, prompt, additionalMessages, tempe
|
|
|
288
216
|
/* c8 ignore next 1 - optional logger */
|
|
289
217
|
logger === null || logger === void 0 ? void 0 : logger.info(`Anthropic completion: model=${config.model}`);
|
|
290
218
|
}
|
|
291
|
-
const headers =
|
|
292
|
-
|
|
293
|
-
'anthropic-version': '2023-06-01',
|
|
294
|
-
'anthropic-dangerous-direct-browser-access': 'true'
|
|
295
|
-
};
|
|
296
|
-
const jsonResult = await fetchJson(url, headers, body, logger);
|
|
219
|
+
const headers = (0, endpoint_1.anthropicAuthHeaders)(config.apiKey);
|
|
220
|
+
const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
|
|
297
221
|
if (jsonResult.isFailure()) {
|
|
298
222
|
return (0, ts_utils_1.fail)(jsonResult.message);
|
|
299
223
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
const stopReason = jsonResult.value.stop_reason;
|
|
305
|
-
if (!Array.isArray(rawContent)) {
|
|
306
|
-
return (0, ts_utils_1.fail)('Anthropic API response: content is not an array');
|
|
307
|
-
}
|
|
308
|
-
return extractAnthropicText(rawContent).onSuccess((text) => (0, ts_utils_1.succeed)({
|
|
309
|
-
content: text,
|
|
310
|
-
truncated: stopReason === 'max_tokens'
|
|
311
|
-
}));
|
|
224
|
+
const rawContent = jsonResult.value.content;
|
|
225
|
+
const stopReason = jsonResult.value.stop_reason;
|
|
226
|
+
if (!Array.isArray(rawContent)) {
|
|
227
|
+
return (0, ts_utils_1.fail)('Anthropic API response: content is not an array');
|
|
312
228
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
});
|
|
321
|
-
});
|
|
229
|
+
if (typeof stopReason !== 'string') {
|
|
230
|
+
return (0, ts_utils_1.fail)('Anthropic API response: stop_reason is missing or not a string');
|
|
231
|
+
}
|
|
232
|
+
return extractAnthropicText(rawContent).onSuccess((text) => (0, ts_utils_1.succeed)({
|
|
233
|
+
content: text,
|
|
234
|
+
truncated: stopReason === 'max_tokens'
|
|
235
|
+
}));
|
|
322
236
|
}
|
|
323
237
|
// ============================================================================
|
|
324
238
|
// Google Gemini adapter
|
|
@@ -328,26 +242,27 @@ async function callAnthropicCompletion(config, prompt, additionalMessages, tempe
|
|
|
328
242
|
* When tools are configured, includes Google Search grounding.
|
|
329
243
|
* @internal
|
|
330
244
|
*/
|
|
331
|
-
async function callGeminiCompletion(config, prompt,
|
|
245
|
+
async function callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, maxTokens) {
|
|
332
246
|
const url = `${config.baseUrl}/models/${config.model}:generateContent`;
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
247
|
+
const contents = (0, chatRequestBuilders_1.buildGeminiContents)(prompt, { head });
|
|
248
|
+
// Temperature is sent only when explicitly provided; otherwise Gemini's default applies.
|
|
249
|
+
const generationConfig = {};
|
|
250
|
+
if (temperature !== undefined) {
|
|
251
|
+
generationConfig.temperature = temperature;
|
|
252
|
+
}
|
|
253
|
+
if (maxTokens !== undefined) {
|
|
254
|
+
generationConfig.maxOutputTokens = maxTokens;
|
|
255
|
+
}
|
|
256
|
+
if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.geminiThinkingBudget) !== undefined) {
|
|
257
|
+
generationConfig.thinkingConfig = { thinkingBudget: resolvedThinking.geminiThinkingBudget };
|
|
258
|
+
}
|
|
259
|
+
if ((resolvedThinking === null || resolvedThinking === void 0 ? void 0 : resolvedThinking.otherParams) !== undefined) {
|
|
260
|
+
Object.assign(generationConfig, resolvedThinking.otherParams);
|
|
346
261
|
}
|
|
347
262
|
const body = {
|
|
348
263
|
systemInstruction: { parts: [{ text: prompt.system }] },
|
|
349
264
|
contents,
|
|
350
|
-
generationConfig
|
|
265
|
+
generationConfig
|
|
351
266
|
};
|
|
352
267
|
if (tools && tools.length > 0) {
|
|
353
268
|
body.tools = (0, toolFormats_1.toGeminiTools)(tools);
|
|
@@ -358,10 +273,8 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
|
|
|
358
273
|
/* c8 ignore next 1 - optional logger */
|
|
359
274
|
logger === null || logger === void 0 ? void 0 : logger.info(`Gemini completion: model=${config.model}`);
|
|
360
275
|
}
|
|
361
|
-
const headers =
|
|
362
|
-
|
|
363
|
-
};
|
|
364
|
-
const jsonResult = await fetchJson(url, headers, body, logger);
|
|
276
|
+
const headers = (0, endpoint_1.geminiAuthHeader)(config.apiKey);
|
|
277
|
+
const jsonResult = await (0, http_1.fetchJson)(url, headers, body, logger, signal);
|
|
365
278
|
if (jsonResult.isFailure()) {
|
|
366
279
|
return (0, ts_utils_1.fail)(jsonResult.message);
|
|
367
280
|
}
|
|
@@ -380,33 +293,54 @@ async function callGeminiCompletion(config, prompt, additionalMessages, temperat
|
|
|
380
293
|
// Provider dispatcher
|
|
381
294
|
// ============================================================================
|
|
382
295
|
/**
|
|
383
|
-
* Calls the appropriate chat completion API for a given provider.
|
|
384
|
-
*
|
|
385
|
-
*
|
|
386
|
-
* - `'openai'` for xAI, OpenAI, Groq, Mistral
|
|
387
|
-
* - `'anthropic'` for Anthropic Claude
|
|
388
|
-
* - `'gemini'` for Google Gemini
|
|
389
|
-
*
|
|
390
|
-
* When tools are provided and the provider supports them:
|
|
391
|
-
* - OpenAI-format providers switch to the Responses API
|
|
392
|
-
* - Anthropic includes tools in the Messages API request
|
|
393
|
-
* - Gemini includes Google Search grounding
|
|
394
|
-
*
|
|
395
|
-
* @param params - Request parameters including descriptor, API key, prompt, and optional tools
|
|
396
|
-
* @returns The completion response with content and truncation status, or a failure
|
|
296
|
+
* Calls the appropriate chat completion API for a given provider. Routes by
|
|
297
|
+
* `apiFormat`: `'openai'` (xAI/OpenAI/Groq/Mistral — switches to Responses API
|
|
298
|
+
* when tools are set), `'anthropic'`, or `'gemini'`.
|
|
397
299
|
* @public
|
|
398
300
|
*/
|
|
399
301
|
async function callProviderCompletion(params) {
|
|
400
|
-
const { descriptor, apiKey,
|
|
401
|
-
|
|
402
|
-
|
|
302
|
+
const { descriptor, apiKey, system, messages, temperature, modelOverride, tier, logger, tools, signal, endpoint, thinking, maxTokens } = params;
|
|
303
|
+
const splitResult = (0, chatRequestBuilders_1.splitChatRequest)(system, messages);
|
|
304
|
+
if (splitResult.isFailure()) {
|
|
305
|
+
return (0, ts_utils_1.fail)(splitResult.message);
|
|
306
|
+
}
|
|
307
|
+
const { prompt, head } = splitResult.value;
|
|
308
|
+
const baseUrlResult = (0, endpoint_1.resolveEffectiveBaseUrl)(descriptor, endpoint);
|
|
309
|
+
if (baseUrlResult.isFailure()) {
|
|
310
|
+
return (0, ts_utils_1.fail)(baseUrlResult.message);
|
|
311
|
+
}
|
|
312
|
+
if (prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
|
|
313
|
+
return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not accept image input`);
|
|
403
314
|
}
|
|
404
315
|
const hasTools = tools !== undefined && tools.length > 0;
|
|
405
|
-
const
|
|
316
|
+
const discriminator = (0, thinkingOptionsResolver_1.providerDiscriminatorForId)(descriptor.id);
|
|
317
|
+
// The quality tier is the only completion-model selector; thinking and tools
|
|
318
|
+
// are orthogonal request params/capabilities and never pick a model.
|
|
319
|
+
const modelContext = tier;
|
|
320
|
+
const modelResult = (0, model_1.resolveProviderModel)(descriptor, modelOverride, modelContext);
|
|
321
|
+
if (modelResult.isFailure()) {
|
|
322
|
+
return (0, ts_utils_1.fail)(modelResult.message);
|
|
323
|
+
}
|
|
324
|
+
const model = modelResult.value;
|
|
325
|
+
let resolvedThinking;
|
|
326
|
+
if (thinking !== undefined) {
|
|
327
|
+
if (discriminator !== undefined) {
|
|
328
|
+
const mergeResult = (0, thinkingOptionsResolver_1.mergeThinkingConfig)(thinking, model, discriminator);
|
|
329
|
+
/* c8 ignore next 3 - mergeThinkingConfig always succeeds; defensive guard */
|
|
330
|
+
if (mergeResult.isFailure()) {
|
|
331
|
+
return (0, ts_utils_1.fail)(mergeResult.message);
|
|
332
|
+
}
|
|
333
|
+
resolvedThinking = mergeResult.value;
|
|
334
|
+
const conflictResult = (0, thinkingOptionsResolver_1.checkTemperatureConflict)(resolvedThinking, discriminator, temperature);
|
|
335
|
+
if (conflictResult.isFailure()) {
|
|
336
|
+
return (0, ts_utils_1.fail)(conflictResult.message);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
406
340
|
const config = {
|
|
407
|
-
baseUrl:
|
|
341
|
+
baseUrl: baseUrlResult.value,
|
|
408
342
|
apiKey,
|
|
409
|
-
model
|
|
343
|
+
model
|
|
410
344
|
};
|
|
411
345
|
/* c8 ignore next 8 - optional logger diagnostic output */
|
|
412
346
|
if (logger) {
|
|
@@ -417,14 +351,16 @@ async function callProviderCompletion(params) {
|
|
|
417
351
|
}
|
|
418
352
|
switch (descriptor.apiFormat) {
|
|
419
353
|
case 'openai':
|
|
420
|
-
|
|
421
|
-
|
|
354
|
+
// Responses-API-only models (e.g. gpt-5.5-pro) 400 on /chat/completions, so they route
|
|
355
|
+
// to the Responses path even with no tools requested — same path the tools case uses.
|
|
356
|
+
if (hasTools || (0, model_1.isResponsesOnlyModel)(descriptor, config.model)) {
|
|
357
|
+
return callOpenAiResponsesCompletion(config, prompt, tools, head, temperature, logger, signal, resolvedThinking, maxTokens);
|
|
422
358
|
}
|
|
423
|
-
return callOpenAiCompletion(config, prompt,
|
|
359
|
+
return callOpenAiCompletion(config, prompt, head, temperature, logger, signal, resolvedThinking, maxTokens, (0, model_1.usesMaxCompletionTokensField)(descriptor));
|
|
424
360
|
case 'anthropic':
|
|
425
|
-
return callAnthropicCompletion(config, prompt,
|
|
361
|
+
return callAnthropicCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, (0, model_1.isAdaptiveThinkingModel)(descriptor, config.model), maxTokens);
|
|
426
362
|
case 'gemini':
|
|
427
|
-
return callGeminiCompletion(config, prompt,
|
|
363
|
+
return callGeminiCompletion(config, prompt, head, temperature, logger, tools, signal, resolvedThinking, maxTokens);
|
|
428
364
|
/* c8 ignore next 4 - defensive coding: exhaustive switch guaranteed by TypeScript */
|
|
429
365
|
default: {
|
|
430
366
|
const _exhaustive = descriptor.apiFormat;
|
|
@@ -436,28 +372,36 @@ async function callProviderCompletion(params) {
|
|
|
436
372
|
// Proxied completion (routes through a backend server)
|
|
437
373
|
// ============================================================================
|
|
438
374
|
/**
|
|
439
|
-
* Calls the AI completion endpoint on a proxy server instead of calling
|
|
440
|
-
*
|
|
441
|
-
*
|
|
442
|
-
*
|
|
443
|
-
*
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
* @param proxyUrl - Base URL of the proxy server (e.g. `http://localhost:3001`)
|
|
375
|
+
* Calls the AI completion endpoint on a proxy server instead of calling the
|
|
376
|
+
* provider API directly from the browser. The proxy handles provider dispatch,
|
|
377
|
+
* CORS, and API key forwarding. The request body serializes the unified
|
|
378
|
+
* {@link AiAssist.IChatRequest} shape (`system?` + `messages`). Enforces the same
|
|
379
|
+
* non-empty / trailing-user-turn and image-input invariants as the direct path.
|
|
380
|
+
* @param proxyUrl - Base URL of the proxy server
|
|
447
381
|
* @param params - Same parameters as {@link callProviderCompletion}
|
|
448
|
-
* @returns The completion response, or a failure
|
|
449
382
|
* @public
|
|
450
383
|
*/
|
|
451
384
|
async function callProxiedCompletion(proxyUrl, params) {
|
|
452
|
-
const { descriptor, apiKey,
|
|
385
|
+
const { descriptor, apiKey, system, messages, temperature, modelOverride, logger, tools, signal, thinking, maxTokens } = params;
|
|
386
|
+
const splitResult = (0, chatRequestBuilders_1.splitChatRequest)(system, messages);
|
|
387
|
+
if (splitResult.isFailure()) {
|
|
388
|
+
return (0, ts_utils_1.fail)(splitResult.message);
|
|
389
|
+
}
|
|
390
|
+
if (splitResult.value.prompt.attachments.length > 0 && !descriptor.acceptsImageInput) {
|
|
391
|
+
return (0, ts_utils_1.fail)(`provider "${descriptor.id}" does not accept image input`);
|
|
392
|
+
}
|
|
453
393
|
const body = {
|
|
454
394
|
providerId: descriptor.id,
|
|
455
395
|
apiKey,
|
|
456
|
-
|
|
457
|
-
temperature: temperature !== null && temperature !== void 0 ? temperature : 0.7
|
|
396
|
+
messages: (0, chatRequestBuilders_1.normalizeOutboundMessages)(splitResult.value)
|
|
458
397
|
};
|
|
459
|
-
|
|
460
|
-
|
|
398
|
+
// Temperature is forwarded only when explicitly provided, matching the direct path — the proxy
|
|
399
|
+
// omits it from the upstream request so the provider default applies.
|
|
400
|
+
if (temperature !== undefined) {
|
|
401
|
+
body.temperature = temperature;
|
|
402
|
+
}
|
|
403
|
+
if (system !== undefined) {
|
|
404
|
+
body.system = system;
|
|
461
405
|
}
|
|
462
406
|
if (modelOverride !== undefined) {
|
|
463
407
|
body.modelOverride = modelOverride;
|
|
@@ -465,14 +409,21 @@ async function callProxiedCompletion(proxyUrl, params) {
|
|
|
465
409
|
if (tools && tools.length > 0) {
|
|
466
410
|
body.tools = tools;
|
|
467
411
|
}
|
|
412
|
+
if (thinking !== undefined) {
|
|
413
|
+
body.thinking = thinking;
|
|
414
|
+
}
|
|
415
|
+
// Forwarded only when explicitly provided; the proxy is responsible for mapping it to the
|
|
416
|
+
// correct upstream provider field (see AiAssist.usesMaxCompletionTokensField).
|
|
417
|
+
if (maxTokens !== undefined) {
|
|
418
|
+
body.maxTokens = maxTokens;
|
|
419
|
+
}
|
|
468
420
|
/* c8 ignore next 1 - optional logger */
|
|
469
421
|
logger === null || logger === void 0 ? void 0 : logger.info(`AI proxy request: provider=${descriptor.id}, proxy=${proxyUrl}`);
|
|
470
422
|
const url = `${proxyUrl}/api/ai/completion`;
|
|
471
|
-
const jsonResult = await fetchJson(url, {}, body, logger);
|
|
423
|
+
const jsonResult = await (0, http_1.fetchJson)(url, {}, body, logger, signal);
|
|
472
424
|
if (jsonResult.isFailure()) {
|
|
473
425
|
return (0, ts_utils_1.fail)(jsonResult.message);
|
|
474
426
|
}
|
|
475
|
-
// Check for error response from proxy
|
|
476
427
|
const response = jsonResult.value;
|
|
477
428
|
if (typeof response.error === 'string') {
|
|
478
429
|
return (0, ts_utils_1.fail)(`proxy: ${response.error}`);
|
|
@@ -485,4 +436,4 @@ async function callProxiedCompletion(proxyUrl, params) {
|
|
|
485
436
|
truncated: response.truncated === true
|
|
486
437
|
});
|
|
487
438
|
}
|
|
488
|
-
//# sourceMappingURL=
|
|
439
|
+
//# sourceMappingURL=completionClient.js.map
|