@agenticc/core 1.0.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/LICENSE +21 -0
- package/README.md +370 -0
- package/README.zh-CN.md +372 -0
- package/dist/audit/index.d.ts +9 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +9 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/logger.d.ts +211 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +268 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/query.d.ts +164 -0
- package/dist/audit/query.d.ts.map +1 -0
- package/dist/audit/query.js +250 -0
- package/dist/audit/query.js.map +1 -0
- package/dist/conversation/context-builder.d.ts +119 -0
- package/dist/conversation/context-builder.d.ts.map +1 -0
- package/dist/conversation/context-builder.js +252 -0
- package/dist/conversation/context-builder.js.map +1 -0
- package/dist/conversation/index.d.ts +10 -0
- package/dist/conversation/index.d.ts.map +1 -0
- package/dist/conversation/index.js +10 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/message-store.d.ts +231 -0
- package/dist/conversation/message-store.d.ts.map +1 -0
- package/dist/conversation/message-store.js +404 -0
- package/dist/conversation/message-store.js.map +1 -0
- package/dist/conversation/session.d.ts +201 -0
- package/dist/conversation/session.d.ts.map +1 -0
- package/dist/conversation/session.js +285 -0
- package/dist/conversation/session.js.map +1 -0
- package/dist/core/agent.d.ts +277 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +674 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/agentic-loop.d.ts +98 -0
- package/dist/core/agentic-loop.d.ts.map +1 -0
- package/dist/core/agentic-loop.js +496 -0
- package/dist/core/agentic-loop.js.map +1 -0
- package/dist/core/index.d.ts +14 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/intent-parser.d.ts +101 -0
- package/dist/core/intent-parser.d.ts.map +1 -0
- package/dist/core/intent-parser.js +221 -0
- package/dist/core/intent-parser.js.map +1 -0
- package/dist/core/plan-generator.d.ts +133 -0
- package/dist/core/plan-generator.d.ts.map +1 -0
- package/dist/core/plan-generator.js +294 -0
- package/dist/core/plan-generator.js.map +1 -0
- package/dist/core/plugin-manager.d.ts +120 -0
- package/dist/core/plugin-manager.d.ts.map +1 -0
- package/dist/core/plugin-manager.js +369 -0
- package/dist/core/plugin-manager.js.map +1 -0
- package/dist/core/response-handler.d.ts +141 -0
- package/dist/core/response-handler.d.ts.map +1 -0
- package/dist/core/response-handler.js +384 -0
- package/dist/core/response-handler.js.map +1 -0
- package/dist/core/tool-executor.d.ts +143 -0
- package/dist/core/tool-executor.d.ts.map +1 -0
- package/dist/core/tool-executor.js +354 -0
- package/dist/core/tool-executor.js.map +1 -0
- package/dist/core/tool-registry.d.ts +133 -0
- package/dist/core/tool-registry.d.ts.map +1 -0
- package/dist/core/tool-registry.js +252 -0
- package/dist/core/tool-registry.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/chunker.d.ts +78 -0
- package/dist/knowledge/chunker.d.ts.map +1 -0
- package/dist/knowledge/chunker.js +233 -0
- package/dist/knowledge/chunker.js.map +1 -0
- package/dist/knowledge/embedder.d.ts +93 -0
- package/dist/knowledge/embedder.d.ts.map +1 -0
- package/dist/knowledge/embedder.js +205 -0
- package/dist/knowledge/embedder.js.map +1 -0
- package/dist/knowledge/index.d.ts +10 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +11 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/loaders/index.d.ts +10 -0
- package/dist/knowledge/loaders/index.d.ts.map +1 -0
- package/dist/knowledge/loaders/index.js +10 -0
- package/dist/knowledge/loaders/index.js.map +1 -0
- package/dist/knowledge/loaders/markdown.d.ts +88 -0
- package/dist/knowledge/loaders/markdown.d.ts.map +1 -0
- package/dist/knowledge/loaders/markdown.js +205 -0
- package/dist/knowledge/loaders/markdown.js.map +1 -0
- package/dist/knowledge/loaders/yaml.d.ts +112 -0
- package/dist/knowledge/loaders/yaml.d.ts.map +1 -0
- package/dist/knowledge/loaders/yaml.js +368 -0
- package/dist/knowledge/loaders/yaml.js.map +1 -0
- package/dist/knowledge/retriever.d.ts +144 -0
- package/dist/knowledge/retriever.d.ts.map +1 -0
- package/dist/knowledge/retriever.js +399 -0
- package/dist/knowledge/retriever.js.map +1 -0
- package/dist/knowledge/store.d.ts +146 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +420 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/llm/adapter.d.ts +194 -0
- package/dist/llm/adapter.d.ts.map +1 -0
- package/dist/llm/adapter.js +42 -0
- package/dist/llm/adapter.js.map +1 -0
- package/dist/llm/adapters/anyrouter.d.ts +84 -0
- package/dist/llm/adapters/anyrouter.d.ts.map +1 -0
- package/dist/llm/adapters/anyrouter.js +372 -0
- package/dist/llm/adapters/anyrouter.js.map +1 -0
- package/dist/llm/adapters/claude.d.ts +66 -0
- package/dist/llm/adapters/claude.d.ts.map +1 -0
- package/dist/llm/adapters/claude.js +323 -0
- package/dist/llm/adapters/claude.js.map +1 -0
- package/dist/llm/adapters/index.d.ts +12 -0
- package/dist/llm/adapters/index.d.ts.map +1 -0
- package/dist/llm/adapters/index.js +12 -0
- package/dist/llm/adapters/index.js.map +1 -0
- package/dist/llm/adapters/mimo.d.ts +85 -0
- package/dist/llm/adapters/mimo.d.ts.map +1 -0
- package/dist/llm/adapters/mimo.js +316 -0
- package/dist/llm/adapters/mimo.js.map +1 -0
- package/dist/llm/adapters/openai.d.ts +53 -0
- package/dist/llm/adapters/openai.d.ts.map +1 -0
- package/dist/llm/adapters/openai.js +293 -0
- package/dist/llm/adapters/openai.js.map +1 -0
- package/dist/llm/adapters/qwen.d.ts +53 -0
- package/dist/llm/adapters/qwen.d.ts.map +1 -0
- package/dist/llm/adapters/qwen.js +299 -0
- package/dist/llm/adapters/qwen.js.map +1 -0
- package/dist/llm/adapters/siliconflow.d.ts +69 -0
- package/dist/llm/adapters/siliconflow.d.ts.map +1 -0
- package/dist/llm/adapters/siliconflow.js +331 -0
- package/dist/llm/adapters/siliconflow.js.map +1 -0
- package/dist/llm/index.d.ts +9 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +12 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/manager.d.ts +97 -0
- package/dist/llm/manager.d.ts.map +1 -0
- package/dist/llm/manager.js +337 -0
- package/dist/llm/manager.js.map +1 -0
- package/dist/test-utils/arbitraries.d.ts +230 -0
- package/dist/test-utils/arbitraries.d.ts.map +1 -0
- package/dist/test-utils/arbitraries.js +280 -0
- package/dist/test-utils/arbitraries.js.map +1 -0
- package/dist/test-utils/cleanup.d.ts +184 -0
- package/dist/test-utils/cleanup.d.ts.map +1 -0
- package/dist/test-utils/cleanup.js +282 -0
- package/dist/test-utils/cleanup.js.map +1 -0
- package/dist/test-utils/config.d.ts +80 -0
- package/dist/test-utils/config.d.ts.map +1 -0
- package/dist/test-utils/config.js +94 -0
- package/dist/test-utils/config.js.map +1 -0
- package/dist/test-utils/index.d.ts +10 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +36 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/mocks.d.ts +170 -0
- package/dist/test-utils/mocks.d.ts.map +1 -0
- package/dist/test-utils/mocks.js +281 -0
- package/dist/test-utils/mocks.js.map +1 -0
- package/dist/types/config.d.ts +170 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +120 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/knowledge.d.ts +95 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +7 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/loop.d.ts +148 -0
- package/dist/types/loop.d.ts.map +1 -0
- package/dist/types/loop.js +16 -0
- package/dist/types/loop.js.map +1 -0
- package/dist/types/plugin.d.ts +137 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +15 -0
- package/dist/types/plugin.js.map +1 -0
- package/dist/types/response.d.ts +186 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +99 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/streaming.d.ts +478 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/types/streaming.js +483 -0
- package/dist/types/streaming.js.map +1 -0
- package/dist/types/tool.d.ts +118 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +42 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/error.d.ts +22 -0
- package/dist/utils/error.d.ts.map +1 -0
- package/dist/utils/error.js +36 -0
- package/dist/utils/error.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Retriever
|
|
3
|
+
*
|
|
4
|
+
* Provides advanced retrieval capabilities including keyword search,
|
|
5
|
+
* semantic search, and hybrid search with knowledge sufficiency assessment.
|
|
6
|
+
*
|
|
7
|
+
* _Requirements: 3.2, 3.3, 3.4, 5.1, 5.2_
|
|
8
|
+
*/
|
|
9
|
+
import { cosineSimilarity } from './embedder.js';
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
defaultTopK: 10,
|
|
12
|
+
defaultMinScore: 0.3,
|
|
13
|
+
keywordWeight: 0.3,
|
|
14
|
+
semanticWeight: 0.7,
|
|
15
|
+
sufficientThreshold: 0.7,
|
|
16
|
+
ambiguousThreshold: 0.4,
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Knowledge Retriever class
|
|
20
|
+
*
|
|
21
|
+
* Provides keyword, semantic, and hybrid search capabilities
|
|
22
|
+
* with knowledge sufficiency assessment.
|
|
23
|
+
*/
|
|
24
|
+
export class Retriever {
|
|
25
|
+
store;
|
|
26
|
+
embedder;
|
|
27
|
+
config;
|
|
28
|
+
constructor(store, embedder, config) {
|
|
29
|
+
this.store = store;
|
|
30
|
+
this.embedder = embedder;
|
|
31
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search the knowledge base
|
|
35
|
+
*
|
|
36
|
+
* @param query - Search query string
|
|
37
|
+
* @param options - Search options
|
|
38
|
+
* @returns Array of search results sorted by relevance
|
|
39
|
+
*/
|
|
40
|
+
async search(query, options) {
|
|
41
|
+
const method = options?.method ?? 'hybrid';
|
|
42
|
+
const topK = options?.topK ?? this.config.defaultTopK;
|
|
43
|
+
const minScore = options?.minScore ?? this.config.defaultMinScore;
|
|
44
|
+
const category = options?.category;
|
|
45
|
+
let results;
|
|
46
|
+
switch (method) {
|
|
47
|
+
case 'keyword':
|
|
48
|
+
results = await this.keywordSearch(query, category);
|
|
49
|
+
break;
|
|
50
|
+
case 'semantic':
|
|
51
|
+
results = await this.semanticSearch(query, category);
|
|
52
|
+
break;
|
|
53
|
+
case 'hybrid':
|
|
54
|
+
default:
|
|
55
|
+
results = await this.hybridSearch(query, category);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
// Filter by minimum score and limit results
|
|
59
|
+
// Results are already sorted by score descending
|
|
60
|
+
return results.filter((r) => r.score >= minScore).slice(0, topK);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Keyword-based search using text matching
|
|
64
|
+
*
|
|
65
|
+
* Implements simple keyword matching with term frequency scoring.
|
|
66
|
+
* Supports category filtering.
|
|
67
|
+
*
|
|
68
|
+
* _Requirements: 3.4_
|
|
69
|
+
*
|
|
70
|
+
* @param query - Search query
|
|
71
|
+
* @param category - Optional category filter
|
|
72
|
+
* @returns Search results sorted by score descending
|
|
73
|
+
*/
|
|
74
|
+
async keywordSearch(query, category) {
|
|
75
|
+
const documents = await this.store.getAllDocuments();
|
|
76
|
+
const matches = this.performKeywordMatch(query, documents, category);
|
|
77
|
+
// Convert to SearchResult and sort by score descending
|
|
78
|
+
return matches
|
|
79
|
+
.map((match) => ({
|
|
80
|
+
document: match.document,
|
|
81
|
+
score: match.score,
|
|
82
|
+
confidence: this.scoreToConfidence(match.score),
|
|
83
|
+
}))
|
|
84
|
+
.sort((a, b) => b.score - a.score);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Perform keyword matching on documents
|
|
88
|
+
*/
|
|
89
|
+
performKeywordMatch(query, documents, category) {
|
|
90
|
+
const queryLower = query.toLowerCase();
|
|
91
|
+
const queryTerms = this.tokenize(queryLower);
|
|
92
|
+
if (queryTerms.length === 0) {
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
const matches = [];
|
|
96
|
+
for (const doc of documents) {
|
|
97
|
+
// Filter by category if specified
|
|
98
|
+
if (category && doc.category !== category) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const contentLower = doc.content.toLowerCase();
|
|
102
|
+
const titleLower = (doc.title ?? '').toLowerCase();
|
|
103
|
+
const combinedText = `${titleLower} ${contentLower}`;
|
|
104
|
+
// Calculate term frequency score
|
|
105
|
+
const matchedTerms = [];
|
|
106
|
+
let totalScore = 0;
|
|
107
|
+
for (const term of queryTerms) {
|
|
108
|
+
// Check for exact term match
|
|
109
|
+
if (combinedText.includes(term)) {
|
|
110
|
+
matchedTerms.push(term);
|
|
111
|
+
// Count occurrences for TF scoring
|
|
112
|
+
const regex = new RegExp(this.escapeRegex(term), 'gi');
|
|
113
|
+
const occurrences = (combinedText.match(regex) || []).length;
|
|
114
|
+
// TF score with diminishing returns
|
|
115
|
+
totalScore += Math.log(1 + occurrences);
|
|
116
|
+
// Boost for title matches
|
|
117
|
+
if (titleLower.includes(term)) {
|
|
118
|
+
totalScore += 0.5;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (matchedTerms.length > 0) {
|
|
123
|
+
// Normalize score by query length and document length
|
|
124
|
+
const coverageScore = matchedTerms.length / queryTerms.length;
|
|
125
|
+
const lengthNorm = 1 / Math.sqrt(combinedText.length / 1000 + 1);
|
|
126
|
+
const finalScore = Math.min(1, (totalScore * coverageScore * lengthNorm) / queryTerms.length);
|
|
127
|
+
matches.push({
|
|
128
|
+
document: doc,
|
|
129
|
+
score: finalScore,
|
|
130
|
+
matchedTerms,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return matches;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Semantic search using embedding similarity
|
|
138
|
+
*
|
|
139
|
+
* Uses vector similarity to find semantically related documents.
|
|
140
|
+
* Falls back to keyword search if embedder is not available.
|
|
141
|
+
*
|
|
142
|
+
* _Requirements: 3.3_
|
|
143
|
+
*
|
|
144
|
+
* @param query - Search query
|
|
145
|
+
* @param category - Optional category filter
|
|
146
|
+
* @returns Search results sorted by score descending
|
|
147
|
+
*/
|
|
148
|
+
async semanticSearch(query, category) {
|
|
149
|
+
// Fall back to keyword search if no embedder
|
|
150
|
+
if (!this.embedder) {
|
|
151
|
+
return this.keywordSearch(query, category);
|
|
152
|
+
}
|
|
153
|
+
// Generate query embedding
|
|
154
|
+
let queryEmbedding;
|
|
155
|
+
try {
|
|
156
|
+
const result = await this.embedder.embed(query);
|
|
157
|
+
queryEmbedding = result.embedding;
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
console.warn('Failed to generate query embedding, falling back to keyword search:', error);
|
|
161
|
+
return this.keywordSearch(query, category);
|
|
162
|
+
}
|
|
163
|
+
const documents = await this.store.getAllDocuments();
|
|
164
|
+
const matches = await this.performSemanticMatch(queryEmbedding, documents, category);
|
|
165
|
+
// Convert to SearchResult and sort by score descending
|
|
166
|
+
return matches
|
|
167
|
+
.map((match) => ({
|
|
168
|
+
document: match.document,
|
|
169
|
+
score: match.score,
|
|
170
|
+
confidence: this.scoreToConfidence(match.score),
|
|
171
|
+
}))
|
|
172
|
+
.sort((a, b) => b.score - a.score);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Perform semantic matching on documents
|
|
176
|
+
*/
|
|
177
|
+
async performSemanticMatch(queryEmbedding, documents, category) {
|
|
178
|
+
const matches = [];
|
|
179
|
+
for (const doc of documents) {
|
|
180
|
+
// Filter by category if specified
|
|
181
|
+
if (category && doc.category !== category) {
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Get document embedding from store
|
|
185
|
+
const docEmbedding = this.store.getEmbedding(doc.id);
|
|
186
|
+
if (!docEmbedding || docEmbedding.length === 0) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
// Calculate cosine similarity
|
|
190
|
+
try {
|
|
191
|
+
const similarity = cosineSimilarity(queryEmbedding, docEmbedding);
|
|
192
|
+
// Normalize to 0-1 range (cosine similarity is -1 to 1)
|
|
193
|
+
const normalizedScore = (similarity + 1) / 2;
|
|
194
|
+
matches.push({
|
|
195
|
+
document: doc,
|
|
196
|
+
score: normalizedScore,
|
|
197
|
+
embedding: docEmbedding,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
// Skip documents with incompatible embeddings
|
|
202
|
+
console.warn(`Skipping document ${doc.id} due to embedding error:`, error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return matches;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Hybrid search combining keyword and semantic results
|
|
209
|
+
*
|
|
210
|
+
* Merges results from both methods with configurable weights.
|
|
211
|
+
* Deduplicates and re-ranks results.
|
|
212
|
+
*
|
|
213
|
+
* _Requirements: 3.2_
|
|
214
|
+
*
|
|
215
|
+
* @param query - Search query
|
|
216
|
+
* @param category - Optional category filter
|
|
217
|
+
* @returns Search results sorted by combined score descending
|
|
218
|
+
*/
|
|
219
|
+
async hybridSearch(query, category) {
|
|
220
|
+
// Get results from both methods
|
|
221
|
+
const keywordResults = await this.keywordSearch(query, category);
|
|
222
|
+
const semanticResults = await this.semanticSearch(query, category);
|
|
223
|
+
// Merge results with weighted scores
|
|
224
|
+
const scoreMap = new Map();
|
|
225
|
+
for (const result of keywordResults) {
|
|
226
|
+
scoreMap.set(result.document.id, {
|
|
227
|
+
keyword: result.score,
|
|
228
|
+
semantic: 0,
|
|
229
|
+
document: result.document,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
for (const result of semanticResults) {
|
|
233
|
+
const existing = scoreMap.get(result.document.id);
|
|
234
|
+
if (existing) {
|
|
235
|
+
existing.semantic = result.score;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
scoreMap.set(result.document.id, {
|
|
239
|
+
keyword: 0,
|
|
240
|
+
semantic: result.score,
|
|
241
|
+
document: result.document,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Calculate combined scores
|
|
246
|
+
const results = [];
|
|
247
|
+
for (const [, scores] of scoreMap.entries()) {
|
|
248
|
+
const combinedScore = scores.keyword * this.config.keywordWeight + scores.semantic * this.config.semanticWeight;
|
|
249
|
+
results.push({
|
|
250
|
+
document: scores.document,
|
|
251
|
+
score: combinedScore,
|
|
252
|
+
confidence: this.scoreToConfidence(combinedScore),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Sort by score descending
|
|
256
|
+
return results.sort((a, b) => b.score - a.score);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Assess knowledge sufficiency for a given intent
|
|
260
|
+
*
|
|
261
|
+
* Evaluates whether the retrieved knowledge is sufficient
|
|
262
|
+
* to answer the user's query.
|
|
263
|
+
*
|
|
264
|
+
* _Requirements: 5.1, 5.2_
|
|
265
|
+
*
|
|
266
|
+
* @param results - Search results to assess
|
|
267
|
+
* @param intent - User intent information
|
|
268
|
+
* @returns Knowledge assessment with status and confidence
|
|
269
|
+
*/
|
|
270
|
+
assessKnowledge(results, intent) {
|
|
271
|
+
// No results - insufficient knowledge
|
|
272
|
+
if (results.length === 0) {
|
|
273
|
+
return {
|
|
274
|
+
status: 'insufficient',
|
|
275
|
+
confidence: 0,
|
|
276
|
+
missingTopic: intent.requiredTopics?.[0] ?? intent.action,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// Calculate overall confidence from top results
|
|
280
|
+
const topResults = results.slice(0, 5);
|
|
281
|
+
const avgScore = topResults.reduce((sum, r) => sum + r.score, 0) / topResults.length;
|
|
282
|
+
const maxScore = Math.max(...topResults.map((r) => r.score));
|
|
283
|
+
// Check if required topics are covered
|
|
284
|
+
const coveredTopics = this.findCoveredTopics(results, intent);
|
|
285
|
+
const requiredTopics = intent.requiredTopics ?? [intent.action];
|
|
286
|
+
const missingTopics = requiredTopics.filter((t) => !coveredTopics.has(t.toLowerCase()));
|
|
287
|
+
// Determine status based on scores and coverage
|
|
288
|
+
if (maxScore >= this.config.sufficientThreshold && missingTopics.length === 0) {
|
|
289
|
+
return {
|
|
290
|
+
status: 'sufficient',
|
|
291
|
+
confidence: avgScore,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
if (maxScore >= this.config.ambiguousThreshold) {
|
|
295
|
+
// Check for ambiguity - multiple high-scoring but different results
|
|
296
|
+
const highScoreResults = results.filter((r) => r.score >= this.config.ambiguousThreshold);
|
|
297
|
+
if (highScoreResults.length > 1) {
|
|
298
|
+
const categories = new Set(highScoreResults.map((r) => r.document.category));
|
|
299
|
+
if (categories.size > 1) {
|
|
300
|
+
// Multiple categories with high scores - ambiguous
|
|
301
|
+
return {
|
|
302
|
+
status: 'ambiguous',
|
|
303
|
+
confidence: avgScore,
|
|
304
|
+
alternatives: Array.from(categories).map((cat) => ({
|
|
305
|
+
interpretation: cat,
|
|
306
|
+
confidence: highScoreResults
|
|
307
|
+
.filter((r) => r.document.category === cat)
|
|
308
|
+
.reduce((sum, r) => sum + r.score, 0) / highScoreResults.length,
|
|
309
|
+
})),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Partial coverage
|
|
314
|
+
if (missingTopics.length > 0) {
|
|
315
|
+
return {
|
|
316
|
+
status: 'insufficient',
|
|
317
|
+
confidence: avgScore,
|
|
318
|
+
missingTopic: missingTopics[0],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
return {
|
|
322
|
+
status: 'sufficient',
|
|
323
|
+
confidence: avgScore,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// Low scores - insufficient
|
|
327
|
+
return {
|
|
328
|
+
status: 'insufficient',
|
|
329
|
+
confidence: avgScore,
|
|
330
|
+
missingTopic: missingTopics[0] ?? intent.action,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Find topics covered by search results
|
|
335
|
+
*/
|
|
336
|
+
findCoveredTopics(results, intent) {
|
|
337
|
+
const covered = new Set();
|
|
338
|
+
for (const result of results) {
|
|
339
|
+
const content = `${result.document.title ?? ''} ${result.document.content}`.toLowerCase();
|
|
340
|
+
// Check action
|
|
341
|
+
if (content.includes(intent.action.toLowerCase())) {
|
|
342
|
+
covered.add(intent.action.toLowerCase());
|
|
343
|
+
}
|
|
344
|
+
// Check entities
|
|
345
|
+
for (const entity of intent.entities) {
|
|
346
|
+
if (content.includes(entity.toLowerCase())) {
|
|
347
|
+
covered.add(entity.toLowerCase());
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Check required topics
|
|
351
|
+
for (const topic of intent.requiredTopics ?? []) {
|
|
352
|
+
if (content.includes(topic.toLowerCase())) {
|
|
353
|
+
covered.add(topic.toLowerCase());
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Add category as covered topic
|
|
357
|
+
covered.add(result.document.category.toLowerCase());
|
|
358
|
+
}
|
|
359
|
+
return covered;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Tokenize text into search terms
|
|
363
|
+
*/
|
|
364
|
+
tokenize(text) {
|
|
365
|
+
return text
|
|
366
|
+
.split(/\s+/)
|
|
367
|
+
.map((t) => t.replace(/[^\w\u4e00-\u9fff]/g, '')) // Keep alphanumeric and Chinese chars
|
|
368
|
+
.filter((t) => t.length > 0);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Escape special regex characters
|
|
372
|
+
*/
|
|
373
|
+
escapeRegex(str) {
|
|
374
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Convert score to confidence level
|
|
378
|
+
*/
|
|
379
|
+
scoreToConfidence(score) {
|
|
380
|
+
if (score >= 0.7)
|
|
381
|
+
return 'high';
|
|
382
|
+
if (score >= 0.4)
|
|
383
|
+
return 'medium';
|
|
384
|
+
return 'low';
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Get retriever configuration
|
|
388
|
+
*/
|
|
389
|
+
getConfig() {
|
|
390
|
+
return { ...this.config };
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Update retriever configuration
|
|
394
|
+
*/
|
|
395
|
+
updateConfig(config) {
|
|
396
|
+
this.config = { ...this.config, ...config };
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../src/knowledge/retriever.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Store
|
|
3
|
+
*
|
|
4
|
+
* In-memory document storage with semantic search for RAG (Retrieval-Augmented Generation).
|
|
5
|
+
*
|
|
6
|
+
* **Why In-Memory?**
|
|
7
|
+
* - RAG requires fast semantic search during conversation processing
|
|
8
|
+
* - Documents are typically loaded at application startup
|
|
9
|
+
* - Embeddings are expensive to generate (cached in memory for performance)
|
|
10
|
+
* - Conversation history is stored externally (database), but knowledge is cached
|
|
11
|
+
*
|
|
12
|
+
* **Design Philosophy:**
|
|
13
|
+
* - Knowledge documents are relatively static (updated infrequently)
|
|
14
|
+
* - Fast retrieval is critical for responsive agent interactions
|
|
15
|
+
* - In-memory storage provides sub-millisecond search performance
|
|
16
|
+
* - For large knowledge bases, consider implementing pagination or lazy loading
|
|
17
|
+
*
|
|
18
|
+
* **For Production:**
|
|
19
|
+
* - Load documents at startup from files or database
|
|
20
|
+
* - Use document versioning to detect changes
|
|
21
|
+
* - Implement periodic refresh if documents change
|
|
22
|
+
* - Consider distributed caching (Redis) for multi-instance deployments
|
|
23
|
+
*
|
|
24
|
+
* Handles storage and retrieval of knowledge documents.
|
|
25
|
+
* Supports document CRUD operations with embedding generation.
|
|
26
|
+
* Includes automatic text chunking for large documents.
|
|
27
|
+
*
|
|
28
|
+
* _Requirements: 3.1, 3.5, 3.6_
|
|
29
|
+
*/
|
|
30
|
+
import type { Document, DocumentInput, KnowledgeBase, SearchOptions, SearchResult } from '../types/knowledge.js';
|
|
31
|
+
import type { Embedder } from './embedder.js';
|
|
32
|
+
import { type ChunkerConfig } from './chunker.js';
|
|
33
|
+
/**
|
|
34
|
+
* Knowledge store configuration
|
|
35
|
+
*/
|
|
36
|
+
export interface KnowledgeStoreConfig {
|
|
37
|
+
/** Embedder instance for generating embeddings */
|
|
38
|
+
embedder?: Embedder;
|
|
39
|
+
/** Whether to generate embeddings on document add */
|
|
40
|
+
generateEmbeddings?: boolean;
|
|
41
|
+
/** Default number of results for search */
|
|
42
|
+
defaultTopK?: number;
|
|
43
|
+
/** Default minimum score for search results */
|
|
44
|
+
defaultMinScore?: number;
|
|
45
|
+
/** Chunker configuration */
|
|
46
|
+
chunkerConfig?: ChunkerConfig;
|
|
47
|
+
/** Whether to enable chunking for large documents */
|
|
48
|
+
enableChunking?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* In-memory Knowledge Store implementation
|
|
52
|
+
*
|
|
53
|
+
* Provides document storage with optional embedding generation
|
|
54
|
+
* and semantic search capabilities.
|
|
55
|
+
*/
|
|
56
|
+
export declare class KnowledgeStore implements KnowledgeBase {
|
|
57
|
+
private documents;
|
|
58
|
+
private config;
|
|
59
|
+
private chunker;
|
|
60
|
+
constructor(config?: KnowledgeStoreConfig);
|
|
61
|
+
/**
|
|
62
|
+
* Add a document to the knowledge base
|
|
63
|
+
* Generates embedding if embedder is configured
|
|
64
|
+
* Automatically chunks large documents
|
|
65
|
+
*
|
|
66
|
+
* @returns Document ID (or parent document ID if chunked)
|
|
67
|
+
*/
|
|
68
|
+
addDocument(doc: DocumentInput): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Add a single document (no chunking)
|
|
71
|
+
*/
|
|
72
|
+
private addSingleDocument;
|
|
73
|
+
/**
|
|
74
|
+
* Add a large document by chunking it
|
|
75
|
+
*/
|
|
76
|
+
private addChunkedDocument;
|
|
77
|
+
/**
|
|
78
|
+
* Get a document by ID
|
|
79
|
+
*/
|
|
80
|
+
getDocument(id: string): Promise<Document | null>;
|
|
81
|
+
/**
|
|
82
|
+
* Delete a document by ID
|
|
83
|
+
*/
|
|
84
|
+
deleteDocument(id: string): Promise<boolean>;
|
|
85
|
+
/**
|
|
86
|
+
* Update a document
|
|
87
|
+
*/
|
|
88
|
+
updateDocument(id: string, updates: Partial<DocumentInput>): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Search the knowledge base
|
|
91
|
+
*/
|
|
92
|
+
search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
|
|
93
|
+
/**
|
|
94
|
+
* List all categories
|
|
95
|
+
*/
|
|
96
|
+
listCategories(): Promise<string[]>;
|
|
97
|
+
/**
|
|
98
|
+
* Get documents by category
|
|
99
|
+
*/
|
|
100
|
+
getDocumentsByCategory(category: string): Promise<Document[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Get all documents
|
|
103
|
+
*/
|
|
104
|
+
getAllDocuments(): Promise<Document[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Get document count
|
|
107
|
+
*/
|
|
108
|
+
getDocumentCount(): number;
|
|
109
|
+
/**
|
|
110
|
+
* Check if a document has an embedding
|
|
111
|
+
*/
|
|
112
|
+
hasEmbedding(id: string): boolean;
|
|
113
|
+
/**
|
|
114
|
+
* Get the embedding for a document
|
|
115
|
+
*/
|
|
116
|
+
getEmbedding(id: string): number[] | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* Get the embedding dimension (from first document with embedding)
|
|
119
|
+
*/
|
|
120
|
+
getEmbeddingDimension(): number | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Clear all documents
|
|
123
|
+
*/
|
|
124
|
+
clear(): void;
|
|
125
|
+
/**
|
|
126
|
+
* Keyword-based search using simple text matching
|
|
127
|
+
*/
|
|
128
|
+
private keywordSearch;
|
|
129
|
+
/**
|
|
130
|
+
* Semantic search using embedding similarity
|
|
131
|
+
*/
|
|
132
|
+
private semanticSearch;
|
|
133
|
+
/**
|
|
134
|
+
* Hybrid search combining keyword and semantic results
|
|
135
|
+
*/
|
|
136
|
+
private hybridSearch;
|
|
137
|
+
/**
|
|
138
|
+
* Convert score to confidence level
|
|
139
|
+
*/
|
|
140
|
+
private scoreToConfidence;
|
|
141
|
+
/**
|
|
142
|
+
* Convert stored document to public document (without embedding)
|
|
143
|
+
*/
|
|
144
|
+
private toDocument;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/knowledge/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB/D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAcD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,MAAM,CAGZ;IACF,OAAO,CAAC,OAAO,CAAc;gBAEjB,MAAM,CAAC,EAAE,oBAAoB;IAKzC;;;;;;OAMG;IACG,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD;;OAEG;YACW,iBAAiB;IA6C/B;;OAEG;YACW,kBAAkB;IAsChC;;OAEG;IACG,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAWvD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD;;OAEG;IACG,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAqCnF;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB7E;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAUzC;;OAEG;IACG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAYnE;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAI5C;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKjC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAI9C;;OAEG;IACH,qBAAqB,IAAI,MAAM,GAAG,SAAS;IAS3C;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;YACW,cAAc;IAmD5B;;OAEG;YACW,YAAY;IA2C1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,UAAU;CAWnB"}
|