mcard-js 2.0.0 → 2.1.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 (103) hide show
  1. package/README.md +91 -3
  2. package/dist/model/ContentTypeInterpreter.d.ts +16 -0
  3. package/dist/model/ContentTypeInterpreter.d.ts.map +1 -0
  4. package/dist/model/ContentTypeInterpreter.js +78 -0
  5. package/dist/model/ContentTypeInterpreter.js.map +1 -0
  6. package/dist/model/GTime.d.ts +15 -0
  7. package/dist/model/GTime.d.ts.map +1 -1
  8. package/dist/model/GTime.js +44 -2
  9. package/dist/model/GTime.js.map +1 -1
  10. package/dist/model/detectors/BaseDetector.d.ts +26 -0
  11. package/dist/model/detectors/BaseDetector.d.ts.map +1 -0
  12. package/dist/model/detectors/BaseDetector.js +5 -0
  13. package/dist/model/detectors/BaseDetector.js.map +1 -0
  14. package/dist/model/detectors/BinaryDetector.d.ts +12 -0
  15. package/dist/model/detectors/BinaryDetector.d.ts.map +1 -0
  16. package/dist/model/detectors/BinaryDetector.js +82 -0
  17. package/dist/model/detectors/BinaryDetector.js.map +1 -0
  18. package/dist/model/detectors/DataFormatDetectors.d.ts +29 -0
  19. package/dist/model/detectors/DataFormatDetectors.d.ts.map +1 -0
  20. package/dist/model/detectors/DataFormatDetectors.js +223 -0
  21. package/dist/model/detectors/DataFormatDetectors.js.map +1 -0
  22. package/dist/model/detectors/LanguageDetector.d.ts +11 -0
  23. package/dist/model/detectors/LanguageDetector.d.ts.map +1 -0
  24. package/dist/model/detectors/LanguageDetector.js +148 -0
  25. package/dist/model/detectors/LanguageDetector.js.map +1 -0
  26. package/dist/model/detectors/MarkupDetectors.d.ts +22 -0
  27. package/dist/model/detectors/MarkupDetectors.d.ts.map +1 -0
  28. package/dist/model/detectors/MarkupDetectors.js +132 -0
  29. package/dist/model/detectors/MarkupDetectors.js.map +1 -0
  30. package/dist/model/detectors/OBJDetector.d.ts +8 -0
  31. package/dist/model/detectors/OBJDetector.d.ts.map +1 -0
  32. package/dist/model/detectors/OBJDetector.js +48 -0
  33. package/dist/model/detectors/OBJDetector.js.map +1 -0
  34. package/dist/model/detectors/registry.d.ts +13 -0
  35. package/dist/model/detectors/registry.d.ts.map +1 -0
  36. package/dist/model/detectors/registry.js +67 -0
  37. package/dist/model/detectors/registry.js.map +1 -0
  38. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts +20 -0
  39. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.d.ts.map +1 -0
  40. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js +42 -0
  41. package/dist/ptr/llm/providers/OllamaEmbeddingProvider.js.map +1 -0
  42. package/dist/ptr/node/CLMLoader.d.ts.map +1 -1
  43. package/dist/ptr/node/CLMLoader.js +8 -0
  44. package/dist/ptr/node/CLMLoader.js.map +1 -1
  45. package/dist/ptr/node/CLMRunner.d.ts.map +1 -1
  46. package/dist/ptr/node/CLMRunner.js +4 -3
  47. package/dist/ptr/node/CLMRunner.js.map +1 -1
  48. package/dist/ptr/node/Runtimes.d.ts +7 -0
  49. package/dist/ptr/node/Runtimes.d.ts.map +1 -1
  50. package/dist/ptr/node/Runtimes.js +94 -3
  51. package/dist/ptr/node/Runtimes.js.map +1 -1
  52. package/dist/rag/HandleVectorStore.d.ts +201 -0
  53. package/dist/rag/HandleVectorStore.d.ts.map +1 -0
  54. package/dist/rag/HandleVectorStore.js +527 -0
  55. package/dist/rag/HandleVectorStore.js.map +1 -0
  56. package/dist/rag/PersistentIndexer.d.ts +144 -0
  57. package/dist/rag/PersistentIndexer.d.ts.map +1 -0
  58. package/dist/rag/PersistentIndexer.js +275 -0
  59. package/dist/rag/PersistentIndexer.js.map +1 -0
  60. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts +87 -0
  61. package/dist/rag/embeddings/VisionEmbeddingProvider.d.ts.map +1 -0
  62. package/dist/rag/embeddings/VisionEmbeddingProvider.js +164 -0
  63. package/dist/rag/embeddings/VisionEmbeddingProvider.js.map +1 -0
  64. package/dist/rag/graph/community.d.ts +56 -0
  65. package/dist/rag/graph/community.d.ts.map +1 -0
  66. package/dist/rag/graph/community.js +247 -0
  67. package/dist/rag/graph/community.js.map +1 -0
  68. package/dist/rag/graph/extractor.d.ts +99 -0
  69. package/dist/rag/graph/extractor.d.ts.map +1 -0
  70. package/dist/rag/graph/extractor.js +210 -0
  71. package/dist/rag/graph/extractor.js.map +1 -0
  72. package/dist/rag/graph/store.d.ts +176 -0
  73. package/dist/rag/graph/store.d.ts.map +1 -0
  74. package/dist/rag/graph/store.js +504 -0
  75. package/dist/rag/graph/store.js.map +1 -0
  76. package/dist/rag/index.d.ts +19 -0
  77. package/dist/rag/index.d.ts.map +1 -0
  78. package/dist/rag/index.js +24 -0
  79. package/dist/rag/index.js.map +1 -0
  80. package/dist/rag/semanticVersioning.d.ts +187 -0
  81. package/dist/rag/semanticVersioning.d.ts.map +1 -0
  82. package/dist/rag/semanticVersioning.js +253 -0
  83. package/dist/rag/semanticVersioning.js.map +1 -0
  84. package/dist/storage/IndexedDBEngine.d.ts.map +1 -1
  85. package/dist/storage/IndexedDBEngine.js +9 -1
  86. package/dist/storage/IndexedDBEngine.js.map +1 -1
  87. package/dist/storage/SqliteNodeEngine.d.ts.map +1 -1
  88. package/dist/storage/SqliteNodeEngine.js +26 -4
  89. package/dist/storage/SqliteNodeEngine.js.map +1 -1
  90. package/dist/storage/SqliteWasmEngine.d.ts.map +1 -1
  91. package/dist/storage/SqliteWasmEngine.js +9 -1
  92. package/dist/storage/SqliteWasmEngine.js.map +1 -1
  93. package/dist/storage/StorageAdapter.d.ts +2 -0
  94. package/dist/storage/StorageAdapter.d.ts.map +1 -1
  95. package/dist/storage/VectorStore.d.ts +28 -5
  96. package/dist/storage/VectorStore.d.ts.map +1 -1
  97. package/dist/storage/VectorStore.js +110 -50
  98. package/dist/storage/VectorStore.js.map +1 -1
  99. package/dist/storage/schema.d.ts +123 -80
  100. package/dist/storage/schema.d.ts.map +1 -1
  101. package/dist/storage/schema.js +305 -217
  102. package/dist/storage/schema.js.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1,144 @@
