@anvia/graph 1.1.3 → 1.1.5

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/README.md CHANGED
@@ -1,9 +1,23 @@
1
1
  # @anvia/graph
2
2
 
3
- Provider-neutral schema, extraction, retrieval-context, and tool primitives for knowledge graphs.
3
+ Turn text into typed entities and relationships for GraphRAG. Define a graph schema once,
4
+ then use it for extraction, retrieval tools, and ingestion with Neo4j or Memgraph.
5
+
6
+ ## Install
7
+
8
+ ```sh
9
+ pnpm add @anvia/graph @anvia/core @anvia/openai zod
10
+ ```
11
+
12
+ `@anvia/openai` supplies the extraction model below; other completion adapters work too.
13
+
14
+ ## Quickstart
15
+
16
+ Set `OPENAI_API_KEY`. This example extracts graph facts without requiring a graph database.
4
17
 
5
18
  ```ts
6
19
  import { defineGraphSchema, extractGraphFacts } from "@anvia/graph";
20
+ import { OpenAIClient } from "@anvia/openai";
7
21
  import { z } from "zod";
8
22
 
9
23
  const schema = defineGraphSchema({
@@ -16,134 +30,35 @@ const schema = defineGraphSchema({
16
30
  },
17
31
  relationships: {},
18
32
  });
19
-
20
- const facts = await extractGraphFacts({ model, schema, chunks });
21
- ```
22
-
23
- Database provisioning, persistence, and query execution belong to graph adapter packages such as
24
- `@anvia/neo4j` and `@anvia/memgraph`.
25
-
26
- ## Ingestion
27
-
28
- Managed graphs accept the same raw text document shape as vector ingestion:
29
-
30
- ```ts
31
- import { ingestGraphText } from "@anvia/graph";
32
-
33
- const ingestion = await ingestGraphText({
34
- graph,
35
- document: {
36
- id: "incident-42",
37
- text,
38
- metadata: { tenant: "acme" },
39
- },
40
- extractionModel,
41
- embeddingModel,
42
- chunking: {
43
- strategy: "recursive",
44
- maxSize: 1_000,
45
- overlap: 100,
46
- separators: ["\n\n", "\n", " "],
47
- },
48
- conflict: "error",
49
- orphanEntities: "delete",
50
- factConflicts: {
51
- entity: {
52
- properties: {
53
- summary: "prefer-longest",
54
- aliases: "union",
55
- confidence: "max",
56
- },
33
+ const client = new OpenAIClient({ apiKey: process.env.OPENAI_API_KEY! });
34
+ const facts = await extractGraphFacts({
35
+ model: client.completionModel({ modelId: "gpt-5.6", api: "responses" }),
36
+ schema,
37
+ chunks: [
38
+ {
39
+ id: "chunk-1",
40
+ documentId: "products",
41
+ index: 0,
42
+ text: "The product with ID anvia is named Anvia.",
57
43
  },
58
- },
59
- });
60
- ```
61
-
62
- Extraction conflicts and stored-graph write conflicts are separate policies. `factConflicts`
63
- resolves disagreements between chunks before persistence; `conflict` controls collisions with facts
64
- already stored by the graph adapter. Extraction rejects disagreements by default. Built-in
65
- property strategies include `prefer-first`, `prefer-last`, `prefer-defined`, `prefer-longest`,
66
- `union`, `max`, and `min`; a custom resolver receives structured candidate and source chunk data.
67
- Conflict errors and resolved warnings include the fact type, stable key, parsed identity, property,
68
- candidate values, and source chunk IDs. Resolved disagreements are returned in `warnings`.
69
-
70
- Use `ingestGraphDocuments()` for a batch. Both functions extract facts, embed chunks and entities,
71
- and atomically replace each source document in the managed graph. Existing graph registrations are
72
- read-only and are rejected as ingestion targets by TypeScript.
73
-
74
- The result also exposes `vectorDocuments`, grouped by source document ID, so a vector store can
75
- reuse the chunk embeddings without another model call:
76
-
77
- ```ts
78
- await vectorStore.upsert({ documents: ingestion.vectorDocuments });
79
- ```
80
-
81
- Every ingestion result includes a `receipt` with document, entity, relationship, and vector IDs,
82
- the graph write counts, warnings, an optional caller-supplied `revision`, and vector-stage status.
83
- Use `ingestGraphTextToStores()` or `ingestGraphDocumentsToStores()` to write the graph followed by
84
- the vector store. If the second stage fails, `GraphIngestionStageError` exposes a receipt with a
85
- completed graph stage and failed vector stage for queue reconciliation.
86
-
87
- The graph and vector writes are separate transactions. Applications that require cross-store
88
- reconciliation should persist their own ingestion status and retry the incomplete write. Advanced
89
- callers can use `prepareGraphDocuments()` to run chunking, extraction, and embedding without writing,
90
- then pass its graph fields to `graph.replaceDocuments()` and its `vectorDocuments` to a vector store.
91
-
92
- ## Search tool
93
-
94
- Create the same Agent tool for any graph adapter implementing `GraphContextRetriever`:
95
-
96
- ```ts
97
- import { createGraphSearchTool } from "@anvia/graph";
98
-
99
- const searchGraph = createGraphSearchTool({
100
- name: "search_graph",
101
- description: "Search connected entities and supporting evidence.",
102
- graph,
103
- model: embeddingModel,
104
- search: {
105
- type: "vector",
106
- seeds: ["entities"],
107
- topK: 8,
108
- },
109
- traversal: {
110
- relationships: ["AFFECTS"],
111
- direction: "both",
112
- maxDepth: 2,
113
- maxNodes: 40,
114
- maxRelationships: 80,
115
- },
116
- evidence: { type: "chunks", maxChunks: 12 },
44
+ ],
117
45
  });
46
+ console.log(facts.output.entities);
118
47
  ```
119
48
 
120
- The graph registration controls which evidence modes are valid. Managed graphs can hydrate stored
121
- chunks, while existing graph registrations use `{ type: "none" }`.
122
-
123
- ## Exploration
49
+ ## Build on the same schema
124
50
 
125
- Adapters implementing `GraphExplorer` expose a portable, bounded view for visualization:
51
+ - Ingest documents with chunking, extraction, and embeddings into managed graphs.
52
+ - Reuse chunk embeddings in vector stores and track partial writes with ingestion receipts.
53
+ - Resolve extraction conflicts with explicit property policies.
54
+ - Create bounded graph search tools and explore graph neighborhoods.
126
55
 
