@convex-dev/rag 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.
Files changed (113) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +371 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/defaultChunker.d.ts +15 -0
  8. package/dist/client/defaultChunker.d.ts.map +1 -0
  9. package/dist/client/defaultChunker.js +148 -0
  10. package/dist/client/defaultChunker.js.map +1 -0
  11. package/dist/client/fileUtils.d.ts +24 -0
  12. package/dist/client/fileUtils.d.ts.map +1 -0
  13. package/dist/client/fileUtils.js +179 -0
  14. package/dist/client/fileUtils.js.map +1 -0
  15. package/dist/client/index.d.ts +442 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +597 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/client/types.d.ts +29 -0
  20. package/dist/client/types.d.ts.map +1 -0
  21. package/dist/client/types.js +2 -0
  22. package/dist/client/types.js.map +1 -0
  23. package/dist/component/_generated/api.d.ts +439 -0
  24. package/dist/component/_generated/api.d.ts.map +1 -0
  25. package/dist/component/_generated/api.js +22 -0
  26. package/dist/component/_generated/api.js.map +1 -0
  27. package/dist/component/_generated/dataModel.d.ts +60 -0
  28. package/dist/component/_generated/server.d.ts +149 -0
  29. package/dist/component/_generated/server.d.ts.map +1 -0
  30. package/dist/component/_generated/server.js +74 -0
  31. package/dist/component/_generated/server.js.map +1 -0
  32. package/dist/component/chunks.d.ts +139 -0
  33. package/dist/component/chunks.d.ts.map +1 -0
  34. package/dist/component/chunks.js +413 -0
  35. package/dist/component/chunks.js.map +1 -0
  36. package/dist/component/convex.config.d.ts +3 -0
  37. package/dist/component/convex.config.d.ts.map +1 -0
  38. package/dist/component/convex.config.js +6 -0
  39. package/dist/component/convex.config.js.map +1 -0
  40. package/dist/component/embeddings/importance.d.ts +21 -0
  41. package/dist/component/embeddings/importance.d.ts.map +1 -0
  42. package/dist/component/embeddings/importance.js +67 -0
  43. package/dist/component/embeddings/importance.js.map +1 -0
  44. package/dist/component/embeddings/index.d.ts +23 -0
  45. package/dist/component/embeddings/index.d.ts.map +1 -0
  46. package/dist/component/embeddings/index.js +54 -0
  47. package/dist/component/embeddings/index.js.map +1 -0
  48. package/dist/component/embeddings/tables.d.ts +39 -0
  49. package/dist/component/embeddings/tables.d.ts.map +1 -0
  50. package/dist/component/embeddings/tables.js +53 -0
  51. package/dist/component/embeddings/tables.js.map +1 -0
  52. package/dist/component/entries.d.ts +167 -0
  53. package/dist/component/entries.d.ts.map +1 -0
  54. package/dist/component/entries.js +409 -0
  55. package/dist/component/entries.js.map +1 -0
  56. package/dist/component/filters.d.ts +46 -0
  57. package/dist/component/filters.d.ts.map +1 -0
  58. package/dist/component/filters.js +72 -0
  59. package/dist/component/filters.js.map +1 -0
  60. package/dist/component/namespaces.d.ts +131 -0
  61. package/dist/component/namespaces.d.ts.map +1 -0
  62. package/dist/component/namespaces.js +222 -0
  63. package/dist/component/namespaces.js.map +1 -0
  64. package/dist/component/schema.d.ts +1697 -0
  65. package/dist/component/schema.d.ts.map +1 -0
  66. package/dist/component/schema.js +88 -0
  67. package/dist/component/schema.js.map +1 -0
  68. package/dist/component/search.d.ts +20 -0
  69. package/dist/component/search.d.ts.map +1 -0
  70. package/dist/component/search.js +69 -0
  71. package/dist/component/search.js.map +1 -0
  72. package/dist/package.json +3 -0
  73. package/dist/react/index.d.ts +2 -0
  74. package/dist/react/index.d.ts.map +1 -0
  75. package/dist/react/index.js +6 -0
  76. package/dist/react/index.js.map +1 -0
  77. package/dist/shared.d.ts +479 -0
  78. package/dist/shared.d.ts.map +1 -0
  79. package/dist/shared.js +98 -0
  80. package/dist/shared.js.map +1 -0
  81. package/package.json +97 -0
  82. package/src/client/_generated/_ignore.ts +1 -0
  83. package/src/client/defaultChunker.test.ts +243 -0
  84. package/src/client/defaultChunker.ts +183 -0
  85. package/src/client/fileUtils.ts +179 -0
  86. package/src/client/index.test.ts +475 -0
  87. package/src/client/index.ts +1125 -0
  88. package/src/client/setup.test.ts +28 -0
  89. package/src/client/types.ts +69 -0
  90. package/src/component/_generated/api.d.ts +439 -0
  91. package/src/component/_generated/api.js +23 -0
  92. package/src/component/_generated/dataModel.d.ts +60 -0
  93. package/src/component/_generated/server.d.ts +149 -0
  94. package/src/component/_generated/server.js +90 -0
  95. package/src/component/chunks.test.ts +915 -0
  96. package/src/component/chunks.ts +555 -0
  97. package/src/component/convex.config.ts +7 -0
  98. package/src/component/embeddings/importance.test.ts +249 -0
  99. package/src/component/embeddings/importance.ts +75 -0
  100. package/src/component/embeddings/index.test.ts +482 -0
  101. package/src/component/embeddings/index.ts +99 -0
  102. package/src/component/embeddings/tables.ts +114 -0
  103. package/src/component/entries.test.ts +341 -0
  104. package/src/component/entries.ts +546 -0
  105. package/src/component/filters.ts +119 -0
  106. package/src/component/namespaces.ts +299 -0
  107. package/src/component/schema.ts +106 -0
  108. package/src/component/search.test.ts +445 -0
  109. package/src/component/search.ts +97 -0
  110. package/src/component/setup.test.ts +5 -0
  111. package/src/react/index.ts +7 -0
  112. package/src/shared.ts +247 -0
  113. package/src/vitest.config.ts +7 -0
