@soulcraft/brainy 0.40.0 → 0.43.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 (152) hide show
  1. package/README.md +605 -194
  2. package/dist/augmentations/conduitAugmentations.js +1158 -0
  3. package/dist/augmentations/conduitAugmentations.js.map +1 -0
  4. package/dist/augmentations/memoryAugmentations.d.ts +2 -0
  5. package/dist/augmentations/memoryAugmentations.d.ts.map +1 -1
  6. package/dist/augmentations/memoryAugmentations.js +270 -0
  7. package/dist/augmentations/memoryAugmentations.js.map +1 -0
  8. package/dist/augmentations/serverSearchAugmentations.js +531 -0
  9. package/dist/augmentations/serverSearchAugmentations.js.map +1 -0
  10. package/dist/browserFramework.d.ts +15 -0
  11. package/dist/demo.d.ts +106 -0
  12. package/dist/examples/basicUsage.js +118 -0
  13. package/dist/examples/basicUsage.js.map +1 -0
  14. package/dist/hnsw/distributedSearch.js +452 -0
  15. package/dist/hnsw/distributedSearch.js.map +1 -0
  16. package/dist/hnsw/hnswIndex.js +602 -0
  17. package/dist/hnsw/hnswIndex.js.map +1 -0
  18. package/dist/hnsw/hnswIndexOptimized.js +471 -0
  19. package/dist/hnsw/hnswIndexOptimized.js.map +1 -0
  20. package/dist/hnsw/optimizedHNSWIndex.js +313 -0
  21. package/dist/hnsw/optimizedHNSWIndex.js.map +1 -0
  22. package/dist/hnsw/partitionedHNSWIndex.js +304 -0
  23. package/dist/hnsw/partitionedHNSWIndex.js.map +1 -0
  24. package/dist/hnsw/scaledHNSWSystem.js +559 -0
  25. package/dist/hnsw/scaledHNSWSystem.js.map +1 -0
  26. package/dist/index.d.ts +5 -3
  27. package/dist/index.js +81 -0
  28. package/dist/mcp/brainyMCPAdapter.js +142 -0
  29. package/dist/mcp/brainyMCPAdapter.js.map +1 -0
  30. package/dist/mcp/brainyMCPService.js +248 -0
  31. package/dist/mcp/brainyMCPService.js.map +1 -0
  32. package/dist/mcp/index.js +17 -0
  33. package/dist/mcp/index.js.map +1 -0
  34. package/dist/mcp/mcpAugmentationToolset.js +180 -0
  35. package/dist/mcp/mcpAugmentationToolset.js.map +1 -0
  36. package/dist/storage/adapters/baseStorageAdapter.js +349 -0
  37. package/dist/storage/adapters/baseStorageAdapter.js.map +1 -0
  38. package/dist/storage/adapters/batchS3Operations.js +287 -0
  39. package/dist/storage/adapters/batchS3Operations.js.map +1 -0
  40. package/dist/storage/adapters/fileSystemStorage.js +846 -0
  41. package/dist/storage/adapters/fileSystemStorage.js.map +1 -0
  42. package/dist/storage/adapters/memoryStorage.js +532 -0
  43. package/dist/storage/adapters/memoryStorage.js.map +1 -0
  44. package/dist/storage/adapters/opfsStorage.d.ts.map +1 -1
  45. package/dist/storage/adapters/opfsStorage.js +1118 -0
  46. package/dist/storage/adapters/opfsStorage.js.map +1 -0
  47. package/dist/storage/adapters/optimizedS3Search.d.ts +79 -0
  48. package/dist/storage/adapters/optimizedS3Search.d.ts.map +1 -0
  49. package/dist/storage/adapters/optimizedS3Search.js +248 -0
  50. package/dist/storage/adapters/optimizedS3Search.js.map +1 -0
  51. package/dist/storage/adapters/s3CompatibleStorage.d.ts +21 -0
  52. package/dist/storage/adapters/s3CompatibleStorage.d.ts.map +1 -1
  53. package/dist/storage/adapters/s3CompatibleStorage.js +2026 -0
  54. package/dist/storage/adapters/s3CompatibleStorage.js.map +1 -0
  55. package/dist/storage/baseStorage.d.ts +1 -0
  56. package/dist/storage/baseStorage.d.ts.map +1 -1
  57. package/dist/storage/baseStorage.js +603 -0
  58. package/dist/storage/baseStorage.js.map +1 -0
  59. package/dist/storage/cacheManager.js +1306 -0
  60. package/dist/storage/cacheManager.js.map +1 -0
  61. package/dist/storage/enhancedCacheManager.js +520 -0
  62. package/dist/storage/enhancedCacheManager.js.map +1 -0
  63. package/dist/storage/readOnlyOptimizations.js +425 -0
  64. package/dist/storage/readOnlyOptimizations.js.map +1 -0
  65. package/dist/storage/storageFactory.d.ts +0 -1
  66. package/dist/storage/storageFactory.d.ts.map +1 -1
  67. package/dist/storage/storageFactory.js +227 -0
  68. package/dist/storage/storageFactory.js.map +1 -0
  69. package/dist/types/augmentations.js +16 -0
  70. package/dist/types/augmentations.js.map +1 -0
  71. package/dist/types/brainyDataInterface.js +8 -0
  72. package/dist/types/brainyDataInterface.js.map +1 -0
  73. package/dist/types/distributedTypes.js +6 -0
  74. package/dist/types/distributedTypes.js.map +1 -0
  75. package/dist/types/fileSystemTypes.js +8 -0
  76. package/dist/types/fileSystemTypes.js.map +1 -0
  77. package/dist/types/graphTypes.js +247 -0
  78. package/dist/types/graphTypes.js.map +1 -0
  79. package/dist/types/mcpTypes.js +22 -0
  80. package/dist/types/mcpTypes.js.map +1 -0
  81. package/dist/types/paginationTypes.js +5 -0
  82. package/dist/types/paginationTypes.js.map +1 -0
  83. package/dist/types/pipelineTypes.js +7 -0
  84. package/dist/types/pipelineTypes.js.map +1 -0
  85. package/dist/types/tensorflowTypes.js +6 -0
  86. package/dist/types/tensorflowTypes.js.map +1 -0
  87. package/dist/unified.js +52 -128048
  88. package/dist/utils/autoConfiguration.js +341 -0
  89. package/dist/utils/autoConfiguration.js.map +1 -0
  90. package/dist/utils/cacheAutoConfig.js +261 -0
  91. package/dist/utils/cacheAutoConfig.js.map +1 -0
  92. package/dist/utils/crypto.js +45 -0
  93. package/dist/utils/crypto.js.map +1 -0
  94. package/dist/utils/distance.js +239 -0
  95. package/dist/utils/distance.js.map +1 -0
  96. package/dist/utils/embedding.d.ts.map +1 -1
  97. package/dist/utils/embedding.js +702 -0
  98. package/dist/utils/embedding.js.map +1 -0
  99. package/dist/utils/environment.js +75 -0
  100. package/dist/utils/environment.js.map +1 -0
  101. package/dist/utils/fieldNameTracking.js +90 -0
  102. package/dist/utils/fieldNameTracking.js.map +1 -0
  103. package/dist/utils/index.d.ts +1 -0
  104. package/dist/utils/index.d.ts.map +1 -1
  105. package/dist/utils/index.js +8 -0
  106. package/dist/utils/index.js.map +1 -0
  107. package/dist/utils/jsonProcessing.js +179 -0
  108. package/dist/utils/jsonProcessing.js.map +1 -0
  109. package/dist/utils/logger.d.ts +45 -92
  110. package/dist/utils/logger.d.ts.map +1 -1
  111. package/dist/utils/logger.js +129 -0
  112. package/dist/utils/logger.js.map +1 -0
  113. package/dist/utils/operationUtils.js +126 -0
  114. package/dist/utils/operationUtils.js.map +1 -0
  115. package/dist/utils/robustModelLoader.d.ts +14 -0
  116. package/dist/utils/robustModelLoader.d.ts.map +1 -1
  117. package/dist/utils/robustModelLoader.js +537 -0
  118. package/dist/utils/robustModelLoader.js.map +1 -0
  119. package/dist/utils/searchCache.js +248 -0
  120. package/dist/utils/searchCache.js.map +1 -0
  121. package/dist/utils/statistics.js +25 -0
  122. package/dist/utils/statistics.js.map +1 -0
  123. package/dist/utils/statisticsCollector.js +224 -0
  124. package/dist/utils/statisticsCollector.js.map +1 -0
  125. package/dist/utils/textEncoding.js +309 -0
  126. package/dist/utils/textEncoding.js.map +1 -0
  127. package/dist/utils/typeUtils.js +40 -0
  128. package/dist/utils/typeUtils.js.map +1 -0
  129. package/dist/utils/version.d.ts +15 -3
  130. package/dist/utils/version.d.ts.map +1 -1
  131. package/dist/utils/version.js +24 -0
  132. package/dist/utils/version.js.map +1 -0
  133. package/dist/utils/workerUtils.js +458 -0
  134. package/dist/utils/workerUtils.js.map +1 -0
  135. package/package.json +23 -15
  136. package/dist/brainy.js +0 -90220
  137. package/dist/brainy.min.js +0 -12511
  138. package/dist/patched-platform-node.d.ts +0 -17
  139. package/dist/statistics/statisticsManager.d.ts +0 -121
  140. package/dist/storage/fileSystemStorage.d.ts +0 -73
  141. package/dist/storage/fileSystemStorage.d.ts.map +0 -1
  142. package/dist/storage/opfsStorage.d.ts +0 -236
  143. package/dist/storage/opfsStorage.d.ts.map +0 -1
  144. package/dist/storage/s3CompatibleStorage.d.ts +0 -157
  145. package/dist/storage/s3CompatibleStorage.d.ts.map +0 -1
  146. package/dist/testing/prettyReporter.d.ts +0 -23
  147. package/dist/testing/prettySummaryReporter.d.ts +0 -22
  148. package/dist/unified.min.js +0 -16153
  149. package/dist/utils/environmentDetection.d.ts +0 -47
  150. package/dist/utils/environmentDetection.d.ts.map +0 -1
  151. package/dist/utils/tensorflowUtils.d.ts +0 -17
  152. package/dist/utils/tensorflowUtils.d.ts.map +0 -1