127
- ```ts
128
- const overview = await graph.explore({
129
- mode: "overview",
130
- nodeTypes: ["Product"],
131
- includeProvenance: true,
132
- maxNodes: 100,
133
- maxRelationships: 200,
134
- });
135
-
136
- const neighborhood = await graph.explore({
137
- mode: "expand",
138
- nodeIds: [overview.nodes[0]!.id],
139
- direction: "both",
140
- maxDepth: 1,
141
- });
142
- ```
56
+ Persistence and provisioning belong to [Neo4j](https://github.com/anvia-hq/anvia/blob/main/packages/graph-neo4j/README.md)
57
+ and [Memgraph](https://github.com/anvia-hq/anvia/blob/main/packages/graph-memgraph/README.md).
58
+ Property schemas must use `z.strictObject()` and preserve input values without transforms or defaults.
143
59
 
144
- Explorer IDs are opaque and provider-specific. They are intended for follow-up expansion within the
145
- same graph, not persistence or cross-provider migration. Adapters cap overview and expansion requests,
146
- return truncation metadata, and omit reserved Anvia properties such as stored embeddings.
60
+ ## Learn more
147
61
 
148
- When `includeProvenance` is true, supported adapters attach source `documentIds` and `chunkIds` to
149
- nodes and relationships.
62
+ - [Usage guide](https://github.com/anvia-hq/anvia/blob/main/docs/packages/graph.md)
63
+ - [Anvia overview](https://github.com/anvia-hq/anvia/blob/main/README.md)
64
+ - [Contributing](https://github.com/anvia-hq/anvia/blob/main/CONTRIBUTING.md)
package/dist/index.js CHANGED
@@ -682,9 +682,12 @@ async function prepareGraphDocuments(options) {
682
682
  };
683
683
  }
684
684
  function ingestionReceipt(prepared, write, revision, vectorStatus) {
685
+ const head = {
686
+ documentIds: prepared.documents.map((document) => document.id)
687
+ };
688
+ if (revision !== void 0) head.revision = revision;
685
689
  return {
686
- documentIds: prepared.documents.map((document) => document.id),
687
- ...revision === void 0 ? {} : { revision },
690
+ ...head,
688
691
  entityKeys: prepared.entities.map((entity) => entity.id),
689
692
  relationshipKeys: prepared.relationships.map((relationship) => relationship.key),
690
693
  vectorDocumentIds: prepared.vectorDocuments.map((document) => document.id),
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/extract.ts","../src/schema.ts","../src/ingest.ts","../src/tool.ts"],"sourcesContent":["import { Usage } from \"@anvia/core\";\nimport { extract } from \"@anvia/core/extractor\";\nimport { z } from \"zod\";\nimport { parseGraphProperties, parseGraphPropertyValue } from \"./schema.js\";\nimport type {\n ExtractGraphFactsOptions,\n ExtractGraphFactsResult,\n GraphEntity,\n GraphExtractionWarning,\n GraphFactConflictCandidate,\n GraphFactConflictPolicy,\n GraphFactPropertyConflict,\n GraphFactPropertyConflictStrategy,\n GraphFacts,\n GraphMention,\n GraphNodeIdentity,\n GraphProperties,\n GraphPropertyValue,\n GraphRelationship,\n GraphSchemaLike,\n} from \"./types.js\";\n\ntype RawEntity = { ref: string; type: string; properties: Record<string, unknown> };\ntype RawRelationship = {\n type: string;\n from: string;\n to: string;\n properties: Record<string, unknown>;\n};\ntype RawChunkFacts = { entities: RawEntity[]; relationships: RawRelationship[] };\ntype ChunkExtraction = { chunkId: string; output: RawChunkFacts; usage: Usage };\ntype EntityCandidate = Readonly<{\n key: string;\n type: string;\n identity: GraphNodeIdentity;\n properties: GraphProperties;\n chunkId: string;\n}>;\ntype RelationshipCandidate = Readonly<{\n key: string;\n type: string;\n from: string;\n to: string;\n identity: GraphNodeIdentity;\n properties: GraphProperties;\n chunkId: string;\n}>;\n\nexport async function extractGraphFacts<\n Schema extends GraphSchemaLike,\n Model extends import(\"@anvia/core\").CompletionModel,\n>(options: ExtractGraphFactsOptions<Schema, Model>): Promise<ExtractGraphFactsResult<Schema>> {\n assertConcurrency(options.concurrency);\n throwIfAborted(options.abortSignal);\n const ids = new Set<string>();\n for (const chunk of options.chunks) {\n if (ids.has(chunk.id)) throw new TypeError(`Duplicate graph chunk id: ${chunk.id}`);\n ids.add(chunk.id);\n if (typeof chunk.text !== \"string\") {\n throw new TypeError(`Graph chunk ${chunk.id} text must be a string.`);\n }\n }\n\n const outputSchema = extractionSchema(options.schema);\n const instructions = graphInstructions(options.schema, options.instructions);\n const extractions = await mapConcurrent(\n options.chunks,\n options.concurrency ?? 1,\n async (chunk): Promise<ChunkExtraction> => {\n throwIfAborted(options.abortSignal);\n const result = await extract({\n model: options.model,\n text: chunk.text,\n outputSchema,\n instructions,\n retries: options.retries,\n abortSignal: options.abortSignal,\n });\n return { chunkId: chunk.id, output: result.output as RawChunkFacts, usage: result.usage };\n },\n );\n return {\n ...normalizeFacts(options.schema, extractions, options.conflicts),\n usage: extractions.reduce((usage, item) => Usage.add(usage, item.usage), Usage.empty()),\n };\n}\n\nfunction extractionSchema(schema: GraphSchemaLike): z.ZodType<RawChunkFacts> {\n const entities = Object.entries(schema.nodes).map(([type, definition]) =>\n z.object({ ref: z.string().min(1), type: z.literal(type), properties: definition.properties }),\n );\n const relationships = Object.entries(schema.relationships).map(([type, definition]) =>\n z.object({\n type: z.literal(type),\n from: z.string().min(1),\n to: z.string().min(1),\n properties: definition.properties,\n }),\n );\n return z.object({\n entities: z.array(union(entities, z.never())),\n relationships: z.array(union(relationships, z.never())),\n }) as unknown as z.ZodType<RawChunkFacts>;\n}\n\nfunction union(items: z.ZodType[], empty: z.ZodType): z.ZodType {\n if (items.length === 0) return empty;\n if (items.length === 1) return items[0] as z.ZodType;\n return z.union(items as [z.ZodType, z.ZodType, ...z.ZodType[]]);\n}\n\nfunction graphInstructions(schema: GraphSchemaLike, extra: string | undefined): string {\n const nodes = Object.entries(schema.nodes)\n .map(([type, definition]) => `- ${type}: ${definition.description}`)\n .join(\"\\n\");\n const relationships = Object.entries(schema.relationships)\n .map(\n ([type, definition]) =>\n `- ${type}: ${definition.from} -> ${definition.to}. ${definition.description}`,\n )\n .join(\"\\n\");\n return [\n \"Extract only facts directly supported by the source text.\",\n \"Give every extracted entity a unique local ref and use those refs as relationship endpoints.\",\n \"Do not invent entity or relationship types outside the declared schema.\",\n `Node types:\\n${nodes}`,\n relationships.length === 0\n ? \"No relationship types are allowed.\"\n : `Relationship types:\\n${relationships}`,\n extra,\n ]\n .filter((part): part is string => part !== undefined && part.length > 0)\n .join(\"\\n\\n\");\n}\n\nfunction normalizeFacts<Schema extends GraphSchemaLike>(\n schema: Schema,\n extractions: readonly ChunkExtraction[],\n conflicts: ExtractGraphFactsOptions<Schema, import(\"@anvia/core\").CompletionModel>[\"conflicts\"],\n): Readonly<{ output: GraphFacts<Schema>; warnings: readonly GraphExtractionWarning[] }> {\n const entityCandidates = new Map<string, EntityCandidate[]>();\n const relationshipCandidates = new Map<string, RelationshipCandidate[]>();\n const mentions = new Map<string, GraphMention>();\n\n for (const extraction of extractions) {\n const refs = new Map<string, EntityCandidate>();\n for (const raw of extraction.output.entities) {\n if (refs.has(raw.ref)) {\n throw new TypeError(`Duplicate entity ref ${raw.ref} in chunk ${extraction.chunkId}.`);\n }\n const definition = schema.nodes[raw.type];\n if (definition === undefined) throw new TypeError(`Unknown graph entity type: ${raw.type}`);\n const properties = parseGraphProperties(\n definition.properties.parse(raw.properties),\n `entity ${raw.type}`,\n );\n const identity = identityFromProperties(definition.identity, properties, raw.type);\n const key = `${raw.type}:${stableObject(identity)}`;\n const candidate: EntityCandidate = {\n key,\n type: raw.type,\n identity,\n properties,\n chunkId: extraction.chunkId,\n };\n appendCandidate(entityCandidates, key, candidate);\n refs.set(raw.ref, candidate);\n mentions.set(`${extraction.chunkId}\\u0000${key}`, {\n chunkId: extraction.chunkId,\n entityKey: key,\n });\n }\n\n for (const raw of extraction.output.relationships) {\n const definition = schema.relationships[raw.type];\n if (definition === undefined) {\n throw new TypeError(`Unknown graph relationship type: ${raw.type}`);\n }\n const from = refs.get(raw.from);\n const to = refs.get(raw.to);\n if (from === undefined || to === undefined) {\n throw new TypeError(\n `Relationship ${raw.type} in chunk ${extraction.chunkId} references an unknown entity ref.`,\n );\n }\n if (from.type !== definition.from || to.type !== definition.to) {\n throw new TypeError(\n `Relationship ${raw.type} has invalid endpoint types ${from.type} -> ${to.type}.`,\n );\n }\n const properties = parseGraphProperties(\n definition.properties.parse(raw.properties),\n `relationship ${raw.type}`,\n );\n const identity = identityFromProperties(definition.identity ?? [], properties, raw.type);\n const key = `${raw.type}:${from.key}->${to.key}:${stableObject(identity)}`;\n appendCandidate(relationshipCandidates, key, {\n key,\n type: raw.type,\n from: from.key,\n to: to.key,\n identity,\n properties,\n chunkId: extraction.chunkId,\n });\n }\n }\n const warnings: GraphExtractionWarning[] = [];\n const entities = [...entityCandidates.values()].map((candidates) => {\n const first = requiredCandidate(candidates);\n const definition = schema.nodes[first.type];\n if (definition === undefined) throw new TypeError(`Unknown graph entity type: ${first.type}`);\n const properties = parseGraphProperties(\n definition.properties.parse(\n resolveFactProperties(\n \"entity\",\n first.key,\n first.type,\n first.identity,\n candidates,\n conflicts?.entity,\n warnings,\n ),\n ),\n `entity ${first.type}`,\n );\n return {\n key: first.key,\n type: first.type,\n identity: first.identity,\n properties,\n sourceChunkIds: uniqueChunkIds(candidates),\n } as GraphEntity<Schema>;\n });\n const relationships = [...relationshipCandidates.values()].map((candidates) => {\n const first = requiredCandidate(candidates);\n const definition = schema.relationships[first.type];\n if (definition === undefined) {\n throw new TypeError(`Unknown graph relationship type: ${first.type}`);\n }\n const properties = parseGraphProperties(\n definition.properties.parse(\n resolveFactProperties(\n \"relationship\",\n first.key,\n first.type,\n first.identity,\n candidates,\n conflicts?.relationship,\n warnings,\n ),\n ),\n `relationship ${first.type}`,\n );\n return {\n key: first.key,\n type: first.type,\n from: first.from,\n to: first.to,\n properties,\n sourceChunkIds: uniqueChunkIds(candidates),\n } as GraphRelationship<Schema>;\n });\n return {\n output: { entities, relationships, mentions: [...mentions.values()] },\n warnings,\n };\n}\n\nfunction appendCandidate<Candidate>(\n candidates: Map<string, Candidate[]>,\n key: string,\n candidate: Candidate,\n): void {\n const current = candidates.get(key);\n if (current === undefined) candidates.set(key, [candidate]);\n else current.push(candidate);\n}\n\nfunction requiredCandidate<Candidate>(candidates: readonly Candidate[]): Candidate {\n const candidate = candidates[0];\n if (candidate === undefined) throw new TypeError(\"Graph fact candidate group cannot be empty.\");\n return candidate;\n}\n\nfunction uniqueChunkIds(candidates: readonly { chunkId: string }[]): readonly string[] {\n return [...new Set(candidates.map((candidate) => candidate.chunkId))];\n}\n\nfunction resolveFactProperties(\n kind: \"entity\" | \"relationship\",\n key: string,\n type: string,\n identity: GraphNodeIdentity,\n candidates: readonly { chunkId: string; properties: GraphProperties }[],\n policy: GraphFactConflictPolicy | undefined,\n warnings: GraphExtractionWarning[],\n): GraphProperties {\n const propertyNames = [\n ...new Set(candidates.flatMap((candidate) => Object.keys(candidate.properties))),\n ].sort();\n const properties: Record<string, GraphPropertyValue> = {};\n for (const property of propertyNames) {\n const propertyCandidates: GraphFactConflictCandidate[] = candidates.map((candidate) => ({\n chunkId: candidate.chunkId,\n properties: candidate.properties,\n value: candidate.properties[property],\n }));\n const firstValue = propertyCandidates[0]?.value;\n if (\n propertyCandidates.every(\n (candidate) => stableValue(candidate.value) === stableValue(firstValue),\n )\n ) {\n if (firstValue !== undefined) properties[property] = firstValue;\n continue;\n }\n const conflict: GraphFactPropertyConflict = {\n code: \"GRAPH_FACT_CONFLICT\",\n kind,\n key,\n type,\n identity,\n property,\n candidates: propertyCandidates,\n sourceChunkIds: uniqueChunkIds(propertyCandidates),\n };\n const strategy =\n policy?.properties?.[property] ?? policy?.resolve ?? policy?.default ?? \"reject\";\n if (strategy === \"reject\") throw new GraphFactConflictError(conflict);\n const resolvedValue = validateResolvedValue(\n resolvePropertyConflict(strategy, conflict),\n conflict,\n );\n if (resolvedValue !== undefined) properties[property] = resolvedValue;\n warnings.push({\n ...conflict,\n code: \"GRAPH_FACT_CONFLICT_RESOLVED\",\n strategy: typeof strategy === \"function\" ? \"custom\" : strategy,\n resolvedValue,\n });\n }\n return properties;\n}\n\nfunction resolvePropertyConflict(\n strategy: Exclude<GraphFactPropertyConflictStrategy, \"reject\">,\n conflict: GraphFactPropertyConflict,\n): GraphPropertyValue | undefined {\n if (typeof strategy === \"function\") {\n return strategy(conflict);\n }\n const values = conflict.candidates.map((candidate) => candidate.value);\n if (strategy === \"prefer-first\") return values[0];\n if (strategy === \"prefer-last\") return values.at(-1);\n if (strategy === \"prefer-defined\") return values.find((value) => value !== undefined);\n if (strategy === \"prefer-longest\") {\n const strings = definedValues(values, \"string\", conflict, strategy);\n return strings.reduce((longest, value) => (value.length > longest.length ? value : longest));\n }\n if (strategy === \"union\") {\n const arrays = values.filter((value) => value !== undefined);\n if (!arrays.every(Array.isArray)) throw incompatibleStrategy(conflict, strategy);\n return [...new Set(arrays.flat())] as string[] | number[] | boolean[];\n }\n const numbers = definedValues(values, \"number\", conflict, strategy);\n return strategy === \"max\" ? Math.max(...numbers) : Math.min(...numbers);\n}\n\nfunction definedValues<Type extends \"string\" | \"number\">(\n values: readonly (GraphPropertyValue | undefined)[],\n type: Type,\n conflict: GraphFactPropertyConflict,\n strategy: string,\n): Type extends \"string\" ? string[] : number[] {\n const defined = values.filter((value) => value !== undefined);\n if (defined.length === 0 || !defined.every((value) => typeof value === type)) {\n throw incompatibleStrategy(conflict, strategy);\n }\n return defined as Type extends \"string\" ? string[] : number[];\n}\n\nfunction validateResolvedValue(\n value: GraphPropertyValue | undefined,\n conflict: GraphFactPropertyConflict,\n): GraphPropertyValue | undefined {\n return value === undefined\n ? undefined\n : parseGraphPropertyValue(value, `Resolved graph fact ${conflict.key}.${conflict.property}`);\n}\n\nfunction incompatibleStrategy(conflict: GraphFactPropertyConflict, strategy: string): TypeError {\n return new TypeError(\n `Graph fact conflict strategy ${strategy} is incompatible with ${conflict.key}.${conflict.property}.`,\n );\n}\n\nfunction identityFromProperties(\n keys: readonly string[],\n properties: GraphProperties,\n type: string,\n): GraphNodeIdentity {\n const identity: Record<string, string | number | boolean> = {};\n for (const key of keys) {\n const value = properties[key];\n if (\n value === undefined ||\n !(typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\")\n ) {\n throw new TypeError(`Identity property ${key} for ${type} must be a primitive value.`);\n }\n identity[key] = value;\n }\n return identity;\n}\n\nfunction stableObject(value: Readonly<Record<string, unknown>>): string {\n return JSON.stringify(\n Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right))),\n );\n}\n\nfunction stableValue(value: unknown): string {\n return value === undefined ? \"undefined\" : stableObject({ value });\n}\n\nexport class GraphFactConflictError extends Error {\n readonly code = \"GRAPH_FACT_CONFLICT\" as const;\n readonly kind: \"entity\" | \"relationship\";\n readonly factKey: string;\n readonly type: string;\n readonly identity: GraphNodeIdentity;\n readonly property: string;\n readonly candidates: readonly GraphFactConflictCandidate[];\n readonly sourceChunkIds: readonly string[];\n\n constructor(conflict: GraphFactPropertyConflict);\n constructor(factKey: string, sourceChunkIds: readonly string[]);\n constructor(\n conflictOrKey: GraphFactPropertyConflict | string,\n legacyChunkIds: readonly string[] = [],\n ) {\n const conflict =\n typeof conflictOrKey === \"string\"\n ? {\n code: \"GRAPH_FACT_CONFLICT\" as const,\n kind: \"entity\" as const,\n key: conflictOrKey,\n type: conflictOrKey.split(\":\", 1)[0] ?? \"unknown\",\n identity: {},\n property: \"unknown\",\n candidates: [],\n sourceChunkIds: legacyChunkIds,\n }\n : conflictOrKey;\n super(\n `Conflicting graph fact ${conflict.key}.${conflict.property} was extracted from chunks ${conflict.sourceChunkIds.join(\", \")}.`,\n );\n this.name = \"GraphFactConflictError\";\n this.kind = conflict.kind;\n this.factKey = conflict.key;\n this.type = conflict.type;\n this.identity = conflict.identity;\n this.property = conflict.property;\n this.candidates = conflict.candidates;\n this.sourceChunkIds = conflict.sourceChunkIds;\n }\n}\n\nfunction assertConcurrency(value: number | undefined): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {\n throw new RangeError(\"Graph extraction concurrency must be a positive safe integer.\");\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return;\n if (signal.reason instanceof Error) throw signal.reason;\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n}\n\nasync function mapConcurrent<Input, Output>(\n values: readonly Input[],\n concurrency: number,\n run: (value: Input) => Promise<Output>,\n): Promise<Output[]> {\n const output = Array<Output>(values.length);\n let cursor = 0;\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, async () => {\n for (;;) {\n const index = cursor;\n cursor += 1;\n if (index >= values.length) return;\n output[index] = await run(values[index] as Input);\n }\n }),\n );\n return output;\n}\n","import { z } from \"zod\";\nimport type {\n GraphProperties,\n GraphPropertyPrimitive,\n GraphPropertyValue,\n GraphSchema,\n GraphSchemaOptions,\n} from \"./types.js\";\n\nexport const graphReservedPropertyPrefix = \"__anvia_\";\n\nexport function defineGraphSchema<const Options extends GraphSchemaOptions>(\n options: Options,\n): GraphSchema<Options> {\n validateGraphSchemaOptions(options);\n return freezeGraphSchema(options, \"graph-schema\");\n}\n\nexport function validateGraphSchemaOptions(options: GraphSchemaOptions): void {\n if (Object.keys(options.nodes).length === 0) {\n throw new TypeError(\"A graph schema requires at least one node type.\");\n }\n for (const [type, definition] of Object.entries(options.nodes)) {\n assertGraphName(type, \"node type\");\n assertDescription(definition.description, `node ${type}`);\n if (!(definition.properties instanceof z.ZodObject)) {\n throw new TypeError(`Properties for node ${type} must be a Zod object schema.`);\n }\n assertExactPropertySchema(definition.properties, `node ${type}`);\n if (\n definition.identity.length === 0 ||\n new Set(definition.identity).size !== definition.identity.length\n ) {\n throw new TypeError(`Node ${type} must declare unique identity properties.`);\n }\n for (const property of definition.identity) {\n assertGraphPropertyName(property);\n if (!(property in definition.properties.shape)) {\n throw new TypeError(`Identity property ${property} is not declared by node ${type}.`);\n }\n }\n for (const property of Object.keys(definition.properties.shape)) {\n assertGraphPropertyName(property);\n }\n }\n for (const [type, definition] of Object.entries(options.relationships)) {\n assertGraphName(type, \"relationship type\");\n assertDescription(definition.description, `relationship ${type}`);\n if (!(definition.from in options.nodes) || !(definition.to in options.nodes)) {\n throw new TypeError(`Relationship ${type} references an unknown endpoint type.`);\n }\n if (!(definition.properties instanceof z.ZodObject)) {\n throw new TypeError(`Properties for relationship ${type} must be a Zod object schema.`);\n }\n assertExactPropertySchema(definition.properties, `relationship ${type}`);\n const identity = definition.identity ?? [];\n if (new Set(identity).size !== identity.length) {\n throw new TypeError(`Relationship ${type} contains duplicate identity properties.`);\n }\n for (const property of Object.keys(definition.properties.shape)) {\n assertGraphPropertyName(property);\n }\n for (const property of identity) {\n if (!(property in definition.properties.shape)) {\n throw new TypeError(\n `Identity property ${property} is not declared by relationship ${type}.`,\n );\n }\n }\n }\n}\n\nexport function freezeGraphSchema<\n const Options extends GraphSchemaOptions,\n const Kind extends string,\n>(options: Options, kind: Kind): Readonly<Options & { kind: Kind }> {\n const nodes = Object.fromEntries(\n Object.entries(options.nodes).map(([type, definition]) => [\n type,\n Object.freeze({ ...definition, identity: Object.freeze([...definition.identity]) }),\n ]),\n );\n const relationships = Object.fromEntries(\n Object.entries(options.relationships).map(([type, definition]) => {\n const copy = { ...definition };\n if (definition.identity !== undefined) {\n Object.assign(copy, { identity: Object.freeze([...definition.identity]) });\n }\n return [type, Object.freeze(copy)];\n }),\n );\n return Object.freeze({\n nodes: Object.freeze(nodes),\n relationships: Object.freeze(relationships),\n kind,\n }) as Readonly<Options & { kind: Kind }>;\n}\n\nexport function parseGraphProperties(value: unknown, label: string): GraphProperties {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object of graph property values.`);\n }\n const output: Record<string, GraphPropertyValue> = {};\n for (const [key, item] of Object.entries(value)) {\n assertGraphPropertyName(key);\n output[key] = parseGraphPropertyValue(item, `${label}.${key}`);\n }\n return output;\n}\n\nexport function parseGraphPropertyValue(value: unknown, label: string): GraphPropertyValue {\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(`${label} must be finite.`);\n if (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n throw new TypeError(`${label} must be a safe integer.`);\n }\n return value;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return [];\n const parsed = value.map((item, index) => parsePrimitive(item, `${label}[${index}]`));\n const type = typeof parsed[0];\n if (!parsed.every((item) => typeof item === type)) {\n throw new TypeError(`${label} must be a homogeneous array.`);\n }\n return parsed as GraphPropertyValue;\n }\n throw new TypeError(`${label} is not a supported graph property value.`);\n}\n\nexport function assertGraphName(value: string, label: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n}\n\nexport function assertGraphPropertyName(value: string): void {\n assertGraphName(value, \"graph property name\");\n if (value.startsWith(graphReservedPropertyPrefix)) {\n throw new TypeError(\n `Graph property names beginning with ${graphReservedPropertyPrefix} are reserved.`,\n );\n }\n}\n\nfunction parsePrimitive(value: unknown, label: string): GraphPropertyPrimitive {\n const parsed = parseGraphPropertyValue(value, label);\n if (typeof parsed === \"string\" || typeof parsed === \"number\" || typeof parsed === \"boolean\") {\n return parsed;\n }\n throw new TypeError(`${label} must be a primitive property value.`);\n}\n\nfunction assertDescription(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty description.`);\n }\n}\n\nfunction assertExactPropertySchema(schema: z.ZodObject<z.ZodRawShape>, label: string): void {\n const definition = schema._zod.def;\n if (!(definition.catchall instanceof z.ZodNever)) {\n throw new TypeError(`${label} properties must use a strict Zod object schema.`);\n }\n for (const [property, propertySchema] of Object.entries(schema.shape)) {\n assertNonEffectfulSchema(propertySchema, `${label} property ${property}`, new Set());\n }\n}\n\nfunction assertNonEffectfulSchema(value: unknown, label: string, visited: Set<z.ZodType>): void {\n if (!(value instanceof z.ZodType)) throw new TypeError(`${label} must be a Zod schema.`);\n if (visited.has(value)) return;\n visited.add(value);\n const definition = value._zod.def as unknown as Record<string, unknown>;\n const type = definition.type;\n if (\n definition.coerce === true ||\n type === \"default\" ||\n type === \"prefault\" ||\n type === \"catch\" ||\n type === \"transform\" ||\n type === \"pipe\"\n ) {\n throw new TypeError(\n `${label} must not coerce, default, transform, preprocess, or catch values.`,\n );\n }\n const checks = definition.checks;\n if (\n Array.isArray(checks) &&\n checks.some((check) => {\n if (typeof check !== \"object\" || check === null) return false;\n return (check as { _zod?: { def?: { check?: unknown } } })._zod?.def?.check === \"overwrite\";\n })\n ) {\n throw new TypeError(`${label} must not normalize or overwrite values.`);\n }\n for (const child of schemaChildren(definition)) assertNonEffectfulSchema(child, label, visited);\n}\n\nfunction schemaChildren(definition: Record<string, unknown>): z.ZodType[] {\n const children: z.ZodType[] = [];\n for (const key of [\"innerType\", \"element\", \"left\", \"right\", \"rest\", \"keyType\", \"valueType\"]) {\n const value = definition[key];\n if (value instanceof z.ZodType) children.push(value);\n }\n for (const key of [\"options\", \"items\"]) {\n const value = definition[key];\n if (Array.isArray(value)) {\n for (const item of value) if (item instanceof z.ZodType) children.push(item);\n }\n }\n return children;\n}\n","import type { CompletionModel, JsonObject, RetrySetting, Usage } from \"@anvia/core\";\nimport {\n chunkTextDocuments,\n type TextDocument,\n type TextDocumentChunk,\n type TextDocumentChunkingOptions,\n type TextDocumentMetadata,\n} from \"@anvia/core/documents\";\nimport { embedDocuments, type EmbeddedDocument, type EmbeddingModel } from \"@anvia/core/embeddings\";\nimport { extractGraphFacts } from \"./extract.js\";\nimport { parseGraphProperties } from \"./schema.js\";\nimport type {\n GraphChunk,\n GraphDocument,\n GraphDocumentWriter,\n GraphEntity,\n GraphExtractionWarning,\n GraphFactConflictOptions,\n GraphMention,\n GraphOrphanEntityPolicy,\n GraphProperties,\n GraphRelationship,\n GraphSchemaLike,\n GraphWriteConflict,\n GraphWriteResult,\n} from \"./types.js\";\n\ntype GraphPreparationOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n> = Readonly<{\n graph: Readonly<{ schema: Schema }>;\n documents: readonly TextDocument<TextDocumentMetadata>[];\n extractionModel: ExtractionModel;\n embeddingModel: EmbeddingModel;\n chunking?: TextDocumentChunkingOptions | undefined;\n entityText?: ((entity: GraphEntity<Schema>) => string) | undefined;\n instructions?: string | undefined;\n retries?: RetrySetting | undefined;\n concurrency?: number | undefined;\n abortSignal?: AbortSignal | undefined;\n factConflicts?: GraphFactConflictOptions | undefined;\n revision?: string | undefined;\n}>;\n\nexport type PrepareGraphDocumentsOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = GraphPreparationOptions<Schema, ExtractionModel>;\n\nexport type IngestGraphDocumentsOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<GraphPreparationOptions<Schema, ExtractionModel>, \"graph\"> &\n Readonly<{\n graph: GraphDocumentWriter<Schema>;\n conflict: GraphWriteConflict;\n orphanEntities: GraphOrphanEntityPolicy;\n }>;\n\nexport type IngestGraphTextOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<IngestGraphDocumentsOptions<Schema, ExtractionModel>, \"documents\"> &\n Readonly<{ document: TextDocument<TextDocumentMetadata> }>;\n\nexport type PreparedGraphDocuments<Schema extends GraphSchemaLike> = Readonly<{\n documents: readonly GraphDocument[];\n chunks: readonly EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[];\n vectorDocuments: readonly EmbeddedDocument<\n TextDocument<TextDocumentMetadata>,\n TextDocumentMetadata\n >[];\n entities: readonly EmbeddedDocument<GraphEntity<Schema>>[];\n relationships: readonly GraphRelationship<Schema>[];\n mentions: readonly GraphMention[];\n usage: Usage;\n warnings: readonly GraphExtractionWarning[];\n}>;\n\nexport type IngestGraphDocumentsResult<Schema extends GraphSchemaLike> =\n PreparedGraphDocuments<Schema> &\n Readonly<{ write: GraphWriteResult; receipt: GraphIngestionReceipt }>;\n\nexport type GraphIngestionReceipt = Readonly<{\n documentIds: readonly string[];\n revision?: string | undefined;\n entityKeys: readonly string[];\n relationshipKeys: readonly string[];\n vectorDocumentIds: readonly string[];\n graphWrite: Readonly<{ status: \"completed\"; result: GraphWriteResult }>;\n vectorWrite: Readonly<{ status: \"not-requested\" | \"completed\" | \"failed\" }>;\n warnings: readonly GraphExtractionWarning[];\n}>;\n\nexport type GraphVectorWriter = Readonly<{\n upsert(options: {\n documents: Array<EmbeddedDocument<TextDocument<TextDocumentMetadata>, TextDocumentMetadata>>;\n providerOptions?: JsonObject | undefined;\n }): Promise<void>;\n}>;\n\nexport type IngestGraphDocumentsToStoresOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = IngestGraphDocumentsOptions<Schema, ExtractionModel> &\n Readonly<{\n vectorStore: GraphVectorWriter;\n vectorProviderOptions?: JsonObject | undefined;\n }>;\n\nexport type IngestGraphTextToStoresOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<IngestGraphDocumentsToStoresOptions<Schema, ExtractionModel>, \"documents\"> &\n Readonly<{ document: TextDocument<TextDocumentMetadata> }>;\n\nexport class GraphIngestionStageError extends Error {\n readonly code = \"GRAPH_INGESTION_STAGE_FAILED\" as const;\n readonly stage = \"vector\" as const;\n\n constructor(\n readonly receipt: GraphIngestionReceipt,\n cause: unknown,\n ) {\n super(\"Graph ingestion completed, but the vector write failed.\", { cause });\n this.name = \"GraphIngestionStageError\";\n }\n}\n\nexport async function ingestGraphText<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphTextOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n return ingestGraphDocuments({\n graph: options.graph,\n documents: [options.document],\n extractionModel: options.extractionModel,\n embeddingModel: options.embeddingModel,\n chunking: options.chunking,\n entityText: options.entityText,\n instructions: options.instructions,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n factConflicts: options.factConflicts,\n revision: options.revision,\n conflict: options.conflict,\n orphanEntities: options.orphanEntities,\n });\n}\n\nexport async function ingestGraphDocuments<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphDocumentsOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n const prepared = await prepareGraphDocuments(options);\n const write = await options.graph.replaceDocuments({\n documents: prepared.documents,\n chunks: prepared.chunks,\n entities: prepared.entities,\n relationships: prepared.relationships,\n mentions: prepared.mentions,\n conflict: options.conflict,\n orphanEntities: options.orphanEntities,\n abortSignal: options.abortSignal,\n });\n return {\n ...prepared,\n write,\n receipt: ingestionReceipt(prepared, write, options.revision, \"not-requested\"),\n };\n}\n\nexport async function ingestGraphTextToStores<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphTextToStoresOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n return ingestGraphDocumentsToStores({ ...options, documents: [options.document] });\n}\n\nexport async function ingestGraphDocumentsToStores<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphDocumentsToStoresOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n const result = await ingestGraphDocuments(options);\n try {\n await options.vectorStore.upsert({\n documents: [...result.vectorDocuments],\n providerOptions: options.vectorProviderOptions,\n });\n } catch (error) {\n throw new GraphIngestionStageError(\n { ...result.receipt, vectorWrite: { status: \"failed\" } },\n error,\n );\n }\n return {\n ...result,\n receipt: { ...result.receipt, vectorWrite: { status: \"completed\" } },\n };\n}\n\nexport async function prepareGraphDocuments<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: PrepareGraphDocumentsOptions<Schema, ExtractionModel>,\n): Promise<PreparedGraphDocuments<Schema>> {\n if (options.revision !== undefined && options.revision.trim().length === 0) {\n throw new TypeError(\"Graph ingestion revision must be a non-empty string.\");\n }\n validatePortableMetadata(options.documents);\n const chunks = chunkTextDocuments({\n documents: options.documents,\n chunking: options.chunking,\n });\n const graphChunks: GraphChunk<TextDocumentMetadata>[] = chunks.map((chunk) => graphChunk(chunk));\n const [facts, embeddedChunks] = await Promise.all([\n extractGraphFacts({\n model: options.extractionModel,\n schema: options.graph.schema,\n chunks: graphChunks,\n instructions: options.instructions,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n conflicts: options.factConflicts,\n }),\n embedDocuments({\n model: options.embeddingModel,\n documents: graphChunks,\n id: (chunk) => chunk.id,\n content: (chunk) => chunk.text,\n metadata: (chunk) => chunk.metadata,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n }),\n ]);\n const embeddedEntities = await embedDocuments({\n model: options.embeddingModel,\n documents: [...facts.output.entities],\n id: (entity) => entity.key,\n content: options.entityText ?? defaultGraphEntityText,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n });\n const vectorDocuments = groupVectorDocuments(options.documents, embeddedChunks.documents);\n return {\n documents: options.documents.map((document) => graphDocument(document)),\n chunks: embeddedChunks.documents,\n vectorDocuments,\n entities: embeddedEntities.documents,\n relationships: facts.output.relationships,\n mentions: facts.output.mentions,\n usage: facts.usage,\n warnings: facts.warnings,\n };\n}\n\nfunction ingestionReceipt<Schema extends GraphSchemaLike>(\n prepared: PreparedGraphDocuments<Schema>,\n write: GraphWriteResult,\n revision: string | undefined,\n vectorStatus: GraphIngestionReceipt[\"vectorWrite\"][\"status\"],\n): GraphIngestionReceipt {\n return {\n documentIds: prepared.documents.map((document) => document.id),\n ...(revision === undefined ? {} : { revision }),\n entityKeys: prepared.entities.map((entity) => entity.id),\n relationshipKeys: prepared.relationships.map((relationship) => relationship.key),\n vectorDocumentIds: prepared.vectorDocuments.map((document) => document.id),\n graphWrite: { status: \"completed\", result: write },\n vectorWrite: { status: vectorStatus },\n warnings: prepared.warnings,\n };\n}\n\nfunction validatePortableMetadata(documents: readonly TextDocument<TextDocumentMetadata>[]): void {\n for (const document of documents) {\n if (document.metadata === undefined) {\n continue;\n }\n const metadata = parseGraphProperties(\n document.metadata,\n `Text document ${document.id} metadata`,\n );\n for (const [key, value] of Object.entries(metadata)) {\n if (Array.isArray(value)) {\n throw new TypeError(\n `Text document ${document.id} metadata.${key} must be a portable primitive value`,\n );\n }\n }\n }\n}\n\nfunction groupVectorDocuments(\n documents: readonly TextDocument<TextDocumentMetadata>[],\n chunks: readonly EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[],\n): readonly EmbeddedDocument<TextDocument<TextDocumentMetadata>, TextDocumentMetadata>[] {\n const chunksByDocument = new Map<\n string,\n EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[]\n >();\n for (const chunk of chunks) {\n const documentChunks = chunksByDocument.get(chunk.document.documentId);\n if (documentChunks === undefined) {\n chunksByDocument.set(chunk.document.documentId, [chunk]);\n } else {\n documentChunks.push(chunk);\n }\n }\n return documents.map((document) => {\n const documentChunks = chunksByDocument.get(document.id);\n if (documentChunks === undefined) {\n throw new TypeError(`Text document ${document.id} has no embedded graph chunks`);\n }\n const embeddedDocument: EmbeddedDocument<\n TextDocument<TextDocumentMetadata>,\n TextDocumentMetadata\n > = {\n id: document.id,\n document,\n embeddings: documentChunks.flatMap((chunk) => chunk.embeddings),\n };\n if (document.metadata !== undefined) {\n embeddedDocument.metadata = document.metadata;\n }\n return embeddedDocument;\n });\n}\n\nfunction graphDocument(document: TextDocument<TextDocumentMetadata>): GraphDocument {\n if (document.metadata === undefined) {\n return { id: document.id };\n }\n return { id: document.id, properties: document.metadata };\n}\n\nfunction graphChunk(\n chunk: TextDocumentChunk<TextDocumentMetadata>,\n): GraphChunk<TextDocumentMetadata> {\n if (chunk.metadata === undefined) {\n return {\n id: chunk.id,\n documentId: chunk.documentId,\n index: chunk.index,\n text: chunk.text,\n };\n }\n return {\n id: chunk.id,\n documentId: chunk.documentId,\n index: chunk.index,\n text: chunk.text,\n metadata: chunk.metadata,\n };\n}\n\nfunction defaultGraphEntityText(entity: GraphEntity<GraphSchemaLike>): string {\n const properties = Object.entries(entity.properties)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}: ${formatGraphProperty(value)}`)\n .join(\"\\n\");\n return properties.length === 0 ? entity.type : `${entity.type}\\n${properties}`;\n}\n\nfunction formatGraphProperty(value: GraphProperties[string]): string {\n if (Array.isArray(value)) {\n return value.join(\", \");\n }\n return String(value);\n}\n","import { createTool } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport type {\n CreateGraphSearchToolOptions,\n GraphContextRetriever,\n GraphSchemaLike,\n GraphSearchTool,\n} from \"./types.js\";\n\nconst primitive = z.union([z.string(), z.number().finite(), z.boolean()]);\nconst propertyValue = z.union([\n primitive,\n z.array(z.string()),\n z.array(z.number().finite()),\n z.array(z.boolean()),\n]);\nconst properties = z.record(z.string(), propertyValue);\nconst contextSchema = z.object({\n seeds: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n score: z.number().finite(),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n nodes: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n identity: z.record(z.string(), primitive),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n relationships: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n from: z.string(),\n to: z.string(),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n evidence: z.array(\n z.object({\n chunkId: z.string(),\n documentId: z.string(),\n index: z.number().int(),\n text: z.string(),\n metadata: properties,\n }),\n ),\n});\n\nexport function createGraphSearchTool<\n Schema extends GraphSchemaLike,\n Retriever extends GraphContextRetriever<Schema>,\n>(options: CreateGraphSearchToolOptions<Schema, Retriever>): GraphSearchTool {\n return createTool({\n name: options.name,\n description: options.description,\n inputSchema: z.object({\n query: z.string().min(1).describe(\"The question or concept to search for in the graph.\"),\n }),\n outputSchema: contextSchema,\n execute: async ({ query }, context) =>\n (await options.graph.retrieve({\n model: options.model,\n query,\n search: options.search,\n traversal: options.traversal,\n evidence: options.evidence,\n retries: options.retries,\n abortSignal: context.abortSignal,\n })) as unknown as z.input<typeof contextSchema>,\n }) as unknown as GraphSearchTool;\n}\n"],"mappings":"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","names":["z","z","properties","properties","z"]}
1
+ {"version":3,"sources":["../src/extract.ts","../src/schema.ts","../src/ingest.ts","../src/tool.ts"],"sourcesContent":["import { Usage } from \"@anvia/core\";\nimport { extract } from \"@anvia/core/extractor\";\nimport { z } from \"zod\";\nimport { parseGraphProperties, parseGraphPropertyValue } from \"./schema.js\";\nimport type {\n ExtractGraphFactsOptions,\n ExtractGraphFactsResult,\n GraphEntity,\n GraphExtractionWarning,\n GraphFactConflictCandidate,\n GraphFactConflictPolicy,\n GraphFactPropertyConflict,\n GraphFactPropertyConflictStrategy,\n GraphFacts,\n GraphMention,\n GraphNodeIdentity,\n GraphProperties,\n GraphPropertyValue,\n GraphRelationship,\n GraphSchemaLike,\n} from \"./types.js\";\n\ntype RawEntity = { ref: string; type: string; properties: Record<string, unknown> };\ntype RawRelationship = {\n type: string;\n from: string;\n to: string;\n properties: Record<string, unknown>;\n};\ntype RawChunkFacts = { entities: RawEntity[]; relationships: RawRelationship[] };\ntype ChunkExtraction = { chunkId: string; output: RawChunkFacts; usage: Usage };\ntype EntityCandidate = Readonly<{\n key: string;\n type: string;\n identity: GraphNodeIdentity;\n properties: GraphProperties;\n chunkId: string;\n}>;\ntype RelationshipCandidate = Readonly<{\n key: string;\n type: string;\n from: string;\n to: string;\n identity: GraphNodeIdentity;\n properties: GraphProperties;\n chunkId: string;\n}>;\n\nexport async function extractGraphFacts<\n Schema extends GraphSchemaLike,\n Model extends import(\"@anvia/core\").CompletionModel,\n>(options: ExtractGraphFactsOptions<Schema, Model>): Promise<ExtractGraphFactsResult<Schema>> {\n assertConcurrency(options.concurrency);\n throwIfAborted(options.abortSignal);\n const ids = new Set<string>();\n for (const chunk of options.chunks) {\n if (ids.has(chunk.id)) throw new TypeError(`Duplicate graph chunk id: ${chunk.id}`);\n ids.add(chunk.id);\n if (typeof chunk.text !== \"string\") {\n throw new TypeError(`Graph chunk ${chunk.id} text must be a string.`);\n }\n }\n\n const outputSchema = extractionSchema(options.schema);\n const instructions = graphInstructions(options.schema, options.instructions);\n const extractions = await mapConcurrent(\n options.chunks,\n options.concurrency ?? 1,\n async (chunk): Promise<ChunkExtraction> => {\n throwIfAborted(options.abortSignal);\n const result = await extract({\n model: options.model,\n text: chunk.text,\n outputSchema,\n instructions,\n retries: options.retries,\n abortSignal: options.abortSignal,\n });\n return { chunkId: chunk.id, output: result.output as RawChunkFacts, usage: result.usage };\n },\n );\n return {\n ...normalizeFacts(options.schema, extractions, options.conflicts),\n usage: extractions.reduce((usage, item) => Usage.add(usage, item.usage), Usage.empty()),\n };\n}\n\nfunction extractionSchema(schema: GraphSchemaLike): z.ZodType<RawChunkFacts> {\n const entities = Object.entries(schema.nodes).map(([type, definition]) =>\n z.object({ ref: z.string().min(1), type: z.literal(type), properties: definition.properties }),\n );\n const relationships = Object.entries(schema.relationships).map(([type, definition]) =>\n z.object({\n type: z.literal(type),\n from: z.string().min(1),\n to: z.string().min(1),\n properties: definition.properties,\n }),\n );\n return z.object({\n entities: z.array(union(entities, z.never())),\n relationships: z.array(union(relationships, z.never())),\n }) as unknown as z.ZodType<RawChunkFacts>;\n}\n\nfunction union(items: z.ZodType[], empty: z.ZodType): z.ZodType {\n if (items.length === 0) return empty;\n if (items.length === 1) return items[0] as z.ZodType;\n return z.union(items as [z.ZodType, z.ZodType, ...z.ZodType[]]);\n}\n\nfunction graphInstructions(schema: GraphSchemaLike, extra: string | undefined): string {\n const nodes = Object.entries(schema.nodes)\n .map(([type, definition]) => `- ${type}: ${definition.description}`)\n .join(\"\\n\");\n const relationships = Object.entries(schema.relationships)\n .map(\n ([type, definition]) =>\n `- ${type}: ${definition.from} -> ${definition.to}. ${definition.description}`,\n )\n .join(\"\\n\");\n return [\n \"Extract only facts directly supported by the source text.\",\n \"Give every extracted entity a unique local ref and use those refs as relationship endpoints.\",\n \"Do not invent entity or relationship types outside the declared schema.\",\n `Node types:\\n${nodes}`,\n relationships.length === 0\n ? \"No relationship types are allowed.\"\n : `Relationship types:\\n${relationships}`,\n extra,\n ]\n .filter((part): part is string => part !== undefined && part.length > 0)\n .join(\"\\n\\n\");\n}\n\nfunction normalizeFacts<Schema extends GraphSchemaLike>(\n schema: Schema,\n extractions: readonly ChunkExtraction[],\n conflicts: ExtractGraphFactsOptions<Schema, import(\"@anvia/core\").CompletionModel>[\"conflicts\"],\n): Readonly<{ output: GraphFacts<Schema>; warnings: readonly GraphExtractionWarning[] }> {\n const entityCandidates = new Map<string, EntityCandidate[]>();\n const relationshipCandidates = new Map<string, RelationshipCandidate[]>();\n const mentions = new Map<string, GraphMention>();\n\n for (const extraction of extractions) {\n const refs = new Map<string, EntityCandidate>();\n for (const raw of extraction.output.entities) {\n if (refs.has(raw.ref)) {\n throw new TypeError(`Duplicate entity ref ${raw.ref} in chunk ${extraction.chunkId}.`);\n }\n const definition = schema.nodes[raw.type];\n if (definition === undefined) throw new TypeError(`Unknown graph entity type: ${raw.type}`);\n const properties = parseGraphProperties(\n definition.properties.parse(raw.properties),\n `entity ${raw.type}`,\n );\n const identity = identityFromProperties(definition.identity, properties, raw.type);\n const key = `${raw.type}:${stableObject(identity)}`;\n const candidate: EntityCandidate = {\n key,\n type: raw.type,\n identity,\n properties,\n chunkId: extraction.chunkId,\n };\n appendCandidate(entityCandidates, key, candidate);\n refs.set(raw.ref, candidate);\n mentions.set(`${extraction.chunkId}\\u0000${key}`, {\n chunkId: extraction.chunkId,\n entityKey: key,\n });\n }\n\n for (const raw of extraction.output.relationships) {\n const definition = schema.relationships[raw.type];\n if (definition === undefined) {\n throw new TypeError(`Unknown graph relationship type: ${raw.type}`);\n }\n const from = refs.get(raw.from);\n const to = refs.get(raw.to);\n if (from === undefined || to === undefined) {\n throw new TypeError(\n `Relationship ${raw.type} in chunk ${extraction.chunkId} references an unknown entity ref.`,\n );\n }\n if (from.type !== definition.from || to.type !== definition.to) {\n throw new TypeError(\n `Relationship ${raw.type} has invalid endpoint types ${from.type} -> ${to.type}.`,\n );\n }\n const properties = parseGraphProperties(\n definition.properties.parse(raw.properties),\n `relationship ${raw.type}`,\n );\n const identity = identityFromProperties(definition.identity ?? [], properties, raw.type);\n const key = `${raw.type}:${from.key}->${to.key}:${stableObject(identity)}`;\n appendCandidate(relationshipCandidates, key, {\n key,\n type: raw.type,\n from: from.key,\n to: to.key,\n identity,\n properties,\n chunkId: extraction.chunkId,\n });\n }\n }\n const warnings: GraphExtractionWarning[] = [];\n const entities = [...entityCandidates.values()].map((candidates) => {\n const first = requiredCandidate(candidates);\n const definition = schema.nodes[first.type];\n if (definition === undefined) throw new TypeError(`Unknown graph entity type: ${first.type}`);\n const properties = parseGraphProperties(\n definition.properties.parse(\n resolveFactProperties(\n \"entity\",\n first.key,\n first.type,\n first.identity,\n candidates,\n conflicts?.entity,\n warnings,\n ),\n ),\n `entity ${first.type}`,\n );\n return {\n key: first.key,\n type: first.type,\n identity: first.identity,\n properties,\n sourceChunkIds: uniqueChunkIds(candidates),\n } as GraphEntity<Schema>;\n });\n const relationships = [...relationshipCandidates.values()].map((candidates) => {\n const first = requiredCandidate(candidates);\n const definition = schema.relationships[first.type];\n if (definition === undefined) {\n throw new TypeError(`Unknown graph relationship type: ${first.type}`);\n }\n const properties = parseGraphProperties(\n definition.properties.parse(\n resolveFactProperties(\n \"relationship\",\n first.key,\n first.type,\n first.identity,\n candidates,\n conflicts?.relationship,\n warnings,\n ),\n ),\n `relationship ${first.type}`,\n );\n return {\n key: first.key,\n type: first.type,\n from: first.from,\n to: first.to,\n properties,\n sourceChunkIds: uniqueChunkIds(candidates),\n } as GraphRelationship<Schema>;\n });\n return {\n output: { entities, relationships, mentions: [...mentions.values()] },\n warnings,\n };\n}\n\nfunction appendCandidate<Candidate>(\n candidates: Map<string, Candidate[]>,\n key: string,\n candidate: Candidate,\n): void {\n const current = candidates.get(key);\n if (current === undefined) candidates.set(key, [candidate]);\n else current.push(candidate);\n}\n\nfunction requiredCandidate<Candidate>(candidates: readonly Candidate[]): Candidate {\n const candidate = candidates[0];\n if (candidate === undefined) throw new TypeError(\"Graph fact candidate group cannot be empty.\");\n return candidate;\n}\n\nfunction uniqueChunkIds(candidates: readonly { chunkId: string }[]): readonly string[] {\n return [...new Set(candidates.map((candidate) => candidate.chunkId))];\n}\n\nfunction resolveFactProperties(\n kind: \"entity\" | \"relationship\",\n key: string,\n type: string,\n identity: GraphNodeIdentity,\n candidates: readonly { chunkId: string; properties: GraphProperties }[],\n policy: GraphFactConflictPolicy | undefined,\n warnings: GraphExtractionWarning[],\n): GraphProperties {\n const propertyNames = [\n ...new Set(candidates.flatMap((candidate) => Object.keys(candidate.properties))),\n ].sort();\n const properties: Record<string, GraphPropertyValue> = {};\n for (const property of propertyNames) {\n const propertyCandidates: GraphFactConflictCandidate[] = candidates.map((candidate) => ({\n chunkId: candidate.chunkId,\n properties: candidate.properties,\n value: candidate.properties[property],\n }));\n const firstValue = propertyCandidates[0]?.value;\n if (\n propertyCandidates.every(\n (candidate) => stableValue(candidate.value) === stableValue(firstValue),\n )\n ) {\n if (firstValue !== undefined) properties[property] = firstValue;\n continue;\n }\n const conflict: GraphFactPropertyConflict = {\n code: \"GRAPH_FACT_CONFLICT\",\n kind,\n key,\n type,\n identity,\n property,\n candidates: propertyCandidates,\n sourceChunkIds: uniqueChunkIds(propertyCandidates),\n };\n const strategy =\n policy?.properties?.[property] ?? policy?.resolve ?? policy?.default ?? \"reject\";\n if (strategy === \"reject\") throw new GraphFactConflictError(conflict);\n const resolvedValue = validateResolvedValue(\n resolvePropertyConflict(strategy, conflict),\n conflict,\n );\n if (resolvedValue !== undefined) properties[property] = resolvedValue;\n warnings.push({\n ...conflict,\n code: \"GRAPH_FACT_CONFLICT_RESOLVED\",\n strategy: typeof strategy === \"function\" ? \"custom\" : strategy,\n resolvedValue,\n });\n }\n return properties;\n}\n\nfunction resolvePropertyConflict(\n strategy: Exclude<GraphFactPropertyConflictStrategy, \"reject\">,\n conflict: GraphFactPropertyConflict,\n): GraphPropertyValue | undefined {\n if (typeof strategy === \"function\") {\n return strategy(conflict);\n }\n const values = conflict.candidates.map((candidate) => candidate.value);\n if (strategy === \"prefer-first\") return values[0];\n if (strategy === \"prefer-last\") return values.at(-1);\n if (strategy === \"prefer-defined\") return values.find((value) => value !== undefined);\n if (strategy === \"prefer-longest\") {\n const strings = definedValues(values, \"string\", conflict, strategy);\n return strings.reduce((longest, value) => (value.length > longest.length ? value : longest));\n }\n if (strategy === \"union\") {\n const arrays = values.filter((value) => value !== undefined);\n if (!arrays.every(Array.isArray)) throw incompatibleStrategy(conflict, strategy);\n return [...new Set(arrays.flat())] as string[] | number[] | boolean[];\n }\n const numbers = definedValues(values, \"number\", conflict, strategy);\n return strategy === \"max\" ? Math.max(...numbers) : Math.min(...numbers);\n}\n\nfunction definedValues<Type extends \"string\" | \"number\">(\n values: readonly (GraphPropertyValue | undefined)[],\n type: Type,\n conflict: GraphFactPropertyConflict,\n strategy: string,\n): Type extends \"string\" ? string[] : number[] {\n const defined = values.filter((value) => value !== undefined);\n if (defined.length === 0 || !defined.every((value) => typeof value === type)) {\n throw incompatibleStrategy(conflict, strategy);\n }\n return defined as Type extends \"string\" ? string[] : number[];\n}\n\nfunction validateResolvedValue(\n value: GraphPropertyValue | undefined,\n conflict: GraphFactPropertyConflict,\n): GraphPropertyValue | undefined {\n return value === undefined\n ? undefined\n : parseGraphPropertyValue(value, `Resolved graph fact ${conflict.key}.${conflict.property}`);\n}\n\nfunction incompatibleStrategy(conflict: GraphFactPropertyConflict, strategy: string): TypeError {\n return new TypeError(\n `Graph fact conflict strategy ${strategy} is incompatible with ${conflict.key}.${conflict.property}.`,\n );\n}\n\nfunction identityFromProperties(\n keys: readonly string[],\n properties: GraphProperties,\n type: string,\n): GraphNodeIdentity {\n const identity: Record<string, string | number | boolean> = {};\n for (const key of keys) {\n const value = properties[key];\n if (\n value === undefined ||\n !(typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\")\n ) {\n throw new TypeError(`Identity property ${key} for ${type} must be a primitive value.`);\n }\n identity[key] = value;\n }\n return identity;\n}\n\nfunction stableObject(value: Readonly<Record<string, unknown>>): string {\n return JSON.stringify(\n Object.fromEntries(Object.entries(value).sort(([left], [right]) => left.localeCompare(right))),\n );\n}\n\nfunction stableValue(value: unknown): string {\n return value === undefined ? \"undefined\" : stableObject({ value });\n}\n\nexport class GraphFactConflictError extends Error {\n readonly code = \"GRAPH_FACT_CONFLICT\" as const;\n readonly kind: \"entity\" | \"relationship\";\n readonly factKey: string;\n readonly type: string;\n readonly identity: GraphNodeIdentity;\n readonly property: string;\n readonly candidates: readonly GraphFactConflictCandidate[];\n readonly sourceChunkIds: readonly string[];\n\n constructor(conflict: GraphFactPropertyConflict);\n constructor(factKey: string, sourceChunkIds: readonly string[]);\n constructor(\n conflictOrKey: GraphFactPropertyConflict | string,\n legacyChunkIds: readonly string[] = [],\n ) {\n const conflict =\n typeof conflictOrKey === \"string\"\n ? {\n code: \"GRAPH_FACT_CONFLICT\" as const,\n kind: \"entity\" as const,\n key: conflictOrKey,\n type: conflictOrKey.split(\":\", 1)[0] ?? \"unknown\",\n identity: {},\n property: \"unknown\",\n candidates: [],\n sourceChunkIds: legacyChunkIds,\n }\n : conflictOrKey;\n super(\n `Conflicting graph fact ${conflict.key}.${conflict.property} was extracted from chunks ${conflict.sourceChunkIds.join(\", \")}.`,\n );\n this.name = \"GraphFactConflictError\";\n this.kind = conflict.kind;\n this.factKey = conflict.key;\n this.type = conflict.type;\n this.identity = conflict.identity;\n this.property = conflict.property;\n this.candidates = conflict.candidates;\n this.sourceChunkIds = conflict.sourceChunkIds;\n }\n}\n\nfunction assertConcurrency(value: number | undefined): void {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 1)) {\n throw new RangeError(\"Graph extraction concurrency must be a positive safe integer.\");\n }\n}\n\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return;\n if (signal.reason instanceof Error) throw signal.reason;\n throw new DOMException(\"The operation was aborted.\", \"AbortError\");\n}\n\nasync function mapConcurrent<Input, Output>(\n values: readonly Input[],\n concurrency: number,\n run: (value: Input) => Promise<Output>,\n): Promise<Output[]> {\n const output = Array<Output>(values.length);\n let cursor = 0;\n await Promise.all(\n Array.from({ length: Math.min(concurrency, values.length) }, async () => {\n for (;;) {\n const index = cursor;\n cursor += 1;\n if (index >= values.length) return;\n output[index] = await run(values[index] as Input);\n }\n }),\n );\n return output;\n}\n","import { z } from \"zod\";\nimport type {\n GraphProperties,\n GraphPropertyPrimitive,\n GraphPropertyValue,\n GraphSchema,\n GraphSchemaOptions,\n} from \"./types.js\";\n\nexport const graphReservedPropertyPrefix = \"__anvia_\";\n\nexport function defineGraphSchema<const Options extends GraphSchemaOptions>(\n options: Options,\n): GraphSchema<Options> {\n validateGraphSchemaOptions(options);\n return freezeGraphSchema(options, \"graph-schema\");\n}\n\nexport function validateGraphSchemaOptions(options: GraphSchemaOptions): void {\n if (Object.keys(options.nodes).length === 0) {\n throw new TypeError(\"A graph schema requires at least one node type.\");\n }\n for (const [type, definition] of Object.entries(options.nodes)) {\n assertGraphName(type, \"node type\");\n assertDescription(definition.description, `node ${type}`);\n if (!(definition.properties instanceof z.ZodObject)) {\n throw new TypeError(`Properties for node ${type} must be a Zod object schema.`);\n }\n assertExactPropertySchema(definition.properties, `node ${type}`);\n if (\n definition.identity.length === 0 ||\n new Set(definition.identity).size !== definition.identity.length\n ) {\n throw new TypeError(`Node ${type} must declare unique identity properties.`);\n }\n for (const property of definition.identity) {\n assertGraphPropertyName(property);\n if (!(property in definition.properties.shape)) {\n throw new TypeError(`Identity property ${property} is not declared by node ${type}.`);\n }\n }\n for (const property of Object.keys(definition.properties.shape)) {\n assertGraphPropertyName(property);\n }\n }\n for (const [type, definition] of Object.entries(options.relationships)) {\n assertGraphName(type, \"relationship type\");\n assertDescription(definition.description, `relationship ${type}`);\n if (!(definition.from in options.nodes) || !(definition.to in options.nodes)) {\n throw new TypeError(`Relationship ${type} references an unknown endpoint type.`);\n }\n if (!(definition.properties instanceof z.ZodObject)) {\n throw new TypeError(`Properties for relationship ${type} must be a Zod object schema.`);\n }\n assertExactPropertySchema(definition.properties, `relationship ${type}`);\n const identity = definition.identity ?? [];\n if (new Set(identity).size !== identity.length) {\n throw new TypeError(`Relationship ${type} contains duplicate identity properties.`);\n }\n for (const property of Object.keys(definition.properties.shape)) {\n assertGraphPropertyName(property);\n }\n for (const property of identity) {\n if (!(property in definition.properties.shape)) {\n throw new TypeError(\n `Identity property ${property} is not declared by relationship ${type}.`,\n );\n }\n }\n }\n}\n\nexport function freezeGraphSchema<\n const Options extends GraphSchemaOptions,\n const Kind extends string,\n>(options: Options, kind: Kind): Readonly<Options & { kind: Kind }> {\n const nodes = Object.fromEntries(\n Object.entries(options.nodes).map(([type, definition]) => [\n type,\n Object.freeze({ ...definition, identity: Object.freeze([...definition.identity]) }),\n ]),\n );\n const relationships = Object.fromEntries(\n Object.entries(options.relationships).map(([type, definition]) => {\n const copy = { ...definition };\n if (definition.identity !== undefined) {\n Object.assign(copy, { identity: Object.freeze([...definition.identity]) });\n }\n return [type, Object.freeze(copy)];\n }),\n );\n return Object.freeze({\n nodes: Object.freeze(nodes),\n relationships: Object.freeze(relationships),\n kind,\n }) as Readonly<Options & { kind: Kind }>;\n}\n\nexport function parseGraphProperties(value: unknown, label: string): GraphProperties {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${label} must be an object of graph property values.`);\n }\n const output: Record<string, GraphPropertyValue> = {};\n for (const [key, item] of Object.entries(value)) {\n assertGraphPropertyName(key);\n output[key] = parseGraphPropertyValue(item, `${label}.${key}`);\n }\n return output;\n}\n\nexport function parseGraphPropertyValue(value: unknown, label: string): GraphPropertyValue {\n if (typeof value === \"string\" || typeof value === \"boolean\") return value;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) throw new TypeError(`${label} must be finite.`);\n if (Number.isInteger(value) && !Number.isSafeInteger(value)) {\n throw new TypeError(`${label} must be a safe integer.`);\n }\n return value;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return [];\n const parsed = value.map((item, index) => parsePrimitive(item, `${label}[${index}]`));\n const type = typeof parsed[0];\n if (!parsed.every((item) => typeof item === type)) {\n throw new TypeError(`${label} must be a homogeneous array.`);\n }\n return parsed as GraphPropertyValue;\n }\n throw new TypeError(`${label} is not a supported graph property value.`);\n}\n\nexport function assertGraphName(value: string, label: string): void {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new TypeError(`${label} must be a non-empty string.`);\n }\n}\n\nexport function assertGraphPropertyName(value: string): void {\n assertGraphName(value, \"graph property name\");\n if (value.startsWith(graphReservedPropertyPrefix)) {\n throw new TypeError(\n `Graph property names beginning with ${graphReservedPropertyPrefix} are reserved.`,\n );\n }\n}\n\nfunction parsePrimitive(value: unknown, label: string): GraphPropertyPrimitive {\n const parsed = parseGraphPropertyValue(value, label);\n if (typeof parsed === \"string\" || typeof parsed === \"number\" || typeof parsed === \"boolean\") {\n return parsed;\n }\n throw new TypeError(`${label} must be a primitive property value.`);\n}\n\nfunction assertDescription(value: string, label: string): void {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new TypeError(`${label} requires a non-empty description.`);\n }\n}\n\nfunction assertExactPropertySchema(schema: z.ZodObject<z.ZodRawShape>, label: string): void {\n const definition = schema._zod.def;\n if (!(definition.catchall instanceof z.ZodNever)) {\n throw new TypeError(`${label} properties must use a strict Zod object schema.`);\n }\n for (const [property, propertySchema] of Object.entries(schema.shape)) {\n assertNonEffectfulSchema(propertySchema, `${label} property ${property}`, new Set());\n }\n}\n\nfunction assertNonEffectfulSchema(value: unknown, label: string, visited: Set<z.ZodType>): void {\n if (!(value instanceof z.ZodType)) throw new TypeError(`${label} must be a Zod schema.`);\n if (visited.has(value)) return;\n visited.add(value);\n const definition = value._zod.def as unknown as Record<string, unknown>;\n const type = definition.type;\n if (\n definition.coerce === true ||\n type === \"default\" ||\n type === \"prefault\" ||\n type === \"catch\" ||\n type === \"transform\" ||\n type === \"pipe\"\n ) {\n throw new TypeError(\n `${label} must not coerce, default, transform, preprocess, or catch values.`,\n );\n }\n const checks = definition.checks;\n if (\n Array.isArray(checks) &&\n checks.some((check) => {\n if (typeof check !== \"object\" || check === null) return false;\n return (check as { _zod?: { def?: { check?: unknown } } })._zod?.def?.check === \"overwrite\";\n })\n ) {\n throw new TypeError(`${label} must not normalize or overwrite values.`);\n }\n for (const child of schemaChildren(definition)) assertNonEffectfulSchema(child, label, visited);\n}\n\nfunction schemaChildren(definition: Record<string, unknown>): z.ZodType[] {\n const children: z.ZodType[] = [];\n for (const key of [\"innerType\", \"element\", \"left\", \"right\", \"rest\", \"keyType\", \"valueType\"]) {\n const value = definition[key];\n if (value instanceof z.ZodType) children.push(value);\n }\n for (const key of [\"options\", \"items\"]) {\n const value = definition[key];\n if (Array.isArray(value)) {\n for (const item of value) if (item instanceof z.ZodType) children.push(item);\n }\n }\n return children;\n}\n","import type { CompletionModel, JsonObject, RetrySetting, Usage } from \"@anvia/core\";\nimport {\n chunkTextDocuments,\n type TextDocument,\n type TextDocumentChunk,\n type TextDocumentChunkingOptions,\n type TextDocumentMetadata,\n} from \"@anvia/core/documents\";\nimport { embedDocuments, type EmbeddedDocument, type EmbeddingModel } from \"@anvia/core/embeddings\";\nimport { extractGraphFacts } from \"./extract.js\";\nimport { parseGraphProperties } from \"./schema.js\";\nimport type {\n GraphChunk,\n GraphDocument,\n GraphDocumentWriter,\n GraphEntity,\n GraphExtractionWarning,\n GraphFactConflictOptions,\n GraphMention,\n GraphOrphanEntityPolicy,\n GraphProperties,\n GraphRelationship,\n GraphSchemaLike,\n GraphWriteConflict,\n GraphWriteResult,\n} from \"./types.js\";\n\ntype GraphPreparationOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n> = Readonly<{\n graph: Readonly<{ schema: Schema }>;\n documents: readonly TextDocument<TextDocumentMetadata>[];\n extractionModel: ExtractionModel;\n embeddingModel: EmbeddingModel;\n chunking?: TextDocumentChunkingOptions | undefined;\n entityText?: ((entity: GraphEntity<Schema>) => string) | undefined;\n instructions?: string | undefined;\n retries?: RetrySetting | undefined;\n concurrency?: number | undefined;\n abortSignal?: AbortSignal | undefined;\n factConflicts?: GraphFactConflictOptions | undefined;\n revision?: string | undefined;\n}>;\n\nexport type PrepareGraphDocumentsOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = GraphPreparationOptions<Schema, ExtractionModel>;\n\nexport type IngestGraphDocumentsOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<GraphPreparationOptions<Schema, ExtractionModel>, \"graph\"> &\n Readonly<{\n graph: GraphDocumentWriter<Schema>;\n conflict: GraphWriteConflict;\n orphanEntities: GraphOrphanEntityPolicy;\n }>;\n\nexport type IngestGraphTextOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<IngestGraphDocumentsOptions<Schema, ExtractionModel>, \"documents\"> &\n Readonly<{ document: TextDocument<TextDocumentMetadata> }>;\n\nexport type PreparedGraphDocuments<Schema extends GraphSchemaLike> = Readonly<{\n documents: readonly GraphDocument[];\n chunks: readonly EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[];\n vectorDocuments: readonly EmbeddedDocument<\n TextDocument<TextDocumentMetadata>,\n TextDocumentMetadata\n >[];\n entities: readonly EmbeddedDocument<GraphEntity<Schema>>[];\n relationships: readonly GraphRelationship<Schema>[];\n mentions: readonly GraphMention[];\n usage: Usage;\n warnings: readonly GraphExtractionWarning[];\n}>;\n\nexport type IngestGraphDocumentsResult<Schema extends GraphSchemaLike> =\n PreparedGraphDocuments<Schema> &\n Readonly<{ write: GraphWriteResult; receipt: GraphIngestionReceipt }>;\n\nexport type GraphIngestionReceipt = Readonly<{\n documentIds: readonly string[];\n revision?: string | undefined;\n entityKeys: readonly string[];\n relationshipKeys: readonly string[];\n vectorDocumentIds: readonly string[];\n graphWrite: Readonly<{ status: \"completed\"; result: GraphWriteResult }>;\n vectorWrite: Readonly<{ status: \"not-requested\" | \"completed\" | \"failed\" }>;\n warnings: readonly GraphExtractionWarning[];\n}>;\n\nexport type GraphVectorWriter = Readonly<{\n upsert(options: {\n documents: Array<EmbeddedDocument<TextDocument<TextDocumentMetadata>, TextDocumentMetadata>>;\n providerOptions?: JsonObject | undefined;\n }): Promise<void>;\n}>;\n\nexport type IngestGraphDocumentsToStoresOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = IngestGraphDocumentsOptions<Schema, ExtractionModel> &\n Readonly<{\n vectorStore: GraphVectorWriter;\n vectorProviderOptions?: JsonObject | undefined;\n }>;\n\nexport type IngestGraphTextToStoresOptions<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel = CompletionModel,\n> = Omit<IngestGraphDocumentsToStoresOptions<Schema, ExtractionModel>, \"documents\"> &\n Readonly<{ document: TextDocument<TextDocumentMetadata> }>;\n\nexport class GraphIngestionStageError extends Error {\n readonly code = \"GRAPH_INGESTION_STAGE_FAILED\" as const;\n readonly stage = \"vector\" as const;\n\n constructor(\n readonly receipt: GraphIngestionReceipt,\n cause: unknown,\n ) {\n super(\"Graph ingestion completed, but the vector write failed.\", { cause });\n this.name = \"GraphIngestionStageError\";\n }\n}\n\nexport async function ingestGraphText<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphTextOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n return ingestGraphDocuments({\n graph: options.graph,\n documents: [options.document],\n extractionModel: options.extractionModel,\n embeddingModel: options.embeddingModel,\n chunking: options.chunking,\n entityText: options.entityText,\n instructions: options.instructions,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n factConflicts: options.factConflicts,\n revision: options.revision,\n conflict: options.conflict,\n orphanEntities: options.orphanEntities,\n });\n}\n\nexport async function ingestGraphDocuments<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphDocumentsOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n const prepared = await prepareGraphDocuments(options);\n const write = await options.graph.replaceDocuments({\n documents: prepared.documents,\n chunks: prepared.chunks,\n entities: prepared.entities,\n relationships: prepared.relationships,\n mentions: prepared.mentions,\n conflict: options.conflict,\n orphanEntities: options.orphanEntities,\n abortSignal: options.abortSignal,\n });\n return {\n ...prepared,\n write,\n receipt: ingestionReceipt(prepared, write, options.revision, \"not-requested\"),\n };\n}\n\nexport async function ingestGraphTextToStores<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphTextToStoresOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n return ingestGraphDocumentsToStores({ ...options, documents: [options.document] });\n}\n\nexport async function ingestGraphDocumentsToStores<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: IngestGraphDocumentsToStoresOptions<Schema, ExtractionModel>,\n): Promise<IngestGraphDocumentsResult<Schema>> {\n const result = await ingestGraphDocuments(options);\n try {\n await options.vectorStore.upsert({\n documents: [...result.vectorDocuments],\n providerOptions: options.vectorProviderOptions,\n });\n } catch (error) {\n throw new GraphIngestionStageError(\n { ...result.receipt, vectorWrite: { status: \"failed\" } },\n error,\n );\n }\n return {\n ...result,\n receipt: { ...result.receipt, vectorWrite: { status: \"completed\" } },\n };\n}\n\nexport async function prepareGraphDocuments<\n Schema extends GraphSchemaLike,\n ExtractionModel extends CompletionModel,\n>(\n options: PrepareGraphDocumentsOptions<Schema, ExtractionModel>,\n): Promise<PreparedGraphDocuments<Schema>> {\n if (options.revision !== undefined && options.revision.trim().length === 0) {\n throw new TypeError(\"Graph ingestion revision must be a non-empty string.\");\n }\n validatePortableMetadata(options.documents);\n const chunks = chunkTextDocuments({\n documents: options.documents,\n chunking: options.chunking,\n });\n const graphChunks: GraphChunk<TextDocumentMetadata>[] = chunks.map((chunk) => graphChunk(chunk));\n const [facts, embeddedChunks] = await Promise.all([\n extractGraphFacts({\n model: options.extractionModel,\n schema: options.graph.schema,\n chunks: graphChunks,\n instructions: options.instructions,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n conflicts: options.factConflicts,\n }),\n embedDocuments({\n model: options.embeddingModel,\n documents: graphChunks,\n id: (chunk) => chunk.id,\n content: (chunk) => chunk.text,\n metadata: (chunk) => chunk.metadata,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n }),\n ]);\n const embeddedEntities = await embedDocuments({\n model: options.embeddingModel,\n documents: [...facts.output.entities],\n id: (entity) => entity.key,\n content: options.entityText ?? defaultGraphEntityText,\n retries: options.retries,\n concurrency: options.concurrency,\n abortSignal: options.abortSignal,\n });\n const vectorDocuments = groupVectorDocuments(options.documents, embeddedChunks.documents);\n return {\n documents: options.documents.map((document) => graphDocument(document)),\n chunks: embeddedChunks.documents,\n vectorDocuments,\n entities: embeddedEntities.documents,\n relationships: facts.output.relationships,\n mentions: facts.output.mentions,\n usage: facts.usage,\n warnings: facts.warnings,\n };\n}\n\nfunction ingestionReceipt<Schema extends GraphSchemaLike>(\n prepared: PreparedGraphDocuments<Schema>,\n write: GraphWriteResult,\n revision: string | undefined,\n vectorStatus: GraphIngestionReceipt[\"vectorWrite\"][\"status\"],\n): GraphIngestionReceipt {\n const head: {\n documentIds: readonly string[];\n revision?: string | undefined;\n } = {\n documentIds: prepared.documents.map((document) => document.id),\n };\n if (revision !== undefined) head.revision = revision;\n return {\n ...head,\n entityKeys: prepared.entities.map((entity) => entity.id),\n relationshipKeys: prepared.relationships.map((relationship) => relationship.key),\n vectorDocumentIds: prepared.vectorDocuments.map((document) => document.id),\n graphWrite: { status: \"completed\", result: write },\n vectorWrite: { status: vectorStatus },\n warnings: prepared.warnings,\n };\n}\n\nfunction validatePortableMetadata(documents: readonly TextDocument<TextDocumentMetadata>[]): void {\n for (const document of documents) {\n if (document.metadata === undefined) {\n continue;\n }\n const metadata = parseGraphProperties(\n document.metadata,\n `Text document ${document.id} metadata`,\n );\n for (const [key, value] of Object.entries(metadata)) {\n if (Array.isArray(value)) {\n throw new TypeError(\n `Text document ${document.id} metadata.${key} must be a portable primitive value`,\n );\n }\n }\n }\n}\n\nfunction groupVectorDocuments(\n documents: readonly TextDocument<TextDocumentMetadata>[],\n chunks: readonly EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[],\n): readonly EmbeddedDocument<TextDocument<TextDocumentMetadata>, TextDocumentMetadata>[] {\n const chunksByDocument = new Map<\n string,\n EmbeddedDocument<GraphChunk<TextDocumentMetadata>, TextDocumentMetadata>[]\n >();\n for (const chunk of chunks) {\n const documentChunks = chunksByDocument.get(chunk.document.documentId);\n if (documentChunks === undefined) {\n chunksByDocument.set(chunk.document.documentId, [chunk]);\n } else {\n documentChunks.push(chunk);\n }\n }\n return documents.map((document) => {\n const documentChunks = chunksByDocument.get(document.id);\n if (documentChunks === undefined) {\n throw new TypeError(`Text document ${document.id} has no embedded graph chunks`);\n }\n const embeddedDocument: EmbeddedDocument<\n TextDocument<TextDocumentMetadata>,\n TextDocumentMetadata\n > = {\n id: document.id,\n document,\n embeddings: documentChunks.flatMap((chunk) => chunk.embeddings),\n };\n if (document.metadata !== undefined) {\n embeddedDocument.metadata = document.metadata;\n }\n return embeddedDocument;\n });\n}\n\nfunction graphDocument(document: TextDocument<TextDocumentMetadata>): GraphDocument {\n if (document.metadata === undefined) {\n return { id: document.id };\n }\n return { id: document.id, properties: document.metadata };\n}\n\nfunction graphChunk(\n chunk: TextDocumentChunk<TextDocumentMetadata>,\n): GraphChunk<TextDocumentMetadata> {\n if (chunk.metadata === undefined) {\n return {\n id: chunk.id,\n documentId: chunk.documentId,\n index: chunk.index,\n text: chunk.text,\n };\n }\n return {\n id: chunk.id,\n documentId: chunk.documentId,\n index: chunk.index,\n text: chunk.text,\n metadata: chunk.metadata,\n };\n}\n\nfunction defaultGraphEntityText(entity: GraphEntity<GraphSchemaLike>): string {\n const properties = Object.entries(entity.properties)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => `${key}: ${formatGraphProperty(value)}`)\n .join(\"\\n\");\n return properties.length === 0 ? entity.type : `${entity.type}\\n${properties}`;\n}\n\nfunction formatGraphProperty(value: GraphProperties[string]): string {\n if (Array.isArray(value)) {\n return value.join(\", \");\n }\n return String(value);\n}\n","import { createTool } from \"@anvia/core/tool\";\nimport { z } from \"zod\";\nimport type {\n CreateGraphSearchToolOptions,\n GraphContextRetriever,\n GraphSchemaLike,\n GraphSearchTool,\n} from \"./types.js\";\n\nconst primitive = z.union([z.string(), z.number().finite(), z.boolean()]);\nconst propertyValue = z.union([\n primitive,\n z.array(z.string()),\n z.array(z.number().finite()),\n z.array(z.boolean()),\n]);\nconst properties = z.record(z.string(), propertyValue);\nconst contextSchema = z.object({\n seeds: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n score: z.number().finite(),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n nodes: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n identity: z.record(z.string(), primitive),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n relationships: z.array(\n z.object({\n key: z.string(),\n type: z.string(),\n from: z.string(),\n to: z.string(),\n properties,\n sourceChunkIds: z.array(z.string()),\n }),\n ),\n evidence: z.array(\n z.object({\n chunkId: z.string(),\n documentId: z.string(),\n index: z.number().int(),\n text: z.string(),\n metadata: properties,\n }),\n ),\n});\n\nexport function createGraphSearchTool<\n Schema extends GraphSchemaLike,\n Retriever extends GraphContextRetriever<Schema>,\n>(options: CreateGraphSearchToolOptions<Schema, Retriever>): GraphSearchTool {\n return createTool({\n name: options.name,\n description: options.description,\n inputSchema: z.object({\n query: z.string().min(1).describe(\"The question or concept to search for in the graph.\"),\n }),\n outputSchema: contextSchema,\n execute: async ({ query }, context) =>\n (await options.graph.retrieve({\n model: options.model,\n query,\n search: options.search,\n traversal: options.traversal,\n evidence: options.evidence,\n retries: options.retries,\n abortSignal: context.abortSignal,\n })) as unknown as z.input<typeof contextSchema>,\n }) as unknown as GraphSearchTool;\n}\n"],"mappings":"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","names":["z","z","properties","properties","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/graph",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "Provider-neutral knowledge graph primitives for Anvia.",
5
5
  "author": "anvia",
6
6
  "license": "MIT",
@@ -32,13 +32,13 @@
32
32
  "@types/node": "^24.9.1",
33
33
  "tsup": "^8.5.0",
34
34
  "typescript": "^5.9.3",
35
- "vitest": "^4.0.8",
36
- "zod": "^4.5.4",
37
- "@anvia/core": "1.2.0"
35
+ "vitest": "^4.1.11",
36
+ "zod": "^4.6.5",
37
+ "@anvia/core": "1.6.1"
38
38
  },
39
39
  "peerDependencies": {
40
- "zod": "^4.4.0",
41
- "@anvia/core": "^1.2.0"
40
+ "zod": "^4.6.5",
41
+ "@anvia/core": "^1.6.1"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsup src/index.ts src/explore.ts --format esm --dts --sourcemap --clean",