kg-extract 0.1.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/README.md ADDED
@@ -0,0 +1,84 @@
1
+ # kg-extract
2
+
3
+ Extract entity-relationship triples from text and build knowledge graphs. Caller provides the LLM function — zero external runtime dependencies.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install kg-extract
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```typescript
14
+ import { extract, buildGraph, createExtractor } from 'kg-extract'
15
+
16
+ // Any function that calls an LLM — OpenAI, Anthropic, local, etc.
17
+ const llm = async (prompt: string) => {
18
+ const res = await openai.chat.completions.create({
19
+ model: 'gpt-4o-mini',
20
+ messages: [{ role: 'user', content: prompt }],
21
+ })
22
+ return res.choices[0].message.content ?? ''
23
+ }
24
+
25
+ // One-shot extraction
26
+ const result = await extract('Alice founded Acme Corp in 2010 in San Francisco.', { llm })
27
+ console.log(result.entities) // [{ name: 'Alice', type: 'Person' }, ...]
28
+ console.log(result.triples) // [{ subject: 'Alice', predicate: 'founded', object: 'Acme Corp', confidence: 0.9 }]
29
+
30
+ // Build a graph from one or more passages
31
+ const kg = await buildGraph(
32
+ ['Alice founded Acme Corp.', 'Acme Corp is headquartered in San Francisco.'],
33
+ { llm }
34
+ )
35
+
36
+ // Graph queries
37
+ const aliceTriples = kg.query('Alice') // all triples where Alice is subject
38
+ const acmeRelations = kg.getRelationships('Acme Corp', 'both')
39
+ const path = kg.findPath('Alice', 'San Francisco')
40
+ const neighbors = kg.getNeighbors('Acme Corp', 1)
41
+ const stats = kg.stats()
42
+ ```
43
+
44
+ ## createExtractor
45
+
46
+ Bind a shared config once and reuse:
47
+
48
+ ```typescript
49
+ const extractor = createExtractor({ llm, minConfidence: 0.5, entityTypes: ['Person', 'Organization'] })
50
+
51
+ const result = await extractor.extract('Some text')
52
+ const kg = await extractor.buildGraph(['Passage one.', 'Passage two.'])
53
+ ```
54
+
55
+ ## KnowledgeGraph API
56
+
57
+ | Method | Description |
58
+ |--------|-------------|
59
+ | `addEntity(entity)` | Add an entity node |
60
+ | `addTriple(triple)` | Add a triple (auto-creates missing nodes) |
61
+ | `getEntity(name)` | Look up entity by name (case-insensitive) |
62
+ | `query(subject?, predicate?, object?)` | Filter triples by any combination |
63
+ | `getRelationships(name, direction?)` | Get outgoing / incoming / both triples |
64
+ | `getNeighbors(name, depth?)` | BFS neighbor entities |
65
+ | `findPath(from, to, options?)` | BFS path as triple array, or null |
66
+ | `getEntitiesByType(type)` | Filter entities by type |
67
+ | `stats()` | Node/edge counts, degree, top predicates |
68
+ | `merge(other)` | Combine another graph in-place |
69
+ | `toJSON()` | Serialize to plain object |
70
+ | `KnowledgeGraph.fromJSON(json)` | Deserialize |
71
+
72
+ ## Options
73
+
74
+ | Option | Default | Description |
75
+ |--------|---------|-------------|
76
+ | `llm` | required | `(prompt: string) => Promise<string>` or messages variant |
77
+ | `entityTypes` | standard set | Entity types to extract |
78
+ | `maxPassageTokens` | `1500` | Max tokens per passage (approx 4 chars/token) |
79
+ | `minConfidence` | `0.3` | Minimum triple confidence threshold |
80
+ | `resolution.enabled` | `true` | Enable 3-phase entity deduplication |
81
+
82
+ ## License
83
+
84
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kg-extract.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg-extract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/kg-extract.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const parser_js_1 = require("../parser.js");
5
+ const resolution_js_1 = require("../resolution.js");
6
+ const graph_js_1 = require("../graph.js");
7
+ const extract_js_1 = require("../extract.js");
8
+ // ---------------------------------------------------------------------------
9
+ // parseEntities
10
+ // ---------------------------------------------------------------------------
11
+ (0, vitest_1.describe)('parseEntities', () => {
12
+ (0, vitest_1.it)('parses valid ENTITY lines', () => {
13
+ const output = 'ENTITY: Alice | Person |\nENTITY: Acme Corp | Organization |';
14
+ const entities = (0, parser_js_1.parseEntities)(output);
15
+ (0, vitest_1.expect)(entities).toHaveLength(2);
16
+ (0, vitest_1.expect)(entities[0]).toMatchObject({ name: 'Alice', type: 'Person', aliases: [] });
17
+ (0, vitest_1.expect)(entities[1]).toMatchObject({ name: 'Acme Corp', type: 'Organization', aliases: [] });
18
+ });
19
+ (0, vitest_1.it)('parses aliases when present', () => {
20
+ const output = 'ENTITY: International Business Machines | Organization | IBM, Big Blue';
21
+ const entities = (0, parser_js_1.parseEntities)(output);
22
+ (0, vitest_1.expect)(entities[0].aliases).toEqual(['IBM', 'Big Blue']);
23
+ });
24
+ (0, vitest_1.it)('ignores lines that do not start with ENTITY:', () => {
25
+ const output = 'Some random text\nENTITY: Bob | Person |\nAnother line';
26
+ const entities = (0, parser_js_1.parseEntities)(output);
27
+ (0, vitest_1.expect)(entities).toHaveLength(1);
28
+ (0, vitest_1.expect)(entities[0].name).toBe('Bob');
29
+ });
30
+ (0, vitest_1.it)('returns empty array for empty output', () => {
31
+ (0, vitest_1.expect)((0, parser_js_1.parseEntities)('')).toEqual([]);
32
+ });
33
+ });
34
+ // ---------------------------------------------------------------------------
35
+ // parseTriples
36
+ // ---------------------------------------------------------------------------
37
+ (0, vitest_1.describe)('parseTriples', () => {
38
+ (0, vitest_1.it)('parses valid TRIPLE lines', () => {
39
+ const output = 'TRIPLE: Alice | works_at | Acme Corp | 0.9';
40
+ const triples = (0, parser_js_1.parseTriples)(output, 0.3);
41
+ (0, vitest_1.expect)(triples).toHaveLength(1);
42
+ (0, vitest_1.expect)(triples[0]).toMatchObject({
43
+ subject: 'Alice',
44
+ predicate: 'works_at',
45
+ object: 'Acme Corp',
46
+ confidence: 0.9,
47
+ });
48
+ });
49
+ (0, vitest_1.it)('normalises predicate to snake_case lowercase', () => {
50
+ const output = 'TRIPLE: Alice | Works At | Acme Corp | 0.8';
51
+ const triples = (0, parser_js_1.parseTriples)(output, 0.3);
52
+ (0, vitest_1.expect)(triples[0].predicate).toBe('works_at');
53
+ });
54
+ (0, vitest_1.it)('filters triples below minConfidence', () => {
55
+ const output = 'TRIPLE: Alice | works_at | Acme Corp | 0.2\nTRIPLE: Alice | founded | Acme Corp | 0.9';
56
+ const triples = (0, parser_js_1.parseTriples)(output, 0.3);
57
+ (0, vitest_1.expect)(triples).toHaveLength(1);
58
+ (0, vitest_1.expect)(triples[0].predicate).toBe('founded');
59
+ });
60
+ (0, vitest_1.it)('ignores lines that do not start with TRIPLE:', () => {
61
+ const output = 'Random\nTRIPLE: A | b | C | 0.7';
62
+ (0, vitest_1.expect)((0, parser_js_1.parseTriples)(output, 0.0)).toHaveLength(1);
63
+ });
64
+ (0, vitest_1.it)('returns empty array for empty output', () => {
65
+ (0, vitest_1.expect)((0, parser_js_1.parseTriples)('', 0.3)).toEqual([]);
66
+ });
67
+ });
68
+ // ---------------------------------------------------------------------------
69
+ // resolveEntities
70
+ // ---------------------------------------------------------------------------
71
+ (0, vitest_1.describe)('resolveEntities', () => {
72
+ (0, vitest_1.it)('merges case-insensitive duplicates', () => {
73
+ const entities = [
74
+ { name: 'Alice', type: 'Person' },
75
+ { name: 'alice', type: 'Person' },
76
+ ];
77
+ const { resolved, mergeMap } = (0, resolution_js_1.resolveEntities)(entities);
78
+ (0, vitest_1.expect)(resolved).toHaveLength(1);
79
+ (0, vitest_1.expect)(mergeMap.get('alice')).toBe('Alice');
80
+ });
81
+ (0, vitest_1.it)('keeps distinct entities intact', () => {
82
+ const entities = [
83
+ { name: 'Alice', type: 'Person' },
84
+ { name: 'Bob', type: 'Person' },
85
+ ];
86
+ const { resolved } = (0, resolution_js_1.resolveEntities)(entities);
87
+ (0, vitest_1.expect)(resolved).toHaveLength(2);
88
+ });
89
+ (0, vitest_1.it)('merges via alias matching', () => {
90
+ const entities = [
91
+ { name: 'International Business Machines', type: 'Organization', aliases: ['IBM'] },
92
+ { name: 'IBM', type: 'Organization', aliases: [] },
93
+ ];
94
+ const { resolved, mergeMap } = (0, resolution_js_1.resolveEntities)(entities);
95
+ // IBM is aliased under International Business Machines, so only one canonical entity
96
+ (0, vitest_1.expect)(mergeMap.size).toBeGreaterThanOrEqual(1);
97
+ // The merged canonical list should not include both as independent entries
98
+ const names = resolved.map(e => e.name);
99
+ (0, vitest_1.expect)(names).not.toContain('IBM'); // IBM merged into International Business Machines
100
+ });
101
+ });
102
+ // ---------------------------------------------------------------------------
103
+ // KnowledgeGraph
104
+ // ---------------------------------------------------------------------------
105
+ (0, vitest_1.describe)('KnowledgeGraph', () => {
106
+ let kg;
107
+ (0, vitest_1.beforeEach)(() => {
108
+ kg = new graph_js_1.KnowledgeGraph();
109
+ });
110
+ (0, vitest_1.it)('addEntity / getEntity round-trip', () => {
111
+ kg.addEntity({ name: 'Alice', type: 'Person' });
112
+ (0, vitest_1.expect)(kg.getEntity('Alice')).toMatchObject({ name: 'Alice', type: 'Person' });
113
+ (0, vitest_1.expect)(kg.getEntity('alice')).toMatchObject({ name: 'Alice', type: 'Person' });
114
+ (0, vitest_1.expect)(kg.getEntity('nobody')).toBeUndefined();
115
+ });
116
+ (0, vitest_1.it)('addTriple auto-creates missing entity nodes', () => {
117
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
118
+ (0, vitest_1.expect)(kg.getEntity('Alice')).toBeDefined();
119
+ (0, vitest_1.expect)(kg.getEntity('Acme Corp')).toBeDefined();
120
+ });
121
+ (0, vitest_1.it)('query filters by subject', () => {
122
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
123
+ kg.addTriple({ subject: 'Bob', predicate: 'works_at', object: 'Acme Corp', confidence: 0.8 });
124
+ const results = kg.query('Alice');
125
+ (0, vitest_1.expect)(results).toHaveLength(1);
126
+ (0, vitest_1.expect)(results[0].subject).toBe('Alice');
127
+ });
128
+ (0, vitest_1.it)('query filters by predicate', () => {
129
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
130
+ kg.addTriple({ subject: 'Alice', predicate: 'founded', object: 'StartupX', confidence: 0.7 });
131
+ (0, vitest_1.expect)(kg.query(undefined, 'works_at')).toHaveLength(1);
132
+ (0, vitest_1.expect)(kg.query(undefined, 'founded')).toHaveLength(1);
133
+ });
134
+ (0, vitest_1.it)('query filters by object', () => {
135
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
136
+ kg.addTriple({ subject: 'Bob', predicate: 'works_at', object: 'OtherCo', confidence: 0.8 });
137
+ (0, vitest_1.expect)(kg.query(undefined, undefined, 'Acme Corp')).toHaveLength(1);
138
+ });
139
+ (0, vitest_1.it)('getRelationships returns correct triples', () => {
140
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
141
+ kg.addTriple({ subject: 'Bob', predicate: 'manages', object: 'Alice', confidence: 0.8 });
142
+ const outgoing = kg.getRelationships('Alice', 'outgoing');
143
+ (0, vitest_1.expect)(outgoing).toHaveLength(1);
144
+ (0, vitest_1.expect)(outgoing[0].predicate).toBe('works_at');
145
+ const incoming = kg.getRelationships('Alice', 'incoming');
146
+ (0, vitest_1.expect)(incoming).toHaveLength(1);
147
+ (0, vitest_1.expect)(incoming[0].predicate).toBe('manages');
148
+ const both = kg.getRelationships('Alice', 'both');
149
+ (0, vitest_1.expect)(both).toHaveLength(2);
150
+ });
151
+ (0, vitest_1.it)('getRelationships returns empty array for unknown entity', () => {
152
+ (0, vitest_1.expect)(kg.getRelationships('nobody')).toEqual([]);
153
+ });
154
+ (0, vitest_1.it)('findPath finds BFS path between two nodes', () => {
155
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
156
+ kg.addTriple({ subject: 'Acme Corp', predicate: 'located_in', object: 'New York', confidence: 0.85 });
157
+ const path = kg.findPath('Alice', 'New York');
158
+ (0, vitest_1.expect)(path).not.toBeNull();
159
+ (0, vitest_1.expect)(path).toHaveLength(2);
160
+ (0, vitest_1.expect)(path[0].predicate).toBe('works_at');
161
+ (0, vitest_1.expect)(path[1].predicate).toBe('located_in');
162
+ });
163
+ (0, vitest_1.it)('findPath returns null when no path exists', () => {
164
+ kg.addEntity({ name: 'Alice', type: 'Person' });
165
+ kg.addEntity({ name: 'Bob', type: 'Person' });
166
+ (0, vitest_1.expect)(kg.findPath('Alice', 'Bob')).toBeNull();
167
+ });
168
+ (0, vitest_1.it)('findPath returns empty array for same-node query', () => {
169
+ kg.addEntity({ name: 'Alice', type: 'Person' });
170
+ (0, vitest_1.expect)(kg.findPath('Alice', 'Alice')).toEqual([]);
171
+ });
172
+ (0, vitest_1.it)('stats() returns correct counts', () => {
173
+ kg.addEntity({ name: 'Alice', type: 'Person' });
174
+ kg.addEntity({ name: 'Acme Corp', type: 'Organization' });
175
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
176
+ const s = kg.stats();
177
+ (0, vitest_1.expect)(s.nodeCount).toBe(2);
178
+ (0, vitest_1.expect)(s.edgeCount).toBe(1);
179
+ (0, vitest_1.expect)(s.entityTypes['Person']).toBe(1);
180
+ (0, vitest_1.expect)(s.entityTypes['Organization']).toBe(1);
181
+ (0, vitest_1.expect)(s.predicates['works_at']).toBe(1);
182
+ (0, vitest_1.expect)(s.avgDegree).toBe(1); // (1 triple * 2) / 2 nodes
183
+ (0, vitest_1.expect)(s.maxDegree).toBe(1);
184
+ (0, vitest_1.expect)(['Alice', 'Acme Corp']).toContain(s.mostConnected);
185
+ });
186
+ (0, vitest_1.it)('toJSON / fromJSON round-trip', () => {
187
+ kg.addEntity({ name: 'Alice', type: 'Person', aliases: ['Al'], properties: { age: 30 } });
188
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
189
+ const json = kg.toJSON();
190
+ (0, vitest_1.expect)(json.metadata.entityCount).toBe(2);
191
+ (0, vitest_1.expect)(json.metadata.tripleCount).toBe(1);
192
+ const kg2 = graph_js_1.KnowledgeGraph.fromJSON(json);
193
+ (0, vitest_1.expect)(kg2.getEntity('Alice')).toMatchObject({ name: 'Alice', type: 'Person' });
194
+ (0, vitest_1.expect)(kg2.query('Alice', 'works_at')).toHaveLength(1);
195
+ });
196
+ (0, vitest_1.it)('getEntitiesByType filters correctly', () => {
197
+ kg.addEntity({ name: 'Alice', type: 'Person' });
198
+ kg.addEntity({ name: 'Bob', type: 'Person' });
199
+ kg.addEntity({ name: 'Acme Corp', type: 'Organization' });
200
+ (0, vitest_1.expect)(kg.getEntitiesByType('Person')).toHaveLength(2);
201
+ (0, vitest_1.expect)(kg.getEntitiesByType('Organization')).toHaveLength(1);
202
+ (0, vitest_1.expect)(kg.getEntitiesByType('Location')).toHaveLength(0);
203
+ });
204
+ (0, vitest_1.it)('merge() combines two graphs', () => {
205
+ kg.addEntity({ name: 'Alice', type: 'Person' });
206
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
207
+ const kg2 = new graph_js_1.KnowledgeGraph();
208
+ kg2.addEntity({ name: 'Bob', type: 'Person' });
209
+ kg2.addTriple({ subject: 'Bob', predicate: 'works_at', object: 'Acme Corp', confidence: 0.8 });
210
+ kg.merge(kg2);
211
+ (0, vitest_1.expect)(kg.stats().nodeCount).toBe(3);
212
+ (0, vitest_1.expect)(kg.stats().edgeCount).toBe(2);
213
+ });
214
+ (0, vitest_1.it)('getNeighbors returns neighbors at depth 1', () => {
215
+ kg.addTriple({ subject: 'Alice', predicate: 'works_at', object: 'Acme Corp', confidence: 0.9 });
216
+ kg.addTriple({ subject: 'Alice', predicate: 'knows', object: 'Bob', confidence: 0.7 });
217
+ const neighbors = kg.getNeighbors('Alice', 1);
218
+ const names = neighbors.map(e => e.name);
219
+ (0, vitest_1.expect)(names).toContain('Acme Corp');
220
+ (0, vitest_1.expect)(names).toContain('Bob');
221
+ (0, vitest_1.expect)(names).not.toContain('Alice');
222
+ });
223
+ });
224
+ // ---------------------------------------------------------------------------
225
+ // extract()
226
+ // ---------------------------------------------------------------------------
227
+ (0, vitest_1.describe)('extract()', () => {
228
+ (0, vitest_1.it)('calls LLM and returns entities + triples', async () => {
229
+ const mockLLM = vitest_1.vi.fn()
230
+ .mockResolvedValueOnce('ENTITY: Alice | Person |\nENTITY: Acme Corp | Organization |')
231
+ .mockResolvedValueOnce('TRIPLE: Alice | works_at | Acme Corp | 0.9');
232
+ const result = await (0, extract_js_1.extract)('Alice works at Acme Corp.', { llm: mockLLM });
233
+ (0, vitest_1.expect)(result.entities).toHaveLength(2);
234
+ (0, vitest_1.expect)(result.triples).toHaveLength(1);
235
+ (0, vitest_1.expect)(result.llmCalls).toBe(2);
236
+ (0, vitest_1.expect)(result.llmDurationMs).toBeGreaterThanOrEqual(0);
237
+ (0, vitest_1.expect)(result.warnings).toEqual([]);
238
+ (0, vitest_1.expect)(result.text).toBe('Alice works at Acme Corp.');
239
+ });
240
+ (0, vitest_1.it)('skips triple call when no entities extracted', async () => {
241
+ const mockLLM = vitest_1.vi.fn().mockResolvedValueOnce('');
242
+ const result = await (0, extract_js_1.extract)('Nothing here.', { llm: mockLLM });
243
+ (0, vitest_1.expect)(result.entities).toHaveLength(0);
244
+ (0, vitest_1.expect)(result.triples).toHaveLength(0);
245
+ (0, vitest_1.expect)(mockLLM).toHaveBeenCalledTimes(1);
246
+ });
247
+ (0, vitest_1.it)('respects minConfidence threshold', async () => {
248
+ const mockLLM = vitest_1.vi.fn()
249
+ .mockResolvedValueOnce('ENTITY: Alice | Person |\nENTITY: Acme Corp | Organization |')
250
+ .mockResolvedValueOnce('TRIPLE: Alice | works_at | Acme Corp | 0.2\nTRIPLE: Alice | founded | Acme Corp | 0.9');
251
+ const result = await (0, extract_js_1.extract)('Alice works at Acme Corp.', { llm: mockLLM, minConfidence: 0.5 });
252
+ (0, vitest_1.expect)(result.triples).toHaveLength(1);
253
+ (0, vitest_1.expect)(result.triples[0].predicate).toBe('founded');
254
+ });
255
+ (0, vitest_1.it)('passes custom entityTypes to prompt', async () => {
256
+ const mockLLM = vitest_1.vi.fn().mockResolvedValueOnce('');
257
+ await (0, extract_js_1.extract)('text', { llm: mockLLM, entityTypes: ['Animal', 'Plant'] });
258
+ (0, vitest_1.expect)(mockLLM.mock.calls[0][0]).toContain('Animal, Plant');
259
+ });
260
+ });
261
+ // ---------------------------------------------------------------------------
262
+ // buildGraph()
263
+ // ---------------------------------------------------------------------------
264
+ (0, vitest_1.describe)('buildGraph()', () => {
265
+ (0, vitest_1.it)('builds a graph from a single text passage', async () => {
266
+ const mockLLM = vitest_1.vi.fn()
267
+ .mockResolvedValueOnce('ENTITY: Alice | Person |\nENTITY: Acme Corp | Organization |')
268
+ .mockResolvedValueOnce('TRIPLE: Alice | works_at | Acme Corp | 0.9');
269
+ const kg = await (0, extract_js_1.buildGraph)('Alice works at Acme Corp.', { llm: mockLLM });
270
+ (0, vitest_1.expect)(kg.getEntity('Alice')).toBeDefined();
271
+ (0, vitest_1.expect)(kg.getEntity('Acme Corp')).toBeDefined();
272
+ (0, vitest_1.expect)(kg.query('Alice', 'works_at')).toHaveLength(1);
273
+ });
274
+ (0, vitest_1.it)('builds a graph from multiple text passages', async () => {
275
+ const mockLLM = vitest_1.vi.fn()
276
+ .mockResolvedValueOnce('ENTITY: Alice | Person |')
277
+ .mockResolvedValueOnce('') // no triples from passage 1
278
+ .mockResolvedValueOnce('ENTITY: Acme Corp | Organization |')
279
+ .mockResolvedValueOnce(''); // no triples from passage 2
280
+ const kg = await (0, extract_js_1.buildGraph)(['Alice is a person.', 'Acme Corp is a company.'], { llm: mockLLM });
281
+ (0, vitest_1.expect)(kg.getEntity('Alice')).toBeDefined();
282
+ (0, vitest_1.expect)(kg.getEntity('Acme Corp')).toBeDefined();
283
+ });
284
+ (0, vitest_1.it)('performs entity resolution by default', async () => {
285
+ const mockLLM = vitest_1.vi.fn()
286
+ .mockResolvedValueOnce('ENTITY: Alice | Person |\nENTITY: alice | Person |')
287
+ .mockResolvedValueOnce('TRIPLE: Alice | same_as | alice | 0.9');
288
+ const kg = await (0, extract_js_1.buildGraph)('Alice and alice are the same.', { llm: mockLLM });
289
+ // After resolution, only one Alice entity should exist
290
+ const aliceEntities = kg.getEntitiesByType('Person');
291
+ (0, vitest_1.expect)(aliceEntities).toHaveLength(1);
292
+ });
293
+ });
294
+ //# sourceMappingURL=kg-extract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kg-extract.test.js","sourceRoot":"","sources":["../../src/__tests__/kg-extract.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ExtractOptions, BuildGraphOptions, ExtractorConfig, Extractor, ExtractionResult } from './types.js';
2
+ import { KnowledgeGraph } from './graph.js';
3
+ export declare function extract(text: string, options: ExtractOptions): Promise<ExtractionResult>;
4
+ export declare function buildGraph(texts: string | string[], options: BuildGraphOptions): Promise<KnowledgeGraph>;
5
+ export declare function createExtractor(config: ExtractorConfig): Extractor;
6
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAU,MAAM,YAAY,CAAA;AAI/J,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AA2B3C,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+B9F;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAOlE"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extract = extract;
4
+ exports.buildGraph = buildGraph;
5
+ exports.createExtractor = createExtractor;
6
+ const prompts_js_1 = require("./prompts.js");
7
+ const parser_js_1 = require("./parser.js");
8
+ const resolution_js_1 = require("./resolution.js");
9
+ const graph_js_1 = require("./graph.js");
10
+ async function callLLM(llm, prompt) {
11
+ if (typeof llm === 'function' && llm.length <= 1) {
12
+ return llm(prompt);
13
+ }
14
+ return llm([{ role: 'user', content: prompt }]);
15
+ }
16
+ function splitPassages(text, maxTokens) {
17
+ const approxChars = maxTokens * 4;
18
+ if (text.length <= approxChars)
19
+ return [text];
20
+ const sentences = text.match(/[^.!?]+[.!?]+/g) ?? [text];
21
+ const passages = [];
22
+ let current = '';
23
+ for (const s of sentences) {
24
+ if ((current + s).length > approxChars && current) {
25
+ passages.push(current.trim());
26
+ current = s;
27
+ }
28
+ else {
29
+ current += s;
30
+ }
31
+ }
32
+ if (current.trim())
33
+ passages.push(current.trim());
34
+ return passages;
35
+ }
36
+ async function extract(text, options) {
37
+ const start = Date.now();
38
+ const passages = splitPassages(text, options.maxPassageTokens ?? 1500);
39
+ const minConfidence = options.minConfidence ?? 0.3;
40
+ let llmCalls = 0;
41
+ const allEntities = [];
42
+ const allTriples = [];
43
+ for (const passage of passages) {
44
+ const entityOutput = await callLLM(options.llm, (0, prompts_js_1.entityExtractionPrompt)(passage, options.entityTypes));
45
+ llmCalls++;
46
+ const entities = (0, parser_js_1.parseEntities)(entityOutput);
47
+ allEntities.push(...entities);
48
+ if (entities.length > 0) {
49
+ const tripleOutput = await callLLM(options.llm, (0, prompts_js_1.relationshipExtractionPrompt)(passage, entities));
50
+ llmCalls++;
51
+ allTriples.push(...(0, parser_js_1.parseTriples)(tripleOutput, minConfidence).map(t => ({ ...t, sourceText: passage })));
52
+ }
53
+ }
54
+ return {
55
+ entities: allEntities,
56
+ triples: allTriples,
57
+ llmCalls,
58
+ llmDurationMs: Date.now() - start,
59
+ warnings: [],
60
+ text,
61
+ };
62
+ }
63
+ async function buildGraph(texts, options) {
64
+ const textArr = Array.isArray(texts) ? texts : [texts];
65
+ const kg = new graph_js_1.KnowledgeGraph();
66
+ for (const text of textArr) {
67
+ const result = await extract(text, options);
68
+ const { resolved, mergeMap } = options.resolution?.enabled !== false
69
+ ? (0, resolution_js_1.resolveEntities)(result.entities)
70
+ : { resolved: result.entities, mergeMap: new Map() };
71
+ const resolvedTriples = (0, resolution_js_1.resolveTriples)(result.triples, mergeMap);
72
+ for (const e of resolved)
73
+ kg.addEntity(e);
74
+ for (const t of resolvedTriples)
75
+ kg.addTriple(t);
76
+ }
77
+ return kg;
78
+ }
79
+ function createExtractor(config) {
80
+ return {
81
+ extract: (text, overrides) => extract(text, { ...config, ...overrides, llm: overrides?.llm ?? config.llm }),
82
+ buildGraph: (texts, overrides) => buildGraph(texts, { ...config, ...overrides, llm: overrides?.llm ?? config.llm }),
83
+ };
84
+ }
85
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Entity, Triple, GraphStats, GraphJSON } from './types.js';
2
+ export declare class KnowledgeGraph {
3
+ private entityMap;
4
+ private _triples;
5
+ addEntity(entity: Entity): void;
6
+ addTriple(triple: Triple): void;
7
+ getEntity(name: string): Entity | undefined;
8
+ query(subject?: string, predicate?: string, object?: string): Triple[];
9
+ getRelationships(name: string, direction?: 'outgoing' | 'incoming' | 'both'): Triple[];
10
+ getNeighbors(name: string, depth?: number): Entity[];
11
+ findPath(from: string, to: string, options?: {
12
+ maxDepth?: number;
13
+ }): Triple[] | null;
14
+ entities(): Iterable<Entity>;
15
+ triples(): Iterable<Triple>;
16
+ getEntitiesByType(type: string): Entity[];
17
+ stats(): GraphStats;
18
+ merge(other: KnowledgeGraph): void;
19
+ toJSON(): GraphJSON;
20
+ static fromJSON(json: GraphJSON): KnowledgeGraph;
21
+ }
22
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAQvE,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAe;IAE/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAO/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAa/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAQtE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,UAAU,GAAG,UAAU,GAAG,MAAe,GAAG,MAAM,EAAE;IAQ9F,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE;IAuB/C,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,EAAE,GAAG,IAAI;IAoBnF,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC;IAI5B,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC;IAI5B,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAIzC,KAAK,IAAI,UAAU;IAsBnB,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAKlC,MAAM,IAAI,SAAS;IAiBnB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc;CAMjD"}
package/dist/graph.js ADDED
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeGraph = void 0;
4
+ class KnowledgeGraph {
5
+ entityMap = new Map();
6
+ _triples = [];
7
+ addEntity(entity) {
8
+ const key = entity.name.toLowerCase();
9
+ if (!this.entityMap.has(key)) {
10
+ this.entityMap.set(key, { entity, outgoing: [], incoming: [] });
11
+ }
12
+ }
13
+ addTriple(triple) {
14
+ this._triples.push(triple);
15
+ // Ensure entities exist
16
+ if (!this.entityMap.has(triple.subject.toLowerCase())) {
17
+ this.addEntity({ name: triple.subject, type: 'unknown' });
18
+ }
19
+ if (!this.entityMap.has(triple.object.toLowerCase())) {
20
+ this.addEntity({ name: triple.object, type: 'unknown' });
21
+ }
22
+ this.entityMap.get(triple.subject.toLowerCase())?.outgoing.push(triple);
23
+ this.entityMap.get(triple.object.toLowerCase())?.incoming.push(triple);
24
+ }
25
+ getEntity(name) {
26
+ return this.entityMap.get(name.toLowerCase())?.entity;
27
+ }
28
+ query(subject, predicate, object) {
29
+ return this._triples.filter(t => (!subject || t.subject.toLowerCase() === subject.toLowerCase()) &&
30
+ (!predicate || t.predicate === predicate) &&
31
+ (!object || t.object.toLowerCase() === object.toLowerCase()));
32
+ }
33
+ getRelationships(name, direction = 'both') {
34
+ const node = this.entityMap.get(name.toLowerCase());
35
+ if (!node)
36
+ return [];
37
+ if (direction === 'outgoing')
38
+ return [...node.outgoing];
39
+ if (direction === 'incoming')
40
+ return [...node.incoming];
41
+ return [...node.outgoing, ...node.incoming];
42
+ }
43
+ getNeighbors(name, depth = 1) {
44
+ const visited = new Set();
45
+ const result = [];
46
+ const queue = [{ name: name.toLowerCase(), d: 0 }];
47
+ while (queue.length > 0) {
48
+ const { name: n, d } = queue.shift();
49
+ if (visited.has(n) || d > depth)
50
+ continue;
51
+ visited.add(n);
52
+ if (d > 0) {
53
+ const e = this.entityMap.get(n)?.entity;
54
+ if (e)
55
+ result.push(e);
56
+ }
57
+ const node = this.entityMap.get(n);
58
+ if (node) {
59
+ for (const t of [...node.outgoing, ...node.incoming]) {
60
+ const next = t.subject.toLowerCase() === n ? t.object.toLowerCase() : t.subject.toLowerCase();
61
+ if (!visited.has(next))
62
+ queue.push({ name: next, d: d + 1 });
63
+ }
64
+ }
65
+ }
66
+ return result;
67
+ }
68
+ findPath(from, to, options) {
69
+ const maxDepth = options?.maxDepth ?? 5;
70
+ const fromKey = from.toLowerCase(), toKey = to.toLowerCase();
71
+ const queue = [{ key: fromKey, path: [] }];
72
+ const visited = new Set();
73
+ while (queue.length > 0) {
74
+ const { key, path } = queue.shift();
75
+ if (key === toKey)
76
+ return path;
77
+ if (visited.has(key) || path.length >= maxDepth)
78
+ continue;
79
+ visited.add(key);
80
+ const node = this.entityMap.get(key);
81
+ if (node) {
82
+ for (const t of node.outgoing) {
83
+ queue.push({ key: t.object.toLowerCase(), path: [...path, t] });
84
+ }
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ *entities() {
90
+ for (const { entity } of this.entityMap.values())
91
+ yield entity;
92
+ }
93
+ *triples() {
94
+ yield* this._triples;
95
+ }
96
+ getEntitiesByType(type) {
97
+ return [...this.entities()].filter(e => e.type.toLowerCase() === type.toLowerCase());
98
+ }
99
+ stats() {
100
+ const entityTypes = {};
101
+ const predicates = {};
102
+ let maxDegree = 0, mostConnected = '';
103
+ for (const { entity, outgoing, incoming } of this.entityMap.values()) {
104
+ entityTypes[entity.type] = (entityTypes[entity.type] ?? 0) + 1;
105
+ const deg = outgoing.length + incoming.length;
106
+ if (deg > maxDegree) {
107
+ maxDegree = deg;
108
+ mostConnected = entity.name;
109
+ }
110
+ }
111
+ for (const t of this._triples)
112
+ predicates[t.predicate] = (predicates[t.predicate] ?? 0) + 1;
113
+ const avgDegree = this.entityMap.size > 0 ? (this._triples.length * 2) / this.entityMap.size : 0;
114
+ return {
115
+ nodeCount: this.entityMap.size,
116
+ edgeCount: this._triples.length,
117
+ avgDegree,
118
+ maxDegree,
119
+ mostConnected,
120
+ entityTypes,
121
+ predicates,
122
+ };
123
+ }
124
+ merge(other) {
125
+ for (const e of other.entities())
126
+ this.addEntity(e);
127
+ for (const t of other.triples())
128
+ this.addTriple(t);
129
+ }
130
+ toJSON() {
131
+ return {
132
+ entities: [...this.entities()].map(e => ({
133
+ name: e.name,
134
+ type: e.type,
135
+ aliases: e.aliases ?? [],
136
+ properties: e.properties ?? {},
137
+ })),
138
+ triples: this._triples,
139
+ metadata: {
140
+ createdAt: new Date().toISOString(),
141
+ entityCount: this.entityMap.size,
142
+ tripleCount: this._triples.length,
143
+ },
144
+ };
145
+ }
146
+ static fromJSON(json) {
147
+ const kg = new KnowledgeGraph();
148
+ for (const e of json.entities)
149
+ kg.addEntity(e);
150
+ for (const t of json.triples)
151
+ kg.addTriple(t);
152
+ return kg;
153
+ }
154
+ }
155
+ exports.KnowledgeGraph = KnowledgeGraph;
156
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../src/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { extract, buildGraph, createExtractor } from './extract.js';
2
+ export { KnowledgeGraph } from './graph.js';
3
+ export type { Entity, EntityType, Triple, ExtractionResult, LLM, LLMFunction, LLMMessage, LLMMessageFunction, ExtractOptions, BuildGraphOptions, ExtractorConfig, Extractor, GraphStats, GraphJSON, } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,YAAY,EACV,MAAM,EACN,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,GAAG,EACH,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,UAAU,EACV,SAAS,GACV,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeGraph = exports.createExtractor = exports.buildGraph = exports.extract = void 0;
4
+ // kg-extract - Extract entity-relationship triples and build knowledge graphs
5
+ var extract_js_1 = require("./extract.js");
6
+ Object.defineProperty(exports, "extract", { enumerable: true, get: function () { return extract_js_1.extract; } });
7
+ Object.defineProperty(exports, "buildGraph", { enumerable: true, get: function () { return extract_js_1.buildGraph; } });
8
+ Object.defineProperty(exports, "createExtractor", { enumerable: true, get: function () { return extract_js_1.createExtractor; } });
9
+ var graph_js_1 = require("./graph.js");
10
+ Object.defineProperty(exports, "KnowledgeGraph", { enumerable: true, get: function () { return graph_js_1.KnowledgeGraph; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,8EAA8E;AAC9E,2CAAmE;AAA1D,qGAAA,OAAO,OAAA;AAAE,wGAAA,UAAU,OAAA;AAAE,6GAAA,eAAe,OAAA;AAC7C,uCAA2C;AAAlC,0GAAA,cAAc,OAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Entity, Triple } from './types.js';
2
+ export declare function parseEntities(llmOutput: string): Entity[];
3
+ export declare function parseTriples(llmOutput: string, minConfidence: number): Triple[];
4
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEhD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAUzD;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB/E"}
package/dist/parser.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseEntities = parseEntities;
4
+ exports.parseTriples = parseTriples;
5
+ function parseEntities(llmOutput) {
6
+ const entities = [];
7
+ for (const line of llmOutput.split('\n')) {
8
+ const match = line.match(/^ENTITY:\s*([^|]+?)\s*\|\s*([^|]+?)(?:\s*\|\s*(.+?))?\s*\|?\s*$/);
9
+ if (!match)
10
+ continue;
11
+ const [, name, type, aliasStr] = match;
12
+ const aliases = aliasStr ? aliasStr.split(',').map(a => a.trim()).filter(Boolean) : [];
13
+ if (name && type)
14
+ entities.push({ name: name.trim(), type: type.trim(), aliases });
15
+ }
16
+ return entities;
17
+ }
18
+ function parseTriples(llmOutput, minConfidence) {
19
+ const triples = [];
20
+ for (const line of llmOutput.split('\n')) {
21
+ const match = line.match(/^TRIPLE:\s*(.+?)\s*\|\s*(.+?)\s*\|\s*(.+?)\s*\|\s*([0-9.]+)\s*$/);
22
+ if (!match)
23
+ continue;
24
+ const [, subject, predicate, object, confStr] = match;
25
+ const confidence = parseFloat(confStr);
26
+ if (isNaN(confidence) || confidence < minConfidence)
27
+ continue;
28
+ if (subject && predicate && object) {
29
+ triples.push({
30
+ subject: subject.trim(),
31
+ predicate: predicate.trim().replace(/\s+/g, '_').toLowerCase(),
32
+ object: object.trim(),
33
+ confidence,
34
+ });
35
+ }
36
+ }
37
+ return triples;
38
+ }
39
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":";;AAEA,sCAUC;AAED,oCAkBC;AA9BD,SAAgB,aAAa,CAAC,SAAiB;IAC7C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;QAC3F,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAA;QACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACtF,IAAI,IAAI,IAAI,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAgB,YAAY,CAAC,SAAiB,EAAE,aAAqB;IACnE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAA;QAC3F,IAAI,CAAC,KAAK;YAAE,SAAQ;QACpB,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAA;QACrD,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,aAAa;YAAE,SAAQ;QAC7D,IAAI,OAAO,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvB,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;gBAC9D,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;gBACrB,UAAU;aACX,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Entity } from './types.js';
2
+ export declare function entityExtractionPrompt(passage: string, entityTypes?: string[]): string;
3
+ export declare function relationshipExtractionPrompt(passage: string, entities: Entity[]): string;
4
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYtF;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAcxF"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entityExtractionPrompt = entityExtractionPrompt;
4
+ exports.relationshipExtractionPrompt = relationshipExtractionPrompt;
5
+ function entityExtractionPrompt(passage, entityTypes) {
6
+ const types = entityTypes?.join(', ') ?? 'Person, Organization, Location, Date, Event, Concept, Product';
7
+ return `Extract all named entities from the text below. For each entity, output one line:
8
+ ENTITY: <name> | <type> | <aliases if any, comma separated>
9
+
10
+ Entity types to look for: ${types}
11
+ Only include types from the list above. Skip pronouns and generic nouns.
12
+
13
+ Text:
14
+ ${passage}
15
+
16
+ Entities (one per line):`;
17
+ }
18
+ function relationshipExtractionPrompt(passage, entities) {
19
+ const entityList = entities.map(e => `- ${e.name} (${e.type})`).join('\n');
20
+ return `Given these entities:
21
+ ${entityList}
22
+
23
+ Extract relationships between them from the text below. Output one per line:
24
+ TRIPLE: <subject> | <predicate> | <object> | <confidence 0.0-1.0>
25
+
26
+ Use short, specific predicates (e.g., "founded", "works_at", "located_in", "acquired").
27
+
28
+ Text:
29
+ ${passage}
30
+
31
+ Triples (one per line):`;
32
+ }
33
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":";;AAEA,wDAYC;AAED,oEAcC;AA5BD,SAAgB,sBAAsB,CAAC,OAAe,EAAE,WAAsB;IAC5E,MAAM,KAAK,GAAG,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,+DAA+D,CAAA;IACxG,OAAO;;;4BAGmB,KAAK;;;;EAI/B,OAAO;;yBAEgB,CAAA;AACzB,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAe,EAAE,QAAkB;IAC9E,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1E,OAAO;EACP,UAAU;;;;;;;;EAQV,OAAO;;wBAEe,CAAA;AACxB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Entity, Triple } from './types.js';
2
+ export declare function resolveEntities(entities: Entity[]): {
3
+ resolved: Entity[];
4
+ mergeMap: Map<string, string>;
5
+ };
6
+ export declare function resolveTriples(triples: Triple[], mergeMap: Map<string, string>): Triple[];
7
+ //# sourceMappingURL=resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution.d.ts","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAEhD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA4CzG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAMzF"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveEntities = resolveEntities;
4
+ exports.resolveTriples = resolveTriples;
5
+ function resolveEntities(entities) {
6
+ const mergeMap = new Map(); // alias → canonical name
7
+ const canonical = [];
8
+ // Phase 1: Exact name matching (case-insensitive)
9
+ const byNormalizedName = new Map();
10
+ for (const e of entities) {
11
+ const key = e.name.toLowerCase().trim();
12
+ if (!byNormalizedName.has(key)) {
13
+ byNormalizedName.set(key, e);
14
+ canonical.push(e);
15
+ }
16
+ else {
17
+ const existing = byNormalizedName.get(key);
18
+ mergeMap.set(e.name, existing.name);
19
+ existing.aliases = [...new Set([...(existing.aliases ?? []), e.name, ...(e.aliases ?? [])])];
20
+ }
21
+ }
22
+ // Phase 2: Alias-based merging
23
+ for (const e of canonical) {
24
+ for (const alias of e.aliases ?? []) {
25
+ const key = alias.toLowerCase().trim();
26
+ const other = byNormalizedName.get(key);
27
+ if (other && other !== e) {
28
+ mergeMap.set(other.name, e.name);
29
+ e.aliases = [...new Set([...(e.aliases ?? []), ...(other.aliases ?? [])])];
30
+ }
31
+ }
32
+ }
33
+ // Phase 3: Substring matching (if one entity name contains another, length >= 5)
34
+ for (let i = 0; i < canonical.length; i++) {
35
+ for (let j = i + 1; j < canonical.length; j++) {
36
+ const a = canonical[i], b = canonical[j];
37
+ const aLower = a.name.toLowerCase(), bLower = b.name.toLowerCase();
38
+ if (aLower.length >= 5 && bLower.includes(aLower)) {
39
+ mergeMap.set(b.name, a.name);
40
+ }
41
+ else if (bLower.length >= 5 && aLower.includes(bLower)) {
42
+ mergeMap.set(a.name, b.name);
43
+ }
44
+ }
45
+ }
46
+ return { resolved: canonical.filter(e => !mergeMap.has(e.name)), mergeMap };
47
+ }
48
+ function resolveTriples(triples, mergeMap) {
49
+ return triples.map(t => ({
50
+ ...t,
51
+ subject: mergeMap.get(t.subject) ?? t.subject,
52
+ object: mergeMap.get(t.object) ?? t.object,
53
+ }));
54
+ }
55
+ //# sourceMappingURL=resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":";;AAEA,0CA4CC;AAED,wCAMC;AApDD,SAAgB,eAAe,CAAC,QAAkB;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA,CAAC,yBAAyB;IACpE,MAAM,SAAS,GAAa,EAAE,CAAA;IAE9B,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAA;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;QACvC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YAC3C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAA;YACnC,QAAQ,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9F,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;YACtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACvC,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;gBAChC,CAAC,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YACxC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;YAClE,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAA;AAC7E,CAAC;AAED,SAAgB,cAAc,CAAC,OAAiB,EAAE,QAA6B;IAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,GAAG,CAAC;QACJ,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO;QAC7C,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM;KAC3C,CAAC,CAAC,CAAA;AACL,CAAC"}
@@ -0,0 +1,73 @@
1
+ export type EntityType = 'Person' | 'Organization' | 'Location' | 'Date' | 'Event' | 'Concept' | 'Product' | string;
2
+ export interface Entity {
3
+ name: string;
4
+ type: EntityType;
5
+ aliases?: string[];
6
+ properties?: Record<string, unknown>;
7
+ }
8
+ export interface Triple {
9
+ subject: string;
10
+ predicate: string;
11
+ object: string;
12
+ confidence: number;
13
+ sourceText?: string;
14
+ }
15
+ export interface ExtractionResult {
16
+ entities: Entity[];
17
+ triples: Triple[];
18
+ llmCalls: number;
19
+ llmDurationMs: number;
20
+ warnings: string[];
21
+ text: string;
22
+ }
23
+ export type LLMFunction = (prompt: string) => Promise<string>;
24
+ export interface LLMMessage {
25
+ role: 'system' | 'user' | 'assistant';
26
+ content: string;
27
+ }
28
+ export type LLMMessageFunction = (messages: LLMMessage[]) => Promise<string>;
29
+ export type LLM = LLMFunction | LLMMessageFunction;
30
+ export interface ExtractOptions {
31
+ llm: LLM;
32
+ entityTypes?: string[];
33
+ maxPassageTokens?: number;
34
+ minConfidence?: number;
35
+ structuredOutput?: boolean;
36
+ }
37
+ export interface BuildGraphOptions extends ExtractOptions {
38
+ resolution?: {
39
+ enabled?: boolean;
40
+ };
41
+ }
42
+ export interface ExtractorConfig extends Partial<ExtractOptions> {
43
+ llm: LLM;
44
+ }
45
+ export interface Extractor {
46
+ extract(text: string, overrides?: Partial<ExtractOptions>): Promise<ExtractionResult>;
47
+ buildGraph(texts: string | string[], overrides?: Partial<BuildGraphOptions>): Promise<KnowledgeGraph>;
48
+ }
49
+ export interface GraphStats {
50
+ nodeCount: number;
51
+ edgeCount: number;
52
+ avgDegree: number;
53
+ maxDegree: number;
54
+ mostConnected: string;
55
+ entityTypes: Record<string, number>;
56
+ predicates: Record<string, number>;
57
+ }
58
+ export interface GraphJSON {
59
+ entities: Array<{
60
+ name: string;
61
+ type: string;
62
+ aliases: string[];
63
+ properties: Record<string, unknown>;
64
+ }>;
65
+ triples: Triple[];
66
+ metadata: {
67
+ createdAt: string;
68
+ entityCount: number;
69
+ tripleCount: number;
70
+ };
71
+ }
72
+ export type KnowledgeGraph = any;
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;AAEnH,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAC7D,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACtF,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAC5E,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG,kBAAkB,CAAA;AAElD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,GAAG,CAAA;IACR,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD,UAAU,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;CACnC;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,cAAc,CAAC;IAAG,GAAG,EAAE,GAAG,CAAA;CAAE;AAE7E,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrF,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACtG;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IACvG,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1E;AAID,MAAM,MAAM,cAAc,GAAG,GAAG,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "kg-extract",
3
+ "version": "0.1.0",
4
+ "description": "Extract entity-relationship triples and build knowledge graphs",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "vitest run",
13
+ "lint": "eslint src/",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [],
17
+ "author": "",
18
+ "license": "MIT",
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^25.5.0",
27
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
28
+ "@typescript-eslint/parser": "^8.57.1",
29
+ "eslint": "^10.1.0",
30
+ "typescript": "^5.9.3",
31
+ "vitest": "^4.1.0"
32
+ }
33
+ }