@opensaas/stack-rag 0.1.6 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +9 -0
- package/README.md +82 -6
- package/dist/config/plugin.d.ts.map +1 -1
- package/dist/config/plugin.js +29 -1
- package/dist/config/plugin.js.map +1 -1
- package/dist/config/types.d.ts +51 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/fields/index.d.ts +1 -0
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +1 -0
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/searchable.d.ts +42 -0
- package/dist/fields/searchable.d.ts.map +1 -0
- package/dist/fields/searchable.js +51 -0
- package/dist/fields/searchable.js.map +1 -0
- package/dist/fields/searchable.test.d.ts +2 -0
- package/dist/fields/searchable.test.d.ts.map +1 -0
- package/dist/fields/searchable.test.js +112 -0
- package/dist/fields/searchable.test.js.map +1 -0
- package/dist/providers/openai.d.ts +2 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +35 -20
- package/dist/providers/openai.js.map +1 -1
- package/dist/runtime/batch.test.js +1 -1
- package/dist/storage/access-filter.d.ts +30 -0
- package/dist/storage/access-filter.d.ts.map +1 -0
- package/dist/storage/access-filter.js +241 -0
- package/dist/storage/access-filter.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/pgvector.d.ts.map +1 -1
- package/dist/storage/pgvector.js +26 -11
- package/dist/storage/pgvector.js.map +1 -1
- package/dist/storage/storage.test.js +1 -0
- package/dist/storage/storage.test.js.map +1 -1
- package/dist/storage/types.d.ts +5 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js.map +1 -1
- package/package.json +3 -3
- package/src/config/plugin.ts +35 -2
- package/src/config/types.ts +59 -0
- package/src/fields/index.ts +2 -0
- package/src/fields/searchable.test.ts +136 -0
- package/src/fields/searchable.ts +57 -0
- package/src/providers/openai.ts +37 -22
- package/src/runtime/batch.test.ts +1 -1
- package/src/storage/access-filter.ts +303 -0
- package/src/storage/index.ts +3 -0
- package/src/storage/pgvector.ts +31 -11
- package/src/storage/storage.test.ts +1 -0
- package/src/storage/types.ts +6 -0
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @opensaas/stack-rag
|
|
2
2
|
|
|
3
|
+
## 0.1.7
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 372d467: Add `searchable` helper functions to embeddings
|
|
8
|
+
- 372d467: Add sudo to context to bypass access control
|
|
9
|
+
- Updated dependencies [372d467]
|
|
10
|
+
- @opensaas/stack-core@0.1.7
|
|
11
|
+
|
|
3
12
|
## 0.1.6
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ pnpm add openai # For OpenAI embeddings
|
|
|
35
35
|
import { config, list } from '@opensaas/stack-core'
|
|
36
36
|
import { text } from '@opensaas/stack-core/fields'
|
|
37
37
|
import { ragPlugin, openaiEmbeddings, pgvectorStorage } from '@opensaas/stack-rag'
|
|
38
|
-
import {
|
|
38
|
+
import { searchable } from '@opensaas/stack-rag/fields'
|
|
39
39
|
|
|
40
40
|
export default config({
|
|
41
41
|
plugins: [
|
|
@@ -55,13 +55,10 @@ export default config({
|
|
|
55
55
|
Article: list({
|
|
56
56
|
fields: {
|
|
57
57
|
title: text({ validation: { isRequired: true } }),
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
contentEmbedding: embedding({
|
|
61
|
-
sourceField: 'content', // Auto-embed when content changes
|
|
58
|
+
// Use searchable() wrapper for automatic embedding generation
|
|
59
|
+
content: searchable(text({ validation: { isRequired: true } }), {
|
|
62
60
|
provider: 'openai',
|
|
63
61
|
dimensions: 1536,
|
|
64
|
-
autoGenerate: true,
|
|
65
62
|
}),
|
|
66
63
|
},
|
|
67
64
|
}),
|
|
@@ -69,6 +66,12 @@ export default config({
|
|
|
69
66
|
})
|
|
70
67
|
```
|
|
71
68
|
|
|
69
|
+
**What's happening:**
|
|
70
|
+
|
|
71
|
+
- The `searchable()` wrapper automatically creates a `contentEmbedding` field
|
|
72
|
+
- Embeddings are auto-generated whenever `content` changes
|
|
73
|
+
- The embedding field respects all your existing access control rules
|
|
74
|
+
|
|
72
75
|
### 2. Generate schema and push to database
|
|
73
76
|
|
|
74
77
|
```bash
|
|
@@ -182,6 +185,79 @@ Good for SQLite-based apps. Requires sqlite-vss extension.
|
|
|
182
185
|
storage: sqliteVssStorage({ distanceFunction: 'cosine' })
|
|
183
186
|
```
|
|
184
187
|
|
|
188
|
+
## Field Configuration Patterns
|
|
189
|
+
|
|
190
|
+
### High-Level: `searchable()` Wrapper (Recommended)
|
|
191
|
+
|
|
192
|
+
The easiest way to add semantic search to any field:
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { searchable } from '@opensaas/stack-rag/fields'
|
|
196
|
+
|
|
197
|
+
fields: {
|
|
198
|
+
content: searchable(text({ validation: { isRequired: true } }), {
|
|
199
|
+
provider: 'openai',
|
|
200
|
+
dimensions: 1536,
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**What it does:**
|
|
206
|
+
|
|
207
|
+
- Automatically creates a companion `contentEmbedding` field
|
|
208
|
+
- Links it to the source field (`content`)
|
|
209
|
+
- Auto-generates embeddings when content changes
|
|
210
|
+
- Clean, concise syntax
|
|
211
|
+
|
|
212
|
+
**Options:**
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
type SearchableOptions = {
|
|
216
|
+
provider?: string // Embedding provider (e.g., 'openai', 'ollama')
|
|
217
|
+
dimensions?: number // Vector dimensions (default: 1536)
|
|
218
|
+
chunking?: ChunkingConfig // Text chunking configuration
|
|
219
|
+
embeddingFieldName?: string // Custom embedding field name (default: `${fieldName}Embedding`)
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Custom embedding field name:**
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
fields: {
|
|
227
|
+
body: searchable(text(), {
|
|
228
|
+
provider: 'openai',
|
|
229
|
+
embeddingFieldName: 'bodyVector', // Instead of 'bodyEmbedding'
|
|
230
|
+
})
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Low-Level: Manual `embedding()` Field
|
|
235
|
+
|
|
236
|
+
For advanced use cases where you need more control:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
import { embedding } from '@opensaas/stack-rag/fields'
|
|
240
|
+
|
|
241
|
+
fields: {
|
|
242
|
+
content: text({ validation: { isRequired: true } }),
|
|
243
|
+
contentEmbedding: embedding({
|
|
244
|
+
sourceField: 'content',
|
|
245
|
+
provider: 'openai',
|
|
246
|
+
dimensions: 1536,
|
|
247
|
+
autoGenerate: true,
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**When to use manual pattern:**
|
|
253
|
+
|
|
254
|
+
- Need access to the embedding field in your schema
|
|
255
|
+
- Want to store embeddings without a source field
|
|
256
|
+
- Building custom embedding pipelines
|
|
257
|
+
- Need field-level hooks on the embedding field
|
|
258
|
+
|
|
259
|
+
Both patterns are fully supported and can be used interchangeably.
|
|
260
|
+
|
|
185
261
|
## MCP Integration
|
|
186
262
|
|
|
187
263
|
Automatic semantic search tools for AI assistants:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,KAAK,EAAE,SAAS,EAA2C,MAAM,YAAY,CAAA;AAKpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAkNnD"}
|
package/dist/config/plugin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { normalizeRAGConfig } from './index.js';
|
|
2
2
|
import { createEmbeddingProvider } from '../providers/index.js';
|
|
3
|
+
import { embedding } from '../fields/embedding.js';
|
|
3
4
|
/**
|
|
4
5
|
* RAG plugin for OpenSaas Stack
|
|
5
6
|
* Provides vector embeddings, semantic search, and automatic embedding generation
|
|
@@ -40,7 +41,34 @@ export function ragPlugin(config) {
|
|
|
40
41
|
name: 'rag',
|
|
41
42
|
version: '0.1.0',
|
|
42
43
|
init: async (context) => {
|
|
43
|
-
//
|
|
44
|
+
// First pass: Scan for searchable() wrapped fields and inject embedding fields
|
|
45
|
+
for (const [listName, listConfig] of Object.entries(context.config.lists)) {
|
|
46
|
+
const embeddingFieldsToInject = {};
|
|
47
|
+
for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
|
|
48
|
+
// Check if field has _searchable metadata
|
|
49
|
+
if ('_searchable' in fieldConfig) {
|
|
50
|
+
const meta = fieldConfig._searchable;
|
|
51
|
+
// Determine embedding field name
|
|
52
|
+
const embeddingName = meta.embeddingFieldName || `${fieldName}Embedding`;
|
|
53
|
+
// Create embedding field
|
|
54
|
+
embeddingFieldsToInject[embeddingName] = embedding({
|
|
55
|
+
sourceField: fieldName,
|
|
56
|
+
provider: meta.provider,
|
|
57
|
+
dimensions: meta.dimensions,
|
|
58
|
+
chunking: meta.chunking,
|
|
59
|
+
autoGenerate: true,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Inject all embedding fields at once
|
|
64
|
+
if (Object.keys(embeddingFieldsToInject).length > 0) {
|
|
65
|
+
context.extendList(listName, {
|
|
66
|
+
fields: embeddingFieldsToInject,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Second pass: Find all embedding fields with autoGenerate enabled
|
|
71
|
+
// This includes both manually defined embedding fields AND injected ones from searchable()
|
|
44
72
|
for (const [listName, listConfig] of Object.entries(context.config.lists)) {
|
|
45
73
|
for (const [fieldName, fieldConfig] of Object.entries(listConfig.fields)) {
|
|
46
74
|
if (fieldConfig.type === 'embedding' &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/config/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -246,4 +246,55 @@ export type SearchResult<T = unknown> = {
|
|
|
246
246
|
*/
|
|
247
247
|
distance: number;
|
|
248
248
|
};
|
|
249
|
+
/**
|
|
250
|
+
* Options for searchable() field wrapper
|
|
251
|
+
* Simplified options for common use cases
|
|
252
|
+
*/
|
|
253
|
+
export type SearchableOptions = {
|
|
254
|
+
/**
|
|
255
|
+
* Embedding provider to use
|
|
256
|
+
* References a provider name from RAG config
|
|
257
|
+
* Falls back to default provider if not specified
|
|
258
|
+
*/
|
|
259
|
+
provider?: EmbeddingProviderName;
|
|
260
|
+
/**
|
|
261
|
+
* Vector dimensions
|
|
262
|
+
* Must match the provider's output dimensions
|
|
263
|
+
* @default 1536 (OpenAI text-embedding-3-small)
|
|
264
|
+
*/
|
|
265
|
+
dimensions?: number;
|
|
266
|
+
/**
|
|
267
|
+
* Chunking configuration for long texts
|
|
268
|
+
*/
|
|
269
|
+
chunking?: ChunkingConfig;
|
|
270
|
+
/**
|
|
271
|
+
* Custom name for the generated embedding field
|
|
272
|
+
* If not provided, defaults to `${fieldName}Embedding`
|
|
273
|
+
* @example 'contentVector' instead of 'contentEmbedding'
|
|
274
|
+
*/
|
|
275
|
+
embeddingFieldName?: string;
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Internal metadata attached to searchable fields
|
|
279
|
+
* Used by ragPlugin to identify and inject embedding fields
|
|
280
|
+
* @internal
|
|
281
|
+
*/
|
|
282
|
+
export type SearchableMetadata = {
|
|
283
|
+
/**
|
|
284
|
+
* Name for the generated embedding field
|
|
285
|
+
*/
|
|
286
|
+
embeddingFieldName: string;
|
|
287
|
+
/**
|
|
288
|
+
* Embedding provider to use
|
|
289
|
+
*/
|
|
290
|
+
provider?: EmbeddingProviderName;
|
|
291
|
+
/**
|
|
292
|
+
* Vector dimensions
|
|
293
|
+
*/
|
|
294
|
+
dimensions?: number;
|
|
295
|
+
/**
|
|
296
|
+
* Chunking configuration
|
|
297
|
+
*/
|
|
298
|
+
chunking?: ChunkingConfig;
|
|
299
|
+
};
|
|
249
300
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
package/dist/fields/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/fields/index.js
CHANGED
package/dist/fields/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG1C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { BaseFieldConfig } from '@opensaas/stack-core';
|
|
2
|
+
import type { SearchableOptions, SearchableMetadata } from '../config/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* High-level field wrapper that automatically adds embedding field and hooks
|
|
5
|
+
*
|
|
6
|
+
* This wrapper makes it easy to add semantic search to any text field by
|
|
7
|
+
* automatically creating a companion embedding field that stays in sync.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { text } from '@opensaas/stack-core/fields'
|
|
12
|
+
* import { searchable } from '@opensaas/stack-rag/fields'
|
|
13
|
+
*
|
|
14
|
+
* fields: {
|
|
15
|
+
* content: searchable(text(), {
|
|
16
|
+
* provider: 'openai',
|
|
17
|
+
* dimensions: 1536
|
|
18
|
+
* })
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* This is equivalent to the manual pattern:
|
|
23
|
+
* ```typescript
|
|
24
|
+
* fields: {
|
|
25
|
+
* content: text(),
|
|
26
|
+
* contentEmbedding: embedding({
|
|
27
|
+
* sourceField: 'content',
|
|
28
|
+
* provider: 'openai',
|
|
29
|
+
* dimensions: 1536,
|
|
30
|
+
* autoGenerate: true
|
|
31
|
+
* })
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @param field - The field to make searchable (usually text() or richText())
|
|
36
|
+
* @param options - Embedding configuration options
|
|
37
|
+
* @returns The same field with searchable metadata attached
|
|
38
|
+
*/
|
|
39
|
+
export declare function searchable<T extends BaseFieldConfig>(field: T, options?: SearchableOptions): T & {
|
|
40
|
+
_searchable: SearchableMetadata;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=searchable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable.d.ts","sourceRoot":"","sources":["../../src/fields/searchable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAClD,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,iBAAsB,GAC9B,CAAC,GAAG;IAAE,WAAW,EAAE,kBAAkB,CAAA;CAAE,CAczC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level field wrapper that automatically adds embedding field and hooks
|
|
3
|
+
*
|
|
4
|
+
* This wrapper makes it easy to add semantic search to any text field by
|
|
5
|
+
* automatically creating a companion embedding field that stays in sync.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { text } from '@opensaas/stack-core/fields'
|
|
10
|
+
* import { searchable } from '@opensaas/stack-rag/fields'
|
|
11
|
+
*
|
|
12
|
+
* fields: {
|
|
13
|
+
* content: searchable(text(), {
|
|
14
|
+
* provider: 'openai',
|
|
15
|
+
* dimensions: 1536
|
|
16
|
+
* })
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* This is equivalent to the manual pattern:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* fields: {
|
|
23
|
+
* content: text(),
|
|
24
|
+
* contentEmbedding: embedding({
|
|
25
|
+
* sourceField: 'content',
|
|
26
|
+
* provider: 'openai',
|
|
27
|
+
* dimensions: 1536,
|
|
28
|
+
* autoGenerate: true
|
|
29
|
+
* })
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @param field - The field to make searchable (usually text() or richText())
|
|
34
|
+
* @param options - Embedding configuration options
|
|
35
|
+
* @returns The same field with searchable metadata attached
|
|
36
|
+
*/
|
|
37
|
+
export function searchable(field, options = {}) {
|
|
38
|
+
const { embeddingFieldName, provider, dimensions, chunking } = options;
|
|
39
|
+
// Attach metadata to the field for ragPlugin to detect
|
|
40
|
+
return {
|
|
41
|
+
...field,
|
|
42
|
+
_searchable: {
|
|
43
|
+
// Use custom name if provided, otherwise will be set by plugin based on field name
|
|
44
|
+
embeddingFieldName: embeddingFieldName || '',
|
|
45
|
+
provider,
|
|
46
|
+
dimensions,
|
|
47
|
+
chunking,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=searchable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable.js","sourceRoot":"","sources":["../../src/fields/searchable.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,UAAU,CACxB,KAAQ,EACR,UAA6B,EAAE;IAE/B,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAEtE,uDAAuD;IACvD,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE;YACX,mFAAmF;YACnF,kBAAkB,EAAE,kBAAkB,IAAI,EAAE;YAC5C,QAAQ;YACR,UAAU;YACV,QAAQ;SACT;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable.test.d.ts","sourceRoot":"","sources":["../../src/fields/searchable.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { searchable } from './searchable.js';
|
|
3
|
+
// Mock text field for testing
|
|
4
|
+
function mockTextField() {
|
|
5
|
+
return {
|
|
6
|
+
type: 'text',
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
8
|
+
getZodSchema: () => null,
|
|
9
|
+
getPrismaType: () => ({ type: 'String', modifiers: '' }),
|
|
10
|
+
getTypeScriptType: () => ({ type: 'string', optional: false }),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
describe('searchable() field wrapper', () => {
|
|
14
|
+
it('should preserve original field properties', () => {
|
|
15
|
+
const field = mockTextField();
|
|
16
|
+
const wrapped = searchable(field);
|
|
17
|
+
expect(wrapped.type).toBe('text');
|
|
18
|
+
expect(wrapped.getZodSchema).toBe(field.getZodSchema);
|
|
19
|
+
expect(wrapped.getPrismaType).toBe(field.getPrismaType);
|
|
20
|
+
expect(wrapped.getTypeScriptType).toBe(field.getTypeScriptType);
|
|
21
|
+
});
|
|
22
|
+
it('should attach _searchable metadata', () => {
|
|
23
|
+
const field = mockTextField();
|
|
24
|
+
const wrapped = searchable(field, { provider: 'openai' });
|
|
25
|
+
expect(wrapped._searchable).toBeDefined();
|
|
26
|
+
expect(wrapped._searchable.provider).toBe('openai');
|
|
27
|
+
});
|
|
28
|
+
it('should use default options when not provided', () => {
|
|
29
|
+
const field = mockTextField();
|
|
30
|
+
const wrapped = searchable(field);
|
|
31
|
+
expect(wrapped._searchable).toBeDefined();
|
|
32
|
+
expect(wrapped._searchable.embeddingFieldName).toBe('');
|
|
33
|
+
expect(wrapped._searchable.provider).toBeUndefined();
|
|
34
|
+
expect(wrapped._searchable.dimensions).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
it('should accept all searchable options', () => {
|
|
37
|
+
const field = mockTextField();
|
|
38
|
+
const options = {
|
|
39
|
+
provider: 'ollama',
|
|
40
|
+
dimensions: 768,
|
|
41
|
+
chunking: {
|
|
42
|
+
strategy: 'sentence',
|
|
43
|
+
maxTokens: 300,
|
|
44
|
+
overlap: 25,
|
|
45
|
+
},
|
|
46
|
+
embeddingFieldName: 'customEmbedding',
|
|
47
|
+
};
|
|
48
|
+
const wrapped = searchable(field, options);
|
|
49
|
+
expect(wrapped._searchable.provider).toBe('ollama');
|
|
50
|
+
expect(wrapped._searchable.dimensions).toBe(768);
|
|
51
|
+
expect(wrapped._searchable.chunking).toEqual({
|
|
52
|
+
strategy: 'sentence',
|
|
53
|
+
maxTokens: 300,
|
|
54
|
+
overlap: 25,
|
|
55
|
+
});
|
|
56
|
+
expect(wrapped._searchable.embeddingFieldName).toBe('customEmbedding');
|
|
57
|
+
});
|
|
58
|
+
it('should preserve field with validation options', () => {
|
|
59
|
+
const fieldWithValidation = {
|
|
60
|
+
...mockTextField(),
|
|
61
|
+
validation: {
|
|
62
|
+
isRequired: true,
|
|
63
|
+
length: { min: 10, max: 1000 },
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const wrapped = searchable(fieldWithValidation, { provider: 'openai' });
|
|
67
|
+
expect(wrapped.validation).toEqual({
|
|
68
|
+
isRequired: true,
|
|
69
|
+
length: { min: 10, max: 1000 },
|
|
70
|
+
});
|
|
71
|
+
expect(wrapped._searchable).toBeDefined();
|
|
72
|
+
});
|
|
73
|
+
it('should preserve field with hooks', () => {
|
|
74
|
+
const resolveInputHook = () => { };
|
|
75
|
+
const fieldWithHooks = {
|
|
76
|
+
...mockTextField(),
|
|
77
|
+
hooks: {
|
|
78
|
+
resolveInput: resolveInputHook,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
const wrapped = searchable(fieldWithHooks);
|
|
82
|
+
expect(wrapped.hooks).toBeDefined();
|
|
83
|
+
expect(wrapped.hooks?.resolveInput).toBe(resolveInputHook);
|
|
84
|
+
expect(wrapped._searchable).toBeDefined();
|
|
85
|
+
});
|
|
86
|
+
it('should work with different field types', () => {
|
|
87
|
+
const richTextField = {
|
|
88
|
+
...mockTextField(),
|
|
89
|
+
type: 'richText',
|
|
90
|
+
};
|
|
91
|
+
const wrapped = searchable(richTextField, { provider: 'openai' });
|
|
92
|
+
expect(wrapped.type).toBe('richText');
|
|
93
|
+
expect(wrapped._searchable).toBeDefined();
|
|
94
|
+
});
|
|
95
|
+
it('should handle empty embeddingFieldName option', () => {
|
|
96
|
+
const field = mockTextField();
|
|
97
|
+
const wrapped = searchable(field, { embeddingFieldName: '' });
|
|
98
|
+
expect(wrapped._searchable.embeddingFieldName).toBe('');
|
|
99
|
+
});
|
|
100
|
+
it('should handle partial chunking config', () => {
|
|
101
|
+
const field = mockTextField();
|
|
102
|
+
const wrapped = searchable(field, {
|
|
103
|
+
chunking: {
|
|
104
|
+
strategy: 'recursive',
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
expect(wrapped._searchable.chunking).toEqual({
|
|
108
|
+
strategy: 'recursive',
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=searchable.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchable.test.js","sourceRoot":"","sources":["../../src/fields/searchable.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,9 @@ export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
|
10
10
|
readonly dimensions: number;
|
|
11
11
|
private client;
|
|
12
12
|
private config;
|
|
13
|
+
private clientPromise;
|
|
13
14
|
constructor(config: OpenAIEmbeddingConfig);
|
|
15
|
+
private ensureClient;
|
|
14
16
|
private initializeClient;
|
|
15
17
|
/**
|
|
16
18
|
* Generate embedding for a single text
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAwB,MAAM,oBAAoB,CAAA;AAyCrF;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAE3B,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAqC;gBAE9C,MAAM,EAAE,qBAAqB;YAM3B,YAAY;YASZ,gBAAgB;IAU9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB5C;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAkDvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,uBAAuB,CAE3F"}
|