@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
package/src/shared.ts ADDED
@@ -0,0 +1,247 @@
1
+ import { v } from "convex/values";
2
+ import type { Infer, Validator, Value, VObject } from "convex/values";
3
+ import { vNamedFilter, type NamedFilter } from "./component/filters.js";
4
+ import { brandedString } from "convex-helpers/validators";
5
+ import type { FunctionReference } from "convex/server";
6
+
7
+ // A good middle-ground that has up to ~3MB if embeddings are 4096 (max).
8
+ // Also a reasonable number of writes to the DB.
9
+ export const CHUNK_BATCH_SIZE = 100;
10
+
11
+ // Branded types for IDs, as components don't expose the internal ID types.
12
+ export const vNamespaceId = brandedString("NamespaceId");
13
+ export const vEntryId = brandedString("EntryId");
14
+ export type NamespaceId = Infer<typeof vNamespaceId>;
15
+ export type EntryId = Infer<typeof vEntryId>;
16
+
17
+ export const vSearchResult = v.object({
18
+ entryId: vEntryId,
19
+ order: v.number(),
20
+ content: v.array(
21
+ v.object({
22
+ text: v.string(),
23
+ metadata: v.optional(v.record(v.string(), v.any())),
24
+ })
25
+ ),
26
+ startOrder: v.number(),
27
+ score: v.number(),
28
+ });
29
+
30
+ export type SearchResult = Infer<typeof vSearchResult>;
31
+
32
+ export const vStatus = v.union(
33
+ v.literal("pending"),
34
+ v.literal("ready"),
35
+ v.literal("replaced")
36
+ );
37
+ export const vActiveStatus = v.union(v.literal("pending"), v.literal("ready"));
38
+ export type Status = Infer<typeof vStatus>;
39
+ export const statuses = vStatus.members.map((s) => s.value);
40
+
41
+ export const vNamespace = v.object({
42
+ namespaceId: vNamespaceId,
43
+ createdAt: v.number(),
44
+ namespace: v.string(),
45
+ status: vStatus,
46
+ filterNames: v.array(v.string()),
47
+ dimension: v.number(),
48
+ modelId: v.string(),
49
+ version: v.number(),
50
+ });
51
+
52
+ export type Namespace = Infer<typeof vNamespace>;
53
+
54
+ export const vEntry = v.object({
55
+ key: v.optional(v.string()),
56
+ title: v.optional(v.string()),
57
+ metadata: v.optional(v.record(v.string(), v.any())),
58
+ entryId: vEntryId,
59
+ importance: v.number(),
60
+ filterValues: v.array(vNamedFilter),
61
+ contentHash: v.optional(v.string()),
62
+ status: vStatus,
63
+ });
64
+
65
+ export type VEntry<
66
+ Filters extends Record<string, Value>,
67
+ Metadata extends Record<string, Value>,
68
+ > = VObject<
69
+ Entry<Filters, Metadata>,
70
+ typeof vEntry.fields,
71
+ "required",
72
+ typeof vEntry.fieldPaths
73
+ >;
74
+
75
+ // Type assertion to keep us honest
76
+ const _1: Entry = {} as Infer<typeof vEntry>;
77
+ const _2: Infer<typeof vEntry> = {} as Entry;
78
+
79
+ export const vSearchEntry = v.object({
80
+ ...vEntry.fields,
81
+ text: v.string(),
82
+ });
83
+
84
+ export type VSearchEntry<
85
+ Filters extends Record<string, Value>,
86
+ Metadata extends Record<string, Value>,
87
+ > = VObject<
88
+ SearchEntry<Filters, Metadata>,
89
+ typeof vSearchEntry.fields,
90
+ "required",
91
+ typeof vSearchEntry.fieldPaths
92
+ >;
93
+
94
+ export type SearchEntry<
95
+ Filters extends Record<string, Value>,
96
+ Metadata extends Record<string, Value>,
97
+ > = Entry<Filters, Metadata> & {
98
+ text: string;
99
+ };
100
+
101
+ export type EntryFilterValues<
102
+ Filters extends Record<string, Value> = Record<string, Value>,
103
+ > = {
104
+ [K in keyof Filters & string]: NamedFilter<K, Filters[K]>;
105
+ }[keyof Filters & string];
106
+
107
+ export type Entry<
108
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
+ Filters extends Record<string, Value> = any,
110
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
111
+ Metadata extends Record<string, Value> = any,
112
+ > = {
113
+ /** The entry's id, uniquely identifying the key + contents + namespace etc. */
114
+ entryId: EntryId;
115
+ /** User-defined key. You can re-use a key to replace it with new contents. */
116
+ key?: string | undefined;
117
+ /** User-defined title. */
118
+ title?: string | undefined;
119
+ /** User-defined metadata. */
120
+ metadata?: Metadata | undefined;
121
+ /** How important this entry is. Defaults to 1.
122
+ * Think of it as multiplying by the vector search score.
123
+ */
124
+ importance: number;
125
+ /** Filters that can be used to search for this entry.
126
+ * Up to 4 filters are supported, of any type.
127
+ */
128
+ filterValues: EntryFilterValues<Filters>[];
129
+ /** Hash of the entry contents.
130
+ * If supplied, it will avoid adding if the hash is the same.
131
+ */
132
+ contentHash?: string | undefined;
133
+ /** Whether this entry's contents have all been inserted and indexed. */
134
+ status: Status;
135
+ };
136
+
137
+ export const vChunk = v.object({
138
+ order: v.number(),
139
+ state: vStatus,
140
+ text: v.string(),
141
+ metadata: v.optional(v.record(v.string(), v.any())),
142
+ });
143
+
144
+ export type Chunk = Infer<typeof vChunk>;
145
+
146
+ export const vCreateChunkArgs = v.object({
147
+ content: v.object({
148
+ text: v.string(),
149
+ metadata: v.optional(v.record(v.string(), v.any())),
150
+ }),
151
+ embedding: v.array(v.number()),
152
+ searchableText: v.optional(v.string()),
153
+ });
154
+ export type CreateChunkArgs = Infer<typeof vCreateChunkArgs>;
155
+
156
+ export function vPaginationResult<
157
+ T extends Validator<Value, "required", string>,
158
+ >(itemValidator: T) {
159
+ return v.object({
160
+ page: v.array(itemValidator),
161
+ continueCursor: v.string(),
162
+ isDone: v.boolean(),
163
+ splitCursor: v.optional(v.union(v.string(), v.null())),
164
+ pageStatus: v.optional(
165
+ v.union(
166
+ v.literal("SplitRecommended"),
167
+ v.literal("SplitRequired"),
168
+ v.null()
169
+ )
170
+ ),
171
+ });
172
+ }
173
+
174
+ export type OnCompleteNamespace = FunctionReference<
175
+ "mutation",
176
+ "internal",
177
+ {
178
+ namespace: Namespace;
179
+ replacedNamespace: Namespace | null;
180
+ },
181
+ null,
182
+ string
183
+ >;
184
+
185
+ export const vOnCompleteArgs = v.object({
186
+ namespace: vNamespace,
187
+ entry: vEntry,
188
+ replacedEntry: v.optional(vEntry),
189
+ error: v.optional(v.string()),
190
+ });
191
+
192
+ export type OnComplete<
193
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
194
+ Filters extends Record<string, Value> = any,
195
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
196
+ EntryMetadata extends Record<string, Value> = any,
197
+ > = FunctionReference<
198
+ "mutation",
199
+ "internal",
200
+ {
201
+ /**
202
+ * The namespace that the entry belongs to.
203
+ */
204
+ namespace: Namespace;
205
+ /**
206
+ * The entry that was added.
207
+ */
208
+ entry: Entry<Filters, EntryMetadata>;
209
+ /**
210
+ * The previous "ready" entry with the same key that was replaced.
211
+ */
212
+ replacedEntry: Entry<Filters, EntryMetadata> | undefined;
213
+ /**
214
+ * If async generation failed, this is the error.
215
+ */
216
+ error: string | undefined;
217
+ },
218
+ null
219
+ >;
220
+
221
+ export const vChunkerArgs = v.object({
222
+ namespace: vNamespace,
223
+ entry: vEntry,
224
+ insertChunks: v.string(),
225
+ });
226
+
227
+ export type ChunkerAction = FunctionReference<
228
+ "action",
229
+ "internal",
230
+ Infer<typeof vChunkerArgs>,
231
+ null
232
+ >;
233
+
234
+ /**
235
+ * Check if the args filter names are compatible with the existing filter names.
236
+ * @param existing The existing filter names.
237
+ * @param args The filter names to check. Can be a prefix
238
+ * @returns True if the filter names are the same, in the same order.
239
+ */
240
+ export function filterNamesContain(existing: string[], args: string[]) {
241
+ for (const name of args) {
242
+ if (!existing.includes(name)) {
243
+ return false;
244
+ }
245
+ }
246
+ return true;
247
+ }
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: "edge-runtime",
6
+ },
7
+ });