@intuned/browser-dev 2.2.3-test-build.0
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/.babelrc +21 -0
- package/.eslintignore +10 -0
- package/.eslintrc.js +39 -0
- package/LICENSE +43 -0
- package/dist/ai/export.d.js +5 -0
- package/dist/ai/export.d.ts +641 -0
- package/dist/ai/extractStructuredData.js +320 -0
- package/dist/ai/extractStructuredDataUsingAi.js +139 -0
- package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
- package/dist/ai/extractionHelpers/validateSchema.js +148 -0
- package/dist/ai/index.d.ts +641 -0
- package/dist/ai/index.js +19 -0
- package/dist/ai/isPageLoaded.js +77 -0
- package/dist/ai/prompt.js +39 -0
- package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
- package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
- package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
- package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
- package/dist/ai/tools/index.js +48 -0
- package/dist/ai/types/errors.js +67 -0
- package/dist/ai/types/models.js +45 -0
- package/dist/ai/types/types.js +48 -0
- package/dist/ai/validators.js +167 -0
- package/dist/common/Logger/index.js +60 -0
- package/dist/common/Logger/types.js +5 -0
- package/dist/common/SdkError.js +50 -0
- package/dist/common/aiModelsValidations.js +32 -0
- package/dist/common/browser_scripts.js +2596 -0
- package/dist/common/ensureBrowserScripts.js +18 -0
- package/dist/common/extendedTest.js +148 -0
- package/dist/common/extractionHelpers.js +19 -0
- package/dist/common/formatZodError.js +18 -0
- package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
- package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
- package/dist/common/fuzzySearch/utils.js +23 -0
- package/dist/common/getModelProvider.js +18 -0
- package/dist/common/getSimplifiedHtml.js +122 -0
- package/dist/common/hashObject.js +32 -0
- package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
- package/dist/common/html2markdown/index.js +19 -0
- package/dist/common/jwtTokenManager.js +18 -0
- package/dist/common/loadRuntime.js +16 -0
- package/dist/common/locatorHelpers.js +41 -0
- package/dist/common/matching/collectStrings.js +32 -0
- package/dist/common/matching/levenshtein.js +40 -0
- package/dist/common/matching/matching.js +317 -0
- package/dist/common/matching/types.js +1 -0
- package/dist/common/noEmpty.js +9 -0
- package/dist/common/saveSnapshotWithExamples.js +60 -0
- package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
- package/dist/common/xpathMapping.js +107 -0
- package/dist/helpers/clickUntilExhausted.js +85 -0
- package/dist/helpers/downloadFile.js +125 -0
- package/dist/helpers/export.d.js +5 -0
- package/dist/helpers/export.d.ts +1220 -0
- package/dist/helpers/extractMarkdown.js +35 -0
- package/dist/helpers/filterEmptyValues.js +54 -0
- package/dist/helpers/gotoUrl.js +98 -0
- package/dist/helpers/index.d.ts +1220 -0
- package/dist/helpers/index.js +128 -0
- package/dist/helpers/processDate.js +25 -0
- package/dist/helpers/resolveUrl.js +64 -0
- package/dist/helpers/sanitizeHtml.js +74 -0
- package/dist/helpers/saveFileToS3.js +50 -0
- package/dist/helpers/scrollToLoadContent.js +57 -0
- package/dist/helpers/tests/extendedTest.js +130 -0
- package/dist/helpers/tests/testClickUntilExhausted.spec.js +387 -0
- package/dist/helpers/tests/testDownloadFile.spec.js +204 -0
- package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
- package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
- package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
- package/dist/helpers/tests/testProcessDate.spec.js +13 -0
- package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
- package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
- package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
- package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
- package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
- package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
- package/dist/helpers/types/Attachment.js +115 -0
- package/dist/helpers/types/CustomTypeRegistry.js +48 -0
- package/dist/helpers/types/RunEnvironment.js +18 -0
- package/dist/helpers/types/ValidationError.js +17 -0
- package/dist/helpers/types/index.js +51 -0
- package/dist/helpers/uploadFileToS3.js +154 -0
- package/dist/helpers/utils/getS3Client.js +22 -0
- package/dist/helpers/utils/index.js +73 -0
- package/dist/helpers/utils/isDownload.js +10 -0
- package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
- package/dist/helpers/utils/isLocator.js +9 -0
- package/dist/helpers/utils/jwtTokenManager.js +18 -0
- package/dist/helpers/validateDataUsingSchema.js +103 -0
- package/dist/helpers/waitForDomSettled.js +90 -0
- package/dist/helpers/withNetworkSettledWait.js +91 -0
- package/dist/index.d.js +16 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +16 -0
- package/dist/intunedServices/ApiGateway/aiApiGateway.js +99 -0
- package/dist/intunedServices/ApiGateway/factory.js +13 -0
- package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
- package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
- package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
- package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +224 -0
- package/dist/intunedServices/ApiGateway/types.js +11 -0
- package/dist/intunedServices/cache/cache.js +61 -0
- package/dist/intunedServices/cache/index.js +12 -0
- package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
- package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
- package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
- package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
- package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
- package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
- package/dist/optimized-extractors/common/index.js +55 -0
- package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
- package/dist/optimized-extractors/common/matching/matching.js +212 -0
- package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
- package/dist/optimized-extractors/common/matching/types.js +18 -0
- package/dist/optimized-extractors/common/matching/utils.js +184 -0
- package/dist/optimized-extractors/common/utils.js +58 -0
- package/dist/optimized-extractors/export.d.js +5 -0
- package/dist/optimized-extractors/export.d.ts +397 -0
- package/dist/optimized-extractors/extractArray.js +120 -0
- package/dist/optimized-extractors/extractObject.js +104 -0
- package/dist/optimized-extractors/index.d.ts +397 -0
- package/dist/optimized-extractors/index.js +31 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
- package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
- package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
- package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
- package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
- package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
- package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
- package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
- package/dist/optimized-extractors/models/anthropicModel.js +23 -0
- package/dist/optimized-extractors/models/openaiModel.js +23 -0
- package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
- package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
- package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
- package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
- package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
- package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
- package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
- package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
- package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
- package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
- package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
- package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
- package/dist/optimized-extractors/types/errors.js +42 -0
- package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
- package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
- package/dist/optimized-extractors/types/types.js +5 -0
- package/dist/optimized-extractors/validators.js +152 -0
- package/dist/vite-env.d.js +1 -0
- package/dist/vite-env.d.ts +9 -0
- package/docs.md +14 -0
- package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
- package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
- package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
- package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
- package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
- package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
- package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
- package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
- package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
- package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
- package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
- package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
- package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
- package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
- package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
- package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
- package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
- package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
- package/generated-docs/helpers/functions/processDate.mdx +55 -0
- package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
- package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
- package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
- package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
- package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
- package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
- package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
- package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
- package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
- package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
- package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
- package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
- package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
- package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
- package/how-to-run-tests.md +10 -0
- package/intuned-runtime-setup.md +13 -0
- package/package.json +119 -0
- package/tsconfig.eslint.json +5 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.waitForDomSettled = void 0;
|
|
7
|
+
var _locatorHelpers = require("../common/locatorHelpers");
|
|
8
|
+
var _Logger = require("../common/Logger");
|
|
9
|
+
const waitForDomSettled = async options => {
|
|
10
|
+
const {
|
|
11
|
+
source,
|
|
12
|
+
settleDurationMs = 500,
|
|
13
|
+
timeoutInMs = 30000
|
|
14
|
+
} = options;
|
|
15
|
+
const settleDurationMsFloored = Math.floor(settleDurationMs);
|
|
16
|
+
const timeoutMs = Math.floor(timeoutInMs);
|
|
17
|
+
let pageObj;
|
|
18
|
+
let elementHandle;
|
|
19
|
+
if (!(0, _locatorHelpers.isPage)(source)) {
|
|
20
|
+
pageObj = source.page();
|
|
21
|
+
const handle = await source.elementHandle();
|
|
22
|
+
if (!handle) {
|
|
23
|
+
_Logger.logger.warn("Could not get element handle from locator");
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
elementHandle = handle;
|
|
27
|
+
} else if ((0, _locatorHelpers.isPage)(source)) {
|
|
28
|
+
pageObj = source;
|
|
29
|
+
elementHandle = await pageObj.evaluateHandle("document.documentElement");
|
|
30
|
+
} else {
|
|
31
|
+
throw new Error("Invalid state");
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const result = await pageObj.evaluate(({
|
|
35
|
+
target,
|
|
36
|
+
settleDurationMsFloored,
|
|
37
|
+
timeoutMs
|
|
38
|
+
}) => {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
if (!target) {
|
|
41
|
+
reject(new Error("Target element not found"));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let mutationTimer;
|
|
45
|
+
let settled = false;
|
|
46
|
+
const observer = new MutationObserver(() => {
|
|
47
|
+
if (settled) return;
|
|
48
|
+
clearTimeout(mutationTimer);
|
|
49
|
+
mutationTimer = window.setTimeout(() => {
|
|
50
|
+
settled = true;
|
|
51
|
+
observer.disconnect();
|
|
52
|
+
clearTimeout(timeoutTimer);
|
|
53
|
+
resolve(true);
|
|
54
|
+
}, settleDurationMsFloored);
|
|
55
|
+
});
|
|
56
|
+
const timeoutTimer = window.setTimeout(() => {
|
|
57
|
+
settled = true;
|
|
58
|
+
observer.disconnect();
|
|
59
|
+
clearTimeout(mutationTimer);
|
|
60
|
+
reject(new Error(`DOM timed out settling after ${timeoutMs} ms`));
|
|
61
|
+
}, timeoutMs);
|
|
62
|
+
observer.observe(target, {
|
|
63
|
+
childList: true,
|
|
64
|
+
subtree: true,
|
|
65
|
+
attributes: true,
|
|
66
|
+
characterData: true
|
|
67
|
+
});
|
|
68
|
+
mutationTimer = window.setTimeout(() => {
|
|
69
|
+
settled = true;
|
|
70
|
+
observer.disconnect();
|
|
71
|
+
clearTimeout(timeoutTimer);
|
|
72
|
+
resolve(true);
|
|
73
|
+
}, settleDurationMsFloored);
|
|
74
|
+
});
|
|
75
|
+
}, {
|
|
76
|
+
target: elementHandle,
|
|
77
|
+
settleDurationMsFloored,
|
|
78
|
+
timeoutMs
|
|
79
|
+
});
|
|
80
|
+
return result;
|
|
81
|
+
} catch (error) {
|
|
82
|
+
_Logger.logger.warn(`DOM settlement detection failed: ${error}`);
|
|
83
|
+
return false;
|
|
84
|
+
} finally {
|
|
85
|
+
if ((0, _locatorHelpers.isPage)(source) && elementHandle) {
|
|
86
|
+
await elementHandle.dispose();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
exports.waitForDomSettled = waitForDomSettled;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.withNetworkSettledWait = void 0;
|
|
7
|
+
var _Logger = require("../common/Logger");
|
|
8
|
+
const withNetworkSettledWait = async (callback, options) => {
|
|
9
|
+
const {
|
|
10
|
+
page,
|
|
11
|
+
timeoutInMs = 30000,
|
|
12
|
+
maxInflightRequests = 0
|
|
13
|
+
} = options || {};
|
|
14
|
+
_Logger.logger.debug(`Page object: ${page}`);
|
|
15
|
+
let networkSettledResolve = null;
|
|
16
|
+
let networkSettledPromise = new Promise(resolve => {
|
|
17
|
+
networkSettledResolve = resolve;
|
|
18
|
+
});
|
|
19
|
+
let isTimeout = false;
|
|
20
|
+
let requestCounter = 0;
|
|
21
|
+
let actionDone = false;
|
|
22
|
+
const pendingRequests = new Set();
|
|
23
|
+
const maybeSettle = async () => {
|
|
24
|
+
if (actionDone && requestCounter <= maxInflightRequests) {
|
|
25
|
+
var _networkSettledResolv;
|
|
26
|
+
(_networkSettledResolv = networkSettledResolve) === null || _networkSettledResolv === void 0 || _networkSettledResolv();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const onRequest = request => {
|
|
30
|
+
requestCounter++;
|
|
31
|
+
pendingRequests.add(request);
|
|
32
|
+
};
|
|
33
|
+
const onRequestDone = async request => {
|
|
34
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
35
|
+
if (pendingRequests.has(request)) {
|
|
36
|
+
requestCounter--;
|
|
37
|
+
pendingRequests.delete(request);
|
|
38
|
+
await maybeSettle();
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
const handleRequestFinished = async req => {
|
|
42
|
+
await onRequestDone(req);
|
|
43
|
+
};
|
|
44
|
+
const handleRequestFailed = async req => {
|
|
45
|
+
await onRequestDone(req);
|
|
46
|
+
};
|
|
47
|
+
page === null || page === void 0 || page.on("request", onRequest);
|
|
48
|
+
page === null || page === void 0 || page.on("requestfinished", handleRequestFinished);
|
|
49
|
+
page === null || page === void 0 || page.on("requestfailed", handleRequestFailed);
|
|
50
|
+
const timeoutPromise = new Promise(resolve => {
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
var _networkSettledResolv2;
|
|
53
|
+
_Logger.logger.info("waiting for network to settle timed out");
|
|
54
|
+
isTimeout = true;
|
|
55
|
+
(_networkSettledResolv2 = networkSettledResolve) === null || _networkSettledResolv2 === void 0 || _networkSettledResolv2();
|
|
56
|
+
resolve();
|
|
57
|
+
}, timeoutInMs);
|
|
58
|
+
});
|
|
59
|
+
try {
|
|
60
|
+
const result = await callback(page);
|
|
61
|
+
actionDone = true;
|
|
62
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
63
|
+
await maybeSettle();
|
|
64
|
+
_Logger.logger.info("-- Start waiting for network to settle... --");
|
|
65
|
+
let shouldContinue = true;
|
|
66
|
+
while (shouldContinue) {
|
|
67
|
+
_Logger.logger.info(`waiting for network to settle, ${requestCounter} requests pending`);
|
|
68
|
+
await Promise.race([networkSettledPromise, timeoutPromise]);
|
|
69
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
70
|
+
if (actionDone && requestCounter <= maxInflightRequests || isTimeout) {
|
|
71
|
+
if (isTimeout) {
|
|
72
|
+
_Logger.logger.info("Exiting due to timeout, network did not settle");
|
|
73
|
+
} else {
|
|
74
|
+
_Logger.logger.info("network settled, no pending requests");
|
|
75
|
+
}
|
|
76
|
+
shouldContinue = false;
|
|
77
|
+
} else {
|
|
78
|
+
networkSettledPromise = new Promise(resolve => {
|
|
79
|
+
networkSettledResolve = resolve;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
_Logger.logger.info("-- Finished waiting for network to settle --");
|
|
84
|
+
return result;
|
|
85
|
+
} finally {
|
|
86
|
+
page === null || page === void 0 || page.off("request", onRequest);
|
|
87
|
+
page === null || page === void 0 || page.off("requestfinished", handleRequestFinished);
|
|
88
|
+
page === null || page === void 0 || page.off("requestfailed", handleRequestFailed);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
exports.withNetworkSettledWait = withNetworkSettledWait;
|
package/dist/index.d.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _export = require("./helpers/export");
|
|
7
|
+
Object.keys(_export).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _export[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _export[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _helpers = require("./helpers");
|
|
7
|
+
Object.keys(_helpers).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _helpers[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _helpers[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.APIGateway = void 0;
|
|
7
|
+
var _getModelProvider = require("../../common/getModelProvider");
|
|
8
|
+
var _Anthropic = require("./providers/Anthropic");
|
|
9
|
+
var _OpenAI = require("./providers/OpenAI");
|
|
10
|
+
var _Gemini = require("./providers/Gemini");
|
|
11
|
+
var _dotenv = require("dotenv");
|
|
12
|
+
(0, _dotenv.config)();
|
|
13
|
+
class APIGateway {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.config = this.getDefaultConfig();
|
|
16
|
+
this.validateConfig(this.config);
|
|
17
|
+
}
|
|
18
|
+
validateConfig(config) {
|
|
19
|
+
if (!config.functionsDomain || !config.workspaceId || !config.integrationId) {
|
|
20
|
+
throw new Error("Gateway configuration is incomplete. " + "Please provide functionsDomain, workspaceId, and integrationId");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
getDefaultConfig() {
|
|
24
|
+
return {
|
|
25
|
+
functionsDomain: process.env.FUNCTIONS_DOMAIN,
|
|
26
|
+
workspaceId: process.env.INTUNED_WORKSPACE_ID,
|
|
27
|
+
integrationId: process.env.INTUNED_INTEGRATION_ID
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
detectProvider(model) {
|
|
31
|
+
const modelLower = model.toLowerCase();
|
|
32
|
+
return (0, _getModelProvider.getModelProvider)(modelLower);
|
|
33
|
+
}
|
|
34
|
+
buildGatewayUrl(provider) {
|
|
35
|
+
var _this$config;
|
|
36
|
+
const baseDomain = (_this$config = this.config) === null || _this$config === void 0 || (_this$config = _this$config.functionsDomain) === null || _this$config === void 0 ? void 0 : _this$config.replace(/\/$/, "");
|
|
37
|
+
return `${baseDomain}/api/${this.config.workspaceId}/functions/${this.config.integrationId}/${provider === "anthropic" ? "anthropic/v1" : provider === "google_vertexai" ? "google_vertexai/v1beta" : provider}`;
|
|
38
|
+
}
|
|
39
|
+
getModelConfig(model, options) {
|
|
40
|
+
const {
|
|
41
|
+
apiKey,
|
|
42
|
+
extraHeaders
|
|
43
|
+
} = options;
|
|
44
|
+
const provider = this.detectProvider(model);
|
|
45
|
+
let apiKeyToUse = apiKey;
|
|
46
|
+
if (apiKey === undefined) {
|
|
47
|
+
if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("anthropic")) {
|
|
48
|
+
apiKeyToUse = process.env.ANTHROPIC_API_KEY;
|
|
49
|
+
} else if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("openai")) {
|
|
50
|
+
apiKeyToUse = process.env.OPENAI_API_KEY;
|
|
51
|
+
} else if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("google_vertexai")) {
|
|
52
|
+
apiKeyToUse = process.env.GOOGLE_API_KEY;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (apiKeyToUse) {
|
|
56
|
+
return {
|
|
57
|
+
model,
|
|
58
|
+
apiKey: apiKeyToUse,
|
|
59
|
+
extraHeaders,
|
|
60
|
+
baseUrl: undefined
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const baseUrl = this.buildGatewayUrl(provider);
|
|
64
|
+
return {
|
|
65
|
+
model,
|
|
66
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
67
|
+
extraHeaders,
|
|
68
|
+
baseUrl
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
createProviderInstance(model, apiKey, extraHeaders) {
|
|
72
|
+
const config = this.getModelConfig(model, {
|
|
73
|
+
apiKey,
|
|
74
|
+
extraHeaders
|
|
75
|
+
});
|
|
76
|
+
const provider = this.detectProvider(model);
|
|
77
|
+
const input = {
|
|
78
|
+
apiKey: config.apiKey,
|
|
79
|
+
headers: config.extraHeaders,
|
|
80
|
+
model: config.model,
|
|
81
|
+
baseUrl: config.baseUrl
|
|
82
|
+
};
|
|
83
|
+
const providerFactories = {
|
|
84
|
+
anthropic: () => (0, _Anthropic.createAnthropicInstance)(input),
|
|
85
|
+
openai: () => (0, _OpenAI.createOpenAIInstance)(input),
|
|
86
|
+
google_vertexai: () => (0, _Gemini.createGoogleInstance)(input)
|
|
87
|
+
};
|
|
88
|
+
const factory = providerFactories[provider];
|
|
89
|
+
if (!factory) {
|
|
90
|
+
throw new Error(`Unsupported provider: ${provider}`);
|
|
91
|
+
}
|
|
92
|
+
return factory();
|
|
93
|
+
}
|
|
94
|
+
getModel(model, apiKey, extraHeaders) {
|
|
95
|
+
const providerInstance = this.createProviderInstance(model, apiKey, extraHeaders);
|
|
96
|
+
return providerInstance.chat(model);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.APIGateway = APIGateway;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.GatewayFactory = void 0;
|
|
7
|
+
var _aiApiGateway = require("./aiApiGateway");
|
|
8
|
+
class GatewayFactory {
|
|
9
|
+
static createAIGateway() {
|
|
10
|
+
return new _aiApiGateway.APIGateway();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.GatewayFactory = GatewayFactory;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createAnthropicInstance = void 0;
|
|
7
|
+
var _anthropic = require("@ai-sdk/anthropic");
|
|
8
|
+
var _jwtTokenManager = require("../../../common/jwtTokenManager");
|
|
9
|
+
const createAnthropicInstance = input => {
|
|
10
|
+
const {
|
|
11
|
+
apiKey,
|
|
12
|
+
baseUrl
|
|
13
|
+
} = input;
|
|
14
|
+
if (apiKey && baseUrl === undefined) {
|
|
15
|
+
return (0, _anthropic.createAnthropic)({
|
|
16
|
+
apiKey
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
return (0, _anthropic.createAnthropic)({
|
|
20
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
21
|
+
baseURL: baseUrl,
|
|
22
|
+
fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
exports.createAnthropicInstance = createAnthropicInstance;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createGoogleInstance = void 0;
|
|
7
|
+
var _google = require("@ai-sdk/google");
|
|
8
|
+
var _jwtTokenManager = require("../../../common/jwtTokenManager");
|
|
9
|
+
const createGoogleInstance = input => {
|
|
10
|
+
const {
|
|
11
|
+
apiKey,
|
|
12
|
+
headers,
|
|
13
|
+
baseUrl
|
|
14
|
+
} = input;
|
|
15
|
+
if (apiKey && baseUrl === undefined) {
|
|
16
|
+
return (0, _google.createGoogleGenerativeAI)({
|
|
17
|
+
apiKey,
|
|
18
|
+
headers
|
|
19
|
+
});
|
|
20
|
+
} else {
|
|
21
|
+
return (0, _google.createGoogleGenerativeAI)({
|
|
22
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
23
|
+
headers,
|
|
24
|
+
baseURL: baseUrl,
|
|
25
|
+
fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.createGoogleInstance = createGoogleInstance;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createOpenAIInstance = void 0;
|
|
7
|
+
var _openai = require("@ai-sdk/openai");
|
|
8
|
+
var _jwtTokenManager = require("../../../common/jwtTokenManager");
|
|
9
|
+
const createOpenAIInstance = input => {
|
|
10
|
+
const {
|
|
11
|
+
apiKey,
|
|
12
|
+
headers,
|
|
13
|
+
baseUrl
|
|
14
|
+
} = input;
|
|
15
|
+
if (apiKey && baseUrl === undefined) {
|
|
16
|
+
return (0, _openai.createOpenAI)({
|
|
17
|
+
apiKey,
|
|
18
|
+
headers
|
|
19
|
+
});
|
|
20
|
+
} else {
|
|
21
|
+
return (0, _openai.createOpenAI)({
|
|
22
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
23
|
+
headers,
|
|
24
|
+
baseURL: baseUrl,
|
|
25
|
+
fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
exports.createOpenAIInstance = createOpenAIInstance;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _extendedTest = require("../../../common/extendedTest");
|
|
4
|
+
var _vitest = require("vitest");
|
|
5
|
+
var _aiApiGateway = require("../aiApiGateway");
|
|
6
|
+
var _getModelProvider = require("../../../common/getModelProvider");
|
|
7
|
+
var _Anthropic = require("../providers/Anthropic");
|
|
8
|
+
var _OpenAI = require("../providers/OpenAI");
|
|
9
|
+
var _Gemini = require("../providers/Gemini");
|
|
10
|
+
_vitest.vi.mock("../../../common/jwtTokenManager", () => ({
|
|
11
|
+
backendFunctionsTokenManager: {
|
|
12
|
+
fetchWithToken: _vitest.vi.fn()
|
|
13
|
+
}
|
|
14
|
+
}));
|
|
15
|
+
_vitest.vi.mock("../../../common/getModelProvider", () => ({
|
|
16
|
+
getModelProvider: _vitest.vi.fn()
|
|
17
|
+
}));
|
|
18
|
+
_vitest.vi.mock("../providers/Anthropic", () => ({
|
|
19
|
+
createAnthropicInstance: _vitest.vi.fn()
|
|
20
|
+
}));
|
|
21
|
+
_vitest.vi.mock("../providers/OpenAI", () => ({
|
|
22
|
+
createOpenAIInstance: _vitest.vi.fn()
|
|
23
|
+
}));
|
|
24
|
+
_vitest.vi.mock("../providers/Gemini", () => ({
|
|
25
|
+
createGoogleInstance: _vitest.vi.fn()
|
|
26
|
+
}));
|
|
27
|
+
const mockGetModelProvider = _vitest.vi.mocked(_getModelProvider.getModelProvider);
|
|
28
|
+
const mockCreateAnthropicInstance = _vitest.vi.mocked(_Anthropic.createAnthropicInstance);
|
|
29
|
+
const mockCreateOpenAIInstance = _vitest.vi.mocked(_OpenAI.createOpenAIInstance);
|
|
30
|
+
const mockCreateGoogleInstance = _vitest.vi.mocked(_Gemini.createGoogleInstance);
|
|
31
|
+
(0, _extendedTest.describe)("APIGateway", () => {
|
|
32
|
+
let originalEnv;
|
|
33
|
+
let gateway;
|
|
34
|
+
(0, _extendedTest.beforeEach)(() => {
|
|
35
|
+
originalEnv = process.env;
|
|
36
|
+
process.env = {
|
|
37
|
+
...originalEnv,
|
|
38
|
+
FUNCTIONS_DOMAIN: "https://functions.example.com",
|
|
39
|
+
INTUNED_WORKSPACE_ID: "workspace123",
|
|
40
|
+
INTUNED_INTEGRATION_ID: "integration456",
|
|
41
|
+
ANTHROPIC_API_KEY: undefined
|
|
42
|
+
};
|
|
43
|
+
gateway = new _aiApiGateway.APIGateway();
|
|
44
|
+
_vitest.vi.clearAllMocks();
|
|
45
|
+
});
|
|
46
|
+
(0, _extendedTest.afterEach)(() => {
|
|
47
|
+
process.env = originalEnv;
|
|
48
|
+
});
|
|
49
|
+
(0, _extendedTest.describe)("constructor and config", () => {
|
|
50
|
+
(0, _extendedTest.it)("should initialize with default config from environment", () => {
|
|
51
|
+
(0, _extendedTest.expect)(gateway["config"]).toEqual({
|
|
52
|
+
functionsDomain: "https://functions.example.com",
|
|
53
|
+
workspaceId: "workspace123",
|
|
54
|
+
integrationId: "integration456"
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
(0, _extendedTest.describe)("detectProvider", () => {
|
|
59
|
+
(0, _extendedTest.it)("should detect openai models", () => {
|
|
60
|
+
mockGetModelProvider.mockReturnValue("openai");
|
|
61
|
+
(0, _extendedTest.expect)(gateway["detectProvider"]("gpt-4")).toBe("openai");
|
|
62
|
+
(0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("gpt-4");
|
|
63
|
+
});
|
|
64
|
+
(0, _extendedTest.it)("should detect anthropic models", () => {
|
|
65
|
+
mockGetModelProvider.mockReturnValue("anthropic");
|
|
66
|
+
(0, _extendedTest.expect)(gateway["detectProvider"]("claude-3-sonnet")).toBe("anthropic");
|
|
67
|
+
(0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("claude-3-sonnet");
|
|
68
|
+
});
|
|
69
|
+
(0, _extendedTest.it)("should handle case insensitive models", () => {
|
|
70
|
+
mockGetModelProvider.mockReturnValue("anthropic");
|
|
71
|
+
(0, _extendedTest.expect)(gateway["detectProvider"]("CLAUDE-3-OPUS")).toBe("anthropic");
|
|
72
|
+
(0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("claude-3-opus");
|
|
73
|
+
});
|
|
74
|
+
(0, _extendedTest.it)("should return unknown for unsupported models", () => {
|
|
75
|
+
mockGetModelProvider.mockReturnValue("unknown");
|
|
76
|
+
(0, _extendedTest.expect)(gateway["detectProvider"]("unknown-model")).toBe("unknown");
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
(0, _extendedTest.describe)("buildGatewayUrl", () => {
|
|
80
|
+
(0, _extendedTest.it)("should build correct URL for anthropic", () => {
|
|
81
|
+
const result = gateway["buildGatewayUrl"]("anthropic");
|
|
82
|
+
(0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1");
|
|
83
|
+
});
|
|
84
|
+
(0, _extendedTest.it)("should build correct URL for google_vertexai", () => {
|
|
85
|
+
const result = gateway["buildGatewayUrl"]("google_vertexai");
|
|
86
|
+
(0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/google_vertexai/v1beta");
|
|
87
|
+
});
|
|
88
|
+
(0, _extendedTest.it)("should build correct URL for other providers", () => {
|
|
89
|
+
const result = gateway["buildGatewayUrl"]("openai");
|
|
90
|
+
(0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/openai");
|
|
91
|
+
});
|
|
92
|
+
(0, _extendedTest.it)("should strip trailing slash from domain", () => {
|
|
93
|
+
process.env.FUNCTIONS_DOMAIN = "https://functions.example.com/";
|
|
94
|
+
const newGateway = new _aiApiGateway.APIGateway();
|
|
95
|
+
const result = newGateway["buildGatewayUrl"]("openai");
|
|
96
|
+
(0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/openai");
|
|
97
|
+
});
|
|
98
|
+
(0, _extendedTest.it)("should throw error for incomplete config", () => {
|
|
99
|
+
delete process.env.FUNCTIONS_DOMAIN;
|
|
100
|
+
(0, _extendedTest.expect)(() => new _aiApiGateway.APIGateway()).toThrow("Gateway configuration is incomplete");
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
(0, _extendedTest.describe)("getModelConfig", () => {
|
|
104
|
+
(0, _extendedTest.it)("should return direct mode config when API key provided", () => {
|
|
105
|
+
const config = gateway.getModelConfig("claude-3-sonnet", {
|
|
106
|
+
apiKey: "sk-test123",
|
|
107
|
+
extraHeaders: {
|
|
108
|
+
"Custom-Header": "value"
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
(0, _extendedTest.expect)(config).toEqual({
|
|
112
|
+
model: "claude-3-sonnet",
|
|
113
|
+
apiKey: "sk-test123",
|
|
114
|
+
extraHeaders: {
|
|
115
|
+
"Custom-Header": "value"
|
|
116
|
+
},
|
|
117
|
+
baseUrl: undefined
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
(0, _extendedTest.it)("should return gateway mode config when no API key", () => {
|
|
121
|
+
mockGetModelProvider.mockReturnValue("anthropic");
|
|
122
|
+
const config = gateway.getModelConfig("claude-3-sonnet", {
|
|
123
|
+
apiKey: undefined,
|
|
124
|
+
extraHeaders: {
|
|
125
|
+
"Custom-Header": "value"
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
process.env.ANTHROPIC_API_KEY = undefined;
|
|
129
|
+
(0, _extendedTest.expect)(config).toEqual({
|
|
130
|
+
model: "claude-3-sonnet",
|
|
131
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
132
|
+
extraHeaders: {
|
|
133
|
+
"Custom-Header": "value"
|
|
134
|
+
},
|
|
135
|
+
baseUrl: "https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1"
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
(0, _extendedTest.describe)("createProviderInstance", () => {
|
|
140
|
+
(0, _extendedTest.it)("should create anthropic instance", () => {
|
|
141
|
+
mockGetModelProvider.mockReturnValue("anthropic");
|
|
142
|
+
const mockInstance = {
|
|
143
|
+
chat: _vitest.vi.fn()
|
|
144
|
+
};
|
|
145
|
+
mockCreateAnthropicInstance.mockReturnValue(mockInstance);
|
|
146
|
+
const result = gateway.createProviderInstance("claude-3-sonnet");
|
|
147
|
+
process.env.ANTHROPIC_API_KEY = undefined;
|
|
148
|
+
(0, _extendedTest.expect)(mockCreateAnthropicInstance).toHaveBeenCalledWith({
|
|
149
|
+
apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
|
|
150
|
+
headers: undefined,
|
|
151
|
+
model: "claude-3-sonnet",
|
|
152
|
+
baseUrl: "https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1"
|
|
153
|
+
});
|
|
154
|
+
(0, _extendedTest.expect)(result).toBe(mockInstance);
|
|
155
|
+
});
|
|
156
|
+
(0, _extendedTest.it)("should create openai instance", () => {
|
|
157
|
+
mockGetModelProvider.mockReturnValue("openai");
|
|
158
|
+
const mockInstance = {
|
|
159
|
+
chat: _vitest.vi.fn()
|
|
160
|
+
};
|
|
161
|
+
mockCreateOpenAIInstance.mockReturnValue(mockInstance);
|
|
162
|
+
const result = gateway.createProviderInstance("gpt-4", "sk-test123");
|
|
163
|
+
(0, _extendedTest.expect)(mockCreateOpenAIInstance).toHaveBeenCalledWith({
|
|
164
|
+
apiKey: "sk-test123",
|
|
165
|
+
headers: undefined,
|
|
166
|
+
model: "gpt-4",
|
|
167
|
+
baseUrl: undefined
|
|
168
|
+
});
|
|
169
|
+
(0, _extendedTest.expect)(result).toBe(mockInstance);
|
|
170
|
+
});
|
|
171
|
+
(0, _extendedTest.it)("should create google instance", () => {
|
|
172
|
+
mockGetModelProvider.mockReturnValue("google_vertexai");
|
|
173
|
+
const mockInstance = {
|
|
174
|
+
chat: _vitest.vi.fn()
|
|
175
|
+
};
|
|
176
|
+
mockCreateGoogleInstance.mockReturnValue(mockInstance);
|
|
177
|
+
const result = gateway.createProviderInstance("gemini-pro");
|
|
178
|
+
(0, _extendedTest.expect)(mockCreateGoogleInstance).toHaveBeenCalled();
|
|
179
|
+
(0, _extendedTest.expect)(result).toBe(mockInstance);
|
|
180
|
+
});
|
|
181
|
+
(0, _extendedTest.it)("should throw error for unsupported provider", () => {
|
|
182
|
+
mockGetModelProvider.mockReturnValue("unknown");
|
|
183
|
+
(0, _extendedTest.expect)(() => gateway.createProviderInstance("unknown-model")).toThrow("Unsupported provider: unknown");
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
(0, _extendedTest.describe)("getModel", () => {
|
|
187
|
+
(0, _extendedTest.it)("should return language model from provider instance", () => {
|
|
188
|
+
mockGetModelProvider.mockReturnValue("anthropic");
|
|
189
|
+
const mockModelInstance = {
|
|
190
|
+
generate: _vitest.vi.fn()
|
|
191
|
+
};
|
|
192
|
+
const mockProviderInstance = {
|
|
193
|
+
chat: _vitest.vi.fn().mockReturnValue(mockModelInstance)
|
|
194
|
+
};
|
|
195
|
+
mockCreateAnthropicInstance.mockReturnValue(mockProviderInstance);
|
|
196
|
+
const result = gateway.getModel("claude-3-sonnet");
|
|
197
|
+
(0, _extendedTest.expect)(mockProviderInstance.chat).toHaveBeenCalledWith("claude-3-sonnet");
|
|
198
|
+
(0, _extendedTest.expect)(result).toBe(mockModelInstance);
|
|
199
|
+
});
|
|
200
|
+
(0, _extendedTest.it)("should pass through API key and headers", () => {
|
|
201
|
+
mockGetModelProvider.mockReturnValue("openai");
|
|
202
|
+
const mockModelInstance = {
|
|
203
|
+
generate: _vitest.vi.fn()
|
|
204
|
+
};
|
|
205
|
+
const mockProviderInstance = {
|
|
206
|
+
chat: _vitest.vi.fn().mockReturnValue(mockModelInstance)
|
|
207
|
+
};
|
|
208
|
+
mockCreateOpenAIInstance.mockReturnValue(mockProviderInstance);
|
|
209
|
+
const result = gateway.getModel("gpt-4", "sk-test123", {
|
|
210
|
+
"Custom-Header": "value"
|
|
211
|
+
});
|
|
212
|
+
(0, _extendedTest.expect)(mockCreateOpenAIInstance).toHaveBeenCalledWith({
|
|
213
|
+
apiKey: "sk-test123",
|
|
214
|
+
headers: {
|
|
215
|
+
"Custom-Header": "value"
|
|
216
|
+
},
|
|
217
|
+
model: "gpt-4",
|
|
218
|
+
baseUrl: undefined
|
|
219
|
+
});
|
|
220
|
+
(0, _extendedTest.expect)(mockProviderInstance.chat).toHaveBeenCalledWith("gpt-4");
|
|
221
|
+
(0, _extendedTest.expect)(result).toBe(mockModelInstance);
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.GatewayMode = void 0;
|
|
7
|
+
let GatewayMode = exports.GatewayMode = function (GatewayMode) {
|
|
8
|
+
GatewayMode["DIRECT"] = "direct";
|
|
9
|
+
GatewayMode["GATEWAY"] = "gateway";
|
|
10
|
+
return GatewayMode;
|
|
11
|
+
}({});
|