@opensaas/stack-rag 0.1.6

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 (149) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/CHANGELOG.md +10 -0
  3. package/CLAUDE.md +565 -0
  4. package/LICENSE +21 -0
  5. package/README.md +406 -0
  6. package/dist/config/index.d.ts +63 -0
  7. package/dist/config/index.d.ts.map +1 -0
  8. package/dist/config/index.js +94 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/config/plugin.d.ts +38 -0
  11. package/dist/config/plugin.d.ts.map +1 -0
  12. package/dist/config/plugin.js +215 -0
  13. package/dist/config/plugin.js.map +1 -0
  14. package/dist/config/plugin.test.d.ts +2 -0
  15. package/dist/config/plugin.test.d.ts.map +1 -0
  16. package/dist/config/plugin.test.js +554 -0
  17. package/dist/config/plugin.test.js.map +1 -0
  18. package/dist/config/types.d.ts +249 -0
  19. package/dist/config/types.d.ts.map +1 -0
  20. package/dist/config/types.js +5 -0
  21. package/dist/config/types.js.map +1 -0
  22. package/dist/fields/embedding.d.ts +85 -0
  23. package/dist/fields/embedding.d.ts.map +1 -0
  24. package/dist/fields/embedding.js +81 -0
  25. package/dist/fields/embedding.js.map +1 -0
  26. package/dist/fields/embedding.test.d.ts +2 -0
  27. package/dist/fields/embedding.test.d.ts.map +1 -0
  28. package/dist/fields/embedding.test.js +323 -0
  29. package/dist/fields/embedding.test.js.map +1 -0
  30. package/dist/fields/index.d.ts +6 -0
  31. package/dist/fields/index.d.ts.map +1 -0
  32. package/dist/fields/index.js +5 -0
  33. package/dist/fields/index.js.map +1 -0
  34. package/dist/index.d.ts +8 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +9 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/index.d.ts +19 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +18 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/providers/index.d.ts +38 -0
  43. package/dist/providers/index.d.ts.map +1 -0
  44. package/dist/providers/index.js +68 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/providers/ollama.d.ts +49 -0
  47. package/dist/providers/ollama.d.ts.map +1 -0
  48. package/dist/providers/ollama.js +151 -0
  49. package/dist/providers/ollama.js.map +1 -0
  50. package/dist/providers/openai.d.ts +41 -0
  51. package/dist/providers/openai.d.ts.map +1 -0
  52. package/dist/providers/openai.js +126 -0
  53. package/dist/providers/openai.js.map +1 -0
  54. package/dist/providers/providers.test.d.ts +2 -0
  55. package/dist/providers/providers.test.d.ts.map +1 -0
  56. package/dist/providers/providers.test.js +224 -0
  57. package/dist/providers/providers.test.js.map +1 -0
  58. package/dist/providers/types.d.ts +88 -0
  59. package/dist/providers/types.d.ts.map +1 -0
  60. package/dist/providers/types.js +2 -0
  61. package/dist/providers/types.js.map +1 -0
  62. package/dist/runtime/batch.d.ts +183 -0
  63. package/dist/runtime/batch.d.ts.map +1 -0
  64. package/dist/runtime/batch.js +240 -0
  65. package/dist/runtime/batch.js.map +1 -0
  66. package/dist/runtime/batch.test.d.ts +2 -0
  67. package/dist/runtime/batch.test.d.ts.map +1 -0
  68. package/dist/runtime/batch.test.js +251 -0
  69. package/dist/runtime/batch.test.js.map +1 -0
  70. package/dist/runtime/chunking.d.ts +42 -0
  71. package/dist/runtime/chunking.d.ts.map +1 -0
  72. package/dist/runtime/chunking.js +264 -0
  73. package/dist/runtime/chunking.js.map +1 -0
  74. package/dist/runtime/chunking.test.d.ts +2 -0
  75. package/dist/runtime/chunking.test.d.ts.map +1 -0
  76. package/dist/runtime/chunking.test.js +212 -0
  77. package/dist/runtime/chunking.test.js.map +1 -0
  78. package/dist/runtime/embeddings.d.ts +147 -0
  79. package/dist/runtime/embeddings.d.ts.map +1 -0
  80. package/dist/runtime/embeddings.js +201 -0
  81. package/dist/runtime/embeddings.js.map +1 -0
  82. package/dist/runtime/embeddings.test.d.ts +2 -0
  83. package/dist/runtime/embeddings.test.d.ts.map +1 -0
  84. package/dist/runtime/embeddings.test.js +366 -0
  85. package/dist/runtime/embeddings.test.js.map +1 -0
  86. package/dist/runtime/index.d.ts +14 -0
  87. package/dist/runtime/index.d.ts.map +1 -0
  88. package/dist/runtime/index.js +18 -0
  89. package/dist/runtime/index.js.map +1 -0
  90. package/dist/runtime/search.d.ts +135 -0
  91. package/dist/runtime/search.d.ts.map +1 -0
  92. package/dist/runtime/search.js +101 -0
  93. package/dist/runtime/search.js.map +1 -0
  94. package/dist/storage/index.d.ts +41 -0
  95. package/dist/storage/index.d.ts.map +1 -0
  96. package/dist/storage/index.js +73 -0
  97. package/dist/storage/index.js.map +1 -0
  98. package/dist/storage/json.d.ts +34 -0
  99. package/dist/storage/json.d.ts.map +1 -0
  100. package/dist/storage/json.js +82 -0
  101. package/dist/storage/json.js.map +1 -0
  102. package/dist/storage/pgvector.d.ts +53 -0
  103. package/dist/storage/pgvector.d.ts.map +1 -0
  104. package/dist/storage/pgvector.js +168 -0
  105. package/dist/storage/pgvector.js.map +1 -0
  106. package/dist/storage/sqlite-vss.d.ts +49 -0
  107. package/dist/storage/sqlite-vss.d.ts.map +1 -0
  108. package/dist/storage/sqlite-vss.js +148 -0
  109. package/dist/storage/sqlite-vss.js.map +1 -0
  110. package/dist/storage/storage.test.d.ts +2 -0
  111. package/dist/storage/storage.test.d.ts.map +1 -0
  112. package/dist/storage/storage.test.js +440 -0
  113. package/dist/storage/storage.test.js.map +1 -0
  114. package/dist/storage/types.d.ts +79 -0
  115. package/dist/storage/types.d.ts.map +1 -0
  116. package/dist/storage/types.js +49 -0
  117. package/dist/storage/types.js.map +1 -0
  118. package/package.json +82 -0
  119. package/src/config/index.ts +116 -0
  120. package/src/config/plugin.test.ts +664 -0
  121. package/src/config/plugin.ts +257 -0
  122. package/src/config/types.ts +283 -0
  123. package/src/fields/embedding.test.ts +408 -0
  124. package/src/fields/embedding.ts +150 -0
  125. package/src/fields/index.ts +6 -0
  126. package/src/index.ts +33 -0
  127. package/src/mcp/index.ts +21 -0
  128. package/src/providers/index.ts +81 -0
  129. package/src/providers/ollama.ts +186 -0
  130. package/src/providers/openai.ts +161 -0
  131. package/src/providers/providers.test.ts +275 -0
  132. package/src/providers/types.ts +100 -0
  133. package/src/runtime/batch.test.ts +332 -0
  134. package/src/runtime/batch.ts +424 -0
  135. package/src/runtime/chunking.test.ts +258 -0
  136. package/src/runtime/chunking.ts +334 -0
  137. package/src/runtime/embeddings.test.ts +441 -0
  138. package/src/runtime/embeddings.ts +380 -0
  139. package/src/runtime/index.ts +51 -0
  140. package/src/runtime/search.ts +243 -0
  141. package/src/storage/index.ts +86 -0
  142. package/src/storage/json.ts +106 -0
  143. package/src/storage/pgvector.ts +206 -0
  144. package/src/storage/sqlite-vss.ts +193 -0
  145. package/src/storage/storage.test.ts +521 -0
  146. package/src/storage/types.ts +126 -0
  147. package/tsconfig.json +13 -0
  148. package/tsconfig.tsbuildinfo +1 -0
  149. package/vitest.config.ts +18 -0
