kagent-ts 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +68 -21
- package/README.md +27 -371
- package/dist/compression/progressive-compressor.d.ts +66 -0
- package/dist/compression/progressive-compressor.d.ts.map +1 -0
- package/dist/compression/progressive-compressor.js +367 -0
- package/dist/compression/progressive-compressor.js.map +1 -0
- package/dist/compression/types.d.ts +1 -5
- package/dist/compression/types.d.ts.map +1 -1
- package/dist/context/context-manager.d.ts +34 -15
- package/dist/context/context-manager.d.ts.map +1 -1
- package/dist/context/context-manager.js +78 -28
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/types.d.ts +20 -4
- package/dist/context/types.d.ts.map +1 -1
- package/dist/core/agent.d.ts +407 -35
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +685 -70
- package/dist/core/agent.js.map +1 -1
- package/dist/core/fusion-agent.d.ts +207 -0
- package/dist/core/fusion-agent.d.ts.map +1 -0
- package/dist/core/fusion-agent.js +769 -0
- package/dist/core/fusion-agent.js.map +1 -0
- package/dist/core/hooks.d.ts +19 -7
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/plan-solve-agent.d.ts +1 -15
- package/dist/core/plan-solve-agent.d.ts.map +1 -1
- package/dist/core/plan-solve-agent.js +144 -117
- package/dist/core/plan-solve-agent.js.map +1 -1
- package/dist/core/react-agent.d.ts +0 -13
- package/dist/core/react-agent.d.ts.map +1 -1
- package/dist/core/react-agent.js +128 -101
- package/dist/core/react-agent.js.map +1 -1
- package/dist/core/response-schema.d.ts +65 -0
- package/dist/core/response-schema.d.ts.map +1 -1
- package/dist/core/response-schema.js +174 -1
- package/dist/core/response-schema.js.map +1 -1
- package/dist/core/system-prompts.d.ts +27 -0
- package/dist/core/system-prompts.d.ts.map +1 -0
- package/dist/core/system-prompts.js +112 -0
- package/dist/core/system-prompts.js.map +1 -0
- package/dist/eval/benchmark.d.ts +81 -0
- package/dist/eval/benchmark.d.ts.map +1 -0
- package/dist/eval/benchmark.js +292 -0
- package/dist/eval/benchmark.js.map +1 -0
- package/dist/eval/eval-runner.d.ts +79 -0
- package/dist/eval/eval-runner.d.ts.map +1 -0
- package/dist/eval/eval-runner.js +252 -0
- package/dist/eval/eval-runner.js.map +1 -0
- package/dist/eval/index.d.ts +7 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +13 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/tool-call-evaluator.d.ts +72 -0
- package/dist/eval/tool-call-evaluator.d.ts.map +1 -0
- package/dist/eval/tool-call-evaluator.js +265 -0
- package/dist/eval/tool-call-evaluator.js.map +1 -0
- package/dist/eval/types.d.ts +219 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +3 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/index.d.ts +61 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +121 -8
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic-provider.d.ts +141 -0
- package/dist/llm/anthropic-provider.d.ts.map +1 -0
- package/dist/llm/anthropic-provider.js +486 -0
- package/dist/llm/anthropic-provider.js.map +1 -0
- package/dist/llm/errors.d.ts +26 -0
- package/dist/llm/errors.d.ts.map +1 -0
- package/dist/llm/errors.js +19 -0
- package/dist/llm/errors.js.map +1 -0
- package/dist/llm/factory.d.ts +73 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +77 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/fallback-provider.d.ts +47 -0
- package/dist/llm/fallback-provider.d.ts.map +1 -0
- package/dist/llm/fallback-provider.js +91 -0
- package/dist/llm/fallback-provider.js.map +1 -0
- package/dist/llm/interface.d.ts +54 -11
- package/dist/llm/interface.d.ts.map +1 -1
- package/dist/llm/interface.js +34 -0
- package/dist/llm/interface.js.map +1 -1
- package/dist/llm/model-router.d.ts +126 -0
- package/dist/llm/model-router.d.ts.map +1 -0
- package/dist/llm/model-router.js +178 -0
- package/dist/llm/model-router.js.map +1 -0
- package/dist/llm/openai-provider.d.ts +8 -32
- package/dist/llm/openai-provider.d.ts.map +1 -1
- package/dist/llm/openai-provider.js +27 -60
- package/dist/llm/openai-provider.js.map +1 -1
- package/dist/llm/rate-limiter.d.ts +41 -0
- package/dist/llm/rate-limiter.d.ts.map +1 -0
- package/dist/llm/rate-limiter.js +93 -0
- package/dist/llm/rate-limiter.js.map +1 -0
- package/dist/llm/retry.d.ts +26 -0
- package/dist/llm/retry.d.ts.map +1 -0
- package/dist/llm/retry.js +44 -0
- package/dist/llm/retry.js.map +1 -0
- package/dist/llm/token-budget.d.ts +97 -0
- package/dist/llm/token-budget.d.ts.map +1 -0
- package/dist/llm/token-budget.js +115 -0
- package/dist/llm/token-budget.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +7 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +38 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +34 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +8 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client-manager.d.ts +72 -0
- package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
- package/dist/mcp/mcp-client-manager.js +235 -0
- package/dist/mcp/mcp-client-manager.js.map +1 -0
- package/dist/mcp/mcp-types.d.ts +58 -0
- package/dist/mcp/mcp-types.d.ts.map +1 -0
- package/dist/mcp/mcp-types.js +20 -0
- package/dist/mcp/mcp-types.js.map +1 -0
- package/dist/memory/index.d.ts +3 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-manager.d.ts +119 -0
- package/dist/memory/memory-manager.d.ts.map +1 -0
- package/dist/memory/memory-manager.js +334 -0
- package/dist/memory/memory-manager.js.map +1 -0
- package/dist/messages/types.d.ts +2 -0
- package/dist/messages/types.d.ts.map +1 -1
- package/dist/orchestrator/index.d.ts +5 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +13 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/json-extractor.d.ts +18 -0
- package/dist/orchestrator/json-extractor.d.ts.map +1 -0
- package/dist/orchestrator/json-extractor.js +111 -0
- package/dist/orchestrator/json-extractor.js.map +1 -0
- package/dist/orchestrator/orchestrator-agent.d.ts +152 -0
- package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-agent.js +675 -0
- package/dist/orchestrator/orchestrator-agent.js.map +1 -0
- package/dist/orchestrator/orchestrator-response.d.ts +40 -0
- package/dist/orchestrator/orchestrator-response.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-response.js +275 -0
- package/dist/orchestrator/orchestrator-response.js.map +1 -0
- package/dist/orchestrator/orchestrator-types.d.ts +116 -0
- package/dist/orchestrator/orchestrator-types.d.ts.map +1 -0
- package/dist/orchestrator/orchestrator-types.js +3 -0
- package/dist/orchestrator/orchestrator-types.js.map +1 -0
- package/dist/preferences/preference-manager.d.ts +8 -3
- package/dist/preferences/preference-manager.d.ts.map +1 -1
- package/dist/preferences/preference-manager.js +17 -4
- package/dist/preferences/preference-manager.js.map +1 -1
- package/dist/rag/chroma-store.d.ts +52 -0
- package/dist/rag/chroma-store.d.ts.map +1 -0
- package/dist/rag/chroma-store.js +110 -0
- package/dist/rag/chroma-store.js.map +1 -0
- package/dist/rag/document-loader.d.ts +21 -0
- package/dist/rag/document-loader.d.ts.map +1 -0
- package/dist/rag/document-loader.js +129 -0
- package/dist/rag/document-loader.js.map +1 -0
- package/dist/rag/embedding-provider.d.ts +36 -0
- package/dist/rag/embedding-provider.d.ts.map +1 -0
- package/dist/rag/embedding-provider.js +74 -0
- package/dist/rag/embedding-provider.js.map +1 -0
- package/dist/rag/index.d.ts +17 -0
- package/dist/rag/index.d.ts.map +1 -0
- package/dist/rag/index.js +27 -0
- package/dist/rag/index.js.map +1 -0
- package/dist/rag/keyword-index.d.ts +53 -0
- package/dist/rag/keyword-index.d.ts.map +1 -0
- package/dist/rag/keyword-index.js +161 -0
- package/dist/rag/keyword-index.js.map +1 -0
- package/dist/rag/llm-reranker.d.ts +36 -0
- package/dist/rag/llm-reranker.d.ts.map +1 -0
- package/dist/rag/llm-reranker.js +95 -0
- package/dist/rag/llm-reranker.js.map +1 -0
- package/dist/rag/rag-manager.d.ts +54 -0
- package/dist/rag/rag-manager.d.ts.map +1 -0
- package/dist/rag/rag-manager.js +179 -0
- package/dist/rag/rag-manager.js.map +1 -0
- package/dist/rag/rag-types.d.ts +143 -0
- package/dist/rag/rag-types.d.ts.map +1 -0
- package/dist/rag/rag-types.js +9 -0
- package/dist/rag/rag-types.js.map +1 -0
- package/dist/rag/rrf.d.ts +47 -0
- package/dist/rag/rrf.d.ts.map +1 -0
- package/dist/rag/rrf.js +70 -0
- package/dist/rag/rrf.js.map +1 -0
- package/dist/rag/search-knowledge.d.ts +24 -0
- package/dist/rag/search-knowledge.d.ts.map +1 -0
- package/dist/rag/search-knowledge.js +86 -0
- package/dist/rag/search-knowledge.js.map +1 -0
- package/dist/rag/text-splitter.d.ts +25 -0
- package/dist/rag/text-splitter.d.ts.map +1 -0
- package/dist/rag/text-splitter.js +136 -0
- package/dist/rag/text-splitter.js.map +1 -0
- package/dist/rag/vector-store.d.ts +34 -0
- package/dist/rag/vector-store.d.ts.map +1 -0
- package/dist/rag/vector-store.js +73 -0
- package/dist/rag/vector-store.js.map +1 -0
- package/dist/reflection/error-notebook.d.ts +125 -0
- package/dist/reflection/error-notebook.d.ts.map +1 -0
- package/dist/reflection/error-notebook.js +368 -0
- package/dist/reflection/error-notebook.js.map +1 -0
- package/dist/reflection/index.d.ts +8 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/dist/reflection/index.js +12 -0
- package/dist/reflection/index.js.map +1 -0
- package/dist/reflection/memory-reflector.d.ts +97 -0
- package/dist/reflection/memory-reflector.d.ts.map +1 -0
- package/dist/reflection/memory-reflector.js +215 -0
- package/dist/reflection/memory-reflector.js.map +1 -0
- package/dist/reflection/reflection-agent.d.ts +105 -0
- package/dist/reflection/reflection-agent.d.ts.map +1 -0
- package/dist/reflection/reflection-agent.js +234 -0
- package/dist/reflection/reflection-agent.js.map +1 -0
- package/dist/reflection/reflection-hook.d.ts +50 -0
- package/dist/reflection/reflection-hook.d.ts.map +1 -0
- package/dist/reflection/reflection-hook.js +108 -0
- package/dist/reflection/reflection-hook.js.map +1 -0
- package/dist/rules/project-rules.d.ts +47 -0
- package/dist/rules/project-rules.d.ts.map +1 -0
- package/dist/rules/project-rules.js +166 -0
- package/dist/rules/project-rules.js.map +1 -0
- package/dist/security/boundaries.d.ts +81 -0
- package/dist/security/boundaries.d.ts.map +1 -0
- package/dist/security/boundaries.js +158 -0
- package/dist/security/boundaries.js.map +1 -0
- package/dist/security/index.d.ts +2 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +11 -0
- package/dist/security/index.js.map +1 -0
- package/dist/session/session-types.d.ts +25 -4
- package/dist/session/session-types.d.ts.map +1 -1
- package/dist/skills/file-skill-loader.d.ts +9 -20
- package/dist/skills/file-skill-loader.d.ts.map +1 -1
- package/dist/skills/file-skill-loader.js +35 -164
- package/dist/skills/file-skill-loader.js.map +1 -1
- package/dist/skills/index.d.ts +1 -1
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +1 -2
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/skill-manager.d.ts +22 -29
- package/dist/skills/skill-manager.d.ts.map +1 -1
- package/dist/skills/skill-manager.js +63 -85
- package/dist/skills/skill-manager.js.map +1 -1
- package/dist/skills/types.d.ts +4 -16
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/subagent/index.d.ts +4 -0
- package/dist/subagent/index.d.ts.map +1 -0
- package/dist/subagent/index.js +8 -0
- package/dist/subagent/index.js.map +1 -0
- package/dist/subagent/subagent-loader.d.ts +53 -0
- package/dist/subagent/subagent-loader.d.ts.map +1 -0
- package/dist/subagent/subagent-loader.js +155 -0
- package/dist/subagent/subagent-loader.js.map +1 -0
- package/dist/subagent/subagent-manager.d.ts +161 -0
- package/dist/subagent/subagent-manager.d.ts.map +1 -0
- package/dist/subagent/subagent-manager.js +468 -0
- package/dist/subagent/subagent-manager.js.map +1 -0
- package/dist/subagent/subagent-types.d.ts +77 -0
- package/dist/subagent/subagent-types.d.ts.map +1 -0
- package/dist/subagent/subagent-types.js +3 -0
- package/dist/subagent/subagent-types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +3 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +87 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit-file.d.ts.map +1 -1
- package/dist/tools/builtin/edit-file.js +1 -0
- package/dist/tools/builtin/edit-file.js.map +1 -1
- package/dist/tools/builtin/index.d.ts +14 -0
- package/dist/tools/builtin/index.d.ts.map +1 -1
- package/dist/tools/builtin/index.js +45 -1
- package/dist/tools/builtin/index.js.map +1 -1
- package/dist/tools/builtin/list-errors.d.ts +7 -0
- package/dist/tools/builtin/list-errors.d.ts.map +1 -0
- package/dist/tools/builtin/list-errors.js +64 -0
- package/dist/tools/builtin/list-errors.js.map +1 -0
- package/dist/tools/builtin/list-subagents.d.ts +7 -0
- package/dist/tools/builtin/list-subagents.d.ts.map +1 -0
- package/dist/tools/builtin/list-subagents.js +21 -0
- package/dist/tools/builtin/list-subagents.js.map +1 -0
- package/dist/tools/builtin/recall.d.ts +11 -0
- package/dist/tools/builtin/recall.d.ts.map +1 -0
- package/dist/tools/builtin/recall.js +60 -0
- package/dist/tools/builtin/recall.js.map +1 -0
- package/dist/tools/builtin/remember.d.ts +12 -0
- package/dist/tools/builtin/remember.d.ts.map +1 -0
- package/dist/tools/builtin/remember.js +72 -0
- package/dist/tools/builtin/remember.js.map +1 -0
- package/dist/tools/builtin/skill.d.ts +14 -0
- package/dist/tools/builtin/skill.d.ts.map +1 -0
- package/dist/tools/builtin/skill.js +71 -0
- package/dist/tools/builtin/skill.js.map +1 -0
- package/dist/tools/builtin/spawn-subagent.d.ts +7 -0
- package/dist/tools/builtin/spawn-subagent.d.ts.map +1 -0
- package/dist/tools/builtin/spawn-subagent.js +43 -0
- package/dist/tools/builtin/spawn-subagent.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +101 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/builtin/write-file.d.ts.map +1 -1
- package/dist/tools/builtin/write-file.js +1 -0
- package/dist/tools/builtin/write-file.js.map +1 -1
- package/dist/tools/circuit-breaker.d.ts +19 -10
- package/dist/tools/circuit-breaker.d.ts.map +1 -1
- package/dist/tools/circuit-breaker.js +22 -11
- package/dist/tools/circuit-breaker.js.map +1 -1
- package/dist/tools/error-tracker.d.ts +28 -44
- package/dist/tools/error-tracker.d.ts.map +1 -1
- package/dist/tools/error-tracker.js +39 -156
- package/dist/tools/error-tracker.js.map +1 -1
- package/dist/tools/tool-filter.d.ts +70 -0
- package/dist/tools/tool-filter.d.ts.map +1 -0
- package/dist/tools/tool-filter.js +92 -0
- package/dist/tools/tool-filter.js.map +1 -0
- package/dist/tools/tool-output-truncator.d.ts +36 -0
- package/dist/tools/tool-output-truncator.d.ts.map +1 -0
- package/dist/tools/tool-output-truncator.js +117 -0
- package/dist/tools/tool-output-truncator.js.map +1 -0
- package/dist/tools/tool-registry.d.ts +25 -9
- package/dist/tools/tool-registry.d.ts.map +1 -1
- package/dist/tools/tool-registry.js +77 -28
- package/dist/tools/tool-registry.js.map +1 -1
- package/dist/tools/tool-validator.d.ts +13 -0
- package/dist/tools/tool-validator.d.ts.map +1 -0
- package/dist/tools/tool-validator.js +116 -0
- package/dist/tools/tool-validator.js.map +1 -0
- package/dist/tools/types.d.ts +86 -3
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +51 -2
- package/dist/tools/types.js.map +1 -1
- package/dist/trace/trace-logger.d.ts +30 -4
- package/dist/trace/trace-logger.d.ts.map +1 -1
- package/dist/trace/trace-logger.js +83 -7
- package/dist/trace/trace-logger.js.map +1 -1
- package/package.json +14 -4
- package/dist/compression/sliding-window.d.ts +0 -21
- package/dist/compression/sliding-window.d.ts.map +0 -1
- package/dist/compression/sliding-window.js +0 -44
- package/dist/compression/sliding-window.js.map +0 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory BM25 keyword index.
|
|
4
|
+
*
|
|
5
|
+
* Builds an inverted index from chunk text during indexing and scores
|
|
6
|
+
* documents against queries using the standard BM25 formula:
|
|
7
|
+
*
|
|
8
|
+
* score(D, Q) = Σ IDF(qᵢ) · (f(qᵢ, D) · (k1+1)) / (f(qᵢ, D) + k1·(1 − b + b·|D|/avgdl))
|
|
9
|
+
*
|
|
10
|
+
* where:
|
|
11
|
+
* f(qᵢ, D) = term frequency of query term qᵢ in document D
|
|
12
|
+
* |D| = document length (token count)
|
|
13
|
+
* avgdl = average document length across the corpus
|
|
14
|
+
* k1 = term saturation parameter (default: 1.5)
|
|
15
|
+
* b = length normalization parameter (default: 0.75)
|
|
16
|
+
* IDF(qᵢ) = log((N − n(qᵢ) + 0.5) / (n(qᵢ) + 0.5) + 1)
|
|
17
|
+
*
|
|
18
|
+
* Zero external dependencies — pure TypeScript implementation suitable
|
|
19
|
+
* for knowledge bases up to ~10K chunks.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.InMemoryKeywordIndex = void 0;
|
|
23
|
+
// ─── Tokenizer ──────────────────────────────────────────────────────────────
|
|
24
|
+
/**
|
|
25
|
+
* Simple multilingual tokenizer.
|
|
26
|
+
*
|
|
27
|
+
* Splits on word boundaries (Unicode-aware via lookbehind/lookahead for CJK
|
|
28
|
+
* characters, plus standard whitespace/punctuation splitting for Latin text).
|
|
29
|
+
*/
|
|
30
|
+
function tokenize(text) {
|
|
31
|
+
const tokens = [];
|
|
32
|
+
// Insert spaces around CJK characters so they split into individual tokens,
|
|
33
|
+
// then split on non-word characters.
|
|
34
|
+
const spaced = text
|
|
35
|
+
.replace(/[一-鿿㐀-䶿]/g, " $& ")
|
|
36
|
+
.replace(/[-ゟ゠-ヿ]/g, " $& ") // Hiragana + Katakana
|
|
37
|
+
.replace(/[가-]/g, " $& ") // Hangul
|
|
38
|
+
.toLowerCase();
|
|
39
|
+
for (const token of spaced.split(/[^a-z0-9一-鿿㐀-䶿-ゟ゠-ヿ가-_]+/)) {
|
|
40
|
+
const t = token.trim();
|
|
41
|
+
if (t.length > 0)
|
|
42
|
+
tokens.push(t);
|
|
43
|
+
}
|
|
44
|
+
return tokens;
|
|
45
|
+
}
|
|
46
|
+
// ─── BM25 Parameters ────────────────────────────────────────────────────────
|
|
47
|
+
const BM25_K1 = 1.5;
|
|
48
|
+
const BM25_B = 0.75;
|
|
49
|
+
// ─── InMemoryKeywordIndex ────────────────────────────────────────────────────
|
|
50
|
+
class InMemoryKeywordIndex {
|
|
51
|
+
/** invertedIndex: word → Map<chunkId → term frequency> */
|
|
52
|
+
invertedIndex = new Map();
|
|
53
|
+
/** IDF values: word → idf */
|
|
54
|
+
idfValues = new Map();
|
|
55
|
+
/** Document lengths: chunkId → token count */
|
|
56
|
+
docLengths = new Map();
|
|
57
|
+
/** Average document length across the corpus. */
|
|
58
|
+
avgDocLength = 0;
|
|
59
|
+
/** Total number of indexed chunks. */
|
|
60
|
+
totalDocs = 0;
|
|
61
|
+
/** All chunks indexed (for retrieval). chunkId → RAGChunk */
|
|
62
|
+
chunks = new Map();
|
|
63
|
+
/** Next chunkId. */
|
|
64
|
+
nextId = 0;
|
|
65
|
+
// ─── Write ──────────────────────────────────────────────────────────────
|
|
66
|
+
/**
|
|
67
|
+
* Add chunks to the keyword index.
|
|
68
|
+
* Recomputes IDF and avgDocLength incrementally.
|
|
69
|
+
*/
|
|
70
|
+
add(newChunks) {
|
|
71
|
+
for (const chunk of newChunks) {
|
|
72
|
+
const id = this.nextId++;
|
|
73
|
+
this.chunks.set(id, chunk);
|
|
74
|
+
const tokens = tokenize(chunk.text);
|
|
75
|
+
this.docLengths.set(id, tokens.length);
|
|
76
|
+
const tf = new Map();
|
|
77
|
+
for (const token of tokens) {
|
|
78
|
+
tf.set(token, (tf.get(token) || 0) + 1);
|
|
79
|
+
}
|
|
80
|
+
for (const [word, count] of tf) {
|
|
81
|
+
let posting = this.invertedIndex.get(word);
|
|
82
|
+
if (!posting) {
|
|
83
|
+
posting = new Map();
|
|
84
|
+
this.invertedIndex.set(word, posting);
|
|
85
|
+
}
|
|
86
|
+
posting.set(id, count);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
this.recomputeStats();
|
|
90
|
+
}
|
|
91
|
+
// ─── Read ───────────────────────────────────────────────────────────────
|
|
92
|
+
/**
|
|
93
|
+
* Search for the top-K chunks matching the query using BM25 scoring.
|
|
94
|
+
*/
|
|
95
|
+
search(query, topK) {
|
|
96
|
+
const queryTokens = tokenize(query);
|
|
97
|
+
if (queryTokens.length === 0 || this.totalDocs === 0)
|
|
98
|
+
return [];
|
|
99
|
+
// Aggregate BM25 scores: chunkId → score
|
|
100
|
+
const scores = new Map();
|
|
101
|
+
for (const token of queryTokens) {
|
|
102
|
+
const posting = this.invertedIndex.get(token);
|
|
103
|
+
if (!posting)
|
|
104
|
+
continue;
|
|
105
|
+
const idf = this.idfValues.get(token) || 0;
|
|
106
|
+
for (const [docId, tf] of posting) {
|
|
107
|
+
const docLen = this.docLengths.get(docId) || 1;
|
|
108
|
+
const numerator = tf * (BM25_K1 + 1);
|
|
109
|
+
const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (docLen / this.avgDocLength));
|
|
110
|
+
const score = idf * (numerator / denominator);
|
|
111
|
+
scores.set(docId, (scores.get(docId) || 0) + score);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Sort by score descending, take top-K
|
|
115
|
+
const ranked = Array.from(scores.entries())
|
|
116
|
+
.sort((a, b) => b[1] - a[1])
|
|
117
|
+
.slice(0, topK);
|
|
118
|
+
// Map back to BM25Result
|
|
119
|
+
return ranked
|
|
120
|
+
.map(([docId, score]) => {
|
|
121
|
+
const chunk = this.chunks.get(docId);
|
|
122
|
+
if (!chunk)
|
|
123
|
+
return null;
|
|
124
|
+
return { chunk, score };
|
|
125
|
+
})
|
|
126
|
+
.filter((r) => r !== null);
|
|
127
|
+
}
|
|
128
|
+
// ─── State ──────────────────────────────────────────────────────────────
|
|
129
|
+
get size() {
|
|
130
|
+
return this.totalDocs;
|
|
131
|
+
}
|
|
132
|
+
clear() {
|
|
133
|
+
this.invertedIndex.clear();
|
|
134
|
+
this.idfValues.clear();
|
|
135
|
+
this.docLengths.clear();
|
|
136
|
+
this.chunks.clear();
|
|
137
|
+
this.avgDocLength = 0;
|
|
138
|
+
this.totalDocs = 0;
|
|
139
|
+
this.nextId = 0;
|
|
140
|
+
}
|
|
141
|
+
// ─── Stats ──────────────────────────────────────────────────────────────
|
|
142
|
+
recomputeStats() {
|
|
143
|
+
this.totalDocs = this.chunks.size;
|
|
144
|
+
// Average doc length
|
|
145
|
+
let totalLen = 0;
|
|
146
|
+
for (const len of this.docLengths.values()) {
|
|
147
|
+
totalLen += len;
|
|
148
|
+
}
|
|
149
|
+
this.avgDocLength = this.totalDocs > 0 ? totalLen / this.totalDocs : 1;
|
|
150
|
+
// IDF
|
|
151
|
+
this.idfValues.clear();
|
|
152
|
+
for (const [word, posting] of this.invertedIndex) {
|
|
153
|
+
const n = posting.size; // number of docs containing this word
|
|
154
|
+
// Smooth IDF: log((N - n + 0.5) / (n + 0.5) + 1)
|
|
155
|
+
const idf = Math.log((this.totalDocs - n + 0.5) / (n + 0.5) + 1);
|
|
156
|
+
this.idfValues.set(word, idf);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.InMemoryKeywordIndex = InMemoryKeywordIndex;
|
|
161
|
+
//# sourceMappingURL=keyword-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyword-index.js","sourceRoot":"","sources":["../../src/rag/keyword-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM-based re-ranker for retrieved results.
|
|
3
|
+
*
|
|
4
|
+
* Uses an LLM (via the framework's LLMProvider interface) to re-score
|
|
5
|
+
* candidate chunks against the original query. This is a simple, zero-new-
|
|
6
|
+
* dependency alternative to a dedicated Cross-Encoder model.
|
|
7
|
+
*
|
|
8
|
+
* For production use with high throughput, consider replacing this with
|
|
9
|
+
* a dedicated rerank API (Cohere, Jina, Voyage AI) or a locally-hosted
|
|
10
|
+
* Cross-Encoder model (e.g., BAAI/bge-reranker-v2-m3 via ONNX).
|
|
11
|
+
*/
|
|
12
|
+
import type { ReRanker, RAGSearchResult } from "./rag-types";
|
|
13
|
+
import type { LLMProvider } from "../llm/interface";
|
|
14
|
+
export interface LLMReRankerConfig {
|
|
15
|
+
/** The LLM provider to use for scoring. */
|
|
16
|
+
llm: LLMProvider;
|
|
17
|
+
/**
|
|
18
|
+
* Maximum candidates to send to the LLM in one re-rank request.
|
|
19
|
+
* Default: 20. More candidates = better comparison but higher cost.
|
|
20
|
+
*/
|
|
21
|
+
maxCandidates?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Model to use (overrides the LLM provider's default model).
|
|
24
|
+
* Useful for using a cheaper/faster model for re-ranking.
|
|
25
|
+
*/
|
|
26
|
+
model?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare class LLMReRanker implements ReRanker {
|
|
29
|
+
private llm;
|
|
30
|
+
private maxCandidates;
|
|
31
|
+
constructor(config: LLMReRankerConfig);
|
|
32
|
+
rerank(query: string, results: RAGSearchResult[]): Promise<RAGSearchResult[]>;
|
|
33
|
+
private buildPrompt;
|
|
34
|
+
private parseScores;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=llm-reranker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-reranker.d.ts","sourceRoot":"","sources":["../../src/rag/llm-reranker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,GAAG,EAAE,WAAW,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,WAAY,YAAW,QAAQ;IAC1C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAS;gBAElB,MAAM,EAAE,iBAAiB;IAK/B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAsCnF,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,WAAW;CAgBpB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LLM-based re-ranker for retrieved results.
|
|
4
|
+
*
|
|
5
|
+
* Uses an LLM (via the framework's LLMProvider interface) to re-score
|
|
6
|
+
* candidate chunks against the original query. This is a simple, zero-new-
|
|
7
|
+
* dependency alternative to a dedicated Cross-Encoder model.
|
|
8
|
+
*
|
|
9
|
+
* For production use with high throughput, consider replacing this with
|
|
10
|
+
* a dedicated rerank API (Cohere, Jina, Voyage AI) or a locally-hosted
|
|
11
|
+
* Cross-Encoder model (e.g., BAAI/bge-reranker-v2-m3 via ONNX).
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.LLMReRanker = void 0;
|
|
15
|
+
const types_1 = require("../messages/types");
|
|
16
|
+
// ─── LLMReRanker ─────────────────────────────────────────────────────────────
|
|
17
|
+
class LLMReRanker {
|
|
18
|
+
llm;
|
|
19
|
+
maxCandidates;
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.llm = config.llm;
|
|
22
|
+
this.maxCandidates = config.maxCandidates ?? 20;
|
|
23
|
+
}
|
|
24
|
+
async rerank(query, results) {
|
|
25
|
+
if (results.length <= 1)
|
|
26
|
+
return results;
|
|
27
|
+
// Limit candidates to avoid huge prompts
|
|
28
|
+
const candidates = results.slice(0, this.maxCandidates);
|
|
29
|
+
const prompt = this.buildPrompt(query, candidates);
|
|
30
|
+
const messages = [
|
|
31
|
+
{ role: types_1.Role.User, content: prompt },
|
|
32
|
+
];
|
|
33
|
+
const response = await this.llm.chat(messages);
|
|
34
|
+
const content = response.content ?? "";
|
|
35
|
+
// Parse scores from the LLM response
|
|
36
|
+
const scores = this.parseScores(content, candidates.length);
|
|
37
|
+
// Apply scores to results
|
|
38
|
+
const reranked = [];
|
|
39
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
40
|
+
reranked.push({
|
|
41
|
+
chunk: candidates[i].chunk,
|
|
42
|
+
score: scores?.[i] ?? candidates[i].score,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Append any overflow results with original scores
|
|
46
|
+
for (let i = this.maxCandidates; i < results.length; i++) {
|
|
47
|
+
reranked.push({ ...results[i] });
|
|
48
|
+
}
|
|
49
|
+
// Sort by new score descending
|
|
50
|
+
reranked.sort((a, b) => b.score - a.score);
|
|
51
|
+
return reranked;
|
|
52
|
+
}
|
|
53
|
+
// ─── Prompt ──────────────────────────────────────────────────────────────
|
|
54
|
+
buildPrompt(query, results) {
|
|
55
|
+
const docs = results.map((r, i) => `[${i}] ${r.chunk.text.slice(0, 500)}`).join("\n\n");
|
|
56
|
+
return [
|
|
57
|
+
`You are a relevance scoring assistant. Given a query and a list of ${results.length} document snippets, score each snippet's relevance to the query on a scale of 0–10 (integer).`,
|
|
58
|
+
"",
|
|
59
|
+
"Rules:",
|
|
60
|
+
"- 0 = completely irrelevant",
|
|
61
|
+
"- 10 = perfectly answers the query",
|
|
62
|
+
"- Score based on factual relevance, not just keyword overlap",
|
|
63
|
+
"",
|
|
64
|
+
`Query: ${query}`,
|
|
65
|
+
"",
|
|
66
|
+
"Documents:",
|
|
67
|
+
docs,
|
|
68
|
+
"",
|
|
69
|
+
`Output ONLY a JSON array of ${results.length} integers in order [score_0, score_1, ..., score_${results.length - 1}].`,
|
|
70
|
+
"Example output: [8, 3, 0, 10, 5]",
|
|
71
|
+
"",
|
|
72
|
+
"Scores:",
|
|
73
|
+
].join("\n");
|
|
74
|
+
}
|
|
75
|
+
// ─── Parsing ─────────────────────────────────────────────────────────────
|
|
76
|
+
parseScores(raw, expectedCount) {
|
|
77
|
+
// Try to extract a JSON array from the response
|
|
78
|
+
const match = raw.match(/\[[\d,\s]+\]/);
|
|
79
|
+
if (!match)
|
|
80
|
+
return null;
|
|
81
|
+
try {
|
|
82
|
+
const arr = JSON.parse(match[0]);
|
|
83
|
+
if (!Array.isArray(arr) || arr.length === 0)
|
|
84
|
+
return null;
|
|
85
|
+
// Normalize to [0, 1]
|
|
86
|
+
const normalized = arr.map((n) => Math.max(0, Math.min(1, Number(n) / 10)));
|
|
87
|
+
return normalized;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.LLMReRanker = LLMReRanker;
|
|
95
|
+
//# sourceMappingURL=llm-reranker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-reranker.js","sourceRoot":"","sources":["../../src/rag/llm-reranker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RAG Manager — orchestrates document loading, embedding, and search.
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle:
|
|
5
|
+
* 1. `index()` — load documents from `documentsDir`, chunk, embed, store.
|
|
6
|
+
* 2. `search(query, topK)` — embed query, search vector store, return results.
|
|
7
|
+
* 3. `clear()` — wipe all indexed data.
|
|
8
|
+
*
|
|
9
|
+
* Owned by the main Agent; created during `Agent.init()` when `rag` config
|
|
10
|
+
* is present.
|
|
11
|
+
*/
|
|
12
|
+
import type { RAGConfig, RAGSearchResult } from "./rag-types";
|
|
13
|
+
import { Logger } from "../logging/logger";
|
|
14
|
+
export declare class RAGManager {
|
|
15
|
+
private config;
|
|
16
|
+
private store;
|
|
17
|
+
private keywordIndex?;
|
|
18
|
+
private reRanker?;
|
|
19
|
+
private logger;
|
|
20
|
+
private documents;
|
|
21
|
+
private _indexed;
|
|
22
|
+
constructor(config: RAGConfig, logger?: Logger);
|
|
23
|
+
/** Whether the index has been built. */
|
|
24
|
+
get indexed(): boolean;
|
|
25
|
+
/** Number of chunks in the store. */
|
|
26
|
+
get chunkCount(): number;
|
|
27
|
+
/** Number of documents loaded. */
|
|
28
|
+
get documentCount(): number;
|
|
29
|
+
/** List of indexed document paths. */
|
|
30
|
+
get documentPaths(): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Load documents, generate embeddings, and populate the vector store.
|
|
33
|
+
*
|
|
34
|
+
* Idempotent — if already indexed, calling again clears and rebuilds.
|
|
35
|
+
*/
|
|
36
|
+
index(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Search the knowledge base for chunks relevant to the query.
|
|
39
|
+
*
|
|
40
|
+
* In hybrid mode (hybridSearch: true), runs both vector similarity and
|
|
41
|
+
* BM25 keyword search in parallel, then merges results via RRF.
|
|
42
|
+
*
|
|
43
|
+
* @param query Natural-language search query.
|
|
44
|
+
* @param topK Number of results to return (overrides config default).
|
|
45
|
+
*/
|
|
46
|
+
search(query: string, topK?: number): Promise<RAGSearchResult[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Format search results for injection into the LLM context.
|
|
49
|
+
*/
|
|
50
|
+
formatResults(results: RAGSearchResult[]): string;
|
|
51
|
+
/** Clear all indexed data. */
|
|
52
|
+
clear(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=rag-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-manager.d.ts","sourceRoot":"","sources":["../../src/rag/rag-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,SAAS,EAET,eAAe,EAGhB,MAAM,aAAa,CAAC;AAKrB,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM;IAiB9C,wCAAwC;IACxC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,qCAAqC;IACrC,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,kCAAkC;IAClC,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,sCAAsC;IACtC,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuD5B;;;;;;;;OAQG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqDtE;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM;IAkBjD,8BAA8B;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RAG Manager — orchestrates document loading, embedding, and search.
|
|
4
|
+
*
|
|
5
|
+
* Lifecycle:
|
|
6
|
+
* 1. `index()` — load documents from `documentsDir`, chunk, embed, store.
|
|
7
|
+
* 2. `search(query, topK)` — embed query, search vector store, return results.
|
|
8
|
+
* 3. `clear()` — wipe all indexed data.
|
|
9
|
+
*
|
|
10
|
+
* Owned by the main Agent; created during `Agent.init()` when `rag` config
|
|
11
|
+
* is present.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.RAGManager = void 0;
|
|
15
|
+
const document_loader_1 = require("./document-loader");
|
|
16
|
+
const vector_store_1 = require("./vector-store");
|
|
17
|
+
const keyword_index_1 = require("./keyword-index");
|
|
18
|
+
const rrf_1 = require("./rrf");
|
|
19
|
+
const logger_1 = require("../logging/logger");
|
|
20
|
+
class RAGManager {
|
|
21
|
+
config;
|
|
22
|
+
store;
|
|
23
|
+
keywordIndex;
|
|
24
|
+
reRanker;
|
|
25
|
+
logger;
|
|
26
|
+
documents = [];
|
|
27
|
+
_indexed = false;
|
|
28
|
+
constructor(config, logger) {
|
|
29
|
+
this.config = {
|
|
30
|
+
chunkSize: 1000,
|
|
31
|
+
chunkOverlap: 200,
|
|
32
|
+
topK: 5,
|
|
33
|
+
...config,
|
|
34
|
+
};
|
|
35
|
+
this.store = config.store ?? new vector_store_1.InMemoryVectorStore();
|
|
36
|
+
if (this.config.hybridSearch) {
|
|
37
|
+
this.keywordIndex = new keyword_index_1.InMemoryKeywordIndex();
|
|
38
|
+
}
|
|
39
|
+
this.reRanker = config.reRanker;
|
|
40
|
+
this.logger = logger ?? new logger_1.ConsoleLogger();
|
|
41
|
+
}
|
|
42
|
+
// ─── Public API ──────────────────────────────────────────────────────────
|
|
43
|
+
/** Whether the index has been built. */
|
|
44
|
+
get indexed() {
|
|
45
|
+
return this._indexed;
|
|
46
|
+
}
|
|
47
|
+
/** Number of chunks in the store. */
|
|
48
|
+
get chunkCount() {
|
|
49
|
+
return this.store.size;
|
|
50
|
+
}
|
|
51
|
+
/** Number of documents loaded. */
|
|
52
|
+
get documentCount() {
|
|
53
|
+
return this.documents.length;
|
|
54
|
+
}
|
|
55
|
+
/** List of indexed document paths. */
|
|
56
|
+
get documentPaths() {
|
|
57
|
+
return this.documents.map((d) => d.path);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load documents, generate embeddings, and populate the vector store.
|
|
61
|
+
*
|
|
62
|
+
* Idempotent — if already indexed, calling again clears and rebuilds.
|
|
63
|
+
*/
|
|
64
|
+
async index() {
|
|
65
|
+
await this.clear();
|
|
66
|
+
this.logger.info("RAG", `Loading documents from "${this.config.documentsDir}"...`);
|
|
67
|
+
this.documents = (0, document_loader_1.loadDocuments)(this.config.documentsDir, this.config.chunkSize, this.config.chunkOverlap);
|
|
68
|
+
if (this.documents.length === 0) {
|
|
69
|
+
this.logger.warn("RAG", `No supported documents found in "${this.config.documentsDir}".`);
|
|
70
|
+
this._indexed = true;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const allChunks = this.documents.flatMap((d) => d.chunks);
|
|
74
|
+
this.logger.info("RAG", `Loaded ${this.documents.length} document(s), ${allChunks.length} chunk(s).`);
|
|
75
|
+
if (allChunks.length === 0) {
|
|
76
|
+
this._indexed = true;
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Generate embeddings in batches
|
|
80
|
+
this.logger.info("RAG", `Generating embeddings (model: ${this.config.embeddingProvider.model})...`);
|
|
81
|
+
const texts = allChunks.map((c) => c.text);
|
|
82
|
+
const batchSize = 20;
|
|
83
|
+
const embeddings = [];
|
|
84
|
+
for (let i = 0; i < texts.length; i += batchSize) {
|
|
85
|
+
const batch = texts.slice(i, i + batchSize);
|
|
86
|
+
const batchEmbeddings = await this.config.embeddingProvider.embed(batch);
|
|
87
|
+
embeddings.push(...batchEmbeddings);
|
|
88
|
+
}
|
|
89
|
+
// Attach embeddings to chunks
|
|
90
|
+
for (let i = 0; i < allChunks.length; i++) {
|
|
91
|
+
allChunks[i].embedding = embeddings[i];
|
|
92
|
+
}
|
|
93
|
+
await this.store.add(allChunks);
|
|
94
|
+
// Build keyword index for hybrid search (BM25)
|
|
95
|
+
if (this.keywordIndex) {
|
|
96
|
+
this.keywordIndex.add(allChunks);
|
|
97
|
+
}
|
|
98
|
+
this.logger.info("RAG", `Indexing complete — ${this.store.size} chunk(s) in vector store${this.keywordIndex ? `, ${this.keywordIndex.size} in keyword index` : ""}.`);
|
|
99
|
+
this._indexed = true;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Search the knowledge base for chunks relevant to the query.
|
|
103
|
+
*
|
|
104
|
+
* In hybrid mode (hybridSearch: true), runs both vector similarity and
|
|
105
|
+
* BM25 keyword search in parallel, then merges results via RRF.
|
|
106
|
+
*
|
|
107
|
+
* @param query Natural-language search query.
|
|
108
|
+
* @param topK Number of results to return (overrides config default).
|
|
109
|
+
*/
|
|
110
|
+
async search(query, topK) {
|
|
111
|
+
if (!this._indexed || this.store.size === 0) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const k = topK ?? this.config.topK ?? 5;
|
|
115
|
+
// Fetch extra candidates when re-ranking so the re-ranker has more to work with
|
|
116
|
+
const fetchFactor = this.reRanker ? (this.config.hybridRetrievalFactor ?? 3) : 1;
|
|
117
|
+
let results;
|
|
118
|
+
// ── Hybrid mode: vector + BM25 → RRF fusion ──────────────────────
|
|
119
|
+
if (this.keywordIndex) {
|
|
120
|
+
const fetchK = k * fetchFactor;
|
|
121
|
+
const [queryEmbedding] = await this.config.embeddingProvider.embed([query]);
|
|
122
|
+
const [vectorResults, bm25Results] = await Promise.all([
|
|
123
|
+
this.store.search(queryEmbedding, fetchK),
|
|
124
|
+
this.keywordIndex.search(query, fetchK),
|
|
125
|
+
]);
|
|
126
|
+
const vecRanking = vectorResults.map((r) => ({
|
|
127
|
+
chunk: r.chunk,
|
|
128
|
+
score: r.score,
|
|
129
|
+
}));
|
|
130
|
+
const bm25Ranking = bm25Results.map((r) => ({
|
|
131
|
+
chunk: r.chunk,
|
|
132
|
+
score: r.score,
|
|
133
|
+
}));
|
|
134
|
+
const fused = (0, rrf_1.rrfFusion)([vecRanking, bm25Ranking], 60, fetchK);
|
|
135
|
+
results = fused.map((f) => ({
|
|
136
|
+
chunk: f.chunk,
|
|
137
|
+
score: f.rrfScore,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// ── Pure vector mode ─────────────────────────────────────────
|
|
142
|
+
const fetchK = k * fetchFactor;
|
|
143
|
+
const [queryEmbedding] = await this.config.embeddingProvider.embed([query]);
|
|
144
|
+
results = await this.store.search(queryEmbedding, fetchK);
|
|
145
|
+
}
|
|
146
|
+
// ── Re-rank (optional) ────────────────────────────────────────────
|
|
147
|
+
if (this.reRanker && results.length > 0) {
|
|
148
|
+
results = await this.reRanker.rerank(query, results);
|
|
149
|
+
}
|
|
150
|
+
// Take final top-K
|
|
151
|
+
return results.slice(0, k);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Format search results for injection into the LLM context.
|
|
155
|
+
*/
|
|
156
|
+
formatResults(results) {
|
|
157
|
+
if (results.length === 0) {
|
|
158
|
+
return "No relevant documents found in the knowledge base.";
|
|
159
|
+
}
|
|
160
|
+
const lines = [];
|
|
161
|
+
lines.push(`Found ${results.length} relevant document chunk(s):\n`);
|
|
162
|
+
for (let i = 0; i < results.length; i++) {
|
|
163
|
+
const r = results[i];
|
|
164
|
+
lines.push(`### [${i + 1}] ${r.chunk.sourcePath} (chunk ${r.chunk.chunkIndex + 1}, score: ${r.score.toFixed(3)})`);
|
|
165
|
+
lines.push(r.chunk.text);
|
|
166
|
+
lines.push("");
|
|
167
|
+
}
|
|
168
|
+
return lines.join("\n");
|
|
169
|
+
}
|
|
170
|
+
/** Clear all indexed data. */
|
|
171
|
+
async clear() {
|
|
172
|
+
await this.store.clear();
|
|
173
|
+
this.keywordIndex?.clear();
|
|
174
|
+
this.documents = [];
|
|
175
|
+
this._indexed = false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.RAGManager = RAGManager;
|
|
179
|
+
//# sourceMappingURL=rag-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-manager.js","sourceRoot":"","sources":["../../src/rag/rag-manager.ts"],"names":[],"mappings":"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"}
|