@mastra/rag 2.5.0 → 2.6.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,57 @@
1
1
  # @mastra/rag
2
2
 
3
+ ## 2.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Added `serialize()` and `GraphRAG.deserialize()` so a knowledge graph can be saved and restored instead of rebuilt on every process start. Building a graph compares every chunk against every other chunk, which is slow for large document sets; now you can do that work once and reload the result. ([#21704](https://github.com/mastra-ai/mastra/pull/21704))
8
+
9
+ ```typescript
10
+ // Before: the graph had to be rebuilt every time
11
+ const graphRag = new GraphRAG(1536, 0.7);
12
+ graphRag.createGraph(documentChunks, embeddings);
13
+
14
+ // After: build once, save the snapshot, and reload it later
15
+ const snapshot = graphRag.serialize();
16
+ await writeFile('./graph.json', JSON.stringify(snapshot));
17
+
18
+ const restored = GraphRAG.deserialize(JSON.parse(await readFile('./graph.json', 'utf8')));
19
+ restored.query({ query: queryEmbedding, topK: 10 });
20
+ ```
21
+
22
+ A snapshot is plain JSON, so you can store it in any database, file, or cache you already use. Loading a snapshot that does not match the graph's embedding dimension now fails immediately with a clear error instead of later during a query. Closes #3926.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [[`587f6ef`](https://github.com/mastra-ai/mastra/commit/587f6efcfc25880b93760a8607d1cd381ec612fe), [`7e096f0`](https://github.com/mastra-ai/mastra/commit/7e096f02f0dddbf09b85d306458351245ed2f886), [`d7e6745`](https://github.com/mastra-ai/mastra/commit/d7e67456954863c55440ea9c49bc6ceb9949972d), [`6223446`](https://github.com/mastra-ai/mastra/commit/6223446ddce6166e96e0ba5e00d628b615dee8ca), [`15101bb`](https://github.com/mastra-ai/mastra/commit/15101bb53c0d934f31af6b8813b88191e382a5e5), [`4e7a421`](https://github.com/mastra-ai/mastra/commit/4e7a421dce8a48742f785d1e93ad2f43a572b282), [`c2c3deb`](https://github.com/mastra-ai/mastra/commit/c2c3debcf670c7082d0a5e553aa99818a864698c), [`d8308a2`](https://github.com/mastra-ai/mastra/commit/d8308a2be3c07e777393d1017a381dcae3890d30), [`b0a2a07`](https://github.com/mastra-ai/mastra/commit/b0a2a07800d42bd9823292e7db832374ed084c9c), [`74e5bd3`](https://github.com/mastra-ai/mastra/commit/74e5bd315b8b3a1e04cb6cf480bb0f5fc4951dc8), [`242e324`](https://github.com/mastra-ai/mastra/commit/242e3241e73cbd5c9bb86a31ebb49ca0256488d4), [`217e967`](https://github.com/mastra-ai/mastra/commit/217e9672d8b3160eb729d8e9f0044949e88da239), [`d774e89`](https://github.com/mastra-ai/mastra/commit/d774e8930c781df8c9effe3763e6b501c099b6cc), [`9c27a53`](https://github.com/mastra-ai/mastra/commit/9c27a53cd9d3de4f3f025bc387d94ce371c33f95), [`8f0a332`](https://github.com/mastra-ai/mastra/commit/8f0a3321bf180368d76fe7b36aa1a8f60f00b6de), [`0b4f108`](https://github.com/mastra-ai/mastra/commit/0b4f1089aa8d92e67c2a8e99726822c5ee410784), [`9acb50f`](https://github.com/mastra-ai/mastra/commit/9acb50f71cec9c362f06820033f90ae6b1f8282f), [`46e9e3f`](https://github.com/mastra-ai/mastra/commit/46e9e3f73babe1bc70080a596cf2ac0b9da48519), [`3f9a190`](https://github.com/mastra-ai/mastra/commit/3f9a19057c027155867b9317294ee4ca7bd0581a), [`dff25a1`](https://github.com/mastra-ai/mastra/commit/dff25a1103fa72ee082a9b6f805ebeb5ce400753), [`6db7a5d`](https://github.com/mastra-ai/mastra/commit/6db7a5dd3dd2b6f7ef75dcd804fcffef5fa83963), [`217e967`](https://github.com/mastra-ai/mastra/commit/217e9672d8b3160eb729d8e9f0044949e88da239), [`583e235`](https://github.com/mastra-ai/mastra/commit/583e23519c13af16c1746f9c49722d011216611b), [`b098de9`](https://github.com/mastra-ai/mastra/commit/b098de9d7cb9f672e0883a5c716465a3a689693d), [`e8808e3`](https://github.com/mastra-ai/mastra/commit/e8808e3d8eb585a2565be53e56a7e0e1477352a4), [`a77f8d4`](https://github.com/mastra-ai/mastra/commit/a77f8d4740d2178a74c41e4bf678b4fcd8fa0bb2), [`7f78585`](https://github.com/mastra-ai/mastra/commit/7f785857e401570e2ffb316911f126ed363aa537), [`33374ba`](https://github.com/mastra-ai/mastra/commit/33374ba359e4fb13eaa918ae925fe167a3c55414), [`940bf5c`](https://github.com/mastra-ai/mastra/commit/940bf5ccf04f2c9ebd8a1390431733222a03b1cd), [`c549e2f`](https://github.com/mastra-ai/mastra/commit/c549e2f40edc1cac5d9e74e82f90da22b48df084), [`58c43d3`](https://github.com/mastra-ai/mastra/commit/58c43d3f7cb2eeaeb8ac733ae71dde822348e588), [`ef6e295`](https://github.com/mastra-ai/mastra/commit/ef6e295b59bc25a5b61b633a89c97bcfce9fb465), [`208e1b3`](https://github.com/mastra-ai/mastra/commit/208e1b39f30f4b386e494394e9d71d96f0f90241), [`c938d34`](https://github.com/mastra-ai/mastra/commit/c938d34739936c8ecbabd67ad6a4a4396f41c4c6), [`88ddc7c`](https://github.com/mastra-ai/mastra/commit/88ddc7ce01d40175f13a3228b789a906779680bd), [`f2a4afd`](https://github.com/mastra-ai/mastra/commit/f2a4afd7e37e809669001ed17724b341a5c1f45e), [`d438148`](https://github.com/mastra-ai/mastra/commit/d438148e222c1e2fb3c652725ce75680962ebec4), [`ba05fe0`](https://github.com/mastra-ai/mastra/commit/ba05fe0738f70cb686777546e968237d09269142), [`40d358e`](https://github.com/mastra-ai/mastra/commit/40d358e29d55543803e64b49241122f598ffabc7), [`d26a8d4`](https://github.com/mastra-ai/mastra/commit/d26a8d4281f28414715b333c85bedaf70d0b2890), [`e80cd7e`](https://github.com/mastra-ai/mastra/commit/e80cd7e7683e7d732e1cc6784bcac1d2640d2ce3), [`ccbbcd9`](https://github.com/mastra-ai/mastra/commit/ccbbcd974eedff4367a54ed0e24c9ee742ab2f61), [`1d9a0ea`](https://github.com/mastra-ai/mastra/commit/1d9a0ea4a9901baee6cd56737243bd6d1f631ac0), [`677cdc6`](https://github.com/mastra-ai/mastra/commit/677cdc6af564dec29a13464d12b7ab2a4efc22e9), [`c549e2f`](https://github.com/mastra-ai/mastra/commit/c549e2f40edc1cac5d9e74e82f90da22b48df084), [`a7dd322`](https://github.com/mastra-ai/mastra/commit/a7dd32247d95afc539f483ca37f4594af0387f59), [`3f5c6f7`](https://github.com/mastra-ai/mastra/commit/3f5c6f728ea35da344248de9aa070f12849f3aa0), [`a318490`](https://github.com/mastra-ai/mastra/commit/a318490e17da32f338d50929c770d901a9b3dd72), [`b860493`](https://github.com/mastra-ai/mastra/commit/b86049391100e665d579f700c8a2034c036defc3), [`d4be8c1`](https://github.com/mastra-ai/mastra/commit/d4be8c1739d22d621e3f78790e1dd5eb5ecc3589), [`a5d2eb1`](https://github.com/mastra-ai/mastra/commit/a5d2eb10347eade1ae2816d88f466c25186c54a5), [`3667679`](https://github.com/mastra-ai/mastra/commit/3667679db057edfb086846d13369fdda4902ad65), [`49696e8`](https://github.com/mastra-ai/mastra/commit/49696e8e42f870674a0a58f5abcd22cc54dd2864), [`2ef2f23`](https://github.com/mastra-ai/mastra/commit/2ef2f230a7aed342e7dc3b2000cd42e4c43e08a7), [`763e0c6`](https://github.com/mastra-ai/mastra/commit/763e0c61e04d76ad9a9efd301aa57525ca0cbea9), [`20504b2`](https://github.com/mastra-ai/mastra/commit/20504b2ecebd0e077acda3d457ab57480a98ed3e), [`77e6b1b`](https://github.com/mastra-ai/mastra/commit/77e6b1bc4c46ce94fe501023fb4393c812ec6be3), [`c5f964d`](https://github.com/mastra-ai/mastra/commit/c5f964d3f77064e978f8066ec506eed77ba5c63c), [`23e0be2`](https://github.com/mastra-ai/mastra/commit/23e0be261381e49534b4ff3101c60ee64a946cbf), [`7fc8806`](https://github.com/mastra-ai/mastra/commit/7fc880627d3cbf995d31ea0e8b807bf15417e651), [`0e02eac`](https://github.com/mastra-ai/mastra/commit/0e02eacdb2e30e1697a41910b41163742a181dc1), [`4df174c`](https://github.com/mastra-ai/mastra/commit/4df174c32bddf093a82f273070b8380aef7c9e90), [`f7c25b5`](https://github.com/mastra-ai/mastra/commit/f7c25b5106ddfb48e591f98df7a51e0f2dd01dba), [`7aad631`](https://github.com/mastra-ai/mastra/commit/7aad631b43bc10db77d5b8c66b200d7a49d18bf2), [`512100a`](https://github.com/mastra-ai/mastra/commit/512100a7d8b7e9c920f2590c6b3612f5de0d3cff), [`e81744c`](https://github.com/mastra-ai/mastra/commit/e81744cd13c46619c142dc521dc0baac47607a84), [`f8f653f`](https://github.com/mastra-ai/mastra/commit/f8f653f10980d01a73706cc3c8689ca5e40ce808), [`dc09cc1`](https://github.com/mastra-ai/mastra/commit/dc09cc1083d861cde192c1cd235324dc75b8c731), [`9ef432b`](https://github.com/mastra-ai/mastra/commit/9ef432b6faa534b57b0d182a610e13dd9a7123ff), [`36b4649`](https://github.com/mastra-ai/mastra/commit/36b4649045a3a380cbab8ceca866db4086223aff), [`b9cf308`](https://github.com/mastra-ai/mastra/commit/b9cf30846f97f99ac1906ee8a68f4f2d117b0378), [`2e1d098`](https://github.com/mastra-ai/mastra/commit/2e1d0984e325fd319d32ea182f596b3170be3847), [`377eb81`](https://github.com/mastra-ai/mastra/commit/377eb81ce43b964e3a6b541df172da74a8ff3716), [`1794a79`](https://github.com/mastra-ai/mastra/commit/1794a79178c418004a7261b1ad9114066f7ef01d), [`0cdc5dc`](https://github.com/mastra-ai/mastra/commit/0cdc5dc69024957815da4f51acc4119eb4f447d7), [`5740ec6`](https://github.com/mastra-ai/mastra/commit/5740ec60c760ffdfbfaa59d603d03b847c864e05)]:
27
+ - @mastra/core@1.60.0
28
+
29
+ ## 2.6.0-alpha.0
30
+
31
+ ### Minor Changes
32
+
33
+ - Added `serialize()` and `GraphRAG.deserialize()` so a knowledge graph can be saved and restored instead of rebuilt on every process start. Building a graph compares every chunk against every other chunk, which is slow for large document sets; now you can do that work once and reload the result. ([#21704](https://github.com/mastra-ai/mastra/pull/21704))
34
+
35
+ ```typescript
36
+ // Before: the graph had to be rebuilt every time
37
+ const graphRag = new GraphRAG(1536, 0.7);
38
+ graphRag.createGraph(documentChunks, embeddings);
39
+
40
+ // After: build once, save the snapshot, and reload it later
41
+ const snapshot = graphRag.serialize();
42
+ await writeFile('./graph.json', JSON.stringify(snapshot));
43
+
44
+ const restored = GraphRAG.deserialize(JSON.parse(await readFile('./graph.json', 'utf8')));
45
+ restored.query({ query: queryEmbedding, topK: 10 });
46
+ ```
47
+
48
+ A snapshot is plain JSON, so you can store it in any database, file, or cache you already use. Loading a snapshot that does not match the graph's embedding dimension now fails immediately with a clear error instead of later during a query. Closes #3926.
49
+
50
+ ### Patch Changes
51
+
52
+ - Updated dependencies [[`b0a2a07`](https://github.com/mastra-ai/mastra/commit/b0a2a07800d42bd9823292e7db832374ed084c9c), [`ccbbcd9`](https://github.com/mastra-ai/mastra/commit/ccbbcd974eedff4367a54ed0e24c9ee742ab2f61), [`3f5c6f7`](https://github.com/mastra-ai/mastra/commit/3f5c6f728ea35da344248de9aa070f12849f3aa0), [`77e6b1b`](https://github.com/mastra-ai/mastra/commit/77e6b1bc4c46ce94fe501023fb4393c812ec6be3), [`2e1d098`](https://github.com/mastra-ai/mastra/commit/2e1d0984e325fd319d32ea182f596b3170be3847)]:
53
+ - @mastra/core@1.60.0-alpha.9
54
+
3
55
  ## 2.5.0
4
56
 
5
57
  ### Minor Changes
@@ -3,7 +3,7 @@ name: mastra-rag
3
3
  description: Documentation for @mastra/rag. Use when working with @mastra/rag APIs, configuration, or implementation.
4
4
  metadata:
5
5
  package: "@mastra/rag"
6
- version: "2.5.0"
6
+ version: "2.6.0"
7
7
  ---
8
8
 
9
9
  ## When to use
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.5.0",
2
+ "version": "2.6.0",
3
3
  "package": "@mastra/rag",
4
4
  "exports": {},
5
5
  "modules": {}
@@ -127,7 +127,7 @@ const { embeddings } = await embedMany({
127
127
  })
128
128
  ```
129
129
 
130
- > **Vector Database Compatibility:** When storing embeddings, the vector database index must be configured to match the output size of your embedding model. If the dimensions don't match, you may get errors or data corruption.
130
+ > **Vector Database Compatibility:** When storing embeddings, configure the vector database index to match the output size of your embedding model to avoid errors or data corruption from mismatched dimensions.
131
131
 
132
132
  ## Example: Complete pipeline
133
133
 
@@ -9,10 +9,7 @@ The `GraphRAG` class implements a graph-based approach to retrieval augmented ge
9
9
  ```typescript
10
10
  import { GraphRAG } from '@mastra/rag'
11
11
 
12
- const graphRag = new GraphRAG({
13
- dimension: 1536,
14
- threshold: 0.7,
15
- })
12
+ const graphRag = new GraphRAG(1536, 0.7)
16
13
 
17
14
  // Create the graph from chunks and embeddings
18
15
  graphRag.createGraph(documentChunks, embeddings)
@@ -88,13 +85,79 @@ Returns an array of `RankedNode` objects, where each node contains:
88
85
 
89
86
  **score** (`number`): Combined relevance score from graph traversal
90
87
 
88
+ ### `serialize`
89
+
90
+ Returns a JSON-safe snapshot of the graph so it can be persisted and restored later instead of rebuilt with `createGraph`.
91
+
92
+ ```typescript
93
+ serialize(): GraphRAGSnapshot
94
+ ```
95
+
96
+ #### Returns
97
+
98
+ Returns a `GraphRAGSnapshot` object containing:
99
+
100
+ **version** (`number`): Snapshot format version, used to reject snapshots this version of the class can't load
101
+
102
+ **dimension** (`number`): Dimension of the embedding vectors the graph was built with
103
+
104
+ **threshold** (`number`): Similarity threshold the graph was built with
105
+
106
+ **nodes** (`GraphNode[]`): All nodes in the graph, each including its full embedding
107
+
108
+ **edges** (`GraphEdge[]`): All edges in the graph
109
+
110
+ The snapshot is a deep copy, so mutating it doesn't affect the graph it came from. Every node carries its full embedding, so snapshots are large: a 1,000-node graph built with 1536-dimension embeddings serializes to about 20 MB of JSON. Size your storage column accordingly.
111
+
112
+ ### `deserialize`
113
+
114
+ Rebuilds a `GraphRAG` instance from a snapshot produced by `serialize`.
115
+
116
+ ```typescript
117
+ static deserialize(snapshot: GraphRAGSnapshot): GraphRAG
118
+ ```
119
+
120
+ #### Parameters
121
+
122
+ **snapshot** (`GraphRAGSnapshot`): A snapshot previously returned by serialize
123
+
124
+ Throws if the snapshot version is unsupported, if a node embedding doesn't match the snapshot dimension, or if an edge references a node that isn't in the snapshot. A bad snapshot therefore fails at load time instead of during a later query.
125
+
126
+ ## Persisting a graph
127
+
128
+ Building a graph is O(n²) in the number of chunks, so rebuilding it on every process start is wasteful. Serialize the graph once and store the snapshot wherever you already keep state. A snapshot is plain JSON, so any store works (a file, a blob column, a key-value cache), and `GraphRAG` doesn't depend on a storage backend.
129
+
130
+ ```typescript
131
+ import { readFile, writeFile } from 'node:fs/promises'
132
+ import { GraphRAG } from '@mastra/rag'
133
+ import type { GraphRAGSnapshot } from '@mastra/rag'
134
+
135
+ const SNAPSHOT_PATH = './docs-graph.json'
136
+
137
+ async function loadOrBuildGraph() {
138
+ try {
139
+ const snapshot = JSON.parse(await readFile(SNAPSHOT_PATH, 'utf8')) as GraphRAGSnapshot
140
+ return GraphRAG.deserialize(snapshot)
141
+ } catch {
142
+ // No usable snapshot yet, so build the graph from scratch
143
+ }
144
+
145
+ const graphRag = new GraphRAG(1536, 0.7)
146
+ graphRag.createGraph(documentChunks, embeddings)
147
+
148
+ await writeFile(SNAPSHOT_PATH, JSON.stringify(graphRag.serialize()))
149
+
150
+ return graphRag
151
+ }
152
+ ```
153
+
154
+ A snapshot reflects the chunks it was built from and isn't updated incrementally. When the underlying documents change, build the graph again and store a new snapshot.
155
+
91
156
  ## Advanced example
92
157
 
93
158
  ```typescript
94
- const graphRag = new GraphRAG({
95
- dimension: 1536,
96
- threshold: 0.8, // Stricter similarity threshold
97
- })
159
+ // Stricter similarity threshold
160
+ const graphRag = new GraphRAG(1536, 0.8)
98
161
 
99
162
  // Create graph from chunks and embeddings
100
163
  graphRag.createGraph(documentChunks, embeddings)
@@ -266,6 +266,23 @@ For detailed configuration options and advanced usage, see the [Vector Query Too
266
266
 
267
267
  Vector store prompts define query patterns and filtering capabilities for each vector database implementation. When implementing filtering, these prompts are required in the agent's instructions to specify valid operators and syntax for each vector store implementation.
268
268
 
269
+ **MongoDB**:
270
+
271
+ ```ts
272
+ import { MONGODB_PROMPT } from '@mastra/mongodb'
273
+
274
+ export const ragAgent = new Agent({
275
+ id: 'rag-agent',
276
+ name: 'RAG Agent',
277
+ model: 'openai/gpt-5.6-sol',
278
+ instructions: `
279
+ Process queries using the provided context. Structure responses to be concise and relevant.
280
+ ${MONGODB_PROMPT}
281
+ `,
282
+ tools: { vectorQueryTool },
283
+ })
284
+ ```
285
+
269
286
  **pgVector**:
270
287
 
271
288
  ```ts
@@ -402,23 +419,6 @@ export const ragAgent = new Agent({
402
419
  })
403
420
  ```
404
421
 
405
- **MongoDB**:
406
-
407
- ```ts
408
- import { MONGODB_PROMPT } from '@mastra/mongodb'
409
-
410
- export const ragAgent = new Agent({
411
- id: 'rag-agent',
412
- name: 'RAG Agent',
413
- model: 'openai/gpt-5.6-sol',
414
- instructions: `
415
- Process queries using the provided context. Structure responses to be concise and relevant.
416
- ${MONGODB_PROMPT}
417
- `,
418
- tools: { vectorQueryTool },
419
- })
420
- ```
421
-
422
422
  **OpenSearch**:
423
423
 
424
424
  ```ts
@@ -520,7 +520,13 @@ The weights control how different factors influence the final ranking:
520
520
 
521
521
  > **Note:** For semantic scoring to work properly during re-ranking, each result must include the text content in its `metadata.text` field.
522
522
 
523
- You can also use other relevance score providers like Cohere or ZeroEntropy:
523
+ You can also use other relevance score providers like Voyage AI, Cohere, or ZeroEntropy:
524
+
525
+ ```ts
526
+ import { VoyageRelevanceScorer } from '@mastra/voyageai'
527
+
528
+ const relevanceProvider = new VoyageRelevanceScorer({ model: 'rerank-2.5' })
529
+ ```
524
530
 
525
531
  ```ts
526
532
  const relevanceProvider = new CohereRelevanceScorer('rerank-v3.5')
@@ -530,6 +536,8 @@ const relevanceProvider = new CohereRelevanceScorer('rerank-v3.5')
530
536
  const relevanceProvider = new ZeroEntropyRelevanceScorer('zerank-1')
531
537
  ```
532
538
 
539
+ Voyage AI provides dedicated reranking models: `rerank-2.5` and `rerank-2.5-lite` both allow up to 32,000 tokens for the query and any single document combined, and up to 600,000 tokens across a request. `VoyageRelevanceScorer` reads `VOYAGE_API_KEY` from the environment, or accepts an `apiKey` in its config.
540
+
533
541
  The re-ranked results combine vector similarity with semantic understanding to improve retrieval quality.
534
542
 
535
543
  For more details about re-ranking, see the [rerank()](https://mastra.ai/reference/rag/rerankWithScorer) method.
@@ -65,7 +65,7 @@ The tool returns an object with:
65
65
  | ---------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
66
66
  | `content` | `string` | The text content of the retrieved passage. |
67
67
  | `source` | `string \| undefined` | The source URI when Bedrock provides one. Agentic retrieval only includes this field when the result metadata contains `_source_uri`. |
68
- | `score` | `number \| undefined` | The relevance score returned by standard retrieval. The agentic API doesn't return a score for result items. |
68
+ | `score` | `number \| undefined` | The relevance score returned by standard retrieval, which the agentic API omits from result items. |
69
69
  | `metadata` | `Record<string, unknown>` | Additional metadata from the retrieval result. |
70
70
 
71
71
  ## Retrieval Modes
@@ -353,7 +353,7 @@ const response = await agent.generate('Find information about deployment', {
353
353
  })
354
354
  ```
355
355
 
356
- This approach allows you to:
356
+ Runtime configuration supports these use cases:
357
357
 
358
358
  - Switch between environments (dev/staging/prod)
359
359
  - Adjust performance parameters based on load
@@ -29,6 +29,17 @@ export interface GraphChunk {
29
29
  export interface GraphEmbedding {
30
30
  vector: number[];
31
31
  }
32
+ /**
33
+ * JSON-safe snapshot of a GraphRAG instance, produced by `serialize()` and
34
+ * restored with `GraphRAG.deserialize()`.
35
+ */
36
+ export interface GraphRAGSnapshot {
37
+ version: 1;
38
+ dimension: number;
39
+ threshold: number;
40
+ nodes: GraphNode[];
41
+ edges: GraphEdge[];
42
+ }
32
43
  export declare class GraphRAG {
33
44
  private nodes;
34
45
  private edges;
@@ -40,6 +51,23 @@ export declare class GraphRAG {
40
51
  getNodes(): GraphNode[];
41
52
  getEdges(): GraphEdge[];
42
53
  getEdgesByType(type: string): GraphEdge[];
54
+ /**
55
+ * Produce a JSON-safe snapshot of the graph so it can be persisted and
56
+ * restored later instead of rebuilt with `createGraph`.
57
+ *
58
+ * The snapshot is a deep copy, including nested node metadata, so mutating it
59
+ * does not affect this instance.
60
+ * Note that every node carries its full embedding, so snapshots of large
61
+ * graphs can be several megabytes of JSON.
62
+ */
63
+ serialize(): GraphRAGSnapshot;
64
+ /**
65
+ * Rebuild a GraphRAG instance from a snapshot produced by `serialize()`.
66
+ *
67
+ * @throws if the snapshot version is unsupported, a node embedding does not
68
+ * match the snapshot dimension, or an edge references an unknown node.
69
+ */
70
+ static deserialize(snapshot: GraphRAGSnapshot): GraphRAG;
43
71
  clear(): void;
44
72
  updateNodeContent(id: string, newContent: string): void;
45
73
  private getNeighbors;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph-rag/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,KAAK,iBAAiB,GAAG,UAAU,CAAC;AACpC,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAa,EAAE,SAAS,GAAE,MAAY;IAQ7D,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAW9B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAe9B,QAAQ,IAAI,SAAS,EAAE;IAKvB,QAAQ,IAAI,SAAS,EAAE;IAIvB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAIzC,KAAK,IAAI,IAAI;IAKb,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IASvD,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IAgCxB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE;IAuC9D,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,qBAAqB;IA2C7B;;;;;;;;OAQG;IAEH,KAAK,CAAC,EACJ,KAAK,EACL,IAAS,EACT,eAAqB,EACrB,WAAkB,EAClB,MAAM,GACP,EAAE;QACD,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KACjC,GAAG,UAAU,EAAE;CA+DjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph-rag/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,KAAK,iBAAiB,GAAG,UAAU,CAAC;AACpC,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGzC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,UAAW,SAAQ,SAAS;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAID,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,GAAE,MAAa,EAAE,SAAS,GAAE,MAAY;IAQ7D,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAW9B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAe9B,QAAQ,IAAI,SAAS,EAAE;IAKvB,QAAQ,IAAI,SAAS,EAAE;IAIvB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAIzC;;;;;;;;OAQG;IACH,SAAS,IAAI,gBAAgB;IAc7B;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,QAAQ;IAiCxD,KAAK,IAAI,IAAI;IAKb,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IASvD,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,gBAAgB;IAgCxB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE;IAuC9D,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,qBAAqB;IA2C7B;;;;;;;;OAQG;IAEH,KAAK,CAAC,EACJ,KAAK,EACL,IAAS,EACT,eAAqB,EACrB,WAAkB,EAClB,MAAM,GACP,EAAE;QACD,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KACjC,GAAG,UAAU,EAAE;CA+DjB"}
package/dist/index.cjs CHANGED
@@ -6224,7 +6224,8 @@ async function rerank(results, query, model, options) {
6224
6224
  }
6225
6225
  //#endregion
6226
6226
  //#region src/graph-rag/index.ts
6227
- var GraphRAG = class {
6227
+ const GRAPH_RAG_SNAPSHOT_VERSION = 1;
6228
+ var GraphRAG = class GraphRAG {
6228
6229
  nodes;
6229
6230
  edges;
6230
6231
  dimension;
@@ -6259,6 +6260,49 @@ var GraphRAG = class {
6259
6260
  getEdgesByType(type) {
6260
6261
  return this.edges.filter((edge) => edge.type === type);
6261
6262
  }
6263
+ /**
6264
+ * Produce a JSON-safe snapshot of the graph so it can be persisted and
6265
+ * restored later instead of rebuilt with `createGraph`.
6266
+ *
6267
+ * The snapshot is a deep copy, including nested node metadata, so mutating it
6268
+ * does not affect this instance.
6269
+ * Note that every node carries its full embedding, so snapshots of large
6270
+ * graphs can be several megabytes of JSON.
6271
+ */
6272
+ serialize() {
6273
+ return {
6274
+ version: GRAPH_RAG_SNAPSHOT_VERSION,
6275
+ dimension: this.dimension,
6276
+ threshold: this.threshold,
6277
+ nodes: Array.from(this.nodes.values()).map((node) => ({
6278
+ ...node,
6279
+ ...node.embedding ? { embedding: [...node.embedding] } : {},
6280
+ ...node.metadata ? { metadata: structuredClone(node.metadata) } : {}
6281
+ })),
6282
+ edges: this.edges.map((edge) => ({ ...edge }))
6283
+ };
6284
+ }
6285
+ /**
6286
+ * Rebuild a GraphRAG instance from a snapshot produced by `serialize()`.
6287
+ *
6288
+ * @throws if the snapshot version is unsupported, a node embedding does not
6289
+ * match the snapshot dimension, or an edge references an unknown node.
6290
+ */
6291
+ static deserialize(snapshot) {
6292
+ if (snapshot?.version !== GRAPH_RAG_SNAPSHOT_VERSION) throw new Error(`Unsupported GraphRAG snapshot version: ${snapshot?.version}`);
6293
+ const graph = new GraphRAG(snapshot.dimension, snapshot.threshold);
6294
+ for (const node of snapshot.nodes ?? []) graph.addNode({
6295
+ ...node,
6296
+ ...node.embedding ? { embedding: [...node.embedding] } : {},
6297
+ ...node.metadata ? { metadata: structuredClone(node.metadata) } : {}
6298
+ });
6299
+ for (const edge of snapshot.edges ?? []) {
6300
+ if (!graph.nodes.has(edge.source)) throw new Error(`Edge references unknown node: ${edge.source}`);
6301
+ if (!graph.nodes.has(edge.target)) throw new Error(`Edge references unknown node: ${edge.target}`);
6302
+ }
6303
+ graph.edges = (snapshot.edges ?? []).map((edge) => ({ ...edge }));
6304
+ return graph;
6305
+ }
6262
6306
  clear() {
6263
6307
  this.nodes.clear();
6264
6308
  this.edges = [];