@@ -0,0 +1,537 @@
1
+ /**
2
+ * Robust Model Loader - Enhanced model loading with retry mechanisms and fallbacks
3
+ *
4
+ * This module provides a more reliable way to load TensorFlow models with:
5
+ * - Exponential backoff retry mechanisms
6
+ * - Timeout handling
7
+ * - Multiple fallback strategies
8
+ * - Better error handling and logging
9
+ * - Optional local model bundling support
10
+ */
11
+ export class RobustModelLoader {
12
+ constructor(options = {}) {
13
+ this.loadAttempts = new Map();
14
+ // Check for environment variables
15
+ const envModelsPath = process.env.BRAINY_MODELS_PATH || process.env.MODELS_PATH;
16
+ // Auto-detect if we need to use an auto-extracted models directory
17
+ const autoDetectedPath = this.autoDetectModelsPath();
18
+ this.options = {
19
+ maxRetries: options.maxRetries ?? 3,
20
+ initialRetryDelay: options.initialRetryDelay ?? 1000,
21
+ maxRetryDelay: options.maxRetryDelay ?? 30000,
22
+ timeout: options.timeout ?? 60000, // 60 seconds
23
+ useExponentialBackoff: options.useExponentialBackoff ?? true,
24
+ fallbackUrls: options.fallbackUrls ?? [],
25
+ verbose: options.verbose ?? false,
26
+ preferLocalModel: options.preferLocalModel ?? true,
27
+ customModelsPath: options.customModelsPath ?? envModelsPath ?? autoDetectedPath
28
+ };
29
+ }
30
+ /**
31
+ * Auto-detect extracted models directory
32
+ */
33
+ autoDetectModelsPath() {
34
+ try {
35
+ // Check if we're in Node.js environment
36
+ const isNode = typeof process !== 'undefined' &&
37
+ process.versions != null &&
38
+ process.versions.node != null;
39
+ if (!isNode) {
40
+ return undefined;
41
+ }
42
+ // Try to detect extracted models directory
43
+ const possiblePaths = [
44
+ // Standard extraction location
45
+ './models',
46
+ '../models',
47
+ '/app/models',
48
+ // Project root relative paths
49
+ process.cwd() + '/models',
50
+ // Docker/container standard paths
51
+ '/usr/src/app/models',
52
+ '/home/app/models'
53
+ ];
54
+ // Use require to access fs and path synchronously (only in Node.js)
55
+ let fs, path;
56
+ try {
57
+ fs = require('fs');
58
+ path = require('path');
59
+ }
60
+ catch (error) {
61
+ // If require fails, we're probably in a browser environment
62
+ return undefined;
63
+ }
64
+ for (const modelPath of possiblePaths) {
65
+ try {
66
+ // Check for marker file that indicates successful extraction
67
+ const markerFile = path.join(modelPath, '.brainy-models-extracted');
68
+ if (fs.existsSync(markerFile)) {
69
+ console.log(`🎯 Auto-detected extracted models at: ${modelPath}`);
70
+ return modelPath;
71
+ }
72
+ // Fallback: check for universal-sentence-encoder directory
73
+ const useDir = path.join(modelPath, 'universal-sentence-encoder');
74
+ const modelJson = path.join(useDir, 'model.json');
75
+ if (fs.existsSync(modelJson)) {
76
+ console.log(`🎯 Auto-detected models directory at: ${modelPath}`);
77
+ return modelPath;
78
+ }
79
+ }
80
+ catch (error) {
81
+ continue;
82
+ }
83
+ }
84
+ return undefined;
85
+ }
86
+ catch (error) {
87
+ return undefined;
88
+ }
89
+ }
90
+ /**
91
+ * Load model with all available fallback strategies
92
+ */
93
+ async loadModelWithFallbacks() {
94
+ const startTime = Date.now();
95
+ this.log('Starting model loading with all fallback strategies');
96
+ // Try local bundled model first (from @soulcraft/brainy-models if available)
97
+ const localModel = await this.tryLoadLocalBundledModel();
98
+ if (localModel) {
99
+ const loadTime = Date.now() - startTime;
100
+ this.log(`✅ Model loaded successfully from local bundle in ${loadTime}ms`);
101
+ return localModel;
102
+ }
103
+ // Fallback to loading from URLs
104
+ console.warn('⚠️ Local model not found. Falling back to remote model loading.');
105
+ console.warn(' For best performance and reliability:');
106
+ console.warn(' 1. Install @soulcraft/brainy-models: npm install @soulcraft/brainy-models');
107
+ console.warn(' 2. Or set BRAINY_MODELS_PATH environment variable for Docker deployments');
108
+ console.warn(' 3. Or use customModelsPath option in RobustModelLoader');
109
+ const fallbackUrls = getUniversalSentenceEncoderFallbacks();
110
+ for (const url of fallbackUrls) {
111
+ try {
112
+ this.log(`Attempting to load model from: ${url}`);
113
+ const model = await this.withTimeout(this.loadFromUrl(url), this.options.timeout);
114
+ const loadTime = Date.now() - startTime;
115
+ // Verify it's the correct model by checking if it can embed text
116
+ try {
117
+ const testEmbedding = await model.embed('test');
118
+ if (!testEmbedding || (Array.isArray(testEmbedding) && testEmbedding.length !== 512)) {
119
+ throw new Error(`Model verification failed: incorrect embedding dimensions (expected 512, got ${Array.isArray(testEmbedding) ? testEmbedding.length : 'invalid'})`);
120
+ }
121
+ }
122
+ catch (verifyError) {
123
+ console.warn(`⚠️ Model verification failed for ${url}: ${verifyError}`);
124
+ continue;
125
+ }
126
+ console.warn(`✅ Successfully loaded Universal Sentence Encoder from remote URL: ${url}`);
127
+ console.warn(` Load time: ${loadTime}ms`);
128
+ return model;
129
+ }
130
+ catch (error) {
131
+ this.log(`Failed to load from ${url}: ${error}`);
132
+ }
133
+ }
134
+ throw new Error('Failed to load model from all available sources');
135
+ }
136
+ /**
137
+ * Load a model with robust retry and fallback mechanisms
138
+ */
139
+ async loadModel(primaryLoadFunction, modelIdentifier = 'default') {
140
+ const startTime = Date.now();
141
+ this.log(`Starting robust model loading for: ${modelIdentifier}`);
142
+ // Try local bundled model first if preferred
143
+ if (this.options.preferLocalModel) {
144
+ try {
145
+ const localModel = await this.tryLoadLocalBundledModel();
146
+ if (localModel) {
147
+ this.log(`Successfully loaded local bundled model in ${Date.now() - startTime}ms`);
148
+ return localModel;
149
+ }
150
+ }
151
+ catch (error) {
152
+ this.log(`Local bundled model not available: ${error}`);
153
+ }
154
+ }
155
+ // Try primary load function with retries
156
+ try {
157
+ const model = await this.loadWithRetries(primaryLoadFunction, `primary-${modelIdentifier}`);
158
+ this.log(`Successfully loaded model via primary method in ${Date.now() - startTime}ms`);
159
+ return model;
160
+ }
161
+ catch (primaryError) {
162
+ this.log(`Primary model loading failed: ${primaryError}`);
163
+ // Try fallback URLs if available
164
+ for (let i = 0; i < this.options.fallbackUrls.length; i++) {
165
+ const fallbackUrl = this.options.fallbackUrls[i];
166
+ this.log(`Trying fallback URL ${i + 1}/${this.options.fallbackUrls.length}: ${fallbackUrl}`);
167
+ try {
168
+ const fallbackModel = await this.loadWithRetries(() => this.loadFromUrl(fallbackUrl), `fallback-${i}-${modelIdentifier}`);
169
+ this.log(`Successfully loaded model via fallback ${i + 1} in ${Date.now() - startTime}ms`);
170
+ return fallbackModel;
171
+ }
172
+ catch (fallbackError) {
173
+ this.log(`Fallback ${i + 1} failed: ${fallbackError}`);
174
+ }
175
+ }
176
+ // All attempts failed
177
+ const totalTime = Date.now() - startTime;
178
+ const errorMessage = `All model loading attempts failed after ${totalTime}ms. Primary error: ${primaryError}`;
179
+ this.log(errorMessage);
180
+ throw new Error(errorMessage);
181
+ }
182
+ }
183
+ /**
184
+ * Load a model with retry logic and exponential backoff
185
+ */
186
+ async loadWithRetries(loadFunction, identifier) {
187
+ let lastError;
188
+ const currentAttempts = this.loadAttempts.get(identifier) || 0;
189
+ for (let attempt = currentAttempts; attempt <= this.options.maxRetries; attempt++) {
190
+ this.loadAttempts.set(identifier, attempt);
191
+ try {
192
+ this.log(`Attempt ${attempt + 1}/${this.options.maxRetries + 1} for ${identifier}`);
193
+ // Apply timeout to the load function
194
+ const model = await this.withTimeout(loadFunction(), this.options.timeout);
195
+ // Success - clear attempt counter
196
+ this.loadAttempts.delete(identifier);
197
+ return model;
198
+ }
199
+ catch (error) {
200
+ lastError = error;
201
+ this.log(`Attempt ${attempt + 1} failed: ${lastError.message}`);
202
+ // Don't retry on the last attempt
203
+ if (attempt === this.options.maxRetries) {
204
+ break;
205
+ }
206
+ // Calculate delay for next attempt
207
+ const delay = this.calculateRetryDelay(attempt);
208
+ this.log(`Retrying in ${delay}ms...`);
209
+ // Wait before next attempt
210
+ await this.sleep(delay);
211
+ }
212
+ }
213
+ // All retries exhausted
214
+ this.loadAttempts.delete(identifier);
215
+ throw lastError;
216
+ }
217
+ /**
218
+ * Try to load a locally bundled model
219
+ */
220
+ async tryLoadLocalBundledModel() {
221
+ try {
222
+ // First, try custom models directory if specified (for Docker deployments)
223
+ if (this.options.customModelsPath) {
224
+ console.log(`Checking custom models directory: ${this.options.customModelsPath}`);
225
+ const customModel = await this.tryLoadFromCustomPath(this.options.customModelsPath);
226
+ if (customModel) {
227
+ console.log('✅ Successfully loaded model from custom directory');
228
+ console.log(' Using custom model path for Docker/production deployment');
229
+ return customModel;
230
+ }
231
+ }
232
+ // Second, try to use @soulcraft/brainy-models package if available
233
+ try {
234
+ console.log('Checking for @soulcraft/brainy-models package...');
235
+ // Use dynamic import with string literal to avoid TypeScript compilation errors for optional dependency
236
+ const packageName = '@soulcraft/brainy-models';
237
+ const brainyModels = await import(packageName).catch(() => null);
238
+ if (brainyModels?.BundledUniversalSentenceEncoder) {
239
+ console.log('✅ Found @soulcraft/brainy-models package installed');
240
+ console.log(' Using local bundled model for maximum performance and reliability');
241
+ const encoder = new brainyModels.BundledUniversalSentenceEncoder({
242
+ verbose: this.options.verbose,
243
+ preferCompressed: false
244
+ });
245
+ await encoder.load();
246
+ console.log('✅ Local Universal Sentence Encoder model loaded successfully');
247
+ // Return a wrapper that matches the Universal Sentence Encoder interface
248
+ return {
249
+ init: async () => {
250
+ // Already initialized
251
+ },
252
+ embed: async (sentences) => {
253
+ const input = Array.isArray(sentences) ? sentences : [sentences];
254
+ const embeddings = await encoder.embedToArrays(input);
255
+ // Return the first embedding as a Vector (number[])
256
+ return embeddings[0] || [];
257
+ },
258
+ dispose: async () => {
259
+ encoder.dispose();
260
+ }
261
+ };
262
+ }
263
+ }
264
+ catch (importError) {
265
+ this.log(`@soulcraft/brainy-models not available: ${importError}`);
266
+ }
267
+ // Check if we're in Node.js environment
268
+ const isNode = typeof process !== 'undefined' &&
269
+ process.versions != null &&
270
+ process.versions.node != null;
271
+ if (isNode) {
272
+ try {
273
+ // Try to load from bundled model directory
274
+ // Use dynamic import with a non-literal string to prevent Rollup from bundling these
275
+ const pathModule = 'path';
276
+ const fsModule = 'fs';
277
+ const urlModule = 'url';
278
+ const path = await import(/* @vite-ignore */ pathModule);
279
+ const fs = await import(/* @vite-ignore */ fsModule);
280
+ const { fileURLToPath } = await import(/* @vite-ignore */ urlModule);
281
+ const __filename = fileURLToPath(import.meta.url);
282
+ const __dirname = path.dirname(__filename);
283
+ // Look for bundled model in multiple possible locations
284
+ const possiblePaths = [
285
+ path.join(__dirname, '..', '..', 'models', 'bundled', 'universal-sentence-encoder'),
286
+ path.join(__dirname, '..', '..', 'brainy-models-package', 'models', 'universal-sentence-encoder'),
287
+ path.join(process.cwd(), 'brainy-models-package', 'models', 'universal-sentence-encoder'),
288
+ path.join(__dirname, '..', '..', 'node_modules', '@soulcraft', 'brainy-models', 'models', 'universal-sentence-encoder'),
289
+ path.join(__dirname, '..', '..', 'node_modules', '@soulcraft', 'brainy-models', 'universal-sentence-encoder'),
290
+ path.join(process.cwd(), 'node_modules', '@soulcraft', 'brainy-models', 'universal-sentence-encoder')
291
+ ];
292
+ for (const modelPath of possiblePaths) {
293
+ const modelJsonPath = path.join(modelPath, 'model.json');
294
+ if (fs.existsSync(modelJsonPath)) {
295
+ this.log(`Found bundled model at: ${modelJsonPath}`);
296
+ // Load TensorFlow.js if not already loaded
297
+ const tf = await import('@tensorflow/tfjs');
298
+ // Read the model.json to check the format
299
+ const modelJsonContent = JSON.parse(fs.readFileSync(modelJsonPath, 'utf8'));
300
+ // Ensure the format field exists for TensorFlow.js compatibility
301
+ if (!modelJsonContent.format) {
302
+ modelJsonContent.format = 'tfjs-graph-model';
303
+ try {
304
+ fs.writeFileSync(modelJsonPath, JSON.stringify(modelJsonContent, null, 2));
305
+ this.log(`✅ Added missing "format" field to model.json for TensorFlow.js compatibility`);
306
+ }
307
+ catch (writeError) {
308
+ this.log(`⚠️ Could not write format field to model.json: ${writeError}`);
309
+ }
310
+ }
311
+ const modelFormat = modelJsonContent.format || 'tfjs-graph-model';
312
+ let model;
313
+ if (modelFormat === 'tfjs-graph-model') {
314
+ // Use loadGraphModel for graph models
315
+ model = await tf.loadGraphModel(`file://${modelJsonPath}`);
316
+ }
317
+ else {
318
+ // Use loadLayersModel for layers models (default)
319
+ model = await tf.loadLayersModel(`file://${modelJsonPath}`);
320
+ }
321
+ // Return a wrapper that matches the Universal Sentence Encoder interface
322
+ return this.createModelWrapper(model);
323
+ }
324
+ }
325
+ }
326
+ catch (nodeImportError) {
327
+ this.log(`Could not load Node.js modules in browser: ${nodeImportError}`);
328
+ }
329
+ }
330
+ return null;
331
+ }
332
+ catch (error) {
333
+ this.log(`Error checking for bundled model: ${error}`);
334
+ return null;
335
+ }
336
+ }
337
+ /**
338
+ * Try to load model from a custom directory path
339
+ */
340
+ async tryLoadFromCustomPath(customPath) {
341
+ try {
342
+ // Check if we're in Node.js environment
343
+ const isNode = typeof process !== 'undefined' &&
344
+ process.versions != null &&
345
+ process.versions.node != null;
346
+ if (!isNode) {
347
+ console.log('Custom model path only supported in Node.js environment');
348
+ return null;
349
+ }
350
+ // Dynamic imports to avoid bundling issues
351
+ const pathModule = 'path';
352
+ const fsModule = 'fs';
353
+ const path = await import(/* @vite-ignore */ pathModule);
354
+ const fs = await import(/* @vite-ignore */ fsModule);
355
+ // Look for models in standard subdirectories
356
+ const possibleModelPaths = [
357
+ // Direct path to universal-sentence-encoder
358
+ path.join(customPath, 'universal-sentence-encoder'),
359
+ // Mirroring @soulcraft/brainy-models structure
360
+ path.join(customPath, 'models', 'universal-sentence-encoder'),
361
+ // TensorFlow hub model structure
362
+ path.join(customPath, 'tfhub', 'universal-sentence-encoder'),
363
+ // Simple models directory
364
+ path.join(customPath, 'use'),
365
+ // Check if customPath itself contains model.json
366
+ customPath
367
+ ];
368
+ for (const modelPath of possibleModelPaths) {
369
+ const modelJsonPath = path.join(modelPath, 'model.json');
370
+ if (fs.existsSync(modelJsonPath)) {
371
+ console.log(`Found model at custom path: ${modelJsonPath}`);
372
+ // Load TensorFlow.js if not already loaded
373
+ const tf = await import('@tensorflow/tfjs');
374
+ // Read and validate the model.json
375
+ const modelJsonContent = JSON.parse(fs.readFileSync(modelJsonPath, 'utf8'));
376
+ // Ensure the format field exists for TensorFlow.js compatibility
377
+ if (!modelJsonContent.format) {
378
+ modelJsonContent.format = 'tfjs-graph-model';
379
+ try {
380
+ fs.writeFileSync(modelJsonPath, JSON.stringify(modelJsonContent, null, 2));
381
+ console.log(`✅ Added missing "format" field to model.json for TensorFlow.js compatibility`);
382
+ }
383
+ catch (writeError) {
384
+ console.log(`⚠️ Could not write format field to model.json: ${writeError}`);
385
+ }
386
+ }
387
+ const modelFormat = modelJsonContent.format || 'tfjs-graph-model';
388
+ let model;
389
+ if (modelFormat === 'tfjs-graph-model') {
390
+ // Use loadGraphModel for graph models
391
+ model = await tf.loadGraphModel(`file://${modelJsonPath}`);
392
+ }
393
+ else {
394
+ // Use loadLayersModel for layers models (default)
395
+ model = await tf.loadLayersModel(`file://${modelJsonPath}`);
396
+ }
397
+ // Return a wrapper that matches the Universal Sentence Encoder interface
398
+ return this.createModelWrapper(model);
399
+ }
400
+ }
401
+ console.log(`No model found in custom path: ${customPath}`);
402
+ return null;
403
+ }
404
+ catch (error) {
405
+ console.log(`Error loading from custom path ${customPath}: ${error}`);
406
+ return null;
407
+ }
408
+ }
409
+ /**
410
+ * Load model from a specific URL
411
+ */
412
+ async loadFromUrl(url) {
413
+ try {
414
+ this.log(`Loading model from URL: ${url}`);
415
+ // Import TensorFlow.js
416
+ const tf = await import('@tensorflow/tfjs');
417
+ // Load the model as a graph model
418
+ const model = await tf.loadGraphModel(url);
419
+ this.log(`✅ Successfully loaded model from: ${url}`);
420
+ // Return a wrapper that matches the Universal Sentence Encoder interface
421
+ return this.createModelWrapper(model);
422
+ }
423
+ catch (error) {
424
+ throw new Error(`Failed to load model from ${url}: ${error}`);
425
+ }
426
+ }
427
+ /**
428
+ * Create a model wrapper that matches the Universal Sentence Encoder interface
429
+ */
430
+ createModelWrapper(tfModel) {
431
+ return {
432
+ init: async () => {
433
+ // Model is already loaded
434
+ },
435
+ embed: async (sentences) => {
436
+ const tf = await import('@tensorflow/tfjs');
437
+ const input = Array.isArray(sentences) ? sentences : [sentences];
438
+ // Universal Sentence Encoder expects tokenized input
439
+ // For the tfhub model, we need to handle text preprocessing
440
+ // The model expects a tensor of strings
441
+ const inputTensor = tf.tensor(input);
442
+ try {
443
+ // Run the model prediction
444
+ const embeddings = await tfModel.predict(inputTensor);
445
+ // Convert to array and clean up
446
+ const result = await embeddings.array();
447
+ embeddings.dispose();
448
+ inputTensor.dispose();
449
+ // Return first embedding if single input, otherwise return all
450
+ return Array.isArray(sentences) ? result : (result[0] || []);
451
+ }
452
+ catch (error) {
453
+ inputTensor.dispose();
454
+ throw new Error(`Failed to generate embeddings: ${error}`);
455
+ }
456
+ },
457
+ dispose: async () => {
458
+ if (tfModel && tfModel.dispose) {
459
+ tfModel.dispose();
460
+ }
461
+ }
462
+ };
463
+ }
464
+ /**
465
+ * Apply timeout to a promise
466
+ */
467
+ async withTimeout(promise, timeoutMs) {
468
+ const timeoutPromise = new Promise((_, reject) => {
469
+ setTimeout(() => {
470
+ reject(new Error(`Operation timed out after ${timeoutMs}ms`));
471
+ }, timeoutMs);
472
+ });
473
+ return Promise.race([promise, timeoutPromise]);
474
+ }
475
+ /**
476
+ * Calculate retry delay with exponential backoff
477
+ */
478
+ calculateRetryDelay(attempt) {
479
+ if (!this.options.useExponentialBackoff) {
480
+ return this.options.initialRetryDelay;
481
+ }
482
+ // Exponential backoff: delay = initialDelay * (2 ^ attempt) + jitter
483
+ const exponentialDelay = this.options.initialRetryDelay * Math.pow(2, attempt);
484
+ // Add jitter (random factor) to prevent thundering herd
485
+ const jitter = Math.random() * 1000;
486
+ // Cap at maximum delay
487
+ const delay = Math.min(exponentialDelay + jitter, this.options.maxRetryDelay);
488
+ return Math.floor(delay);
489
+ }
490
+ /**
491
+ * Sleep for specified milliseconds
492
+ */
493
+ sleep(ms) {
494
+ return new Promise(resolve => setTimeout(resolve, ms));
495
+ }
496
+ /**
497
+ * Log message if verbose mode is enabled
498
+ */
499
+ log(message) {
500
+ if (this.options.verbose) {
501
+ console.log(`[RobustModelLoader] ${message}`);
502
+ }
503
+ }
504
+ /**
505
+ * Get loading statistics
506
+ */
507
+ getLoadingStats() {
508
+ const stats = {};
509
+ for (const [identifier, attempts] of this.loadAttempts.entries()) {
510
+ stats[identifier] = attempts;
511
+ }
512
+ return stats;
513
+ }
514
+ /**
515
+ * Reset loading statistics
516
+ */
517
+ resetStats() {
518
+ this.loadAttempts.clear();
519
+ }
520
+ }
521
+ /**
522
+ * Create a robust model loader with sensible defaults
523
+ */
524
+ export function createRobustModelLoader(options) {
525
+ return new RobustModelLoader(options);
526
+ }
527
+ /**
528
+ * Utility function to create fallback URLs for Universal Sentence Encoder
529
+ */
530
+ export function getUniversalSentenceEncoderFallbacks() {
531
+ return [
532
+ 'https://tfhub.dev/tensorflow/tfjs-model/universal-sentence-encoder/1/default/1',
533
+ 'https://storage.googleapis.com/tfjs-models/savedmodel/universal_sentence_encoder/1/model.json',
534
+ // Add more fallback URLs as they become available
535
+ ];
536
+ }
537
+ //# sourceMappingURL=robustModelLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robustModelLoader.js","sourceRoot":"","sources":["../../src/utils/robustModelLoader.ts"],"names":[],"mappings":"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"}