@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,74 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * Generated utilities for implementing server-side Convex query and mutation functions.
4
+ *
5
+ * THIS CODE IS AUTOMATICALLY GENERATED.
6
+ *
7
+ * To regenerate, run `npx convex dev`.
8
+ * @module
9
+ */
10
+ import { actionGeneric, httpActionGeneric, queryGeneric, mutationGeneric, internalActionGeneric, internalMutationGeneric, internalQueryGeneric, componentsGeneric, } from "convex/server";
11
+ /**
12
+ * Define a query in this Convex app's public API.
13
+ *
14
+ * This function will be allowed to read your Convex database and will be accessible from the client.
15
+ *
16
+ * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
17
+ * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
18
+ */
19
+ export const query = queryGeneric;
20
+ /**
21
+ * Define a query that is only accessible from other Convex functions (but not from the client).
22
+ *
23
+ * This function will be allowed to read from your Convex database. It will not be accessible from the client.
24
+ *
25
+ * @param func - The query function. It receives a {@link QueryCtx} as its first argument.
26
+ * @returns The wrapped query. Include this as an `export` to name it and make it accessible.
27
+ */
28
+ export const internalQuery = internalQueryGeneric;
29
+ /**
30
+ * Define a mutation in this Convex app's public API.
31
+ *
32
+ * This function will be allowed to modify your Convex database and will be accessible from the client.
33
+ *
34
+ * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
35
+ * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
36
+ */
37
+ export const mutation = mutationGeneric;
38
+ /**
39
+ * Define a mutation that is only accessible from other Convex functions (but not from the client).
40
+ *
41
+ * This function will be allowed to modify your Convex database. It will not be accessible from the client.
42
+ *
43
+ * @param func - The mutation function. It receives a {@link MutationCtx} as its first argument.
44
+ * @returns The wrapped mutation. Include this as an `export` to name it and make it accessible.
45
+ */
46
+ export const internalMutation = internalMutationGeneric;
47
+ /**
48
+ * Define an action in this Convex app's public API.
49
+ *
50
+ * An action is a function which can execute any JavaScript code, including non-deterministic
51
+ * code and code with side-effects, like calling third-party services.
52
+ * They can be run in Convex's JavaScript environment or in Node.js using the "use node" directive.
53
+ * They can interact with the database indirectly by calling queries and mutations using the {@link ActionCtx}.
54
+ *
55
+ * @param func - The action. It receives an {@link ActionCtx} as its first argument.
56
+ * @returns The wrapped action. Include this as an `export` to name it and make it accessible.
57
+ */
58
+ export const action = actionGeneric;
59
+ /**
60
+ * Define an action that is only accessible from other Convex functions (but not from the client).
61
+ *
62
+ * @param func - The function. It receives an {@link ActionCtx} as its first argument.
63
+ * @returns The wrapped function. Include this as an `export` to name it and make it accessible.
64
+ */
65
+ export const internalAction = internalActionGeneric;
66
+ /**
67
+ * Define a Convex HTTP action.
68
+ *
69
+ * @param func - The function. It receives an {@link ActionCtx} as its first argument, and a `Request` object
70
+ * as its second.
71
+ * @returns The wrapped endpoint function. Route a URL path to this function in `convex/http.js`.
72
+ */
73
+ export const httpAction = httpActionGeneric;
74
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/component/_generated/server.js"],"names":[],"mappings":"AAAA,oBAAoB;AACpB;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAElD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,eAAe,CAAC;AAExC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,aAAa,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC"}
@@ -0,0 +1,139 @@
1
+ import { type Infer } from "convex/values";
2
+ import { type Entry } from "../shared.js";
3
+ import type { Id } from "./_generated/dataModel.js";
4
+ import { type MutationCtx } from "./_generated/server.js";
5
+ export declare const vInsertChunksArgs: import("convex/values").VObject<{
6
+ entryId: import("convex/values").GenericId<"entries">;
7
+ startOrder: number;
8
+ chunks: {
9
+ searchableText?: string | undefined;
10
+ content: {
11
+ metadata?: Record<string, any> | undefined;
12
+ text: string;
13
+ };
14
+ embedding: number[];
15
+ }[];
16
+ }, {
17
+ entryId: import("convex/values").VId<import("convex/values").GenericId<"entries">, "required">;
18
+ startOrder: import("convex/values").VFloat64<number, "required">;
19
+ chunks: import("convex/values").VArray<{
20
+ searchableText?: string | undefined;
21
+ content: {
22
+ metadata?: Record<string, any> | undefined;
23
+ text: string;
24
+ };
25
+ embedding: number[];
26
+ }[], import("convex/values").VObject<{
27
+ searchableText?: string | undefined;
28
+ content: {
29
+ metadata?: Record<string, any> | undefined;
30
+ text: string;
31
+ };
32
+ embedding: number[];
33
+ }, {
34
+ content: import("convex/values").VObject<{
35
+ metadata?: Record<string, any> | undefined;
36
+ text: string;
37
+ }, {
38
+ text: import("convex/values").VString<string, "required">;
39
+ metadata: import("convex/values").VRecord<Record<string, any> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VAny<any, "required", string>, "optional", string>;
40
+ }, "required", "text" | "metadata" | `metadata.${string}`>;
41
+ embedding: import("convex/values").VArray<number[], import("convex/values").VFloat64<number, "required">, "required">;
42
+ searchableText: import("convex/values").VString<string | undefined, "optional">;
43
+ }, "required", "content" | "embedding" | "searchableText" | "content.text" | "content.metadata" | `content.metadata.${string}`>, "required">;
44
+ }, "required", "entryId" | "startOrder" | "chunks">;
45
+ type InsertChunksArgs = Infer<typeof vInsertChunksArgs>;
46
+ export declare const insert: import("convex/server").RegisteredMutation<"public", {
47
+ entryId: import("convex/values").GenericId<"entries">;
48
+ startOrder: number;
49
+ chunks: {
50
+ searchableText?: string | undefined;
51
+ content: {
52
+ metadata?: Record<string, any> | undefined;
53
+ text: string;
54
+ };
55
+ embedding: number[];
56
+ }[];
57
+ }, Promise<{
58
+ status: "pending" | "ready";
59
+ }>>;
60
+ export declare function insertChunks(ctx: MutationCtx, { entryId, startOrder, chunks }: InsertChunksArgs): Promise<{
61
+ status: "pending" | "ready";
62
+ }>;
63
+ export declare const replaceChunksPage: import("convex/server").RegisteredMutation<"public", {
64
+ entryId: import("convex/values").GenericId<"entries">;
65
+ startOrder: number;
66
+ }, Promise<{
67
+ status: "replaced";
68
+ nextStartOrder: number;
69
+ } | {
70
+ status: "pending";
71
+ nextStartOrder: number;
72
+ } | {
73
+ status: "ready";
74
+ nextStartOrder: number;
75
+ }>>;
76
+ export declare const vRangeResult: import("convex/values").VObject<{
77
+ entryId: import("convex/values").GenericId<"entries">;
78
+ order: number;
79
+ content: {
80
+ metadata?: Record<string, any> | undefined;
81
+ text: string;
82
+ }[];
83
+ startOrder: number;
84
+ }, {
85
+ entryId: import("convex/values").VId<import("convex/values").GenericId<"entries">, "required">;
86
+ order: import("convex/values").VFloat64<number, "required">;
87
+ startOrder: import("convex/values").VFloat64<number, "required">;
88
+ content: import("convex/values").VArray<{
89
+ metadata?: Record<string, any> | undefined;
90
+ text: string;
91
+ }[], import("convex/values").VObject<{
92
+ metadata?: Record<string, any> | undefined;
93
+ text: string;
94
+ }, {
95
+ text: import("convex/values").VString<string, "required">;
96
+ metadata: import("convex/values").VRecord<Record<string, any> | undefined, import("convex/values").VString<string, "required">, import("convex/values").VAny<any, "required", string>, "optional", string>;
97
+ }, "required", "text" | "metadata" | `metadata.${string}`>, "required">;
98
+ }, "required", "entryId" | "order" | "content" | "startOrder">;
99
+ export declare const getRangesOfChunks: import("convex/server").RegisteredQuery<"internal", {
100
+ chunkContext: {
101
+ before: number;
102
+ after: number;
103
+ };
104
+ embeddingIds: import("convex/values").GenericId<"vectors_4096" | "vectors_128" | "vectors_256" | "vectors_512" | "vectors_768" | "vectors_1024" | "vectors_1408" | "vectors_1536" | "vectors_2048" | "vectors_3072">[];
105
+ }, Promise<{
106
+ ranges: (null | Infer<typeof vRangeResult>)[];
107
+ entries: Entry[];
108
+ }>>;
109
+ export declare const list: import("convex/server").RegisteredQuery<"public", {
110
+ entryId: import("convex/values").GenericId<"entries">;
111
+ paginationOpts: {
112
+ id?: number | undefined;
113
+ endCursor?: string | null | undefined;
114
+ maximumRowsRead?: number | undefined;
115
+ maximumBytesRead?: number | undefined;
116
+ numItems: number;
117
+ cursor: string | null;
118
+ };
119
+ }, Promise<{
120
+ page: {
121
+ order: number;
122
+ state: "pending" | "ready" | "replaced";
123
+ text: string;
124
+ metadata: Record<string, any> | undefined;
125
+ }[];
126
+ isDone: boolean;
127
+ continueCursor: import("convex/server").Cursor;
128
+ splitCursor?: import("convex/server").Cursor | null;
129
+ pageStatus?: "SplitRecommended" | "SplitRequired" | null;
130
+ }>>;
131
+ export declare function deleteChunksPage(ctx: MutationCtx, { entryId, startOrder }: {
132
+ entryId: Id<"entries">;
133
+ startOrder: number;
134
+ }): Promise<{
135
+ isDone: boolean;
136
+ nextStartOrder: number;
137
+ }>;
138
+ export {};
139
+ //# sourceMappingURL=chunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../src/component/chunks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAOL,KAAK,KAAK,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAO,EAAE,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAIL,KAAK,WAAW,EAEjB,MAAM,wBAAwB,CAAC;AAehC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mDAI5B,CAAC;AACH,KAAK,gBAAgB,GAAG,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAExD,eAAO,MAAM,MAAM;;;;;;;;;;;;;GAIjB,CAAC;AAEH,wBAAsB,YAAY,CAChC,GAAG,EAAE,WAAW,EAChB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,gBAAgB;;GAmFlD;AA6BD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;GAyJ5B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;8DAUvB,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;YAalB,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,EAAE;aACpC,KAAK,EAAE;GAmHlB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;GAwBf,CAAC;AA4BH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;IAAE,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;;;GAmBxE"}
@@ -0,0 +1,413 @@
1
+ import { assert } from "convex-helpers";
2
+ import { paginator } from "convex-helpers/server/pagination";
3
+ import { mergedStream, stream } from "convex-helpers/server/stream";
4
+ import { paginationOptsValidator } from "convex/server";
5
+ import { convexToJson } from "convex/values";
6
+ import { statuses, vChunk, vCreateChunkArgs, vEntry, vPaginationResult, vStatus, } from "../shared.js";
7
+ import { internalQuery, mutation, query, } from "./_generated/server.js";
8
+ import { insertEmbedding } from "./embeddings/index.js";
9
+ import { vVectorId } from "./embeddings/tables.js";
10
+ import { schema, v } from "./schema.js";
11
+ import { getPreviousEntry, publicEntry } from "./entries.js";
12
+ import { filterFieldsFromNumbers, numberedFilterFromNamedFilters, } from "./filters.js";
13
+ const KB = 1_024;
14
+ const MB = 1_024 * KB;
15
+ const BANDWIDTH_PER_TRANSACTION_HARD_LIMIT = 8 * MB;
16
+ const BANDWIDTH_PER_TRANSACTION_SOFT_LIMIT = 4 * MB;
17
+ export const vInsertChunksArgs = v.object({
18
+ entryId: v.id("entries"),
19
+ startOrder: v.number(),
20
+ chunks: v.array(vCreateChunkArgs),
21
+ });
22
+ export const insert = mutation({
23
+ args: vInsertChunksArgs,
24
+ returns: v.object({ status: vStatus }),
25
+ handler: insertChunks,
26
+ });
27
+ export async function insertChunks(ctx, { entryId, startOrder, chunks }) {
28
+ const entry = await ctx.db.get(entryId);
29
+ if (!entry) {
30
+ throw new Error(`Entry ${entryId} not found`);
31
+ }
32
+ await ensureLatestEntryVersion(ctx, entry);
33
+ // Get the namespace for filter conversion
34
+ const namespace = await ctx.db.get(entry.namespaceId);
35
+ assert(namespace, `Namespace ${entry.namespaceId} not found`);
36
+ const previousEntry = await getPreviousEntry(ctx, entry);
37
+ let order = startOrder;
38
+ const chunkIds = [];
39
+ const existingChunks = await ctx.db
40
+ .query("chunks")
41
+ .withIndex("entryId_order", (q) => q
42
+ .eq("entryId", entryId)
43
+ .gte("order", startOrder)
44
+ .lt("order", startOrder + chunks.length))
45
+ .collect();
46
+ if (existingChunks.length > 0) {
47
+ console.debug(`Deleting ${existingChunks.length} existing chunks for entry ${entryId} at version ${entry.version}`);
48
+ }
49
+ // TODO: avoid writing if they're the same
50
+ await Promise.all(existingChunks.map(async (c) => {
51
+ if (c.state.kind === "ready") {
52
+ await ctx.db.delete(c.state.embeddingId);
53
+ }
54
+ await ctx.db.delete(c.contentId);
55
+ await ctx.db.delete(c._id);
56
+ }));
57
+ const numberedFilter = numberedFilterFromNamedFilters(entry.filterValues, namespace.filterNames);
58
+ for (const chunk of chunks) {
59
+ const contentId = await ctx.db.insert("content", {
60
+ text: chunk.content.text,
61
+ metadata: chunk.content.metadata,
62
+ });
63
+ let state = {
64
+ kind: "pending",
65
+ embedding: chunk.embedding,
66
+ importance: entry.importance,
67
+ pendingSearchableText: chunk.searchableText,
68
+ };
69
+ if (!previousEntry) {
70
+ const embeddingId = await insertEmbedding(ctx, chunk.embedding, entry.namespaceId, entry.importance, numberedFilter);
71
+ state = {
72
+ kind: "ready",
73
+ embeddingId,
74
+ searchableText: chunk.searchableText,
75
+ };
76
+ }
77
+ chunkIds.push(await ctx.db.insert("chunks", {
78
+ entryId,
79
+ order,
80
+ state,
81
+ contentId,
82
+ namespaceId: entry.namespaceId,
83
+ ...filterFieldsFromNumbers(entry.namespaceId, numberedFilter),
84
+ }));
85
+ order++;
86
+ }
87
+ return {
88
+ status: previousEntry ? "pending" : "ready",
89
+ };
90
+ }
91
+ async function ensureLatestEntryVersion(ctx, entry) {
92
+ if (!entry.key) {
93
+ return true;
94
+ }
95
+ const newerEntry = await mergedStream(statuses.map((status) => stream(ctx.db, schema)
96
+ .query("entries")
97
+ .withIndex("namespaceId_status_key_version", (q) => q
98
+ .eq("namespaceId", entry.namespaceId)
99
+ .eq("status.kind", status)
100
+ .eq("key", entry.key)
101
+ .gt("version", entry.version))), ["version"]).first();
102
+ if (newerEntry) {
103
+ console.warn(`Bailing from inserting chunks for entry ${entry.key} at version ${entry.version} since there's a newer version ${newerEntry.version} (status ${newerEntry.status}) creation time difference ${(newerEntry._creationTime - entry._creationTime).toFixed(0)}ms`);
104
+ return false;
105
+ }
106
+ return true;
107
+ }
108
+ export const replaceChunksPage = mutation({
109
+ args: v.object({
110
+ entryId: v.id("entries"),
111
+ startOrder: v.number(),
112
+ }),
113
+ returns: v.object({
114
+ status: vStatus,
115
+ nextStartOrder: v.number(),
116
+ }),
117
+ handler: async (ctx, args) => {
118
+ const { entryId, startOrder } = args;
119
+ const entryOrNull = await ctx.db.get(entryId);
120
+ if (!entryOrNull) {
121
+ throw new Error(`Entry ${entryId} not found`);
122
+ }
123
+ const entry = entryOrNull;
124
+ const isLatest = await ensureLatestEntryVersion(ctx, entry);
125
+ if (!isLatest) {
126
+ return {
127
+ status: "replaced",
128
+ nextStartOrder: startOrder,
129
+ };
130
+ }
131
+ // Get the namespace for filter conversion
132
+ const namespace = await ctx.db.get(entry.namespaceId);
133
+ assert(namespace, `Namespace ${entry.namespaceId} not found`);
134
+ const previousEntry = await getPreviousEntry(ctx, entry);
135
+ const pendingEntries = entry.key && previousEntry
136
+ ? await ctx.db
137
+ .query("entries")
138
+ .withIndex("namespaceId_status_key_version", (q) => q
139
+ .eq("namespaceId", entry.namespaceId)
140
+ .eq("status.kind", "pending")
141
+ .eq("key", entry.key))
142
+ .collect()
143
+ : [];
144
+ const chunkStream = mergedStream([entry, ...pendingEntries, previousEntry]
145
+ .filter((d) => d !== null)
146
+ .map((entry) => stream(ctx.db, schema)
147
+ .query("chunks")
148
+ .withIndex("entryId_order", (q) => q.eq("entryId", entry._id).gte("order", startOrder))), ["order"]);
149
+ const namespaceId = entry.namespaceId;
150
+ const namedFilters = numberedFilterFromNamedFilters(entry.filterValues, namespace.filterNames);
151
+ async function addChunk(chunk) {
152
+ const embeddingId = await insertEmbedding(ctx, chunk.state.embedding, namespaceId, entry.importance, namedFilters);
153
+ await ctx.db.patch(chunk._id, {
154
+ state: { kind: "ready", embeddingId },
155
+ });
156
+ }
157
+ let dataUsedSoFar = 0;
158
+ let indexToDelete = startOrder;
159
+ let chunksToDeleteEmbeddings = [];
160
+ let chunkToAdd = null;
161
+ async function handleBatch() {
162
+ await Promise.all(chunksToDeleteEmbeddings.map(async (chunk) => {
163
+ assert(chunk.state.kind === "ready");
164
+ const vector = await ctx.db.get(chunk.state.embeddingId);
165
+ assert(vector, `Vector ${chunk.state.embeddingId} not found`);
166
+ await ctx.db.delete(chunk.state.embeddingId);
167
+ await ctx.db.patch(chunk._id, {
168
+ state: {
169
+ kind: "replaced",
170
+ embeddingId: chunk.state.embeddingId,
171
+ vector: vector.vector,
172
+ pendingSearchableText: chunk.state.searchableText,
173
+ },
174
+ });
175
+ }));
176
+ chunksToDeleteEmbeddings = [];
177
+ if (chunkToAdd) {
178
+ await addChunk(chunkToAdd);
179
+ }
180
+ chunkToAdd = null;
181
+ }
182
+ for await (const chunk of chunkStream) {
183
+ if (chunk.state.kind === "pending") {
184
+ dataUsedSoFar += await estimateChunkSize(chunk);
185
+ }
186
+ else {
187
+ dataUsedSoFar += 17 * KB; // embedding conservative estimate
188
+ }
189
+ if (chunk.order > indexToDelete) {
190
+ await handleBatch();
191
+ indexToDelete = chunk.order;
192
+ // delete the chunks
193
+ // check if we're close to the limit
194
+ // if so, bail and pick up on this chunk.order.
195
+ if (dataUsedSoFar > BANDWIDTH_PER_TRANSACTION_SOFT_LIMIT) {
196
+ return {
197
+ status: "pending",
198
+ nextStartOrder: indexToDelete,
199
+ };
200
+ }
201
+ }
202
+ if (dataUsedSoFar > BANDWIDTH_PER_TRANSACTION_HARD_LIMIT) {
203
+ return {
204
+ status: "pending",
205
+ nextStartOrder: indexToDelete,
206
+ };
207
+ }
208
+ if (chunk.state.kind === "pending") {
209
+ if (chunk.entryId === entryId) {
210
+ if (chunkToAdd) {
211
+ console.warn(`Multiple pending chunks before changing order ${chunk.order} for entry ${entryId} version ${entry.version}: ${chunkToAdd._id} and ${chunk._id}`);
212
+ await addChunk(chunkToAdd);
213
+ }
214
+ chunkToAdd = chunk;
215
+ }
216
+ }
217
+ else {
218
+ if (chunk.entryId !== entryId && chunk.state.kind === "ready") {
219
+ chunksToDeleteEmbeddings.push(chunk);
220
+ }
221
+ else {
222
+ console.debug(`Skipping adding chunk ${chunk._id} for entry ${entryId} version ${entry.version} since it's already ready`);
223
+ }
224
+ }
225
+ }
226
+ // handle the last batch
227
+ await handleBatch();
228
+ return {
229
+ status: "ready",
230
+ nextStartOrder: 0,
231
+ };
232
+ },
233
+ });
234
+ export const vRangeResult = v.object({
235
+ entryId: v.id("entries"),
236
+ order: v.number(),
237
+ startOrder: v.number(),
238
+ content: v.array(v.object({
239
+ text: v.string(),
240
+ metadata: v.optional(v.record(v.string(), v.any())),
241
+ })),
242
+ });
243
+ export const getRangesOfChunks = internalQuery({
244
+ args: {
245
+ embeddingIds: v.array(vVectorId),
246
+ chunkContext: v.object({ before: v.number(), after: v.number() }),
247
+ },
248
+ returns: v.object({
249
+ ranges: v.array(v.union(v.null(), vRangeResult)),
250
+ entries: v.array(vEntry),
251
+ }),
252
+ handler: async (ctx, args) => {
253
+ const { embeddingIds, chunkContext } = args;
254
+ const chunks = await Promise.all(embeddingIds.map((embeddingId) => ctx.db
255
+ .query("chunks")
256
+ .withIndex("embeddingId", (q) => q.eq("state.embeddingId", embeddingId))
257
+ .order("desc")
258
+ .first()));
259
+ // Note: This preserves order of entries as they first appeared.
260
+ const entries = (await Promise.all(Array.from(new Set(chunks.filter((c) => c !== null).map((c) => c.entryId))).map((id) => ctx.db.get(id))))
261
+ .filter((d) => d !== null)
262
+ .map(publicEntry);
263
+ const entryOders = chunks
264
+ .filter((c) => c !== null)
265
+ .map((c) => [c.entryId, c.order])
266
+ .reduce((acc, [entryId, order]) => {
267
+ if (acc[entryId]?.includes(order)) {
268
+ // De-dupe orders
269
+ return acc;
270
+ }
271
+ acc[entryId] = [...(acc[entryId] ?? []), order].sort((a, b) => a - b);
272
+ return acc;
273
+ }, {});
274
+ const result = [];
275
+ for (const chunk of chunks) {
276
+ if (chunk === null) {
277
+ result.push(null);
278
+ continue;
279
+ }
280
+ // Note: if we parallelize this in the future, we could have a race
281
+ // instead we'd check that other chunks are not the same doc/order
282
+ if (result.find((r) => r?.entryId === chunk.entryId && r?.order === chunk.order)) {
283
+ // De-dupe chunks
284
+ result.push(null);
285
+ continue;
286
+ }
287
+ const entryId = chunk.entryId;
288
+ const entry = await ctx.db.get(entryId);
289
+ assert(entry, `Entry ${entryId} not found`);
290
+ const otherOrders = entryOders[entryId] ?? [chunk.order];
291
+ const ourOrderIndex = otherOrders.indexOf(chunk.order);
292
+ const previousOrder = otherOrders[ourOrderIndex - 1] ?? -Infinity;
293
+ const nextOrder = otherOrders[ourOrderIndex + 1] ?? Infinity;
294
+ // We absorb all previous context up to the previous chunk.
295
+ const startOrder = Math.max(chunk.order - chunkContext.before, 0, Math.min(previousOrder + 1, chunk.order));
296
+ // We stop short if the next chunk order's "before" context will cover it.
297
+ const endOrder = Math.min(chunk.order + chunkContext.after + 1, Math.max(nextOrder - chunkContext.before, chunk.order + 1));
298
+ const contentIds = [];
299
+ if (startOrder === chunk.order && endOrder === chunk.order + 1) {
300
+ contentIds.push(chunk.contentId);
301
+ }
302
+ else {
303
+ const chunks = await ctx.db
304
+ .query("chunks")
305
+ .withIndex("entryId_order", (q) => q
306
+ .eq("entryId", entryId)
307
+ .gte("order", startOrder)
308
+ .lt("order", endOrder))
309
+ .collect();
310
+ for (const chunk of chunks) {
311
+ contentIds.push(chunk.contentId);
312
+ }
313
+ }
314
+ const content = await Promise.all(contentIds.map(async (contentId) => {
315
+ const content = await ctx.db.get(contentId);
316
+ assert(content, `Content ${contentId} not found`);
317
+ return { text: content.text, metadata: content.metadata };
318
+ }));
319
+ result.push({
320
+ entryId,
321
+ order: chunk.order,
322
+ startOrder,
323
+ content,
324
+ });
325
+ }
326
+ return {
327
+ ranges: result,
328
+ entries,
329
+ };
330
+ },
331
+ });
332
+ export const list = query({
333
+ args: v.object({
334
+ entryId: v.id("entries"),
335
+ paginationOpts: paginationOptsValidator,
336
+ }),
337
+ returns: vPaginationResult(vChunk),
338
+ handler: async (ctx, args) => {
339
+ const { entryId, paginationOpts } = args;
340
+ const chunks = await paginator(ctx.db, schema)
341
+ .query("chunks")
342
+ .withIndex("entryId_order", (q) => q.eq("entryId", entryId))
343
+ .order("asc")
344
+ .paginate(paginationOpts);
345
+ return {
346
+ ...chunks,
347
+ page: await Promise.all(chunks.page.map(async (chunk) => {
348
+ const content = await ctx.db.get(chunk.contentId);
349
+ assert(content, `Content ${chunk.contentId} not found`);
350
+ return publicChunk(chunk, content);
351
+ })),
352
+ };
353
+ },
354
+ });
355
+ // export async function findLastChunk(
356
+ // ctx: MutationCtx,
357
+ // entryId: Id<"entries">
358
+ // ): Promise<Chunk | null> {
359
+ // const chunk = await ctx.db
360
+ // .query("chunks")
361
+ // .withIndex("entryId_order", (q) => q.eq("entryId", entryId))
362
+ // .order("desc")
363
+ // .first();
364
+ // if (!chunk) {
365
+ // return null;
366
+ // }
367
+ // const content = await ctx.db.get(chunk.contentId);
368
+ // assert(content, `Content for chunk ${chunk._id} not found`);
369
+ // return publicChunk(chunk, content);
370
+ // }
371
+ async function publicChunk(chunk, content) {
372
+ return {
373
+ order: chunk.order,
374
+ state: chunk.state.kind,
375
+ text: content.text,
376
+ metadata: content.metadata,
377
+ };
378
+ }
379
+ export async function deleteChunksPage(ctx, { entryId, startOrder }) {
380
+ const chunkStream = ctx.db
381
+ .query("chunks")
382
+ .withIndex("entryId_order", (q) => q.eq("entryId", entryId).gte("order", startOrder));
383
+ let dataUsedSoFar = 0;
384
+ for await (const chunk of chunkStream) {
385
+ dataUsedSoFar += await estimateChunkSize(chunk);
386
+ await ctx.db.delete(chunk._id);
387
+ dataUsedSoFar += await estimateContentSize(ctx, chunk.contentId);
388
+ await ctx.db.delete(chunk.contentId);
389
+ if (dataUsedSoFar > BANDWIDTH_PER_TRANSACTION_HARD_LIMIT) {
390
+ // TODO: schedule follow-up - workpool?
391
+ return { isDone: false, nextStartOrder: chunk.order };
392
+ }
393
+ }
394
+ return { isDone: true, nextStartOrder: -1 };
395
+ }
396
+ async function estimateChunkSize(chunk) {
397
+ let dataUsedSoFar = 100; // constant metadata - roughly
398
+ if (chunk.state.kind === "pending") {
399
+ dataUsedSoFar += chunk.state.embedding.length * 8;
400
+ }
401
+ return dataUsedSoFar;
402
+ }
403
+ async function estimateContentSize(ctx, contentId) {
404
+ let dataUsedSoFar = 0;
405
+ // TODO: if/when deletions don't count as bandwidth, we can remove this.
406
+ const content = await ctx.db.get(contentId);
407
+ if (content) {
408
+ dataUsedSoFar += content.text.length;
409
+ dataUsedSoFar += JSON.stringify(convexToJson(content.metadata ?? {})).length;
410
+ }
411
+ return dataUsedSoFar;
412
+ }
413
+ //# sourceMappingURL=chunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../src/component/chunks.ts"],"names":[],"mappings":"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"}