@centerseedwu/naru-agent 0.2.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 +392 -0
- package/dist/agent.d.ts +39 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +578 -0
- package/dist/agent.js.map +1 -0
- package/dist/compression/base.d.ts +12 -0
- package/dist/compression/base.d.ts.map +1 -0
- package/dist/compression/base.js +2 -0
- package/dist/compression/base.js.map +1 -0
- package/dist/compression/compressor.d.ts +20 -0
- package/dist/compression/compressor.d.ts.map +1 -0
- package/dist/compression/compressor.js +52 -0
- package/dist/compression/compressor.js.map +1 -0
- package/dist/compression/in-memory-store.d.ts +8 -0
- package/dist/compression/in-memory-store.d.ts.map +1 -0
- package/dist/compression/in-memory-store.js +13 -0
- package/dist/compression/in-memory-store.js.map +1 -0
- package/dist/decision/index.d.ts +7 -0
- package/dist/decision/index.d.ts.map +1 -0
- package/dist/decision/index.js +4 -0
- package/dist/decision/index.js.map +1 -0
- package/dist/decision/llm-structured-classifier.d.ts +18 -0
- package/dist/decision/llm-structured-classifier.d.ts.map +1 -0
- package/dist/decision/llm-structured-classifier.js +44 -0
- package/dist/decision/llm-structured-classifier.js.map +1 -0
- package/dist/decision/tool-planner.d.ts +14 -0
- package/dist/decision/tool-planner.d.ts.map +1 -0
- package/dist/decision/tool-planner.js +35 -0
- package/dist/decision/tool-planner.js.map +1 -0
- package/dist/decision/types.d.ts +53 -0
- package/dist/decision/types.d.ts.map +1 -0
- package/dist/decision/types.js +12 -0
- package/dist/decision/types.js.map +1 -0
- package/dist/event-bus.d.ts +10 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +34 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/guardrails/base.d.ts +10 -0
- package/dist/guardrails/base.d.ts.map +1 -0
- package/dist/guardrails/base.js +2 -0
- package/dist/guardrails/base.js.map +1 -0
- package/dist/guardrails/keyword.d.ts +15 -0
- package/dist/guardrails/keyword.d.ts.map +1 -0
- package/dist/guardrails/keyword.js +37 -0
- package/dist/guardrails/keyword.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/base.d.ts +19 -0
- package/dist/intent/base.d.ts.map +1 -0
- package/dist/intent/base.js +2 -0
- package/dist/intent/base.js.map +1 -0
- package/dist/intent/llm-classifier.d.ts +22 -0
- package/dist/intent/llm-classifier.d.ts.map +1 -0
- package/dist/intent/llm-classifier.js +49 -0
- package/dist/intent/llm-classifier.js.map +1 -0
- package/dist/intent/tool-calling-classifier.d.ts +16 -0
- package/dist/intent/tool-calling-classifier.d.ts.map +1 -0
- package/dist/intent/tool-calling-classifier.js +56 -0
- package/dist/intent/tool-calling-classifier.js.map +1 -0
- package/dist/knowledge/base.d.ts +14 -0
- package/dist/knowledge/base.d.ts.map +1 -0
- package/dist/knowledge/base.js +10 -0
- package/dist/knowledge/base.js.map +1 -0
- package/dist/knowledge/chroma-store.d.ts +25 -0
- package/dist/knowledge/chroma-store.d.ts.map +1 -0
- package/dist/knowledge/chroma-store.js +70 -0
- package/dist/knowledge/chroma-store.js.map +1 -0
- package/dist/knowledge/contextualizer.d.ts +17 -0
- package/dist/knowledge/contextualizer.d.ts.map +1 -0
- package/dist/knowledge/contextualizer.js +47 -0
- package/dist/knowledge/contextualizer.js.map +1 -0
- package/dist/knowledge/graph-store.d.ts +22 -0
- package/dist/knowledge/graph-store.d.ts.map +1 -0
- package/dist/knowledge/graph-store.js +116 -0
- package/dist/knowledge/graph-store.js.map +1 -0
- package/dist/knowledge/hybrid-store.d.ts +16 -0
- package/dist/knowledge/hybrid-store.d.ts.map +1 -0
- package/dist/knowledge/hybrid-store.js +39 -0
- package/dist/knowledge/hybrid-store.js.map +1 -0
- package/dist/knowledge/in-memory-store.d.ts +27 -0
- package/dist/knowledge/in-memory-store.d.ts.map +1 -0
- package/dist/knowledge/in-memory-store.js +54 -0
- package/dist/knowledge/in-memory-store.js.map +1 -0
- package/dist/knowledge/pgvector-store.d.ts +27 -0
- package/dist/knowledge/pgvector-store.d.ts.map +1 -0
- package/dist/knowledge/pgvector-store.js +68 -0
- package/dist/knowledge/pgvector-store.js.map +1 -0
- package/dist/memory/base.d.ts +21 -0
- package/dist/memory/base.d.ts.map +1 -0
- package/dist/memory/base.js +9 -0
- package/dist/memory/base.js.map +1 -0
- package/dist/memory/in-memory-store.d.ts +10 -0
- package/dist/memory/in-memory-store.d.ts.map +1 -0
- package/dist/memory/in-memory-store.js +35 -0
- package/dist/memory/in-memory-store.js.map +1 -0
- package/dist/memory/manager.d.ts +29 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +121 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/mem0-manager.d.ts +32 -0
- package/dist/memory/mem0-manager.d.ts.map +1 -0
- package/dist/memory/mem0-manager.js +77 -0
- package/dist/memory/mem0-manager.js.map +1 -0
- package/dist/memory/pgvector-store.d.ts +22 -0
- package/dist/memory/pgvector-store.d.ts.map +1 -0
- package/dist/memory/pgvector-store.js +89 -0
- package/dist/memory/pgvector-store.js.map +1 -0
- package/dist/orchestration/channel.d.ts +18 -0
- package/dist/orchestration/channel.d.ts.map +1 -0
- package/dist/orchestration/channel.js +2 -0
- package/dist/orchestration/channel.js.map +1 -0
- package/dist/orchestration/executor.d.ts +19 -0
- package/dist/orchestration/executor.d.ts.map +1 -0
- package/dist/orchestration/executor.js +2 -0
- package/dist/orchestration/executor.js.map +1 -0
- package/dist/orchestration/index.d.ts +13 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +9 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/intent.d.ts +49 -0
- package/dist/orchestration/intent.d.ts.map +1 -0
- package/dist/orchestration/intent.js +57 -0
- package/dist/orchestration/intent.js.map +1 -0
- package/dist/orchestration/orchestrator.d.ts +59 -0
- package/dist/orchestration/orchestrator.d.ts.map +1 -0
- package/dist/orchestration/orchestrator.js +216 -0
- package/dist/orchestration/orchestrator.js.map +1 -0
- package/dist/orchestration/pending.d.ts +28 -0
- package/dist/orchestration/pending.d.ts.map +1 -0
- package/dist/orchestration/pending.js +32 -0
- package/dist/orchestration/pending.js.map +1 -0
- package/dist/orchestration/result.d.ts +24 -0
- package/dist/orchestration/result.d.ts.map +1 -0
- package/dist/orchestration/result.js +2 -0
- package/dist/orchestration/result.js.map +1 -0
- package/dist/orchestration/session-state.d.ts +24 -0
- package/dist/orchestration/session-state.d.ts.map +1 -0
- package/dist/orchestration/session-state.js +19 -0
- package/dist/orchestration/session-state.js.map +1 -0
- package/dist/orchestration/trace.d.ts +20 -0
- package/dist/orchestration/trace.d.ts.map +1 -0
- package/dist/orchestration/trace.js +2 -0
- package/dist/orchestration/trace.js.map +1 -0
- package/dist/session/base.d.ts +7 -0
- package/dist/session/base.d.ts.map +1 -0
- package/dist/session/base.js +2 -0
- package/dist/session/base.js.map +1 -0
- package/dist/session/in-memory-store.d.ts +9 -0
- package/dist/session/in-memory-store.d.ts.map +1 -0
- package/dist/session/in-memory-store.js +13 -0
- package/dist/session/in-memory-store.js.map +1 -0
- package/dist/session/redis-store.d.ts +16 -0
- package/dist/session/redis-store.d.ts.map +1 -0
- package/dist/session/redis-store.js +29 -0
- package/dist/session/redis-store.js.map +1 -0
- package/dist/skills/base.d.ts +38 -0
- package/dist/skills/base.d.ts.map +1 -0
- package/dist/skills/base.js +24 -0
- package/dist/skills/base.js.map +1 -0
- package/dist/skills/registry.d.ts +11 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +37 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/selectors.d.ts +23 -0
- package/dist/skills/selectors.d.ts.map +1 -0
- package/dist/skills/selectors.js +52 -0
- package/dist/skills/selectors.js.map +1 -0
- package/dist/tools/base.d.ts +34 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +22 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/vercel-adapter.d.ts +17 -0
- package/dist/tools/vercel-adapter.d.ts.map +1 -0
- package/dist/tools/vercel-adapter.js +66 -0
- package/dist/tools/vercel-adapter.js.map +1 -0
- package/dist/tracing/collector.d.ts +16 -0
- package/dist/tracing/collector.d.ts.map +1 -0
- package/dist/tracing/collector.js +92 -0
- package/dist/tracing/collector.js.map +1 -0
- package/dist/tracing/exporters/jsonl.d.ts +13 -0
- package/dist/tracing/exporters/jsonl.d.ts.map +1 -0
- package/dist/tracing/exporters/jsonl.js +14 -0
- package/dist/tracing/exporters/jsonl.js.map +1 -0
- package/dist/tracing/trace.d.ts +34 -0
- package/dist/tracing/trace.d.ts.map +1 -0
- package/dist/tracing/trace.js +28 -0
- package/dist/tracing/trace.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/math.d.ts +3 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +14 -0
- package/dist/utils/math.js.map +1 -0
- package/dist-cjs/agent.js +581 -0
- package/dist-cjs/compression/base.js +2 -0
- package/dist-cjs/compression/compressor.js +55 -0
- package/dist-cjs/compression/in-memory-store.js +16 -0
- package/dist-cjs/decision/index.js +9 -0
- package/dist-cjs/decision/llm-structured-classifier.js +47 -0
- package/dist-cjs/decision/tool-planner.js +38 -0
- package/dist-cjs/decision/types.js +15 -0
- package/dist-cjs/event-bus.js +37 -0
- package/dist-cjs/guardrails/base.js +2 -0
- package/dist-cjs/guardrails/keyword.js +40 -0
- package/dist-cjs/index.js +84 -0
- package/dist-cjs/intent/base.js +2 -0
- package/dist-cjs/intent/llm-classifier.js +52 -0
- package/dist-cjs/intent/tool-calling-classifier.js +59 -0
- package/dist-cjs/knowledge/base.js +12 -0
- package/dist-cjs/knowledge/chroma-store.js +106 -0
- package/dist-cjs/knowledge/contextualizer.js +50 -0
- package/dist-cjs/knowledge/graph-store.js +152 -0
- package/dist-cjs/knowledge/hybrid-store.js +42 -0
- package/dist-cjs/knowledge/in-memory-store.js +57 -0
- package/dist-cjs/knowledge/pgvector-store.js +71 -0
- package/dist-cjs/memory/base.js +11 -0
- package/dist-cjs/memory/in-memory-store.js +38 -0
- package/dist-cjs/memory/manager.js +124 -0
- package/dist-cjs/memory/mem0-manager.js +113 -0
- package/dist-cjs/memory/pgvector-store.js +92 -0
- package/dist-cjs/orchestration/channel.js +2 -0
- package/dist-cjs/orchestration/executor.js +2 -0
- package/dist-cjs/orchestration/index.js +17 -0
- package/dist-cjs/orchestration/intent.js +61 -0
- package/dist-cjs/orchestration/orchestrator.js +219 -0
- package/dist-cjs/orchestration/pending.js +36 -0
- package/dist-cjs/orchestration/result.js +2 -0
- package/dist-cjs/orchestration/session-state.js +22 -0
- package/dist-cjs/orchestration/trace.js +2 -0
- package/dist-cjs/session/base.js +2 -0
- package/dist-cjs/session/in-memory-store.js +16 -0
- package/dist-cjs/session/redis-store.js +32 -0
- package/dist-cjs/skills/base.js +27 -0
- package/dist-cjs/skills/registry.js +40 -0
- package/dist-cjs/skills/selectors.js +56 -0
- package/dist-cjs/tools/base.js +24 -0
- package/dist-cjs/tools/vercel-adapter.js +69 -0
- package/dist-cjs/tracing/collector.js +95 -0
- package/dist-cjs/tracing/exporters/jsonl.js +17 -0
- package/dist-cjs/tracing/trace.js +31 -0
- package/dist-cjs/types.js +9 -0
- package/dist-cjs/utils/math.js +17 -0
- package/package.json +70 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type LanguageModel } from "ai";
|
|
2
|
+
import type { BaseIntentClassifier } from "./base.js";
|
|
3
|
+
import type { IntentResult } from "../types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fast LLM-based intent classifier using 2-char codes:
|
|
6
|
+
* YY = needs knowledge + needs tools
|
|
7
|
+
* YN = needs knowledge, no tools
|
|
8
|
+
* NY = no knowledge, needs tools
|
|
9
|
+
* NN = neither
|
|
10
|
+
*/
|
|
11
|
+
export declare class LLMIntentClassifier implements BaseIntentClassifier {
|
|
12
|
+
private model;
|
|
13
|
+
private examples;
|
|
14
|
+
private maxTokens;
|
|
15
|
+
constructor(config: {
|
|
16
|
+
model: LanguageModel;
|
|
17
|
+
examples?: Array<[string, string]>;
|
|
18
|
+
maxTokens?: number;
|
|
19
|
+
});
|
|
20
|
+
classify(message: string): Promise<IntentResult>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=llm-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-classifier.d.ts","sourceRoot":"","sources":["../../src/intent/llm-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;GAMG;AACH,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE;QAClB,KAAK,EAAE,aAAa,CAAC;QACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAMK,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;CAgCvD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { generateText } from "ai";
|
|
2
|
+
/**
|
|
3
|
+
* Fast LLM-based intent classifier using 2-char codes:
|
|
4
|
+
* YY = needs knowledge + needs tools
|
|
5
|
+
* YN = needs knowledge, no tools
|
|
6
|
+
* NY = no knowledge, needs tools
|
|
7
|
+
* NN = neither
|
|
8
|
+
*/
|
|
9
|
+
export class LLMIntentClassifier {
|
|
10
|
+
model;
|
|
11
|
+
examples;
|
|
12
|
+
maxTokens;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.model = config.model;
|
|
15
|
+
this.examples = config.examples ?? [];
|
|
16
|
+
this.maxTokens = config.maxTokens ?? 30;
|
|
17
|
+
}
|
|
18
|
+
async classify(message) {
|
|
19
|
+
const examplesStr = this.examples
|
|
20
|
+
.map(([msg, code]) => `User: ${msg}\nCode: ${code}`)
|
|
21
|
+
.join("\n");
|
|
22
|
+
const system = [
|
|
23
|
+
"Classify user intent with a 2-character code.",
|
|
24
|
+
"First char: Y if the query needs knowledge/RAG retrieval, N if not.",
|
|
25
|
+
"Second char: Y if the query needs tool calls, N if not.",
|
|
26
|
+
"Reply ONLY with the 2-char code (YY, YN, NY, or NN).",
|
|
27
|
+
examplesStr ? `\nExamples:\n${examplesStr}` : "",
|
|
28
|
+
].join("\n");
|
|
29
|
+
try {
|
|
30
|
+
const result = await generateText({
|
|
31
|
+
model: this.model,
|
|
32
|
+
system,
|
|
33
|
+
prompt: message,
|
|
34
|
+
maxOutputTokens: this.maxTokens,
|
|
35
|
+
});
|
|
36
|
+
const raw = result.text.trim().toUpperCase().slice(0, 2);
|
|
37
|
+
return {
|
|
38
|
+
needsKnowledge: raw[0] !== "N",
|
|
39
|
+
needsTools: raw[1] !== "N",
|
|
40
|
+
raw,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Default: enable everything
|
|
45
|
+
return { needsKnowledge: true, needsTools: true, raw: "YY" };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=llm-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-classifier.js","sourceRoot":"","sources":["../../src/intent/llm-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,IAAI,CAAC;AAItD;;;;;;GAMG;AACH,MAAM,OAAO,mBAAmB;IACtB,KAAK,CAAgB;IACrB,QAAQ,CAA0B;IAClC,SAAS,CAAS;IAE1B,YAAY,MAIX;QACC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ;aAC9B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,WAAW,IAAI,EAAE,CAAC;aACnD,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,MAAM,GAAG;YACb,+CAA+C;YAC/C,qEAAqE;YACrE,yDAAyD;YACzD,sDAAsD;YACtD,WAAW,CAAC,CAAC,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;gBAChC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM;gBACN,MAAM,EAAE,OAAO;gBACf,eAAe,EAAE,IAAI,CAAC,SAAS;aAChC,CAAC,CAAC;YAEH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO;gBACL,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;gBAC9B,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;gBAC1B,GAAG;aACJ,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type LanguageModel } from "ai";
|
|
2
|
+
import type { BaseToolCallingClassifier, ToolCallingResult } from "./base.js";
|
|
3
|
+
import type { BaseTool } from "../tools/base.js";
|
|
4
|
+
/**
|
|
5
|
+
* Uses a lightweight LLM to decide which tools to call, then executes them.
|
|
6
|
+
*/
|
|
7
|
+
export declare class LLMToolCallingClassifier implements BaseToolCallingClassifier {
|
|
8
|
+
private model;
|
|
9
|
+
private systemPrompt;
|
|
10
|
+
constructor(config: {
|
|
11
|
+
model: LanguageModel;
|
|
12
|
+
systemPrompt?: string;
|
|
13
|
+
});
|
|
14
|
+
classify(message: string, tools: BaseTool[]): Promise<ToolCallingResult>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=tool-calling-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-calling-classifier.d.ts","sourceRoot":"","sources":["../../src/intent/tool-calling-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD;;GAEG;AACH,qBAAa,wBAAyB,YAAW,yBAAyB;IACxE,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE;QAClB,KAAK,EAAE,aAAa,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;IAOK,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,iBAAiB,CAAC;CA4C9B"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { generateText, stepCountIs } from "ai";
|
|
2
|
+
import { toVercelTools } from "../tools/vercel-adapter.js";
|
|
3
|
+
/**
|
|
4
|
+
* Uses a lightweight LLM to decide which tools to call, then executes them.
|
|
5
|
+
*/
|
|
6
|
+
export class LLMToolCallingClassifier {
|
|
7
|
+
model;
|
|
8
|
+
systemPrompt;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.model = config.model;
|
|
11
|
+
this.systemPrompt =
|
|
12
|
+
config.systemPrompt ??
|
|
13
|
+
"You are a tool-calling assistant. Use the available tools to answer the user's question. Only call tools that are relevant.";
|
|
14
|
+
}
|
|
15
|
+
async classify(message, tools) {
|
|
16
|
+
if (tools.length === 0) {
|
|
17
|
+
return { toolResults: [], usage: {}, rawResponse: "" };
|
|
18
|
+
}
|
|
19
|
+
const vercelTools = toVercelTools(tools);
|
|
20
|
+
const result = await generateText({
|
|
21
|
+
model: this.model,
|
|
22
|
+
system: this.systemPrompt,
|
|
23
|
+
prompt: message,
|
|
24
|
+
tools: vercelTools,
|
|
25
|
+
stopWhen: stepCountIs(1),
|
|
26
|
+
});
|
|
27
|
+
const toolResults = [];
|
|
28
|
+
// Extract tool call results from steps
|
|
29
|
+
for (const step of result.steps ?? []) {
|
|
30
|
+
for (const tc of step.toolCalls ?? []) {
|
|
31
|
+
toolResults.push({
|
|
32
|
+
tool: tc.toolName,
|
|
33
|
+
args: tc.input ?? {},
|
|
34
|
+
result: "",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Match tool results by index
|
|
38
|
+
const stepToolResults = step.toolResults ?? [];
|
|
39
|
+
for (let i = 0; i < stepToolResults.length && i < toolResults.length; i++) {
|
|
40
|
+
toolResults[toolResults.length - (stepToolResults.length - i)] = {
|
|
41
|
+
...toolResults[toolResults.length - (stepToolResults.length - i)],
|
|
42
|
+
result: String(stepToolResults[i].result),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
toolResults,
|
|
48
|
+
usage: {
|
|
49
|
+
promptTokens: result.usage?.inputTokens ?? 0,
|
|
50
|
+
completionTokens: result.usage?.outputTokens ?? 0,
|
|
51
|
+
},
|
|
52
|
+
rawResponse: result.text,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tool-calling-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-calling-classifier.js","sourceRoot":"","sources":["../../src/intent/tool-calling-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAsB,MAAM,IAAI,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D;;GAEG;AACH,MAAM,OAAO,wBAAwB;IAC3B,KAAK,CAAgB;IACrB,YAAY,CAAS;IAE7B,YAAY,MAGX;QACC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,YAAY;YACf,MAAM,CAAC,YAAY;gBACnB,6HAA6H,CAAC;IAClI,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,OAAe,EACf,KAAiB;QAEjB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACzD,CAAC;QAED,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;SACzB,CAAC,CAAC;QAEH,MAAM,WAAW,GAAqC,EAAE,CAAC;QACzD,uCAAuC;QACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;gBACtC,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,EAAE,CAAC,QAAQ;oBACjB,IAAI,EAAG,EAAoD,CAAC,KAAK,IAAI,EAAE;oBACvE,MAAM,EAAE,EAAE;iBACX,CAAC,CAAC;YACL,CAAC;YACD,8BAA8B;YAC9B,MAAM,eAAe,GAAI,IAAgE,CAAC,WAAW,IAAI,EAAE,CAAC;YAC5G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,MAAM,IAAI,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC1E,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG;oBAC/D,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACjE,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;iBAC1C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW;YACX,KAAK,EAAE;gBACL,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;gBAC5C,gBAAgB,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;aAClD;YACD,WAAW,EAAE,MAAM,CAAC,IAAI;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface KnowledgeResult {
|
|
2
|
+
text: string;
|
|
3
|
+
score: number;
|
|
4
|
+
metadata: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface BaseKnowledgeStore {
|
|
7
|
+
search(query: string, topK?: number): Promise<KnowledgeResult[]>;
|
|
8
|
+
formatContext(results: KnowledgeResult[], minScore?: number): string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Default formatContext implementation.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatKnowledgeContext(results: KnowledgeResult[], minScore?: number): string;
|
|
14
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEjE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,SAAM,GACb,MAAM,CAIR"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default formatContext implementation.
|
|
3
|
+
*/
|
|
4
|
+
export function formatKnowledgeContext(results, minScore = 0.3) {
|
|
5
|
+
const filtered = results.filter((r) => r.score >= minScore);
|
|
6
|
+
if (filtered.length === 0)
|
|
7
|
+
return "";
|
|
8
|
+
return filtered.map((r) => r.text).join("\n\n---\n\n");
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA0B,EAC1B,QAAQ,GAAG,GAAG;IAEd,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;IAC5D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BaseKnowledgeStore, KnowledgeResult } from "./base.js";
|
|
2
|
+
export interface ChromaKnowledgeStoreConfig {
|
|
3
|
+
collectionName?: string;
|
|
4
|
+
chromaUrl?: string;
|
|
5
|
+
embeddingFunction?: any;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Knowledge store backed by ChromaDB.
|
|
9
|
+
* Requires `chromadb` as a peer dependency.
|
|
10
|
+
* Uses lazy initialization — the collection is created on first use.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ChromaKnowledgeStore implements BaseKnowledgeStore {
|
|
13
|
+
private client;
|
|
14
|
+
private collectionPromise;
|
|
15
|
+
private collectionName;
|
|
16
|
+
private chromaUrl;
|
|
17
|
+
private embeddingFunction;
|
|
18
|
+
constructor(config?: ChromaKnowledgeStoreConfig);
|
|
19
|
+
private getCollection;
|
|
20
|
+
ingest(text: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
21
|
+
batchIngest(texts: string[], metadataList?: Array<Record<string, unknown>>): Promise<void>;
|
|
22
|
+
search(query: string, topK?: number): Promise<KnowledgeResult[]>;
|
|
23
|
+
formatContext(results: KnowledgeResult[], minScore?: number): string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=chroma-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-store.d.ts","sourceRoot":"","sources":["../../src/knowledge/chroma-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGrE,MAAM,WAAW,0BAA0B;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iBAAiB,CAAC,EAAE,GAAG,CAAC;CACzB;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAE7D,OAAO,CAAC,MAAM,CAAa;IAE3B,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,iBAAiB,CAAM;gBAEnB,MAAM,GAAE,0BAA+B;IAOnD,OAAO,CAAC,aAAa;IAgBf,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,WAAW,CACf,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC;IAWV,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAmBjE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;CAGlE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { formatKnowledgeContext } from "./base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Knowledge store backed by ChromaDB.
|
|
4
|
+
* Requires `chromadb` as a peer dependency.
|
|
5
|
+
* Uses lazy initialization — the collection is created on first use.
|
|
6
|
+
*/
|
|
7
|
+
export class ChromaKnowledgeStore {
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
9
|
+
client = null;
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
collectionPromise = null;
|
|
12
|
+
collectionName;
|
|
13
|
+
chromaUrl;
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
embeddingFunction;
|
|
16
|
+
constructor(config = {}) {
|
|
17
|
+
this.chromaUrl = config.chromaUrl ?? "http://localhost:8000";
|
|
18
|
+
this.collectionName = config.collectionName ?? "knowledge";
|
|
19
|
+
this.embeddingFunction = config.embeddingFunction;
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
getCollection() {
|
|
23
|
+
if (!this.collectionPromise) {
|
|
24
|
+
this.collectionPromise = (async () => {
|
|
25
|
+
const { ChromaClient } = await import("chromadb");
|
|
26
|
+
this.client = new ChromaClient({ path: this.chromaUrl });
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
const opts = { name: this.collectionName };
|
|
29
|
+
if (this.embeddingFunction) {
|
|
30
|
+
opts.embeddingFunction = this.embeddingFunction;
|
|
31
|
+
}
|
|
32
|
+
return this.client.getOrCreateCollection(opts);
|
|
33
|
+
})();
|
|
34
|
+
}
|
|
35
|
+
return this.collectionPromise;
|
|
36
|
+
}
|
|
37
|
+
async ingest(text, metadata) {
|
|
38
|
+
await this.batchIngest([text], metadata ? [metadata] : undefined);
|
|
39
|
+
}
|
|
40
|
+
async batchIngest(texts, metadataList) {
|
|
41
|
+
const collection = await this.getCollection();
|
|
42
|
+
const ids = texts.map(() => crypto.randomUUID());
|
|
43
|
+
await collection.add({
|
|
44
|
+
ids,
|
|
45
|
+
documents: texts,
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
metadatas: metadataList,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async search(query, topK = 3) {
|
|
51
|
+
const collection = await this.getCollection();
|
|
52
|
+
const results = await collection.query({
|
|
53
|
+
queryTexts: [query],
|
|
54
|
+
nResults: topK,
|
|
55
|
+
});
|
|
56
|
+
const documents = results.documents?.[0] ?? [];
|
|
57
|
+
const distances = results.distances?.[0] ?? [];
|
|
58
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
+
const metadatas = results.metadatas?.[0] ?? [];
|
|
60
|
+
return documents.map((doc, i) => ({
|
|
61
|
+
text: doc ?? "",
|
|
62
|
+
score: 1 - (distances[i] ?? 1),
|
|
63
|
+
metadata: metadatas[i] ?? {},
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
formatContext(results, minScore = 0.3) {
|
|
67
|
+
return formatKnowledgeContext(results, minScore);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=chroma-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chroma-store.js","sourceRoot":"","sources":["../../src/knowledge/chroma-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual Retrieval: enrich chunks with situational context at ingest time.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic research shows this reduces retrieval failure by 49-67%.
|
|
5
|
+
* Cost: runs once at ingestion; zero overhead at query time.
|
|
6
|
+
*/
|
|
7
|
+
import { type LanguageModel } from "ai";
|
|
8
|
+
export interface ChunkContextualizerConfig {
|
|
9
|
+
model: LanguageModel;
|
|
10
|
+
}
|
|
11
|
+
export declare class ChunkContextualizer {
|
|
12
|
+
private readonly model;
|
|
13
|
+
constructor(config: ChunkContextualizerConfig);
|
|
14
|
+
contextualize(chunk: string, fullDocument: string): Promise<string>;
|
|
15
|
+
contextualizeMany(chunks: string[], fullDocument: string, concurrency?: number): Promise<string[]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=contextualizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextualizer.d.ts","sourceRoot":"","sources":["../../src/knowledge/contextualizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAEtD,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,aAAa,CAAC;CACtB;AAcD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;gBAE1B,MAAM,EAAE,yBAAyB;IAIvC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAanE,iBAAiB,CACrB,MAAM,EAAE,MAAM,EAAE,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAI,GACd,OAAO,CAAC,MAAM,EAAE,CAAC;CAmBrB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contextual Retrieval: enrich chunks with situational context at ingest time.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic research shows this reduces retrieval failure by 49-67%.
|
|
5
|
+
* Cost: runs once at ingestion; zero overhead at query time.
|
|
6
|
+
*/
|
|
7
|
+
import { generateText } from "ai";
|
|
8
|
+
const PROMPT_TEMPLATE = `<document>
|
|
9
|
+
{document}
|
|
10
|
+
</document>
|
|
11
|
+
|
|
12
|
+
以下是要定位的 chunk:
|
|
13
|
+
<chunk>
|
|
14
|
+
{chunk}
|
|
15
|
+
</chunk>
|
|
16
|
+
|
|
17
|
+
請用一到三句話說明這個 chunk 在整份文件中的位置和背景脈絡,\
|
|
18
|
+
目的是改善向量搜索的準確度。只輸出這段說明,不要其他內容。`;
|
|
19
|
+
export class ChunkContextualizer {
|
|
20
|
+
model;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.model = config.model;
|
|
23
|
+
}
|
|
24
|
+
async contextualize(chunk, fullDocument) {
|
|
25
|
+
const prompt = PROMPT_TEMPLATE
|
|
26
|
+
.replace("{document}", fullDocument.replaceAll("{chunk}", "\\{chunk\\}"))
|
|
27
|
+
.replace("{chunk}", chunk);
|
|
28
|
+
const { text } = await generateText({
|
|
29
|
+
model: this.model,
|
|
30
|
+
messages: [{ role: "user", content: prompt }],
|
|
31
|
+
});
|
|
32
|
+
return `${text.trim()}\n${chunk}`;
|
|
33
|
+
}
|
|
34
|
+
async contextualizeMany(chunks, fullDocument, concurrency = 5) {
|
|
35
|
+
const results = new Array(chunks.length);
|
|
36
|
+
let nextIndex = 0;
|
|
37
|
+
const worker = async () => {
|
|
38
|
+
while (nextIndex < chunks.length) {
|
|
39
|
+
const i = nextIndex++;
|
|
40
|
+
results[i] = await this.contextualize(chunks[i], fullDocument);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, chunks.length) }, () => worker()));
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=contextualizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextualizer.js","sourceRoot":"","sources":["../../src/knowledge/contextualizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAsB,MAAM,IAAI,CAAC;AAMtD,MAAM,eAAe,GAAG;;;;;;;;;;8BAUM,CAAC;AAE/B,MAAM,OAAO,mBAAmB;IACb,KAAK,CAAgB;IAEtC,YAAY,MAAiC;QAC3C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,YAAoB;QACrD,MAAM,MAAM,GAAG,eAAe;aAC3B,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,UAAU,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;aACxE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C,CAAC,CAAC;QAEH,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,MAAgB,EAChB,YAAoB,EACpB,WAAW,GAAG,CAAC;QAEf,MAAM,OAAO,GAAa,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;YACxB,OAAO,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;gBACtB,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CACR,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAChD,GAAG,EAAE,CAAC,MAAM,EAAE,CACf,CACF,CAAC;QACF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BaseKnowledgeStore, KnowledgeResult } from "./base.js";
|
|
2
|
+
import { type LanguageModel } from "ai";
|
|
3
|
+
/**
|
|
4
|
+
* Knowledge graph store using graphology. Requires `graphology` as optional dependency.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GraphKnowledgeStore implements BaseKnowledgeStore {
|
|
7
|
+
private graph;
|
|
8
|
+
private model;
|
|
9
|
+
private graphLib;
|
|
10
|
+
constructor(config: {
|
|
11
|
+
model: LanguageModel;
|
|
12
|
+
});
|
|
13
|
+
private ensureGraph;
|
|
14
|
+
ingestText(text: string): Promise<{
|
|
15
|
+
entities: number;
|
|
16
|
+
relations: number;
|
|
17
|
+
}>;
|
|
18
|
+
search(query: string, topK?: number): Promise<KnowledgeResult[]>;
|
|
19
|
+
formatContext(results: KnowledgeResult[], minScore?: number): string;
|
|
20
|
+
getGraph(): unknown;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=graph-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-store.d.ts","sourceRoot":"","sources":["../../src/knowledge/graph-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAErE,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,IAAI,CAAC;AAsBxD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAE5D,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,MAAM,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE;YAK9B,WAAW;IAQnB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAmC1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA2DjE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;IAIjE,QAAQ,IAAI,OAAO;CAGpB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { formatKnowledgeContext } from "./base.js";
|
|
2
|
+
import { generateObject } from "ai";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const EntityRelationSchema = z.object({
|
|
5
|
+
entities: z.array(z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
type: z.string(),
|
|
8
|
+
description: z.string().optional(),
|
|
9
|
+
})),
|
|
10
|
+
relations: z.array(z.object({
|
|
11
|
+
source: z.string(),
|
|
12
|
+
target: z.string(),
|
|
13
|
+
relation: z.string(),
|
|
14
|
+
})),
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Knowledge graph store using graphology. Requires `graphology` as optional dependency.
|
|
18
|
+
*/
|
|
19
|
+
export class GraphKnowledgeStore {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
graph = null;
|
|
22
|
+
model;
|
|
23
|
+
graphLib = null;
|
|
24
|
+
constructor(config) {
|
|
25
|
+
this.model = config.model;
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
28
|
+
async ensureGraph() {
|
|
29
|
+
if (this.graph)
|
|
30
|
+
return this.graph;
|
|
31
|
+
const graphology = await import("graphology");
|
|
32
|
+
this.graphLib = graphology;
|
|
33
|
+
this.graph = new graphology.default();
|
|
34
|
+
return this.graph;
|
|
35
|
+
}
|
|
36
|
+
async ingestText(text) {
|
|
37
|
+
const graph = await this.ensureGraph();
|
|
38
|
+
const { object } = await generateObject({
|
|
39
|
+
model: this.model,
|
|
40
|
+
schema: EntityRelationSchema,
|
|
41
|
+
prompt: `Extract entities and relationships from this text. Focus on key concepts, people, organizations, and their relationships.\n\n${text}`,
|
|
42
|
+
});
|
|
43
|
+
for (const entity of object.entities) {
|
|
44
|
+
const key = entity.name.toLowerCase();
|
|
45
|
+
if (!graph.hasNode(key)) {
|
|
46
|
+
graph.addNode(key, {
|
|
47
|
+
label: entity.name,
|
|
48
|
+
type: entity.type,
|
|
49
|
+
description: entity.description ?? "",
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
for (const rel of object.relations) {
|
|
54
|
+
const src = rel.source.toLowerCase();
|
|
55
|
+
const tgt = rel.target.toLowerCase();
|
|
56
|
+
if (graph.hasNode(src) && graph.hasNode(tgt)) {
|
|
57
|
+
try {
|
|
58
|
+
graph.addEdge(src, tgt, { relation: rel.relation });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// edge may already exist
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { entities: object.entities.length, relations: object.relations.length };
|
|
66
|
+
}
|
|
67
|
+
async search(query, topK = 3) {
|
|
68
|
+
const graph = await this.ensureGraph();
|
|
69
|
+
const queryLower = query.toLowerCase();
|
|
70
|
+
const results = [];
|
|
71
|
+
// Find matching nodes
|
|
72
|
+
const matchedNodes = [];
|
|
73
|
+
graph.forEachNode((node, attrs) => {
|
|
74
|
+
const label = attrs.label ?? node;
|
|
75
|
+
if (queryLower.includes(node) ||
|
|
76
|
+
queryLower.includes(label.toLowerCase())) {
|
|
77
|
+
matchedNodes.push(node);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Expand neighbors for matched nodes
|
|
81
|
+
for (const node of matchedNodes.slice(0, topK)) {
|
|
82
|
+
const attrs = graph.getNodeAttributes(node);
|
|
83
|
+
const neighbors = [];
|
|
84
|
+
graph.forEachNeighbor(node, (neighbor) => {
|
|
85
|
+
const nAttrs = graph.getNodeAttributes(neighbor);
|
|
86
|
+
neighbors.push(nAttrs.label ?? neighbor);
|
|
87
|
+
});
|
|
88
|
+
const edges = [];
|
|
89
|
+
graph.forEachEdge(node, (_edge, edgeAttrs, src, tgt) => {
|
|
90
|
+
const srcLabel = graph.getNodeAttributes(src).label ?? src;
|
|
91
|
+
const tgtLabel = graph.getNodeAttributes(tgt).label ?? tgt;
|
|
92
|
+
edges.push(`${srcLabel} -[${edgeAttrs.relation}]-> ${tgtLabel}`);
|
|
93
|
+
});
|
|
94
|
+
const text = [
|
|
95
|
+
`Entity: ${attrs.label} (${attrs.type})`,
|
|
96
|
+
attrs.description ? `Description: ${attrs.description}` : "",
|
|
97
|
+
edges.length > 0 ? `Relations:\n${edges.join("\n")}` : "",
|
|
98
|
+
]
|
|
99
|
+
.filter(Boolean)
|
|
100
|
+
.join("\n");
|
|
101
|
+
results.push({
|
|
102
|
+
text,
|
|
103
|
+
score: 1.0,
|
|
104
|
+
metadata: { nodeId: node, type: attrs.type },
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return results.slice(0, topK);
|
|
108
|
+
}
|
|
109
|
+
formatContext(results, minScore = 0.3) {
|
|
110
|
+
return formatKnowledgeContext(results, minScore);
|
|
111
|
+
}
|
|
112
|
+
getGraph() {
|
|
113
|
+
return this.graph;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=graph-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-store.js","sourceRoot":"","sources":["../../src/knowledge/graph-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BaseKnowledgeStore, KnowledgeResult } from "./base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-source knowledge store that merges results from multiple stores
|
|
4
|
+
* with weighted scoring.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HybridKnowledgeStore implements BaseKnowledgeStore {
|
|
7
|
+
private stores;
|
|
8
|
+
private weights;
|
|
9
|
+
constructor(config: {
|
|
10
|
+
stores: BaseKnowledgeStore[];
|
|
11
|
+
weights?: number[];
|
|
12
|
+
});
|
|
13
|
+
search(query: string, topK?: number): Promise<KnowledgeResult[]>;
|
|
14
|
+
formatContext(results: KnowledgeResult[], minScore?: number): string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=hybrid-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-store.d.ts","sourceRoot":"","sources":["../../src/knowledge/hybrid-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGrE;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAW;gBAEd,MAAM,EAAE;QAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;QAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;KACpB;IAMK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+BjE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;CAGlE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { formatKnowledgeContext } from "./base.js";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-source knowledge store that merges results from multiple stores
|
|
4
|
+
* with weighted scoring.
|
|
5
|
+
*/
|
|
6
|
+
export class HybridKnowledgeStore {
|
|
7
|
+
stores;
|
|
8
|
+
weights;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.stores = config.stores;
|
|
11
|
+
this.weights =
|
|
12
|
+
config.weights ?? config.stores.map(() => 1 / config.stores.length);
|
|
13
|
+
}
|
|
14
|
+
async search(query, topK = 3) {
|
|
15
|
+
const allResults = await Promise.allSettled(this.stores.map((store, i) => store.search(query, topK).then((results) => results.map((r) => ({
|
|
16
|
+
...r,
|
|
17
|
+
score: r.score * this.weights[i],
|
|
18
|
+
})))));
|
|
19
|
+
const merged = [];
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
for (const result of allResults) {
|
|
22
|
+
if (result.status === "fulfilled") {
|
|
23
|
+
for (const r of result.value) {
|
|
24
|
+
// Deduplicate by text content
|
|
25
|
+
const key = r.text.slice(0, 100);
|
|
26
|
+
if (!seen.has(key)) {
|
|
27
|
+
seen.add(key);
|
|
28
|
+
merged.push(r);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return merged.sort((a, b) => b.score - a.score).slice(0, topK);
|
|
34
|
+
}
|
|
35
|
+
formatContext(results, minScore = 0.3) {
|
|
36
|
+
return formatKnowledgeContext(results, minScore);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hybrid-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-store.js","sourceRoot":"","sources":["../../src/knowledge/hybrid-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAuB;IAC7B,OAAO,CAAW;IAE1B,YAAY,MAGX;QACC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO;YACV,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAI,GAAG,CAAC;QAClC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,UAAU,CACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAC3B,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClB,GAAG,CAAC;YACJ,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;SACjC,CAAC,CAAC,CACJ,CACF,CACF,CAAC;QAEF,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;YAChC,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC7B,8BAA8B;oBAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACd,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,aAAa,CAAC,OAA0B,EAAE,QAAQ,GAAG,GAAG;QACtD,OAAO,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BaseKnowledgeStore, KnowledgeResult } from "./base.js";
|
|
2
|
+
import type { EmbedFn } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* In-memory vector knowledge store for development and testing.
|
|
5
|
+
* Uses cosine similarity for search — no external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* @deprecated Use {@link ChromaKnowledgeStore} for production workloads.
|
|
8
|
+
*/
|
|
9
|
+
export declare class InMemoryKnowledgeStore implements BaseKnowledgeStore {
|
|
10
|
+
private docs;
|
|
11
|
+
private embedFn;
|
|
12
|
+
constructor(config: {
|
|
13
|
+
embedFn: EmbedFn;
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Ingest a list of text documents. Computes embeddings in batch.
|
|
17
|
+
*/
|
|
18
|
+
batchIngest(texts: string[], metadataList?: Array<Record<string, unknown>>): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Ingest a single document.
|
|
21
|
+
*/
|
|
22
|
+
ingest(text: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
23
|
+
search(query: string, topK?: number): Promise<KnowledgeResult[]>;
|
|
24
|
+
formatContext(results: KnowledgeResult[], minScore?: number): string;
|
|
25
|
+
get size(): number;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=in-memory-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../../src/knowledge/in-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C;;;;;GAKG;AACH,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,OAAO,CAAC,IAAI,CAAmB;IAC/B,OAAO,CAAC,OAAO,CAAU;gBAEb,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;IAIxC;;OAEG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAejE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,QAAQ,SAAM,GAAG,MAAM;IAIjE,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|