1
+ /**
2
+ * PersistentIndexer - Auto-indexing MCards for semantic search
3
+ *
4
+ * Manages automatic indexing of MCards into the vector store,
5
+ * with persistent storage alongside the main MCard database.
6
+ *
7
+ * Mirrors Python: mcard/rag/indexer.py
8
+ */
9
+ import { MCard } from '../model/MCard';
10
+ import { CardCollection } from '../model/CardCollection';
11
+ import { VectorStoreConfig } from '../storage/VectorStore';
12
+ export interface IndexerConfig extends VectorStoreConfig {
13
+ autoIndex?: boolean;
14
+ }
15
+ export interface IndexStats {
16
+ indexed: number;
17
+ skipped: number;
18
+ failed: number;
19
+ total: number;
20
+ status?: string;
21
+ }
22
+ export interface IndexerStats {
23
+ vectorDbPath: string;
24
+ embeddingModel: string;
25
+ dimensions: number;
26
+ indexedCount: number;
27
+ vectorCount: number;
28
+ uniqueMCards: number;
29
+ hasVecExtension: boolean;
30
+ hybridSearchEnabled: boolean;
31
+ indexingInProgress: boolean;
32
+ }
33
+ /**
34
+ * Manages persistent vector indexing for MCard collections.
35
+ *
36
+ * Features:
37
+ * - Automatic indexing when MCards are added
38
+ * - Persistent vector database alongside MCard database
39
+ * - Background indexing for large collections
40
+ * - Index status tracking
41
+ *
42
+ * Usage:
43
+ * import { PersistentIndexer } from './rag/PersistentIndexer';
44
+ *
45
+ * const indexer = new PersistentIndexer();
46
+ *
47
+ * // Index all existing content
48
+ * const stats = await indexer.indexAll();
49
+ *
50
+ * // Search
51
+ * const results = await indexer.search("query");
52
+ */
53
+ export declare class PersistentIndexer {
54
+ private static instance;
55
+ private collection;
56
+ private config;
57
+ private vectorDbPath;
58
+ private embedder;
59
+ private vectorStore;
60
+ private autoIndex;
61
+ private indexingInProgress;
62
+ private indexedHashes;
63
+ private initialized;
64
+ /**
65
+ * Get singleton instance of PersistentIndexer
66
+ */
67
+ static getInstance(collection?: CardCollection, config?: IndexerConfig, vectorDbPath?: string): PersistentIndexer;
68
+ /**
69
+ * Reset singleton instance (for testing)
70
+ */
71
+ static resetInstance(): void;
72
+ private constructor();
73
+ /**
74
+ * Set the collection to index from
75
+ */
76
+ setCollection(collection: CardCollection): void;
77
+ /**
78
+ * Load already-indexed hashes from the vector store
79
+ */
80
+ private loadIndexedHashes;
81
+ /**
82
+ * Check if an MCard is already indexed
83
+ */
84
+ isIndexed(hash: string): boolean;
85
+ /**
86
+ * Index a single MCard
87
+ *
88
+ * @param mcard - MCard to index
89
+ * @param force - Re-index even if already indexed
90
+ * @returns True if indexed successfully
91
+ */
92
+ indexMCard(mcard: MCard, force?: boolean): Promise<boolean>;
93
+ /**
94
+ * Index all MCards in the collection
95
+ *
96
+ * @param force - Re-index even if already indexed
97
+ * @param progressCallback - Optional callback(current, total)
98
+ * @param batchSize - Number of cards to process at once
99
+ * @returns Statistics about the indexing operation
100
+ */
101
+ indexAll(force?: boolean, progressCallback?: (current: number, total: number) => void, batchSize?: number): Promise<IndexStats>;
102
+ /**
103
+ * Search for similar MCards
104
+ *
105
+ * @param query - Search query
106
+ * @param k - Number of results
107
+ * @param hybrid - Use hybrid (vector + FTS) search
108
+ * @returns List of search results
109
+ */
110
+ search(query: string, k?: number, hybrid?: boolean): Promise<any[]>;
111
+ /**
112
+ * Delete an MCard from the index
113
+ */
114
+ delete(hash: string): Promise<boolean>;
115
+ /**
116
+ * Clear the entire vector index
117
+ */
118
+ clear(): Promise<void>;
119
+ /**
120
+ * Get indexer statistics
121
+ */
122
+ getStats(): IndexerStats;
123
+ /**
124
+ * Close the indexer
125
+ */
126
+ close(): void;
127
+ }
128
+ /**
129
+ * Get or create the default persistent indexer
130
+ */
131
+ export declare function getIndexer(collection?: CardCollection, config?: IndexerConfig): PersistentIndexer;
132
+ /**
133
+ * Convenience function for semantic search
134
+ */
135
+ export declare function semanticSearch(query: string, k?: number): Promise<any[]>;
136
+ /**
137
+ * Convenience function to index an MCard
138
+ */
139
+ export declare function indexMCard(mcard: MCard, force?: boolean): Promise<boolean>;
140
+ /**
141
+ * Reset the default indexer (for testing)
142
+ */
143
+ export declare function resetIndexer(): void;
144
+ //# sourceMappingURL=PersistentIndexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentIndexer.d.ts","sourceRoot":"","sources":["../../src/rag/PersistentIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * PersistentIndexer - Auto-indexing MCards for semantic search
3
+ *
4
+ * Manages automatic indexing of MCards into the vector store,
5
+ * with persistent storage alongside the main MCard database.
6
+ *
7
+ * Mirrors Python: mcard/rag/indexer.py
8
+ */
9
+ import { MCardVectorStore, DEFAULT_VECTOR_CONFIG } from '../storage/VectorStore';
10
+ import { OllamaEmbeddingProvider } from '../ptr/llm/providers/OllamaEmbeddingProvider';
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ // PersistentIndexer Class
13
+ // ─────────────────────────────────────────────────────────────────────────────
14
+ /**
15
+ * Manages persistent vector indexing for MCard collections.
16
+ *
17
+ * Features:
18
+ * - Automatic indexing when MCards are added
19
+ * - Persistent vector database alongside MCard database
20
+ * - Background indexing for large collections
21
+ * - Index status tracking
22
+ *
23
+ * Usage:
24
+ * import { PersistentIndexer } from './rag/PersistentIndexer';
25
+ *
26
+ * const indexer = new PersistentIndexer();
27
+ *
28
+ * // Index all existing content
29
+ * const stats = await indexer.indexAll();
30
+ *
31
+ * // Search
32
+ * const results = await indexer.search("query");
33
+ */
34
+ export class PersistentIndexer {
35
+ static instance = null;
36
+ collection;
37
+ config;
38
+ vectorDbPath;
39
+ embedder;
40
+ vectorStore;
41
+ autoIndex;
42
+ indexingInProgress = false;
43
+ indexedHashes = new Set();
44
+ initialized = false;
45
+ /**
46
+ * Get singleton instance of PersistentIndexer
47
+ */
48
+ static getInstance(collection, config, vectorDbPath) {
49
+ if (!PersistentIndexer.instance) {
50
+ PersistentIndexer.instance = new PersistentIndexer(collection, config, vectorDbPath);
51
+ }
52
+ return PersistentIndexer.instance;
53
+ }
54
+ /**
55
+ * Reset singleton instance (for testing)
56
+ */
57
+ static resetInstance() {
58
+ PersistentIndexer.instance = null;
59
+ }
60
+ constructor(collection, config, vectorDbPath) {
61
+ this.config = config || { ...DEFAULT_VECTOR_CONFIG, autoIndex: false };
62
+ this.autoIndex = this.config.autoIndex ?? false;
63
+ // Vector DB path - default to memory
64
+ this.vectorDbPath = vectorDbPath || ':memory:';
65
+ // Initialize embedding provider
66
+ this.embedder = new OllamaEmbeddingProvider(this.config.embeddingModel || DEFAULT_VECTOR_CONFIG.embeddingModel, this.config.ollamaBaseUrl || 'http://localhost:11434');
67
+ // Initialize vector store
68
+ this.vectorStore = new MCardVectorStore(this.vectorDbPath, this.config);
69
+ // Collection will be set later if not provided
70
+ this.collection = collection;
71
+ this.initialized = true;
72
+ console.debug(`PersistentIndexer initialized: ${this.vectorDbPath}`);
73
+ }
74
+ /**
75
+ * Set the collection to index from
76
+ */
77
+ setCollection(collection) {
78
+ this.collection = collection;
79
+ }
80
+ /**
81
+ * Load already-indexed hashes from the vector store
82
+ */
83
+ async loadIndexedHashes() {
84
+ try {
85
+ // Query for distinct hashes from metadata table
86
+ const hashes = await this.vectorStore.getIndexedHashes();
87
+ this.indexedHashes = new Set(hashes);
88
+ console.debug(`Loaded ${this.indexedHashes.size} indexed hashes`);
89
+ }
90
+ catch (error) {
91
+ console.warn(`Failed to load indexed hashes: ${error}`);
92
+ this.indexedHashes = new Set();
93
+ }
94
+ }
95
+ /**
96
+ * Check if an MCard is already indexed
97
+ */
98
+ isIndexed(hash) {
99
+ return this.indexedHashes.has(hash);
100
+ }
101
+ /**
102
+ * Index a single MCard
103
+ *
104
+ * @param mcard - MCard to index
105
+ * @param force - Re-index even if already indexed
106
+ * @returns True if indexed successfully
107
+ */
108
+ async indexMCard(mcard, force = false) {
109
+ if (!force && this.isIndexed(mcard.hash)) {
110
+ console.debug(`MCard ${mcard.hash.slice(0, 8)} already indexed, skipping`);
111
+ return true;
112
+ }
113
+ try {
114
+ const content = mcard.getContentAsText();
115
+ const count = await this.vectorStore.index(mcard.hash, content);
116
+ if (count > 0) {
117
+ this.indexedHashes.add(mcard.hash);
118
+ console.debug(`Indexed MCard ${mcard.hash.slice(0, 8)} (${count} vectors)`);
119
+ return true;
120
+ }
121
+ return false;
122
+ }
123
+ catch (error) {
124
+ console.error(`Failed to index MCard ${mcard.hash.slice(0, 8)}: ${error}`);
125
+ return false;
126
+ }
127
+ }
128
+ /**
129
+ * Index all MCards in the collection
130
+ *
131
+ * @param force - Re-index even if already indexed
132
+ * @param progressCallback - Optional callback(current, total)
133
+ * @param batchSize - Number of cards to process at once
134
+ * @returns Statistics about the indexing operation
135
+ */
136
+ async indexAll(force = false, progressCallback, batchSize = 50) {
137
+ if (this.indexingInProgress) {
138
+ console.warn('Indexing already in progress');
139
+ return { indexed: 0, skipped: 0, failed: 0, total: 0, status: 'busy' };
140
+ }
141
+ if (!this.collection) {
142
+ throw new Error('No collection set for indexer');
143
+ }
144
+ this.indexingInProgress = true;
145
+ const stats = { indexed: 0, skipped: 0, failed: 0, total: 0 };
146
+ try {
147
+ // Get all cards through pagination
148
+ let pageNumber = 1;
149
+ const pageSize = batchSize;
150
+ let allCards = [];
151
+ while (true) {
152
+ const page = await this.collection.getPage(pageNumber, pageSize);
153
+ allCards.push(...page.items);
154
+ if (!page.hasNext)
155
+ break;
156
+ pageNumber++;
157
+ }
158
+ stats.total = allCards.length;
159
+ for (let i = 0; i < allCards.length; i++) {
160
+ const mcard = allCards[i];
161
+ if (!force && this.isIndexed(mcard.hash)) {
162
+ stats.skipped++;
163
+ }
164
+ else if (await this.indexMCard(mcard, force)) {
165
+ stats.indexed++;
166
+ }
167
+ else {
168
+ stats.failed++;
169
+ }
170
+ // Progress callback
171
+ if (progressCallback && (i + 1) % 10 === 0) {
172
+ progressCallback(i + 1, stats.total);
173
+ }
174
+ }
175
+ console.info(`Indexing complete: ${JSON.stringify(stats)}`);
176
+ }
177
+ finally {
178
+ this.indexingInProgress = false;
179
+ }
180
+ return stats;
181
+ }
182
+ /**
183
+ * Search for similar MCards
184
+ *
185
+ * @param query - Search query
186
+ * @param k - Number of results
187
+ * @param hybrid - Use hybrid (vector + FTS) search
188
+ * @returns List of search results
189
+ */
190
+ async search(query, k = 5, hybrid = true) {
191
+ if (hybrid && this.config.enableHybridSearch) {
192
+ return this.vectorStore.hybridSearch(query, k);
193
+ }
194
+ else {
195
+ return this.vectorStore.search(query, k);
196
+ }
197
+ }
198
+ /**
199
+ * Delete an MCard from the index
200
+ */
201
+ async delete(hash) {
202
+ const count = await this.vectorStore.delete(hash);
203
+ if (count > 0) {
204
+ this.indexedHashes.delete(hash);
205
+ return true;
206
+ }
207
+ return false;
208
+ }
209
+ /**
210
+ * Clear the entire vector index
211
+ */
212
+ async clear() {
213
+ await this.vectorStore.clear();
214
+ this.indexedHashes.clear();
215
+ console.info('Vector index cleared');
216
+ }
217
+ /**
218
+ * Get indexer statistics
219
+ */
220
+ getStats() {
221
+ return {
222
+ vectorDbPath: this.vectorDbPath,
223
+ embeddingModel: this.config.embeddingModel || DEFAULT_VECTOR_CONFIG.embeddingModel,
224
+ dimensions: this.config.dimensions || DEFAULT_VECTOR_CONFIG.dimensions,
225
+ indexedCount: this.indexedHashes.size,
226
+ vectorCount: this.vectorStore.count(),
227
+ uniqueMCards: this.vectorStore.countUnique ? this.vectorStore.countUnique() : this.indexedHashes.size,
228
+ hasVecExtension: this.vectorStore.hasVectorExtension(),
229
+ hybridSearchEnabled: this.config.enableHybridSearch ?? false,
230
+ indexingInProgress: this.indexingInProgress,
231
+ };
232
+ }
233
+ /**
234
+ * Close the indexer
235
+ */
236
+ close() {
237
+ this.vectorStore.close();
238
+ }
239
+ }
240
+ // ─────────────────────────────────────────────────────────────────────────────
241
+ // Global Convenience Functions
242
+ // ─────────────────────────────────────────────────────────────────────────────
243
+ let defaultIndexer = null;
244
+ /**
245
+ * Get or create the default persistent indexer
246
+ */
247
+ export function getIndexer(collection, config) {
248
+ if (!defaultIndexer) {
249
+ defaultIndexer = PersistentIndexer.getInstance(collection, config);
250
+ }
251
+ return defaultIndexer;
252
+ }
253
+ /**
254
+ * Convenience function for semantic search
255
+ */
256
+ export async function semanticSearch(query, k = 5) {
257
+ return getIndexer().search(query, k);
258
+ }
259
+ /**
260
+ * Convenience function to index an MCard
261
+ */
262
+ export async function indexMCard(mcard, force = false) {
263
+ return getIndexer().indexMCard(mcard, force);
264
+ }
265
+ /**
266
+ * Reset the default indexer (for testing)
267
+ */
268
+ export function resetIndexer() {
269
+ if (defaultIndexer) {
270
+ defaultIndexer.close();
271
+ defaultIndexer = null;
272
+ }
273
+ PersistentIndexer.resetInstance();
274
+ }
275
+ //# sourceMappingURL=PersistentIndexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersistentIndexer.js","sourceRoot":"","sources":["../../src/rag/PersistentIndexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Vision Embedding Provider
3
+ *
4
+ * Multimodal embedding provider that uses vision models to describe images,
5
+ * then embeds the descriptions for vector search.
6
+ *
7
+ * Mirrors Python: mcard/rag/embeddings/vision.py
8
+ */
9
+ import { EmbeddingProvider } from '../../storage/VectorStore';
10
+ export interface VisionProviderConfig {
11
+ visionModel?: string;
12
+ embeddingModel?: string;
13
+ ollamaBaseUrl?: string;
14
+ descriptionPrompt?: string;
15
+ }
16
+ export declare const VISION_MODELS: {
17
+ moondream: {
18
+ description: string;
19
+ size: string;
20
+ };
21
+ 'llama3.2-vision': {
22
+ description: string;
23
+ size: string;
24
+ };
25
+ llava: {
26
+ description: string;
27
+ size: string;
28
+ };
29
+ 'minicpm-v': {
30
+ description: string;
31
+ size: string;
32
+ };
33
+ };
34
+ /**
35
+ * Multimodal embedding provider for images.
36
+ *
37
+ * Uses a two-stage approach:
38
+ * 1. Vision model generates a text description of the image
39
+ * 2. Text embedding model converts description to vector
40
+ *
41
+ * This enables semantic search over images using existing vector infrastructure.
42
+ *
43
+ * Usage:
44
+ * const provider = new VisionEmbeddingProvider();
45
+ *
46
+ * // Embed an image (path, bytes, or base64)
47
+ * const embedding = await provider.embedImage("path/to/image.jpg");
48
+ */
49
+ export declare class VisionEmbeddingProvider implements EmbeddingProvider {
50
+ private visionModel;
51
+ private baseUrl;
52
+ private descriptionPrompt;
53
+ private textEmbedder;
54
+ constructor(config?: VisionProviderConfig);
55
+ get modelName(): string;
56
+ get providerName(): string;
57
+ get dimensions(): number;
58
+ /**
59
+ * Generate text description of an image.
60
+ *
61
+ * @param imageData - Image as base64 string or Uint8Array
62
+ * @param prompt - Optional custom prompt
63
+ */
64
+ describeImage(imageData: string | Uint8Array, prompt?: string): Promise<string>;
65
+ /**
66
+ * Generate embedding for an image.
67
+ */
68
+ embedImage(imageData: string | Uint8Array, prompt?: string): Promise<number[]>;
69
+ /**
70
+ * Generate embedding and return description.
71
+ */
72
+ embedImageWithDescription(imageData: string | Uint8Array, prompt?: string): Promise<{
73
+ embedding: number[];
74
+ description: string;
75
+ }>;
76
+ embed(text: string): Promise<number[]>;
77
+ embedBatch(texts: string[]): Promise<number[][]>;
78
+ /**
79
+ * Convert Uint8Array to base64 string
80
+ */
81
+ private arrayBufferToBase64;
82
+ /**
83
+ * Get provider information
84
+ */
85
+ getInfo(): any;
86
+ }
87
+ //# sourceMappingURL=VisionEmbeddingProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisionEmbeddingProvider.d.ts","sourceRoot":"","sources":["../../../src/rag/embeddings/VisionEmbeddingProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAO9D,MAAM,WAAW,oBAAoB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAiBzB,CAAC;AAkBF;;;;;;;;;;;;;;GAcG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,YAAY,CAA0B;gBAElC,MAAM,GAAE,oBAAyB;IAW7C,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;;;;OAKG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCrF;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWpF;;OAEG;IACG,yBAAyB,CAC3B,SAAS,EAAE,MAAM,GAAG,UAAU,EAC9B,MAAM,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAUlD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAItC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQtD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,IAAI,GAAG;CAQjB"}