@@ -0,0 +1,366 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, } from './embeddings.js';
3
+ // Mock embedding provider
4
+ function createMockProvider() {
5
+ return {
6
+ type: 'mock',
7
+ model: 'mock-model',
8
+ dimensions: 3,
9
+ embed: vi.fn(async (text) => {
10
+ // Return simple mock vector based on text length
11
+ return [text.length / 10, text.length / 20, text.length / 30];
12
+ }),
13
+ embedBatch: vi.fn(async (texts) => {
14
+ return texts.map((text) => [text.length / 10, text.length / 20, text.length / 30]);
15
+ }),
16
+ };
17
+ }
18
+ describe('generateEmbedding', () => {
19
+ it('should generate single embedding without chunking', async () => {
20
+ const provider = createMockProvider();
21
+ const embedding = await generateEmbedding({
22
+ provider,
23
+ text: 'Hello world',
24
+ enableChunking: false,
25
+ });
26
+ expect(embedding).toHaveProperty('vector');
27
+ expect(embedding).toHaveProperty('metadata');
28
+ expect(embedding.vector).toHaveLength(3);
29
+ expect(embedding.metadata.model).toBe('mock-model');
30
+ expect(embedding.metadata.provider).toBe('mock');
31
+ expect(embedding.metadata.dimensions).toBe(3);
32
+ expect(embedding.metadata.sourceHash).toBeDefined();
33
+ });
34
+ it('should generate chunked embeddings with chunking enabled', async () => {
35
+ const provider = createMockProvider();
36
+ const longText = 'A'.repeat(1000);
37
+ const chunkedEmbeddings = await generateEmbedding({
38
+ provider,
39
+ text: longText,
40
+ enableChunking: true,
41
+ chunking: { chunkSize: 200, chunkOverlap: 0 },
42
+ });
43
+ expect(Array.isArray(chunkedEmbeddings)).toBe(true);
44
+ expect(chunkedEmbeddings.length).toBeGreaterThan(1);
45
+ for (const chunked of chunkedEmbeddings) {
46
+ expect(chunked).toHaveProperty('chunk');
47
+ expect(chunked).toHaveProperty('embedding');
48
+ expect(chunked.embedding.vector).toHaveLength(3);
49
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
50
+ expect(chunked.embedding.metadata.chunkIndex).toBeDefined();
51
+ }
52
+ });
53
+ it('should include source hash when enabled', async () => {
54
+ const provider = createMockProvider();
55
+ const text = 'Test text';
56
+ const embedding = await generateEmbedding({
57
+ provider,
58
+ text,
59
+ includeSourceHash: true,
60
+ });
61
+ expect(embedding.metadata.sourceHash).toBeDefined();
62
+ expect(typeof embedding.metadata.sourceHash).toBe('string');
63
+ expect(embedding.metadata.sourceHash).toHaveLength(64); // SHA-256 hex
64
+ });
65
+ it('should exclude source hash when disabled', async () => {
66
+ const provider = createMockProvider();
67
+ const text = 'Test text';
68
+ const embedding = await generateEmbedding({
69
+ provider,
70
+ text,
71
+ includeSourceHash: false,
72
+ });
73
+ expect(embedding.metadata.sourceHash).toBeUndefined();
74
+ });
75
+ it('should include additional metadata', async () => {
76
+ const provider = createMockProvider();
77
+ const embedding = await generateEmbedding({
78
+ provider,
79
+ text: 'Test',
80
+ metadata: { customField: 'customValue' },
81
+ });
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ expect(embedding.metadata.customField).toBe('customValue');
84
+ });
85
+ it('should call provider.embed for single embedding', async () => {
86
+ const provider = createMockProvider();
87
+ await generateEmbedding({
88
+ provider,
89
+ text: 'Test',
90
+ enableChunking: false,
91
+ });
92
+ expect(provider.embed).toHaveBeenCalledWith('Test');
93
+ });
94
+ it('should call provider.embedBatch for chunked embedding', async () => {
95
+ const provider = createMockProvider();
96
+ await generateEmbedding({
97
+ provider,
98
+ text: 'A'.repeat(1000),
99
+ enableChunking: true,
100
+ chunking: { chunkSize: 200, chunkOverlap: 50 },
101
+ });
102
+ expect(provider.embedBatch).toHaveBeenCalled();
103
+ });
104
+ });
105
+ describe('generateEmbeddings', () => {
106
+ it('should generate embeddings for multiple texts', async () => {
107
+ const provider = createMockProvider();
108
+ const texts = ['Text 1', 'Text 2', 'Text 3'];
109
+ const embeddings = await generateEmbeddings({
110
+ provider,
111
+ texts,
112
+ });
113
+ expect(embeddings).toHaveLength(3);
114
+ for (const embedding of embeddings) {
115
+ expect(embedding.vector).toHaveLength(3);
116
+ expect(embedding.metadata.model).toBe('mock-model');
117
+ }
118
+ });
119
+ it('should process texts in batches', async () => {
120
+ const provider = createMockProvider();
121
+ const texts = Array(25).fill('Test');
122
+ await generateEmbeddings({
123
+ provider,
124
+ texts,
125
+ batchSize: 10,
126
+ });
127
+ // Should be called 3 times (10 + 10 + 5)
128
+ expect(provider.embedBatch).toHaveBeenCalledTimes(3);
129
+ });
130
+ it('should include source hashes for all embeddings', async () => {
131
+ const provider = createMockProvider();
132
+ const texts = ['Text 1', 'Text 2', 'Text 3'];
133
+ const embeddings = await generateEmbeddings({
134
+ provider,
135
+ texts,
136
+ includeSourceHash: true,
137
+ });
138
+ for (const embedding of embeddings) {
139
+ expect(embedding.metadata.sourceHash).toBeDefined();
140
+ }
141
+ });
142
+ it('should handle empty text array', async () => {
143
+ const provider = createMockProvider();
144
+ const embeddings = await generateEmbeddings({
145
+ provider,
146
+ texts: [],
147
+ });
148
+ expect(embeddings).toHaveLength(0);
149
+ });
150
+ });
151
+ describe('shouldRegenerateEmbedding', () => {
152
+ it('should return true when no existing embedding', () => {
153
+ const result = shouldRegenerateEmbedding('New text', null);
154
+ expect(result).toBe(true);
155
+ });
156
+ it('should return true when source text changed', () => {
157
+ const embedding = {
158
+ vector: [1, 2, 3],
159
+ metadata: {
160
+ model: 'test',
161
+ provider: 'test',
162
+ dimensions: 3,
163
+ generatedAt: new Date().toISOString(),
164
+ sourceHash: hashText('Old text'),
165
+ },
166
+ };
167
+ const result = shouldRegenerateEmbedding('New text', embedding);
168
+ expect(result).toBe(true);
169
+ });
170
+ it('should return false when source text unchanged', () => {
171
+ const text = 'Same text';
172
+ const embedding = {
173
+ vector: [1, 2, 3],
174
+ metadata: {
175
+ model: 'test',
176
+ provider: 'test',
177
+ dimensions: 3,
178
+ generatedAt: new Date().toISOString(),
179
+ sourceHash: hashText(text),
180
+ },
181
+ };
182
+ const result = shouldRegenerateEmbedding(text, embedding);
183
+ expect(result).toBe(false);
184
+ });
185
+ it('should return false when no source hash in metadata', () => {
186
+ const embedding = {
187
+ vector: [1, 2, 3],
188
+ metadata: {
189
+ model: 'test',
190
+ provider: 'test',
191
+ dimensions: 3,
192
+ generatedAt: new Date().toISOString(),
193
+ },
194
+ };
195
+ const result = shouldRegenerateEmbedding('Any text', embedding);
196
+ expect(result).toBe(false); // Conservative: don't regenerate if we can't tell
197
+ });
198
+ });
199
+ describe('hashText', () => {
200
+ it('should generate consistent hash for same text', () => {
201
+ const text = 'Test text';
202
+ const hash1 = hashText(text);
203
+ const hash2 = hashText(text);
204
+ expect(hash1).toBe(hash2);
205
+ });
206
+ it('should generate different hashes for different text', () => {
207
+ const hash1 = hashText('Text 1');
208
+ const hash2 = hashText('Text 2');
209
+ expect(hash1).not.toBe(hash2);
210
+ });
211
+ it('should generate SHA-256 hex string', () => {
212
+ const hash = hashText('Test');
213
+ expect(hash).toMatch(/^[0-9a-f]{64}$/);
214
+ });
215
+ it('should be case-sensitive', () => {
216
+ const hash1 = hashText('Test');
217
+ const hash2 = hashText('test');
218
+ expect(hash1).not.toBe(hash2);
219
+ });
220
+ });
221
+ describe('validateEmbeddingDimensions', () => {
222
+ it('should pass validation for correct dimensions', () => {
223
+ const embedding = {
224
+ vector: [1, 2, 3],
225
+ metadata: {
226
+ model: 'test',
227
+ provider: 'test',
228
+ dimensions: 3,
229
+ generatedAt: new Date().toISOString(),
230
+ },
231
+ };
232
+ expect(() => {
233
+ validateEmbeddingDimensions(embedding, 3);
234
+ }).not.toThrow();
235
+ });
236
+ it('should throw error for dimension mismatch', () => {
237
+ const embedding = {
238
+ vector: [1, 2, 3],
239
+ metadata: {
240
+ model: 'test',
241
+ provider: 'test',
242
+ dimensions: 3,
243
+ generatedAt: new Date().toISOString(),
244
+ },
245
+ };
246
+ expect(() => {
247
+ validateEmbeddingDimensions(embedding, 5);
248
+ }).toThrow('Embedding dimension mismatch: expected 5, got 3');
249
+ });
250
+ it('should throw error for metadata dimension mismatch', () => {
251
+ const embedding = {
252
+ vector: [1, 2, 3],
253
+ metadata: {
254
+ model: 'test',
255
+ provider: 'test',
256
+ dimensions: 5, // Wrong metadata
257
+ generatedAt: new Date().toISOString(),
258
+ },
259
+ };
260
+ expect(() => {
261
+ validateEmbeddingDimensions(embedding, 3);
262
+ }).toThrow('Embedding metadata dimension mismatch');
263
+ });
264
+ });
265
+ describe('mergeEmbeddings', () => {
266
+ it('should merge embeddings using average pooling', () => {
267
+ const embeddings = [
268
+ {
269
+ vector: [1, 2, 3],
270
+ metadata: {
271
+ model: 'test',
272
+ provider: 'test',
273
+ dimensions: 3,
274
+ generatedAt: new Date().toISOString(),
275
+ },
276
+ },
277
+ {
278
+ vector: [3, 4, 5],
279
+ metadata: {
280
+ model: 'test',
281
+ provider: 'test',
282
+ dimensions: 3,
283
+ generatedAt: new Date().toISOString(),
284
+ },
285
+ },
286
+ ];
287
+ const merged = mergeEmbeddings(embeddings, 'average');
288
+ expect(merged.vector).toEqual([2, 3, 4]); // Average of [1,2,3] and [3,4,5]
289
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
290
+ expect(merged.metadata.mergedFrom).toBe(2);
291
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
292
+ expect(merged.metadata.mergeMethod).toBe('average');
293
+ });
294
+ it('should merge embeddings using max pooling', () => {
295
+ const embeddings = [
296
+ {
297
+ vector: [1, 5, 3],
298
+ metadata: {
299
+ model: 'test',
300
+ provider: 'test',
301
+ dimensions: 3,
302
+ generatedAt: new Date().toISOString(),
303
+ },
304
+ },
305
+ {
306
+ vector: [4, 2, 6],
307
+ metadata: {
308
+ model: 'test',
309
+ provider: 'test',
310
+ dimensions: 3,
311
+ generatedAt: new Date().toISOString(),
312
+ },
313
+ },
314
+ ];
315
+ const merged = mergeEmbeddings(embeddings, 'max');
316
+ expect(merged.vector).toEqual([4, 5, 6]); // Max of each dimension
317
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
318
+ expect(merged.metadata.mergeMethod).toBe('max');
319
+ });
320
+ it('should return single embedding if array has one item', () => {
321
+ const embeddings = [
322
+ {
323
+ vector: [1, 2, 3],
324
+ metadata: {
325
+ model: 'test',
326
+ provider: 'test',
327
+ dimensions: 3,
328
+ generatedAt: new Date().toISOString(),
329
+ },
330
+ },
331
+ ];
332
+ const merged = mergeEmbeddings(embeddings);
333
+ expect(merged).toBe(embeddings[0]);
334
+ });
335
+ it('should throw error for empty array', () => {
336
+ expect(() => {
337
+ mergeEmbeddings([]);
338
+ }).toThrow('Cannot merge empty array of embeddings');
339
+ });
340
+ it('should throw error for dimension mismatch', () => {
341
+ const embeddings = [
342
+ {
343
+ vector: [1, 2, 3],
344
+ metadata: {
345
+ model: 'test',
346
+ provider: 'test',
347
+ dimensions: 3,
348
+ generatedAt: new Date().toISOString(),
349
+ },
350
+ },
351
+ {
352
+ vector: [1, 2], // Different dimensions
353
+ metadata: {
354
+ model: 'test',
355
+ provider: 'test',
356
+ dimensions: 2,
357
+ generatedAt: new Date().toISOString(),
358
+ },
359
+ },
360
+ ];
361
+ expect(() => {
362
+ mergeEmbeddings(embeddings);
363
+ }).toThrow('Cannot merge embeddings with different dimensions');
364
+ });
365
+ });
366
+ //# sourceMappingURL=embeddings.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.test.js","sourceRoot":"","sources":["../../src/runtime/embeddings.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Runtime utilities for RAG operations
3
+ *
4
+ * This module provides high-level APIs for:
5
+ * - Text chunking
6
+ * - Embedding generation
7
+ * - Semantic search
8
+ * - Batch processing with rate limiting
9
+ */
10
+ export { chunkText, estimateTokenCount, mergeSmallChunks, type ChunkingStrategy, type ChunkingOptions, type TextChunk, } from './chunking.js';
11
+ export { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, type GenerateEmbeddingOptions, type GenerateEmbeddingsOptions, type ChunkedEmbedding, } from './embeddings.js';
12
+ export { semanticSearch, findSimilar, type SemanticSearchOptions, type FindSimilarOptions, } from './search.js';
13
+ export { batchProcess, RateLimiter, ProcessingQueue, type BatchProcessOptions, type BatchProgress, type BatchError, type BatchProcessResult, } from './batch.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,SAAS,GACf,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,EACf,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,cAAc,EACd,WAAW,EACX,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Runtime utilities for RAG operations
3
+ *
4
+ * This module provides high-level APIs for:
5
+ * - Text chunking
6
+ * - Embedding generation
7
+ * - Semantic search
8
+ * - Batch processing with rate limiting
9
+ */
10
+ // Text chunking
11
+ export { chunkText, estimateTokenCount, mergeSmallChunks, } from './chunking.js';
12
+ // Embedding generation
13
+ export { generateEmbedding, generateEmbeddings, shouldRegenerateEmbedding, hashText, validateEmbeddingDimensions, mergeEmbeddings, } from './embeddings.js';
14
+ // Semantic search
15
+ export { semanticSearch, findSimilar, } from './search.js';
16
+ // Batch processing
17
+ export { batchProcess, RateLimiter, ProcessingQueue, } from './batch.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,gBAAgB;AAChB,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,eAAe,CAAA;AAEtB,uBAAuB;AACvB,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,GAIhB,MAAM,iBAAiB,CAAA;AAExB,kBAAkB;AAClB,OAAO,EACL,cAAc,EACd,WAAW,GAGZ,MAAM,aAAa,CAAA;AAEpB,mBAAmB;AACnB,OAAO,EACL,YAAY,EACZ,WAAW,EACX,eAAe,GAKhB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * High-level semantic search APIs
3
+ */
4
+ import type { AccessContext } from '@opensaas/stack-core';
5
+ import type { SearchResult } from '../config/types.js';
6
+ import type { EmbeddingProvider } from '../providers/types.js';
7
+ import type { VectorStorage } from '../storage/types.js';
8
+ export interface SemanticSearchOptions {
9
+ /**
10
+ * List key to search (e.g., 'Article', 'Post')
11
+ */
12
+ listKey: string;
13
+ /**
14
+ * Field name containing embeddings
15
+ */
16
+ fieldName: string;
17
+ /**
18
+ * Natural language query text
19
+ */
20
+ query: string;
21
+ /**
22
+ * Embedding provider to use for query embedding
23
+ */
24
+ provider: EmbeddingProvider;
25
+ /**
26
+ * Vector storage backend to use for search
27
+ */
28
+ storage: VectorStorage;
29
+ /**
30
+ * Access context for enforcing access control
31
+ */
32
+ context: AccessContext;
33
+ /**
34
+ * Maximum number of results to return
35
+ * @default 10
36
+ */
37
+ limit?: number;
38
+ /**
39
+ * Minimum similarity score (0-1)
40
+ * @default 0.0
41
+ */
42
+ minScore?: number;
43
+ /**
44
+ * Additional Prisma where clause to filter results
45
+ */
46
+ where?: Record<string, unknown>;
47
+ }
48
+ /**
49
+ * Perform semantic search using natural language query
50
+ *
51
+ * This is a high-level API that:
52
+ * 1. Generates embedding for the query text
53
+ * 2. Searches for similar vectors in the database
54
+ * 3. Enforces access control
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * const results = await semanticSearch({
59
+ * listKey: 'Article',
60
+ * fieldName: 'contentEmbedding',
61
+ * query: 'articles about machine learning',
62
+ * provider: createEmbeddingProvider({ type: 'openai', apiKey: '...' }),
63
+ * storage: createVectorStorage({ type: 'pgvector' }),
64
+ * context: await getContext(),
65
+ * limit: 10,
66
+ * minScore: 0.7,
67
+ * })
68
+ * ```
69
+ */
70
+ export declare function semanticSearch<T = unknown>(options: SemanticSearchOptions): Promise<SearchResult<T>[]>;
71
+ export interface FindSimilarOptions {
72
+ /**
73
+ * List key to search (e.g., 'Article', 'Post')
74
+ */
75
+ listKey: string;
76
+ /**
77
+ * Field name containing embeddings
78
+ */
79
+ fieldName: string;
80
+ /**
81
+ * ID of the item to find similar items for
82
+ */
83
+ itemId: string;
84
+ /**
85
+ * Vector storage backend to use for search
86
+ */
87
+ storage: VectorStorage;
88
+ /**
89
+ * Access context for enforcing access control
90
+ */
91
+ context: AccessContext;
92
+ /**
93
+ * Maximum number of results to return
94
+ * @default 10
95
+ */
96
+ limit?: number;
97
+ /**
98
+ * Minimum similarity score (0-1)
99
+ * @default 0.0
100
+ */
101
+ minScore?: number;
102
+ /**
103
+ * Whether to exclude the source item from results
104
+ * @default true
105
+ */
106
+ excludeSelf?: boolean;
107
+ /**
108
+ * Additional Prisma where clause to filter results
109
+ */
110
+ where?: Record<string, unknown>;
111
+ }
112
+ /**
113
+ * Find items similar to a given item by ID
114
+ *
115
+ * This is a high-level API that:
116
+ * 1. Fetches the embedding of the source item
117
+ * 2. Searches for similar vectors in the database
118
+ * 3. Enforces access control
119
+ * 4. Optionally excludes the source item from results
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const similar = await findSimilar({
124
+ * listKey: 'Article',
125
+ * fieldName: 'contentEmbedding',
126
+ * itemId: 'article-123',
127
+ * storage: createVectorStorage({ type: 'pgvector' }),
128
+ * context: await getContext(),
129
+ * limit: 5,
130
+ * excludeSelf: true,
131
+ * })
132
+ * ```
133
+ */
134
+ export declare function findSimilar<T = unknown>(options: FindSimilarOptions): Promise<SearchResult<T>[]>;
135
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/runtime/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAExD,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,CAAA;IAE3B;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,cAAc,CAAC,CAAC,GAAG,OAAO,EAC9C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAyB5B;AAED,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;OAEG;IACH,OAAO,EAAE,aAAa,CAAA;IAEtB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAmD5B"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * High-level semantic search APIs
3
+ */
4
+ /**
5
+ * Perform semantic search using natural language query
6
+ *
7
+ * This is a high-level API that:
8
+ * 1. Generates embedding for the query text
9
+ * 2. Searches for similar vectors in the database
10
+ * 3. Enforces access control
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const results = await semanticSearch({
15
+ * listKey: 'Article',
16
+ * fieldName: 'contentEmbedding',
17
+ * query: 'articles about machine learning',
18
+ * provider: createEmbeddingProvider({ type: 'openai', apiKey: '...' }),
19
+ * storage: createVectorStorage({ type: 'pgvector' }),
20
+ * context: await getContext(),
21
+ * limit: 10,
22
+ * minScore: 0.7,
23
+ * })
24
+ * ```
25
+ */
26
+ export async function semanticSearch(options) {
27
+ const { listKey, fieldName, query, provider, storage, context, limit = 10, minScore = 0.0, where, } = options;
28
+ // Generate embedding for query
29
+ const queryVector = await provider.embed(query);
30
+ // Search for similar vectors
31
+ const results = await storage.search(listKey, fieldName, queryVector, {
32
+ limit,
33
+ minScore,
34
+ context,
35
+ where,
36
+ });
37
+ return results;
38
+ }
39
+ /**
40
+ * Find items similar to a given item by ID
41
+ *
42
+ * This is a high-level API that:
43
+ * 1. Fetches the embedding of the source item
44
+ * 2. Searches for similar vectors in the database
45
+ * 3. Enforces access control
46
+ * 4. Optionally excludes the source item from results
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * const similar = await findSimilar({
51
+ * listKey: 'Article',
52
+ * fieldName: 'contentEmbedding',
53
+ * itemId: 'article-123',
54
+ * storage: createVectorStorage({ type: 'pgvector' }),
55
+ * context: await getContext(),
56
+ * limit: 5,
57
+ * excludeSelf: true,
58
+ * })
59
+ * ```
60
+ */
61
+ export async function findSimilar(options) {
62
+ const { listKey, fieldName, itemId, storage, context, limit = 10, minScore = 0.0, excludeSelf = true, where = {}, } = options;
63
+ // Fetch the source item's embedding
64
+ // We need to access the database through the context
65
+ const dbKey = getDbKey(listKey);
66
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
67
+ const model = context.db[dbKey];
68
+ if (!model) {
69
+ throw new Error(`List "${listKey}" not found in database`);
70
+ }
71
+ const item = await model.findUnique({
72
+ where: { id: itemId },
73
+ select: { [fieldName]: true },
74
+ });
75
+ if (!item) {
76
+ throw new Error(`Item with id "${itemId}" not found in list "${listKey}"`);
77
+ }
78
+ const embedding = item[fieldName];
79
+ if (!embedding || !embedding.vector) {
80
+ throw new Error(`Item "${itemId}" does not have an embedding in field "${fieldName}"`);
81
+ }
82
+ const queryVector = embedding.vector;
83
+ // Build where clause
84
+ const searchWhere = excludeSelf ? { ...where, id: { not: itemId } } : where;
85
+ // Search for similar vectors
86
+ const results = await storage.search(listKey, fieldName, queryVector, {
87
+ limit,
88
+ minScore,
89
+ context,
90
+ where: searchWhere,
91
+ });
92
+ return results;
93
+ }
94
+ /**
95
+ * Convert list key (PascalCase) to database key (camelCase)
96
+ * Same logic as in core package
97
+ */
98
+ function getDbKey(listKey) {
99
+ return listKey.charAt(0).toLowerCase() + listKey.slice(1);
100
+ }
101
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/runtime/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B;IAE9B,MAAM,EACJ,OAAO,EACP,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,OAAO,EACP,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,GAAG,EACd,KAAK,GACN,GAAG,OAAO,CAAA;IAEX,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAE/C,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAI,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE;QACvE,KAAK;QACL,QAAQ;QACR,OAAO;QACP,KAAK;KACN,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAoDD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAA2B;IAE3B,MAAM,EACJ,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,EACP,OAAO,EACP,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,GAAG,EACd,WAAW,GAAG,IAAI,EAClB,KAAK,GAAG,EAAE,GACX,GAAG,OAAO,CAAA;IAEX,oCAAoC;IACpC,qDAAqD;IACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC/B,8DAA8D;IAC9D,MAAM,KAAK,GAAI,OAAO,CAAC,EAAU,CAAC,KAAK,CAAC,CAAA;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,yBAAyB,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;QAClC,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;QACrB,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE;KAC9B,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,wBAAwB,OAAO,GAAG,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IACjC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,SAAS,MAAM,0CAA0C,SAAS,GAAG,CAAC,CAAA;IACxF,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAA;IAEpC,qBAAqB;IACrB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAE3E,6BAA6B;IAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAI,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE;QACvE,KAAK;QACL,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,WAAW;KACnB,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,OAAe;IAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC"}