@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.
Files changed (206) hide show
  1. package/.babelrc +21 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +39 -0
  4. package/LICENSE +43 -0
  5. package/dist/ai/export.d.js +5 -0
  6. package/dist/ai/export.d.ts +641 -0
  7. package/dist/ai/extractStructuredData.js +320 -0
  8. package/dist/ai/extractStructuredDataUsingAi.js +139 -0
  9. package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
  10. package/dist/ai/extractionHelpers/validateSchema.js +148 -0
  11. package/dist/ai/index.d.ts +641 -0
  12. package/dist/ai/index.js +19 -0
  13. package/dist/ai/isPageLoaded.js +77 -0
  14. package/dist/ai/prompt.js +39 -0
  15. package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
  16. package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
  17. package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
  18. package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
  19. package/dist/ai/tools/index.js +48 -0
  20. package/dist/ai/types/errors.js +67 -0
  21. package/dist/ai/types/models.js +45 -0
  22. package/dist/ai/types/types.js +48 -0
  23. package/dist/ai/validators.js +167 -0
  24. package/dist/common/Logger/index.js +60 -0
  25. package/dist/common/Logger/types.js +5 -0
  26. package/dist/common/SdkError.js +50 -0
  27. package/dist/common/aiModelsValidations.js +32 -0
  28. package/dist/common/browser_scripts.js +2596 -0
  29. package/dist/common/ensureBrowserScripts.js +18 -0
  30. package/dist/common/extendedTest.js +148 -0
  31. package/dist/common/extractionHelpers.js +19 -0
  32. package/dist/common/formatZodError.js +18 -0
  33. package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
  34. package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
  35. package/dist/common/fuzzySearch/utils.js +23 -0
  36. package/dist/common/getModelProvider.js +18 -0
  37. package/dist/common/getSimplifiedHtml.js +122 -0
  38. package/dist/common/hashObject.js +32 -0
  39. package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
  40. package/dist/common/html2markdown/index.js +19 -0
  41. package/dist/common/jwtTokenManager.js +18 -0
  42. package/dist/common/loadRuntime.js +16 -0
  43. package/dist/common/locatorHelpers.js +41 -0
  44. package/dist/common/matching/collectStrings.js +32 -0
  45. package/dist/common/matching/levenshtein.js +40 -0
  46. package/dist/common/matching/matching.js +317 -0
  47. package/dist/common/matching/types.js +1 -0
  48. package/dist/common/noEmpty.js +9 -0
  49. package/dist/common/saveSnapshotWithExamples.js +60 -0
  50. package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
  51. package/dist/common/xpathMapping.js +107 -0
  52. package/dist/helpers/clickUntilExhausted.js +85 -0
  53. package/dist/helpers/downloadFile.js +125 -0
  54. package/dist/helpers/export.d.js +5 -0
  55. package/dist/helpers/export.d.ts +1220 -0
  56. package/dist/helpers/extractMarkdown.js +35 -0
  57. package/dist/helpers/filterEmptyValues.js +54 -0
  58. package/dist/helpers/gotoUrl.js +98 -0
  59. package/dist/helpers/index.d.ts +1220 -0
  60. package/dist/helpers/index.js +128 -0
  61. package/dist/helpers/processDate.js +25 -0
  62. package/dist/helpers/resolveUrl.js +64 -0
  63. package/dist/helpers/sanitizeHtml.js +74 -0
  64. package/dist/helpers/saveFileToS3.js +50 -0
  65. package/dist/helpers/scrollToLoadContent.js +57 -0
  66. package/dist/helpers/tests/extendedTest.js +130 -0
  67. package/dist/helpers/tests/testClickUntilExhausted.spec.js +387 -0
  68. package/dist/helpers/tests/testDownloadFile.spec.js +204 -0
  69. package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
  70. package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
  71. package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
  72. package/dist/helpers/tests/testProcessDate.spec.js +13 -0
  73. package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
  74. package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
  75. package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
  76. package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
  77. package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
  78. package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
  79. package/dist/helpers/types/Attachment.js +115 -0
  80. package/dist/helpers/types/CustomTypeRegistry.js +48 -0
  81. package/dist/helpers/types/RunEnvironment.js +18 -0
  82. package/dist/helpers/types/ValidationError.js +17 -0
  83. package/dist/helpers/types/index.js +51 -0
  84. package/dist/helpers/uploadFileToS3.js +154 -0
  85. package/dist/helpers/utils/getS3Client.js +22 -0
  86. package/dist/helpers/utils/index.js +73 -0
  87. package/dist/helpers/utils/isDownload.js +10 -0
  88. package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
  89. package/dist/helpers/utils/isLocator.js +9 -0
  90. package/dist/helpers/utils/jwtTokenManager.js +18 -0
  91. package/dist/helpers/validateDataUsingSchema.js +103 -0
  92. package/dist/helpers/waitForDomSettled.js +90 -0
  93. package/dist/helpers/withNetworkSettledWait.js +91 -0
  94. package/dist/index.d.js +16 -0
  95. package/dist/index.d.ts +10 -0
  96. package/dist/index.js +16 -0
  97. package/dist/intunedServices/ApiGateway/aiApiGateway.js +99 -0
  98. package/dist/intunedServices/ApiGateway/factory.js +13 -0
  99. package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
  100. package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
  101. package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
  102. package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +224 -0
  103. package/dist/intunedServices/ApiGateway/types.js +11 -0
  104. package/dist/intunedServices/cache/cache.js +61 -0
  105. package/dist/intunedServices/cache/index.js +12 -0
  106. package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
  107. package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
  108. package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
  109. package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
  110. package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
  111. package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
  112. package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
  113. package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
  114. package/dist/optimized-extractors/common/index.js +55 -0
  115. package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
  116. package/dist/optimized-extractors/common/matching/matching.js +212 -0
  117. package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
  118. package/dist/optimized-extractors/common/matching/types.js +18 -0
  119. package/dist/optimized-extractors/common/matching/utils.js +184 -0
  120. package/dist/optimized-extractors/common/utils.js +58 -0
  121. package/dist/optimized-extractors/export.d.js +5 -0
  122. package/dist/optimized-extractors/export.d.ts +397 -0
  123. package/dist/optimized-extractors/extractArray.js +120 -0
  124. package/dist/optimized-extractors/extractObject.js +104 -0
  125. package/dist/optimized-extractors/index.d.ts +397 -0
  126. package/dist/optimized-extractors/index.js +31 -0
  127. package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
  128. package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
  129. package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
  130. package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
  131. package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
  132. package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
  133. package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
  134. package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
  135. package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
  136. package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
  137. package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
  138. package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
  139. package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
  140. package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
  141. package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
  142. package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
  143. package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
  144. package/dist/optimized-extractors/models/anthropicModel.js +23 -0
  145. package/dist/optimized-extractors/models/openaiModel.js +23 -0
  146. package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
  147. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
  148. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
  149. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
  150. package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
  151. package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
  152. package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
  153. package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
  154. package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
  155. package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
  156. package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
  157. package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
  158. package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
  159. package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
  160. package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
  161. package/dist/optimized-extractors/types/errors.js +42 -0
  162. package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
  163. package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
  164. package/dist/optimized-extractors/types/types.js +5 -0
  165. package/dist/optimized-extractors/validators.js +152 -0
  166. package/dist/vite-env.d.js +1 -0
  167. package/dist/vite-env.d.ts +9 -0
  168. package/docs.md +14 -0
  169. package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
  170. package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
  171. package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
  172. package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
  173. package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
  174. package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
  175. package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
  176. package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
  177. package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
  178. package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
  179. package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
  180. package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
  181. package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
  182. package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
  183. package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
  184. package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
  185. package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
  186. package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
  187. package/generated-docs/helpers/functions/processDate.mdx +55 -0
  188. package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
  189. package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
  190. package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
  191. package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
  192. package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
  193. package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
  194. package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
  195. package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
  196. package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
  197. package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
  198. package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
  199. package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
  200. package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
  201. package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
  202. package/how-to-run-tests.md +10 -0
  203. package/intuned-runtime-setup.md +13 -0
  204. package/package.json +119 -0
  205. package/tsconfig.eslint.json +5 -0
  206. package/tsconfig.json +26 -0
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cache = void 0;
7
+ var _zod = require("zod");
8
+ var _jwtTokenManager = require("../../common/jwtTokenManager");
9
+ var _Logger = require("../../common/Logger");
10
+ const forbiddenCharacters = /[:#]/g;
11
+ const keySchema = _zod.z.string().min(1, "Key must be at least 1 character long").refine(key => {
12
+ var _key$match;
13
+ return (((_key$match = key.match(forbiddenCharacters)) === null || _key$match === void 0 ? void 0 : _key$match.length) ?? 0) === 0;
14
+ }, 'Key cannot contain the following characters: ":" or "#"');
15
+ class Cache {
16
+ async get(key) {
17
+ try {
18
+ const parsedKey = keySchema.parse(key);
19
+ const response = await (0, _jwtTokenManager.callBackendFunctionWithToken)(`cache/${parsedKey}`, {
20
+ method: "GET"
21
+ });
22
+ const contentType = response.headers.get("content-type");
23
+ if (!(contentType !== null && contentType !== void 0 && contentType.includes("application/json"))) {
24
+ const responseText = await response.text();
25
+ throw new Error(`Server returned ${contentType} instead of JSON. This usually indicates an authentication issue or wrong endpoint. Response: ${responseText.substring(0, 200)}...`);
26
+ }
27
+ const json = await response.json();
28
+ if (!response.ok) {
29
+ throw new Error(`Failed to get cache value for key ${parsedKey}: ${json.message}`);
30
+ }
31
+ return json.value;
32
+ } catch (error) {
33
+ throw new Error(`Failed to get cache value for key ${key}: ${error}`);
34
+ }
35
+ }
36
+ async set(key, value) {
37
+ try {
38
+ const keyResult = keySchema.parse(key);
39
+ const response = await (0, _jwtTokenManager.callBackendFunctionWithToken)(`cache/${keyResult}`, {
40
+ method: "PUT",
41
+ body: JSON.stringify(value),
42
+ headers: {
43
+ "Content-Type": "application/json"
44
+ }
45
+ });
46
+ const contentType = response.headers.get("content-type");
47
+ if (!(contentType !== null && contentType !== void 0 && contentType.includes("application/json"))) {
48
+ const responseText = await response.text();
49
+ _Logger.logger.error(`Expected JSON but got content-type: ${contentType}`);
50
+ throw new Error(`Server returned ${contentType} instead of JSON. This usually indicates an authentication issue or wrong endpoint. Response: ${responseText.substring(0, 200)}...`);
51
+ }
52
+ const json = await response.json();
53
+ if (!response.ok) {
54
+ throw new Error(`Failed to set cache value for key ${keyResult}: ${json.message}`);
55
+ }
56
+ } catch (error) {
57
+ throw new Error(`Failed to set cache value for key ${key}: ${error}`);
58
+ }
59
+ }
60
+ }
61
+ const cache = exports.cache = new Cache();
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "cache", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _cache.cache;
10
+ }
11
+ });
12
+ var _cache = require("./cache");
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("../../../common/extendedTest");
4
+ var _cache = require("../cache");
5
+ var _vitest = require("vitest");
6
+ var _jwtTokenManager = require("../../../common/jwtTokenManager");
7
+ _vitest.vi.mock("../../../common/jwtTokenManager", () => ({
8
+ callBackendFunctionWithToken: _vitest.vi.fn()
9
+ }));
10
+ const mockCallBackendFunction = _vitest.vi.mocked(_jwtTokenManager.callBackendFunctionWithToken);
11
+ (0, _extendedTest.describe)("Cache", () => {
12
+ (0, _extendedTest.beforeEach)(() => {
13
+ _vitest.vi.clearAllMocks();
14
+ });
15
+ (0, _extendedTest.describe)("get", () => {
16
+ (0, _extendedTest.it)("should return value when successful", async () => {
17
+ const mockResponse = {
18
+ ok: true,
19
+ headers: {
20
+ get: _vitest.vi.fn().mockReturnValue("application/json")
21
+ },
22
+ json: _vitest.vi.fn().mockResolvedValue({
23
+ value: "cached_data"
24
+ })
25
+ };
26
+ mockCallBackendFunction.mockResolvedValue(mockResponse);
27
+ const result = await _cache.cache.get("test_key");
28
+ (0, _extendedTest.expect)(result).toBe("cached_data");
29
+ (0, _extendedTest.expect)(mockCallBackendFunction).toHaveBeenCalledWith("cache/test_key", {
30
+ method: "GET"
31
+ });
32
+ (0, _extendedTest.expect)(mockResponse.json).toHaveBeenCalled();
33
+ });
34
+ (0, _extendedTest.it)("should throw error when response is not ok", async () => {
35
+ const mockResponse = {
36
+ ok: false,
37
+ headers: {
38
+ get: _vitest.vi.fn().mockReturnValue("application/json")
39
+ },
40
+ json: _vitest.vi.fn().mockResolvedValue({
41
+ message: "Cache miss"
42
+ })
43
+ };
44
+ mockCallBackendFunction.mockResolvedValue(mockResponse);
45
+ await (0, _extendedTest.expect)(_cache.cache.get("test_key")).rejects.toThrow("Failed to get cache value for key test_key: Cache miss");
46
+ });
47
+ (0, _extendedTest.it)("should throw error for empty key", async () => {
48
+ await (0, _extendedTest.expect)(_cache.cache.get("")).rejects.toThrow("Failed to get cache value for key : [");
49
+ });
50
+ (0, _extendedTest.it)("should throw error for key with colon", async () => {
51
+ await (0, _extendedTest.expect)(_cache.cache.get("invalid:key")).rejects.toThrow("Failed to get cache value for key invalid:key: [");
52
+ });
53
+ (0, _extendedTest.it)("should throw error for key with hash", async () => {
54
+ await (0, _extendedTest.expect)(_cache.cache.get("invalid#key")).rejects.toThrow("Failed to get cache value for key invalid#key: [");
55
+ });
56
+ });
57
+ (0, _extendedTest.describe)("set", () => {
58
+ (0, _extendedTest.it)("should call backend correctly when successful", async () => {
59
+ const mockResponse = {
60
+ ok: true,
61
+ headers: {
62
+ get: _vitest.vi.fn().mockReturnValue("application/json")
63
+ },
64
+ json: _vitest.vi.fn().mockResolvedValue({})
65
+ };
66
+ mockCallBackendFunction.mockResolvedValue(mockResponse);
67
+ const testValue = {
68
+ data: "test"
69
+ };
70
+ await _cache.cache.set("test_key", testValue);
71
+ (0, _extendedTest.expect)(mockCallBackendFunction).toHaveBeenCalledWith("cache/test_key", {
72
+ method: "PUT",
73
+ body: JSON.stringify(testValue),
74
+ headers: {
75
+ "Content-Type": "application/json"
76
+ }
77
+ });
78
+ (0, _extendedTest.expect)(mockResponse.json).toHaveBeenCalled();
79
+ });
80
+ (0, _extendedTest.it)("should throw error when response is not ok", async () => {
81
+ const mockResponse = {
82
+ ok: false,
83
+ headers: {
84
+ get: _vitest.vi.fn().mockReturnValue("application/json")
85
+ },
86
+ json: _vitest.vi.fn().mockResolvedValue({
87
+ message: "Set failed"
88
+ })
89
+ };
90
+ mockCallBackendFunction.mockResolvedValue(mockResponse);
91
+ await (0, _extendedTest.expect)(_cache.cache.set("test_key", "value")).rejects.toThrow("Failed to set cache value for key test_key: Set failed");
92
+ });
93
+ (0, _extendedTest.it)("should throw error for empty key", async () => {
94
+ await (0, _extendedTest.expect)(_cache.cache.set("", "value")).rejects.toThrow("Failed to set cache value for key : [");
95
+ });
96
+ (0, _extendedTest.it)("should throw error for key with forbidden characters", async () => {
97
+ await (0, _extendedTest.expect)(_cache.cache.set("invalid:key", "value")).rejects.toThrow("Failed to set cache value for key invalid:key: [");
98
+ await (0, _extendedTest.expect)(_cache.cache.set("invalid#key", "value")).rejects.toThrow("Failed to set cache value for key invalid#key: [");
99
+ });
100
+ (0, _extendedTest.it)("should handle different value types", async () => {
101
+ const mockResponse = {
102
+ ok: true,
103
+ headers: {
104
+ get: _vitest.vi.fn().mockReturnValue("application/json")
105
+ },
106
+ json: _vitest.vi.fn().mockResolvedValue({})
107
+ };
108
+ mockCallBackendFunction.mockResolvedValue(mockResponse);
109
+ await _cache.cache.set("key1", "string_value");
110
+ await _cache.cache.set("key2", {
111
+ object: "value"
112
+ });
113
+ await _cache.cache.set("key3", 123);
114
+ (0, _extendedTest.expect)(mockCallBackendFunction).toHaveBeenCalledTimes(3);
115
+ });
116
+ });
117
+ });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildExamplesPrompt = buildExamplesPrompt;
7
+ function buildExamplesPrompt({
8
+ entityName,
9
+ examples
10
+ }) {
11
+ return `Ensure your extraction of ` + entityName + ` matches these examples in format and content. Follow these guidelines:` + "\n" + `1. **String Data**: Match the formatting and any transformations applied in the examples. If strings were reformed or parts were removed in the examples, apply the same changes to your extraction,.` + "\n" + `2. **Numerical Data**: Keep numbers in the same format as the examples. Ensure consistency in units, rounding, and notation.` + "\n" + `3. **Date Data**: Align the date format with the examples provided. Maintain the same order, separators, and any additional formatting rules.` + "\n" + `Consistency with these examples is crucial for accurate data extraction:` + "\n" + examples.map((e, index) => `${index}. ` + JSON.stringify(e)).join("\n");
12
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildImagesFromPageOrHandle = buildImagesFromPageOrHandle;
7
+ exports.captureFullPageImagesWithOverlap = captureFullPageImagesWithOverlap;
8
+ var _neverthrow = require("neverthrow");
9
+ var errors = _interopRequireWildcard(require("../types/errors"));
10
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
+ async function captureFullPageImagesWithOverlap(page, options = {
12
+ overlap: 200,
13
+ sliceHeight: 1000
14
+ }) {
15
+ const totalHeight = await page.evaluate(() => document.body.scrollHeight);
16
+ let currentHeight = 0;
17
+ const buffers = [];
18
+ while (currentHeight < totalHeight) {
19
+ if (buffers.length > 10) {
20
+ console.info(`the page is too long, only first ${totalHeight} px of the page will be captured.`);
21
+ break;
22
+ }
23
+ await page.setViewportSize({
24
+ width: 1200,
25
+ height: options.sliceHeight
26
+ });
27
+ await page.evaluate(y => window.scrollTo(0, y), currentHeight - (currentHeight > 0 ? options.overlap : 0));
28
+ await page.waitForTimeout(500);
29
+ const buffer = await page.screenshot();
30
+ buffers.push(buffer);
31
+ currentHeight += options.sliceHeight - options.overlap;
32
+ }
33
+ return buffers;
34
+ }
35
+ async function buildImagesFromPageOrHandle(page, searchRegionHandler) {
36
+ const originalViewPortSize = page.viewportSize();
37
+ await page.setViewportSize({
38
+ width: 1200,
39
+ height: 800
40
+ });
41
+ if (searchRegionHandler) {
42
+ const size = await searchRegionHandler.boundingBox();
43
+ if (!size) {
44
+ return (0, _neverthrow.err)(errors.other("the provided search region is very large, image extraction support up to 5000px height."));
45
+ }
46
+ return (0, _neverthrow.ok)([await searchRegionHandler.screenshot({
47
+ type: "png"
48
+ })]);
49
+ }
50
+ const fullPageImages = await captureFullPageImagesWithOverlap(page);
51
+ if (originalViewPortSize) {
52
+ await page.setViewportSize(originalViewPortSize);
53
+ }
54
+ return (0, _neverthrow.ok)(fullPageImages);
55
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractStructuredDataUsingClaude = extractStructuredDataUsingClaude;
7
+ var _anthropicModel = require("../models/anthropicModel");
8
+ var _neverthrow = require("neverthrow");
9
+ var Errors = _interopRequireWildcard(require("../types/errors"));
10
+ var _utils = require("./utils");
11
+ var _Logger = require("../../common/Logger");
12
+ var _aiModelsValidations = require("../../common/aiModelsValidations");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ async function extractStructuredDataUsingClaude(input) {
15
+ const {
16
+ entityName,
17
+ model,
18
+ jsonSchema: originalJsonSchema,
19
+ systemMessage,
20
+ text,
21
+ extraUserMessages,
22
+ images,
23
+ apiKey
24
+ } = input;
25
+ const processedJsonSchema = (0, _utils.processInputSchema)(originalJsonSchema, entityName);
26
+ const toolName = `extract_${entityName}`;
27
+ const content = [];
28
+ if (extraUserMessages) {
29
+ const mappedExtraMessages = extraUserMessages.map(message => ({
30
+ type: "text",
31
+ text: message
32
+ }));
33
+ content.push(...mappedExtraMessages);
34
+ }
35
+ content.push({
36
+ type: "text",
37
+ text: `extract ` + entityName + ` from the text and images, Use must the ` + toolName + ` tool, ` + (originalJsonSchema.description ? entityName + ` is ` + originalJsonSchema.description : "")
38
+ });
39
+ if (text) {
40
+ content.push(...text.map(t => ({
41
+ type: "text",
42
+ text: t
43
+ })));
44
+ }
45
+ if (images) {
46
+ const imagesContent = images.map(image => ({
47
+ type: "image",
48
+ source: {
49
+ data: image.data.toString("base64"),
50
+ media_type: `image/${image.image_type}`,
51
+ type: "base64"
52
+ }
53
+ }));
54
+ content.push(...imagesContent);
55
+ }
56
+ const anthropic = (0, _anthropicModel.createAnthropicInstance)({
57
+ apiKey
58
+ });
59
+ const modelName = _aiModelsValidations.CLAUDE_MODELS_MAPPINGS[model] ?? model;
60
+ const maxTokens = _aiModelsValidations.MAX_TOKENS_OVERRIDES[modelName] ?? 4096;
61
+ const response = await (0, _neverthrow.fromPromise)(anthropic.messages.create({
62
+ max_tokens: maxTokens,
63
+ temperature: 0,
64
+ system: `${systemMessage ?? ""}`,
65
+ messages: [{
66
+ role: "user",
67
+ content
68
+ }],
69
+ model: modelName,
70
+ tools: [{
71
+ input_schema: processedJsonSchema,
72
+ name: toolName,
73
+ description: `Extract ` + entityName + ` mentioned in the text or images. Relay on the parameters for more info. always use this tool when you are asked to extract data. you should respect the provided schema even if it was multiple levels deep, undefined is not an accepted input, please never respond with it.`
74
+ }, {
75
+ name: "no_data_found",
76
+ description: `you should call this tool you are asked to extract data using ` + toolName + ` and you couldn't find any data, make this your last resort, if you are sure that there is no data in the text or images.`,
77
+ input_schema: {
78
+ type: "object",
79
+ properties: null
80
+ }
81
+ }]
82
+ }).withResponse(), error => {
83
+ var _typedError$error, _typedError$error2;
84
+ const typedError = error;
85
+ if ((typedError === null || typedError === void 0 ? void 0 : typedError.status) === 449) {
86
+ return Errors.insufficientAiCredits(typedError.error.error);
87
+ }
88
+ if ((typedError === null || typedError === void 0 ? void 0 : typedError.status) === 413) {
89
+ return Errors.AiCallFailed("content should not exceed 10mb", error);
90
+ }
91
+ if ((typedError === null || typedError === void 0 ? void 0 : typedError.status) === 400 && typeof (typedError === null || typedError === void 0 || (_typedError$error = typedError.error) === null || _typedError$error === void 0 ? void 0 : _typedError$error.error) === "object" && typedError !== null && typedError !== void 0 && (_typedError$error2 = typedError.error) !== null && _typedError$error2 !== void 0 && (_typedError$error2 = _typedError$error2.error) !== null && _typedError$error2 !== void 0 && (_typedError$error2 = _typedError$error2.message) !== null && _typedError$error2 !== void 0 && _typedError$error2.includes("prompt is too long:")) {
92
+ return Errors.AiCallFailed("content exceeded model max capacity", error);
93
+ }
94
+ return Errors.AiCallFailed(`Failed to call claude api with status ${typedError === null || typedError === void 0 ? void 0 : typedError.status}: ${error.message}`, error);
95
+ });
96
+ if (response.isErr()) {
97
+ return (0, _neverthrow.err)(response.error);
98
+ }
99
+ const unwrappedResponse = response.value.data;
100
+ if (unwrappedResponse.stop_reason === "max_tokens") {
101
+ return (0, _neverthrow.err)(Errors.AiCallFailed("response from ai exceeds model maximum output tokens, try to be more specific with what data you need to extract"));
102
+ }
103
+ if (unwrappedResponse.stop_reason !== "tool_use") {
104
+ return (0, _neverthrow.err)(Errors.NoToolUsage("the model was not able to extract data correctly, please try to modify your prompt and schema to give more context."));
105
+ }
106
+ const noDataFound = unwrappedResponse.content.some(content => content.type === "tool_use" && content.name == "no_data_found");
107
+ if (noDataFound) {
108
+ return (0, _neverthrow.err)(Errors.NoDataFound("data isn't found in the text or images."));
109
+ }
110
+ const tool = unwrappedResponse.content.find(content => content.type === "tool_use" && content.name == toolName);
111
+ if (!tool) {
112
+ return (0, _neverthrow.err)(Errors.NoToolUsage("the model was not able to extract data correctly, please try to modify your prompt and schema to give more context."));
113
+ }
114
+ if (!tool.input) {
115
+ return (0, _neverthrow.err)(Errors.invalidExtractionResult("the model was not able to extract data correctly, please try to modify your prompt and schema to give more context."));
116
+ }
117
+ if (originalJsonSchema.type === "array" && tool.input[entityName] === "undefined") {
118
+ return (0, _neverthrow.err)(Errors.invalidExtractionResult("the model was not able to extract data correctly"));
119
+ }
120
+ const result = (0, _utils.getResultFromOutputSchema)(originalJsonSchema, entityName, tool.input);
121
+ const callCost = response.value.response.headers.get("x-ai-cost-in-cents");
122
+ if (input.logAiCallCost) {
123
+ if (apiKey) {
124
+ _Logger.logger.info(`extractor ${input.identifier}: AI cost is not calculated (using custom API key)`);
125
+ } else if (callCost) {
126
+ const cost = parseFloat(callCost);
127
+ if (!isNaN(cost)) {
128
+ _Logger.logger.info(`extractor ${input.identifier}: AI cost is $${cost / 100}`);
129
+ }
130
+ }
131
+ }
132
+ return (0, _neverthrow.ok)({
133
+ result
134
+ });
135
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractStructuredDataUsingGoogle = extractStructuredDataUsingGoogle;
7
+ var _aiModelsValidations = require("../../common/aiModelsValidations");
8
+ var _extractStrucutredDataUsingAiInstance = require("./extractStrucutredDataUsingAiInstance");
9
+ var Errors = _interopRequireWildcard(require("../types/errors"));
10
+ var _neverthrow = require("neverthrow");
11
+ var _google = require("@ai-sdk/google");
12
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
13
+ async function extractStructuredDataUsingGoogle(input) {
14
+ var _input$text;
15
+ if (!input.apiKey) {
16
+ return (0, _neverthrow.err)(Errors.invalidInput("Google AI is only supported with a custom API key. Please provide it or use a different AI provider."));
17
+ }
18
+ let model = input.model;
19
+ if (input.model in _aiModelsValidations.MODELS_MAPPINGS) {
20
+ model = _aiModelsValidations.MODELS_MAPPINGS[input.model];
21
+ }
22
+ const googleGenAi = (0, _google.createGoogleGenerativeAI)({
23
+ apiKey: input.apiKey
24
+ });
25
+ const extraMessages = input.extraUserMessages ?? [];
26
+ if (extraMessages.length === 0 && (((_input$text = input.text) === null || _input$text === void 0 ? void 0 : _input$text.length) ?? 0) === 0) {
27
+ var _input$images;
28
+ extraMessages.push("Use the following image" + ((((_input$images = input.images) === null || _input$images === void 0 ? void 0 : _input$images.length) ?? 0) > 1 ? "s" : ""));
29
+ }
30
+ return (0, _extractStrucutredDataUsingAiInstance.extractStructuredDataUsingAiInstance)({
31
+ ...input,
32
+ extraUserMessages: extraMessages,
33
+ model: googleGenAi(model),
34
+ apiName: "google",
35
+ maxTokens: _aiModelsValidations.MAX_TOKENS_OVERRIDES[model]
36
+ });
37
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractStructuredDataUsingOpenAi = extractStructuredDataUsingOpenAi;
7
+ var _neverthrow = require("neverthrow");
8
+ var Errors = _interopRequireWildcard(require("../types/errors"));
9
+ var _utils = require("./utils");
10
+ var _Logger = require("../../common/Logger");
11
+ var _aiModelsValidations = require("../../common/aiModelsValidations");
12
+ var _openaiModel = require("../models/openaiModel");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
14
+ async function extractStructuredDataUsingOpenAi(input) {
15
+ var _completion$value$dat, _completion$value$dat2;
16
+ const {
17
+ entityName,
18
+ model,
19
+ jsonSchema: originalJsonSchema,
20
+ systemMessage,
21
+ text,
22
+ extraUserMessages,
23
+ images,
24
+ apiKey
25
+ } = input;
26
+ if (images && images.length > 0 && model === "gpt3.5-turbo") {
27
+ return (0, _neverthrow.err)(Errors.invalidInput("Images are only supported for gpt4-turbo and gpt-4o models"));
28
+ }
29
+ const processedJsonSchema = (0, _utils.processInputSchema)(originalJsonSchema, entityName);
30
+ const content = [];
31
+ if (extraUserMessages) {
32
+ content.push(...extraUserMessages.map(message => ({
33
+ type: "text",
34
+ text: message
35
+ })));
36
+ }
37
+ if (text) {
38
+ content.push(...text.map(t => ({
39
+ type: "text",
40
+ text: t
41
+ })));
42
+ }
43
+ if (images) {
44
+ const imageContent = images.map(image => ({
45
+ type: "image_url",
46
+ image_url: {
47
+ url: `data:image/${image.image_type};base64,${image.data.toString("base64")}`,
48
+ detail: "high"
49
+ }
50
+ }));
51
+ content.push(...imageContent);
52
+ }
53
+ const modelName = _aiModelsValidations.MODELS_MAPPINGS[input.model] ?? input.model;
54
+ const toolName = `extract_${entityName}`;
55
+ const openAiInstance = (0, _openaiModel.createOpenAIInstance)({
56
+ apiKey
57
+ });
58
+ const completion = await (0, _neverthrow.fromPromise)(openAiInstance.chat.completions.create({
59
+ max_tokens: 4000,
60
+ temperature: 0,
61
+ model: modelName,
62
+ messages: [{
63
+ role: "system",
64
+ content: `${systemMessage ?? ""}, ` + `using the ` + (originalJsonSchema.description ? `. Here is more info about the entity that we are trying to extract: ` + originalJsonSchema.description : "")
65
+ }, {
66
+ role: "user",
67
+ content
68
+ }],
69
+ function_call: {
70
+ name: toolName
71
+ },
72
+ functions: [{
73
+ name: "no_data_found",
74
+ description: `you should call this tool you are asked to extract data using ` + toolName + ` and you couldn't find any data, make this your last resort, if you are sure that there is no data in the text or images`
75
+ }, {
76
+ name: toolName,
77
+ description: `Extract ` + entityName + ` mentioned in the text and images. Relay on the parameters for more info.`,
78
+ parameters: processedJsonSchema
79
+ }]
80
+ }).withResponse(), error => {
81
+ const typedError = error;
82
+ if ((typedError === null || typedError === void 0 ? void 0 : typedError.status) === 449) {
83
+ var _typedError$error;
84
+ return Errors.insufficientAiCredits(typedError === null || typedError === void 0 || (_typedError$error = typedError.error) === null || _typedError$error === void 0 ? void 0 : _typedError$error.error);
85
+ }
86
+ if ((error === null || error === void 0 ? void 0 : error.status) === 400 && ["context_length_exceeded", "string_above_max_length"].includes(error === null || error === void 0 ? void 0 : error.code)) {
87
+ return Errors.AiCallFailed("content exceeded model max capacity", error);
88
+ }
89
+ return Errors.AiCallFailed(`Failed to call openai api with status ${typedError === null || typedError === void 0 ? void 0 : typedError.status}: ${error.message}`, error);
90
+ });
91
+ if (completion.isErr()) {
92
+ return (0, _neverthrow.err)(completion.error);
93
+ }
94
+ if (completion.value.data.choices[0].finish_reason === "length") {
95
+ return (0, _neverthrow.err)(Errors.AiCallFailed("response from ai exceeds model maximum output tokens, try to be more specific with what data you need to extract"));
96
+ }
97
+ const noDataFound = (_completion$value$dat = completion.value.data.choices[0].message.tool_calls) === null || _completion$value$dat === void 0 ? void 0 : _completion$value$dat.some(content => content.type === "function" && content.function.name == "no_data_found");
98
+ if (noDataFound) {
99
+ return (0, _neverthrow.err)(Errors.NoDataFound("data isn't found in the text or images."));
100
+ }
101
+ let functionCall = (_completion$value$dat2 = completion.value.data.choices[0].message.tool_calls) === null || _completion$value$dat2 === void 0 || (_completion$value$dat2 = _completion$value$dat2.find(t => t.type === "function" && t.function.name === toolName)) === null || _completion$value$dat2 === void 0 ? void 0 : _completion$value$dat2.function;
102
+ if (!functionCall) {
103
+ functionCall = completion.value.data.choices[0].message.function_call;
104
+ if (!functionCall) {
105
+ return (0, _neverthrow.err)(Errors.NoToolUsage("the model was not able to extract data correctly."));
106
+ }
107
+ }
108
+ const extractedData = functionCall.arguments;
109
+ if (!extractedData) return (0, _neverthrow.err)(Errors.invalidExtractionResult("No extraction result found."));
110
+ const escapedString = extractedData.replace(/[\t\n\r\f\v]/g, " ");
111
+ const jsonParse = (0, _neverthrow.fromThrowable)(JSON.parse, () => Errors.invalidExtractionResult("Failed to parse extraction result."));
112
+ const parsedData = jsonParse(escapedString);
113
+ if (parsedData.isErr()) {
114
+ return (0, _neverthrow.err)(parsedData.error);
115
+ }
116
+ const result = (0, _utils.getResultFromOutputSchema)(originalJsonSchema, entityName, parsedData.value);
117
+ const formatted = (0, _utils.cleanupAiResult)(result);
118
+ const callCost = completion.value.response.headers.get("x-ai-cost-in-cents");
119
+ if (input.logAiCallCost) {
120
+ if (apiKey) {
121
+ _Logger.logger.info(`extractor ${input.identifier}: AI cost is not calculated (using custom API key)`);
122
+ } else if (callCost) {
123
+ const cost = parseFloat(callCost);
124
+ if (!isNaN(cost)) {
125
+ _Logger.logger.info(`extractor ${input.identifier}: AI cost is $${cost / 100}`);
126
+ }
127
+ }
128
+ }
129
+ return (0, _neverthrow.ok)({
130
+ result: formatted
131
+ });
132
+ }