@@ -0,0 +1,597 @@
1
+ import { embed, embedMany, generateText } from "ai";
2
+ import { assert } from "convex-helpers";
3
+ import { createFunctionHandle, internalActionGeneric, internalMutationGeneric, } from "convex/server";
4
+ import {} from "convex/values";
5
+ import { CHUNK_BATCH_SIZE, filterNamesContain, vChunkerArgs, vEntryId, vNamespaceId, vOnCompleteArgs, } from "../shared.js";
6
+ import {} from "./types.js";
7
+ import {} from "../shared.js";
8
+ import { defaultChunker } from "./defaultChunker.js";
9
+ export { defaultChunker, vEntryId, vNamespaceId };
10
+ export { vEntry, vSearchEntry, vSearchResult, vOnCompleteArgs, } from "../shared.js";
11
+ export { contentHashFromArrayBuffer, guessMimeTypeFromExtension, guessMimeTypeFromContents, } from "./fileUtils.js";
12
+ const DEFAULT_SEARCH_LIMIT = 10;
13
+ export class RAG {
14
+ component;
15
+ options;
16
+ /**
17
+ * A component to use for Retrieval-Augmented Generation.
18
+ * Create one for each model and embedding dimension you want to use.
19
+ * When migrating between models / embedding lengths, create multiple
20
+ * instances and do your `add`s with the appropriate instance, and searches
21
+ * against the appropriate instance to get results with those parameters.
22
+ *
23
+ * The filterNames need to match the names of the filters you provide when
24
+ * adding and when searching. Use the type parameter to make this type safe.
25
+ *
26
+ * The second type parameter makes the entry metadata type safe. E.g. you can
27
+ * do rag.add(ctx, {
28
+ * namespace: "my-namespace",
29
+ * metadata: {
30
+ * source: "website" as const,
31
+ * },
32
+ * })
33
+ * and then entry results will have the metadata type `{ source: "website" }`.
34
+ */
35
+ constructor(component, options) {
36
+ this.component = component;
37
+ this.options = options;
38
+ }
39
+ /**
40
+ * Add an entry to the store. It will chunk the text with the `defaultChunker`
41
+ * if you don't provide chunks, and embed the chunks with the default model
42
+ * if you don't provide chunk embeddings.
43
+ *
44
+ * If you provide a key, it will replace an existing entry with the same key.
45
+ * If you don't provide a key, it will always create a new entry.
46
+ * If you provide a contentHash, it will deduplicate the entry if it already exists.
47
+ * The filterValues you provide can be used later to search for it.
48
+ */
49
+ async add(ctx, args) {
50
+ let namespaceId;
51
+ if ("namespaceId" in args) {
52
+ namespaceId = args.namespaceId;
53
+ }
54
+ else {
55
+ const namespace = await this.getOrCreateNamespace(ctx, {
56
+ namespace: args.namespace,
57
+ status: "ready",
58
+ });
59
+ namespaceId = namespace.namespaceId;
60
+ }
61
+ validateAddFilterValues(args.filterValues, this.options.filterNames);
62
+ const chunks = args.chunks ?? defaultChunker(args.text);
63
+ let allChunks;
64
+ if (Array.isArray(chunks) && chunks.length < CHUNK_BATCH_SIZE) {
65
+ allChunks = await createChunkArgsBatch(this.options.textEmbeddingModel, chunks);
66
+ }
67
+ const onComplete = args.onComplete && (await createFunctionHandle(args.onComplete));
68
+ const { entryId, status, created, replacedVersion } = await ctx.runMutation(this.component.entries.add, {
69
+ entry: {
70
+ key: args.key,
71
+ namespaceId,
72
+ title: args.title,
73
+ metadata: args.metadata,
74
+ filterValues: args.filterValues ?? [],
75
+ importance: args.importance ?? 1,
76
+ contentHash: args.contentHash,
77
+ },
78
+ onComplete,
79
+ allChunks,
80
+ });
81
+ if (status === "ready") {
82
+ return {
83
+ entryId: entryId,
84
+ status,
85
+ created,
86
+ replacedVersion: replacedVersion,
87
+ };
88
+ }
89
+ // break chunks up into batches, respecting soft limit
90
+ let startOrder = 0;
91
+ let isPending = false;
92
+ for await (const batch of batchIterator(chunks, CHUNK_BATCH_SIZE)) {
93
+ const chunks = await createChunkArgsBatch(this.options.textEmbeddingModel, batch);
94
+ const { status } = await ctx.runMutation(this.component.chunks.insert, {
95
+ entryId,
96
+ startOrder,
97
+ chunks,
98
+ });
99
+ startOrder += chunks.length;
100
+ if (status === "pending") {
101
+ isPending = true;
102
+ }
103
+ }
104
+ if (isPending) {
105
+ let startOrder = 0;
106
+ // replace any older version of the entry with the new one
107
+ while (true) {
108
+ const { status, nextStartOrder } = await ctx.runMutation(this.component.chunks.replaceChunksPage, { entryId, startOrder });
109
+ if (status === "ready") {
110
+ break;
111
+ }
112
+ else if (status === "replaced") {
113
+ return {
114
+ entryId: entryId,
115
+ status: "replaced",
116
+ created: false,
117
+ replacedVersion: null,
118
+ };
119
+ }
120
+ startOrder = nextStartOrder;
121
+ }
122
+ }
123
+ const promoted = await ctx.runMutation(this.component.entries.promoteToReady, { entryId });
124
+ return {
125
+ entryId: entryId,
126
+ status: "ready",
127
+ replacedVersion: promoted.replacedVersion,
128
+ created: true,
129
+ };
130
+ }
131
+ /**
132
+ * Add an entry to the store asynchronously.
133
+ *
134
+ * This is useful if you want to chunk the entry in a separate process,
135
+ * or if you want to chunk the entry in a separate process.
136
+ *
137
+ * The chunkerAction is a function that splits the entry into chunks and
138
+ * embeds them. It should be passed as internal.foo.myChunkerAction
139
+ * e.g.
140
+ * ```ts
141
+ * export const myChunkerAction = rag.defineChunkerAction(async (ctx, args) => {
142
+ * // ...
143
+ * return { chunks: [chunk1, chunk2, chunk3] };
144
+ * });
145
+ *
146
+ * // in your mutation
147
+ * const entryId = await rag.addAsync(ctx, {
148
+ * key: "myfile.txt",
149
+ * namespace: "my-namespace",
150
+ * chunkerAction: internal.foo.myChunkerAction,
151
+ * });
152
+ * ```
153
+ */
154
+ async addAsync(ctx, args) {
155
+ let namespaceId;
156
+ if ("namespaceId" in args) {
157
+ namespaceId = args.namespaceId;
158
+ }
159
+ else {
160
+ const namespace = await this.getOrCreateNamespace(ctx, {
161
+ namespace: args.namespace,
162
+ status: "ready",
163
+ });
164
+ namespaceId = namespace.namespaceId;
165
+ }
166
+ validateAddFilterValues(args.filterValues, this.options.filterNames);
167
+ const onComplete = args.onComplete
168
+ ? await createFunctionHandle(args.onComplete)
169
+ : undefined;
170
+ const chunker = await createFunctionHandle(args.chunkerAction);
171
+ const { entryId, status } = await ctx.runMutation(this.component.entries.addAsync, {
172
+ entry: {
173
+ key: args.key,
174
+ namespaceId,
175
+ title: args.title,
176
+ metadata: args.metadata,
177
+ filterValues: args.filterValues ?? [],
178
+ importance: args.importance ?? 1,
179
+ contentHash: args.contentHash,
180
+ },
181
+ onComplete,
182
+ chunker,
183
+ });
184
+ return { entryId: entryId, status };
185
+ }
186
+ /**
187
+ * Search for entries in a namespace with configurable filters.
188
+ * You can provide a query string or target embedding, as well as search
189
+ * parameters to filter and constrain the results.
190
+ */
191
+ async search(ctx, args) {
192
+ const { namespace, filters = [], limit = DEFAULT_SEARCH_LIMIT, chunkContext = { before: 0, after: 0 }, vectorScoreThreshold, } = args;
193
+ let embedding = args.embedding;
194
+ if (!embedding) {
195
+ const embedResult = await embed({
196
+ model: this.options.textEmbeddingModel,
197
+ value: args.query,
198
+ });
199
+ embedding = embedResult.embedding;
200
+ }
201
+ const { results, entries } = await ctx.runAction(this.component.search.search, {
202
+ embedding,
203
+ namespace,
204
+ modelId: this.options.textEmbeddingModel.modelId,
205
+ filters,
206
+ limit,
207
+ vectorScoreThreshold,
208
+ chunkContext,
209
+ });
210
+ const entriesWithTexts = entries.map((e) => {
211
+ const ranges = results
212
+ .filter((r) => r.entryId === e.entryId)
213
+ .sort((a, b) => a.startOrder - b.startOrder);
214
+ let text = "";
215
+ let previousEnd = 0;
216
+ for (const range of ranges) {
217
+ if (previousEnd !== 0) {
218
+ if (range.startOrder !== previousEnd) {
219
+ text += "\n...\n";
220
+ }
221
+ else {
222
+ text += "\n";
223
+ }
224
+ }
225
+ text += range.content.map((c) => c.text).join("\n");
226
+ previousEnd = range.startOrder + range.content.length;
227
+ }
228
+ return { ...e, text };
229
+ });
230
+ return {
231
+ results: results,
232
+ text: entriesWithTexts
233
+ .map((e) => (e.title ? `# ${e.title}:\n${e.text}` : e.text))
234
+ .join(`\n---\n`),
235
+ entries: entriesWithTexts,
236
+ };
237
+ }
238
+ /**
239
+ * Generate text based on Retrieval-Augmented Generation.
240
+ *
241
+ * This will search for entries in the namespace based on the prompt and use
242
+ * the results as context to generate text, using the search options args.
243
+ * You can override the default "system" message to provide instructions on
244
+ * using the context and answering in the appropriate style.
245
+ * You can provide "messages" in addition to the prompt to provide
246
+ * extra context / conversation history.
247
+ */
248
+ async generateText(ctx, args) {
249
+ const { search: { namespace, ...searchOpts }, prompt, ...aiSdkOpts } = args;
250
+ const context = await this.search(ctx, {
251
+ namespace,
252
+ query: prompt,
253
+ ...searchOpts,
254
+ });
255
+ let contextHeader = "Use the following context to respond to the user's question:\n";
256
+ let contextContents = context.text;
257
+ let contextFooter = "\n--------------------------------\n";
258
+ let userQuestionHeader = "";
259
+ let userQuestionFooter = "";
260
+ let userPrompt = prompt;
261
+ switch (aiSdkOpts.model.provider) {
262
+ case "openai":
263
+ userQuestionHeader = '**User question:**\n"""';
264
+ userQuestionFooter = '"""';
265
+ break;
266
+ case "meta":
267
+ userQuestionHeader = "**User question:**\n";
268
+ break;
269
+ case "google":
270
+ userQuestionHeader = "<question>";
271
+ userQuestionFooter = "</question>";
272
+ // fallthrough
273
+ case "anthropic":
274
+ contextHeader = "<context>";
275
+ contextContents = context.entries
276
+ .map((e) => e.title
277
+ ? `<document title="${e.title}">${e.text}</document>`
278
+ : `<document>${e.text}</document>`)
279
+ .join("\n");
280
+ contextFooter = "</context>";
281
+ userPrompt = prompt.replace(/</g, "&lt;").replace(/>/g, "&gt;");
282
+ break;
283
+ default:
284
+ }
285
+ const promptWithContext = [
286
+ contextHeader,
287
+ contextContents,
288
+ contextFooter,
289
+ "\n",
290
+ userQuestionHeader,
291
+ userPrompt,
292
+ userQuestionFooter,
293
+ ]
294
+ .join("\n")
295
+ .trim();
296
+ const result = (await generateText({
297
+ system: "You use the context provided only to produce a response. Do not preface the response with acknowledgement of the context.",
298
+ ...aiSdkOpts,
299
+ messages: [
300
+ ...(args.messages ?? []),
301
+ {
302
+ role: "user",
303
+ content: promptWithContext,
304
+ },
305
+ ],
306
+ }));
307
+ result.context = context;
308
+ return result;
309
+ }
310
+ /**
311
+ * List all entries in a namespace.
312
+ */
313
+ async list(ctx, args) {
314
+ const results = await ctx.runQuery(this.component.entries.list, {
315
+ namespaceId: args.namespaceId,
316
+ paginationOpts: args.paginationOpts,
317
+ order: args.order ?? "asc",
318
+ status: args.status ?? "ready",
319
+ });
320
+ return results;
321
+ }
322
+ /**
323
+ * Get entry metadata by its id.
324
+ */
325
+ async getEntry(ctx, args) {
326
+ const entry = await ctx.runQuery(this.component.entries.get, {
327
+ entryId: args.entryId,
328
+ });
329
+ return entry;
330
+ }
331
+ /**
332
+ * Find an existing entry by its content hash, which you can use to copy
333
+ * new results into a new entry when migrating, or avoiding duplicating work
334
+ * when updating content.
335
+ */
336
+ async findExistingEntryByContentHash(ctx, args) {
337
+ const entry = await ctx.runQuery(this.component.entries.findByContentHash, {
338
+ namespace: args.namespace,
339
+ dimension: this.options.embeddingDimension,
340
+ filterNames: this.options.filterNames ?? [],
341
+ modelId: this.options.textEmbeddingModel.modelId,
342
+ key: args.key,
343
+ contentHash: args.contentHash,
344
+ });
345
+ return entry;
346
+ }
347
+ /**
348
+ * Get a namespace that matches the modelId, embedding dimension, and
349
+ * filterNames of the RAG instance. If it doesn't exist, it will be created.
350
+ */
351
+ async getOrCreateNamespace(ctx, args) {
352
+ const onComplete = args.onComplete
353
+ ? await createFunctionHandle(args.onComplete)
354
+ : undefined;
355
+ assert(!onComplete || args.status === "pending", "You can only supply an onComplete handler for pending namespaces");
356
+ const { namespaceId, status } = await ctx.runMutation(this.component.namespaces.getOrCreate, {
357
+ namespace: args.namespace,
358
+ status: args.status ?? "ready",
359
+ onComplete,
360
+ modelId: this.options.textEmbeddingModel.modelId,
361
+ dimension: this.options.embeddingDimension,
362
+ filterNames: this.options.filterNames ?? [],
363
+ });
364
+ return { namespaceId: namespaceId, status };
365
+ }
366
+ /**
367
+ * Get a namespace that matches the modelId, embedding dimension, and
368
+ * filterNames of the RAG instance. If it doesn't exist, it will return null.
369
+ */
370
+ async getNamespace(ctx, args) {
371
+ return ctx.runQuery(this.component.namespaces.get, {
372
+ namespace: args.namespace,
373
+ modelId: this.options.textEmbeddingModel.modelId,
374
+ dimension: this.options.embeddingDimension,
375
+ filterNames: this.options.filterNames ?? [],
376
+ });
377
+ }
378
+ /**
379
+ * List all chunks for an entry, paginated.
380
+ */
381
+ async listChunks(ctx, args) {
382
+ return ctx.runQuery(this.component.chunks.list, {
383
+ entryId: args.entryId,
384
+ paginationOpts: args.paginationOpts,
385
+ });
386
+ }
387
+ /**
388
+ * Delete an entry and all its chunks.
389
+ */
390
+ async delete(ctx, args) {
391
+ await ctx.runMutation(this.component.entries.deleteAsync, {
392
+ entryId: args.entryId,
393
+ startOrder: 0,
394
+ });
395
+ }
396
+ /**
397
+ * Define a function that can be provided to the `onComplete` parameter of
398
+ * `add` or `addAsync` like:
399
+ * ```ts
400
+ * const onComplete = rag.defineOnComplete(async (ctx, args) => {
401
+ * // ...
402
+ * });
403
+ *
404
+ * // in your mutation
405
+ * await rag.add(ctx, {
406
+ * namespace: "my-namespace",
407
+ * onComplete: internal.foo.onComplete,
408
+ * });
409
+ * ```
410
+ * It will be called when the entry is no longer "pending".
411
+ * This is usually when it's "ready" but it can be "replaced" if a newer
412
+ * entry is ready before this one.
413
+ */
414
+ defineOnComplete(fn) {
415
+ return internalMutationGeneric({
416
+ args: vOnCompleteArgs,
417
+ handler: fn,
418
+ });
419
+ }
420
+ /**
421
+ * Define a function that can be provided to the `chunkerAction` parameter of
422
+ * `addAsync` like:
423
+ * ```ts
424
+ * const chunkerAction = rag.defineChunkerAction(async (ctx, args) => {
425
+ * // ...
426
+ * });
427
+ *
428
+ * // in your mutation
429
+ * const entryId = await rag.addAsync(ctx, {
430
+ * key: "myfile.txt",
431
+ * namespace: "my-namespace",
432
+ * chunkerAction: internal.foo.myChunkerAction,
433
+ * });
434
+ * ```
435
+ * It will be called when the entry is added, or when the entry is replaced
436
+ * along the way.
437
+ */
438
+ defineChunkerAction(fn) {
439
+ return internalActionGeneric({
440
+ args: vChunkerArgs,
441
+ handler: async (ctx, args) => {
442
+ const { namespace, entry } = args;
443
+ if (namespace.modelId !== this.options.textEmbeddingModel.modelId) {
444
+ console.error(`You are using a different embedding model ${this.options.textEmbeddingModel.modelId} for asynchronously ` +
445
+ `generating chunks than the one provided when it was started: ${namespace.modelId}`);
446
+ return;
447
+ }
448
+ if (namespace.dimension !== this.options.embeddingDimension) {
449
+ console.error(`You are using a different embedding dimension ${this.options.embeddingDimension} for asynchronously ` +
450
+ `generating chunks than the one provided when it was started: ${namespace.dimension}`);
451
+ return;
452
+ }
453
+ if (!filterNamesContain(namespace.filterNames, this.options.filterNames ?? [])) {
454
+ console.error(`You are using a different filters (${this.options.filterNames?.join(", ")}) for asynchronously ` +
455
+ `generating chunks than the one provided when it was started: ${namespace.filterNames.join(", ")}`);
456
+ return;
457
+ }
458
+ const chunksPromise = fn(ctx, {
459
+ namespace,
460
+ entry: entry,
461
+ });
462
+ let chunkIterator;
463
+ if (chunksPromise instanceof Promise) {
464
+ const chunks = await chunksPromise;
465
+ chunkIterator = {
466
+ [Symbol.asyncIterator]: async function* () {
467
+ yield* chunks.chunks;
468
+ },
469
+ };
470
+ }
471
+ else {
472
+ chunkIterator = chunksPromise;
473
+ }
474
+ let batchOrder = 0;
475
+ for await (const batch of batchIterator(chunkIterator, CHUNK_BATCH_SIZE)) {
476
+ const createChunkArgs = await createChunkArgsBatch(this.options.textEmbeddingModel, batch);
477
+ await ctx.runMutation(args.insertChunks, {
478
+ entryId: entry.entryId,
479
+ startOrder: batchOrder,
480
+ chunks: createChunkArgs,
481
+ });
482
+ batchOrder += createChunkArgs.length;
483
+ }
484
+ },
485
+ });
486
+ }
487
+ }
488
+ async function* batchIterator(iterator, batchSize) {
489
+ let batch = [];
490
+ for await (const item of iterator) {
491
+ batch.push(item);
492
+ if (batch.length >= batchSize) {
493
+ yield batch;
494
+ batch = [];
495
+ }
496
+ }
497
+ if (batch.length > 0) {
498
+ yield batch;
499
+ }
500
+ }
501
+ function validateAddFilterValues(filterValues, filterNames) {
502
+ if (!filterValues) {
503
+ return;
504
+ }
505
+ if (!filterNames) {
506
+ throw new Error("You must provide filter names to RAG to add entries with filters.");
507
+ }
508
+ const seen = new Set();
509
+ for (const filterValue of filterValues) {
510
+ if (seen.has(filterValue.name)) {
511
+ throw new Error(`You cannot provide the same filter name twice: ${filterValue.name}.`);
512
+ }
513
+ seen.add(filterValue.name);
514
+ }
515
+ for (const filterName of filterNames) {
516
+ if (!seen.has(filterName)) {
517
+ throw new Error(`Filter name ${filterName} is not valid (one of ${filterNames.join(", ")}).`);
518
+ }
519
+ }
520
+ }
521
+ function makeBatches(items, batchSize) {
522
+ const batches = [];
523
+ for (let i = 0; i < items.length; i += batchSize) {
524
+ batches.push(items.slice(i, i + batchSize));
525
+ }
526
+ return batches;
527
+ }
528
+ async function createChunkArgsBatch(embedModel, chunks) {
529
+ const argsMaybeMissingEmbeddings = chunks.map((chunk) => {
530
+ if (typeof chunk === "string") {
531
+ return { content: { text: chunk } };
532
+ }
533
+ else if ("text" in chunk) {
534
+ const { text, metadata, keywords: searchableText } = chunk;
535
+ return {
536
+ content: { text, metadata },
537
+ embedding: chunk.embedding,
538
+ searchableText,
539
+ };
540
+ }
541
+ else if ("pageContent" in chunk) {
542
+ const { pageContent: text, metadata, keywords: searchableText } = chunk;
543
+ return {
544
+ content: { text, metadata },
545
+ embedding: chunk.embedding,
546
+ searchableText,
547
+ };
548
+ }
549
+ else {
550
+ throw new Error("Invalid chunk: " + JSON.stringify(chunk));
551
+ }
552
+ });
553
+ const missingEmbeddingsWithIndex = argsMaybeMissingEmbeddings
554
+ .map((arg, index) => arg.embedding
555
+ ? null
556
+ : {
557
+ text: arg.content.text,
558
+ index,
559
+ })
560
+ .filter((b) => b !== null);
561
+ for (const batch of makeBatches(missingEmbeddingsWithIndex, 100)) {
562
+ const { embeddings } = await embedMany({
563
+ model: embedModel,
564
+ values: batch.map((b) => b.text),
565
+ });
566
+ for (const [index, embedding] of embeddings.entries()) {
567
+ argsMaybeMissingEmbeddings[batch[index].index].embedding = embedding;
568
+ }
569
+ }
570
+ return argsMaybeMissingEmbeddings.filter((a) => {
571
+ if (a.embedding === undefined) {
572
+ throw new Error("Embedding is undefined for chunk " + a.content.text);
573
+ }
574
+ return true;
575
+ });
576
+ }
577
+ /**
578
+ * Rank results from multiple results, e.g. from vector search and text search.
579
+ * Uses the "Recriprocal Rank Fusion" algorithm.
580
+ * @param sortedResults The results arrays ordered by most important first.
581
+ */
582
+ export function hybridRank(sortedResults, opts) {
583
+ const k = opts?.k ?? 10;
584
+ const scores = new Map();
585
+ for (const [i, results] of sortedResults.entries()) {
586
+ const weight = opts?.weights?.[i] ?? 1;
587
+ for (let j = 0; j < results.length; j++) {
588
+ const key = results[j];
589
+ scores.set(key, (scores.get(key) ?? 0) + weight / (k + j));
590
+ }
591
+ }
592
+ const sortedScores = Array.from(scores.entries()).sort((a, b) => b[1] - a[1]);
593
+ return sortedScores
594
+ .filter(([_, score]) => score >= (opts?.cutoffScore ?? 0))
595
+ .map(([key]) => key);
596
+ }
597
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { Expand, FunctionReference, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx, StorageActionWriter, StorageReader } from "convex/server";
2
+ import { type GenericId } from "convex/values";
3
+ import type { Mounts } from "../component/_generated/api.js";
4
+ export type RAGComponent = UseApi<Mounts>;
5
+ export type RunQueryCtx = {
6
+ runQuery: GenericQueryCtx<GenericDataModel>["runQuery"];
7
+ };
8
+ export type RunMutationCtx = {
9
+ runQuery: GenericMutationCtx<GenericDataModel>["runQuery"];
10
+ runMutation: GenericMutationCtx<GenericDataModel>["runMutation"];
11
+ };
12
+ export type RunActionCtx = {
13
+ runQuery: GenericActionCtx<GenericDataModel>["runQuery"];
14
+ runMutation: GenericActionCtx<GenericDataModel>["runMutation"];
15
+ runAction: GenericActionCtx<GenericDataModel>["runAction"];
16
+ };
17
+ export type ActionCtx = RunActionCtx & {
18
+ storage: StorageActionWriter;
19
+ };
20
+ export type QueryCtx = RunQueryCtx & {
21
+ storage: StorageReader;
22
+ };
23
+ export type OpaqueIds<T> = T extends GenericId<infer _T> ? string : T extends (infer U)[] ? OpaqueIds<U>[] : T extends ArrayBuffer ? ArrayBuffer : T extends object ? {
24
+ [K in keyof T]: OpaqueIds<T[K]>;
25
+ } : T;
26
+ export type UseApi<API> = Expand<{
27
+ [mod in keyof API]: API[mod] extends FunctionReference<infer FType, "public", infer FArgs, infer FReturnType, infer FComponentPath> ? FunctionReference<FType, "internal", OpaqueIds<FArgs>, OpaqueIds<FReturnType>, FComponentPath> : UseApi<API[mod]>;
28
+ }>;
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAK7D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAI1C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC;CACzD,CAAC;AACF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3D,WAAW,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC;CAClE,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC;IACzD,WAAW,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,CAAC;IAC/D,SAAS,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAAC,CAAC;CAC5D,CAAC;AACF,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG;IACrC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AACF,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG;IACnC,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,IACrB,CAAC,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC,GACzB,MAAM,GACN,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACnB,SAAS,CAAC,CAAC,CAAC,EAAE,GACd,CAAC,SAAS,WAAW,GACnB,WAAW,GACX,CAAC,SAAS,MAAM,GACd;KACG,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC,GACD,CAAC,CAAC;AAEd,MAAM,MAAM,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC;KAC9B,GAAG,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,iBAAiB,CACpD,MAAM,KAAK,EACX,QAAQ,EACR,MAAM,KAAK,EACX,MAAM,WAAW,EACjB,MAAM,cAAc,CACrB,GACG,iBAAiB,CACf,KAAK,EACL,UAAU,EACV,SAAS,CAAC,KAAK,CAAC,EAChB,SAAS,CAAC,WAAW,CAAC,EACtB,cAAc,CACf,GACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import {} from "convex/values";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,MAAM,eAAe,CAAC"}