@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,420 @@
|
|
|
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 { v4 as uuidv4 } from 'uuid';
|
|
31
|
+
import { cosineSimilarity } from './embedder.js';
|
|
32
|
+
import { TextChunker } from './chunker.js';
|
|
33
|
+
const DEFAULT_CONFIG = {
|
|
34
|
+
embedder: undefined,
|
|
35
|
+
generateEmbeddings: true,
|
|
36
|
+
defaultTopK: 10,
|
|
37
|
+
defaultMinScore: 0.5,
|
|
38
|
+
chunkerConfig: undefined,
|
|
39
|
+
enableChunking: true,
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* In-memory Knowledge Store implementation
|
|
43
|
+
*
|
|
44
|
+
* Provides document storage with optional embedding generation
|
|
45
|
+
* and semantic search capabilities.
|
|
46
|
+
*/
|
|
47
|
+
export class KnowledgeStore {
|
|
48
|
+
documents = new Map();
|
|
49
|
+
config;
|
|
50
|
+
chunker;
|
|
51
|
+
constructor(config) {
|
|
52
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
53
|
+
this.chunker = new TextChunker(config?.chunkerConfig);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Add a document to the knowledge base
|
|
57
|
+
* Generates embedding if embedder is configured
|
|
58
|
+
* Automatically chunks large documents
|
|
59
|
+
*
|
|
60
|
+
* @returns Document ID (or parent document ID if chunked)
|
|
61
|
+
*/
|
|
62
|
+
async addDocument(doc) {
|
|
63
|
+
// Check if document needs chunking
|
|
64
|
+
if (this.config.enableChunking && this.chunker.needsChunking(doc.content)) {
|
|
65
|
+
return this.addChunkedDocument(doc);
|
|
66
|
+
}
|
|
67
|
+
return this.addSingleDocument(doc);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Add a single document (no chunking)
|
|
71
|
+
*/
|
|
72
|
+
async addSingleDocument(doc, chunkInfo) {
|
|
73
|
+
const id = uuidv4();
|
|
74
|
+
const now = new Date();
|
|
75
|
+
let embedding;
|
|
76
|
+
// Generate embedding if configured
|
|
77
|
+
if (this.config.generateEmbeddings && this.config.embedder) {
|
|
78
|
+
try {
|
|
79
|
+
const result = await this.config.embedder.embed(doc.content);
|
|
80
|
+
embedding = result.embedding;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.warn('Failed to generate embedding:', error);
|
|
84
|
+
// Continue without embedding
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const storedDoc = {
|
|
88
|
+
id,
|
|
89
|
+
category: doc.category,
|
|
90
|
+
title: doc.title,
|
|
91
|
+
content: doc.content,
|
|
92
|
+
metadata: doc.metadata ?? {},
|
|
93
|
+
embedding,
|
|
94
|
+
createdAt: now,
|
|
95
|
+
updatedAt: now,
|
|
96
|
+
...(chunkInfo && {
|
|
97
|
+
parentId: chunkInfo.parentId,
|
|
98
|
+
chunkIndex: chunkInfo.chunkIndex,
|
|
99
|
+
totalChunks: chunkInfo.totalChunks,
|
|
100
|
+
}),
|
|
101
|
+
};
|
|
102
|
+
this.documents.set(id, storedDoc);
|
|
103
|
+
return id;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Add a large document by chunking it
|
|
107
|
+
*/
|
|
108
|
+
async addChunkedDocument(doc) {
|
|
109
|
+
const parentId = uuidv4();
|
|
110
|
+
const chunks = this.chunker.chunk(doc.content);
|
|
111
|
+
const totalChunks = chunks.length;
|
|
112
|
+
console.log(`Chunking document "${doc.title}" into ${totalChunks} chunks`);
|
|
113
|
+
// Add each chunk as a separate document
|
|
114
|
+
for (const chunk of chunks) {
|
|
115
|
+
const chunkTitle = doc.title
|
|
116
|
+
? `${doc.title} [${chunk.index + 1}/${totalChunks}]`
|
|
117
|
+
: `Chunk ${chunk.index + 1}/${totalChunks}`;
|
|
118
|
+
await this.addSingleDocument({
|
|
119
|
+
category: doc.category,
|
|
120
|
+
title: chunkTitle,
|
|
121
|
+
content: chunk.content,
|
|
122
|
+
metadata: {
|
|
123
|
+
...doc.metadata,
|
|
124
|
+
_isChunk: true,
|
|
125
|
+
_chunkIndex: chunk.index,
|
|
126
|
+
_totalChunks: totalChunks,
|
|
127
|
+
_startPos: chunk.startPos,
|
|
128
|
+
_endPos: chunk.endPos,
|
|
129
|
+
},
|
|
130
|
+
}, {
|
|
131
|
+
parentId,
|
|
132
|
+
chunkIndex: chunk.index,
|
|
133
|
+
totalChunks,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return parentId;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get a document by ID
|
|
140
|
+
*/
|
|
141
|
+
async getDocument(id) {
|
|
142
|
+
const doc = this.documents.get(id);
|
|
143
|
+
if (!doc) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
// Return without embedding (internal detail)
|
|
147
|
+
return this.toDocument(doc);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Delete a document by ID
|
|
151
|
+
*/
|
|
152
|
+
async deleteDocument(id) {
|
|
153
|
+
return this.documents.delete(id);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Update a document
|
|
157
|
+
*/
|
|
158
|
+
async updateDocument(id, updates) {
|
|
159
|
+
const doc = this.documents.get(id);
|
|
160
|
+
if (!doc) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// Update fields
|
|
164
|
+
if (updates.category !== undefined) {
|
|
165
|
+
doc.category = updates.category;
|
|
166
|
+
}
|
|
167
|
+
if (updates.title !== undefined) {
|
|
168
|
+
doc.title = updates.title;
|
|
169
|
+
}
|
|
170
|
+
if (updates.metadata !== undefined) {
|
|
171
|
+
doc.metadata = updates.metadata;
|
|
172
|
+
}
|
|
173
|
+
// If content changed, regenerate embedding
|
|
174
|
+
if (updates.content !== undefined) {
|
|
175
|
+
doc.content = updates.content;
|
|
176
|
+
if (this.config.generateEmbeddings && this.config.embedder) {
|
|
177
|
+
try {
|
|
178
|
+
const result = await this.config.embedder.embed(updates.content);
|
|
179
|
+
doc.embedding = result.embedding;
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
console.warn('Failed to regenerate embedding:', error);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
doc.updatedAt = new Date();
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Search the knowledge base
|
|
191
|
+
*/
|
|
192
|
+
async search(query, options) {
|
|
193
|
+
const method = options?.method ?? 'hybrid';
|
|
194
|
+
const topK = options?.topK ?? this.config.defaultTopK;
|
|
195
|
+
const minScore = options?.minScore ?? this.config.defaultMinScore;
|
|
196
|
+
const category = options?.category;
|
|
197
|
+
let results;
|
|
198
|
+
switch (method) {
|
|
199
|
+
case 'keyword':
|
|
200
|
+
results = this.keywordSearch(query, category);
|
|
201
|
+
break;
|
|
202
|
+
case 'semantic':
|
|
203
|
+
results = await this.semanticSearch(query, category);
|
|
204
|
+
break;
|
|
205
|
+
case 'hybrid':
|
|
206
|
+
default:
|
|
207
|
+
results = await this.hybridSearch(query, category);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
// Filter by minimum score and limit results
|
|
211
|
+
return results.filter((r) => r.score >= minScore).slice(0, topK);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* List all categories
|
|
215
|
+
*/
|
|
216
|
+
async listCategories() {
|
|
217
|
+
const categories = new Set();
|
|
218
|
+
for (const doc of this.documents.values()) {
|
|
219
|
+
categories.add(doc.category);
|
|
220
|
+
}
|
|
221
|
+
return Array.from(categories).sort();
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Get documents by category
|
|
225
|
+
*/
|
|
226
|
+
async getDocumentsByCategory(category) {
|
|
227
|
+
const results = [];
|
|
228
|
+
for (const doc of this.documents.values()) {
|
|
229
|
+
if (doc.category === category) {
|
|
230
|
+
results.push(this.toDocument(doc));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get all documents
|
|
237
|
+
*/
|
|
238
|
+
async getAllDocuments() {
|
|
239
|
+
return Array.from(this.documents.values()).map((doc) => this.toDocument(doc));
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Get document count
|
|
243
|
+
*/
|
|
244
|
+
getDocumentCount() {
|
|
245
|
+
return this.documents.size;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Check if a document has an embedding
|
|
249
|
+
*/
|
|
250
|
+
hasEmbedding(id) {
|
|
251
|
+
const doc = this.documents.get(id);
|
|
252
|
+
return doc?.embedding !== undefined && doc.embedding.length > 0;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Get the embedding for a document
|
|
256
|
+
*/
|
|
257
|
+
getEmbedding(id) {
|
|
258
|
+
return this.documents.get(id)?.embedding;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get the embedding dimension (from first document with embedding)
|
|
262
|
+
*/
|
|
263
|
+
getEmbeddingDimension() {
|
|
264
|
+
for (const doc of this.documents.values()) {
|
|
265
|
+
if (doc.embedding && doc.embedding.length > 0) {
|
|
266
|
+
return doc.embedding.length;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Clear all documents
|
|
273
|
+
*/
|
|
274
|
+
clear() {
|
|
275
|
+
this.documents.clear();
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Keyword-based search using simple text matching
|
|
279
|
+
*/
|
|
280
|
+
keywordSearch(query, category) {
|
|
281
|
+
const queryLower = query.toLowerCase();
|
|
282
|
+
const queryTerms = queryLower.split(/\s+/).filter((t) => t.length > 0);
|
|
283
|
+
const results = [];
|
|
284
|
+
for (const doc of this.documents.values()) {
|
|
285
|
+
// Filter by category if specified
|
|
286
|
+
if (category && doc.category !== category) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
const contentLower = doc.content.toLowerCase();
|
|
290
|
+
const titleLower = (doc.title ?? '').toLowerCase();
|
|
291
|
+
// Calculate keyword match score
|
|
292
|
+
let matchCount = 0;
|
|
293
|
+
for (const term of queryTerms) {
|
|
294
|
+
if (contentLower.includes(term) || titleLower.includes(term)) {
|
|
295
|
+
matchCount++;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
if (matchCount > 0) {
|
|
299
|
+
const score = matchCount / queryTerms.length;
|
|
300
|
+
results.push({
|
|
301
|
+
document: this.toDocument(doc),
|
|
302
|
+
score,
|
|
303
|
+
confidence: this.scoreToConfidence(score),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Sort by score descending
|
|
308
|
+
return results.sort((a, b) => b.score - a.score);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Semantic search using embedding similarity
|
|
312
|
+
*/
|
|
313
|
+
async semanticSearch(query, category) {
|
|
314
|
+
if (!this.config.embedder) {
|
|
315
|
+
// Fall back to keyword search if no embedder
|
|
316
|
+
return this.keywordSearch(query, category);
|
|
317
|
+
}
|
|
318
|
+
// Generate query embedding
|
|
319
|
+
let queryEmbedding;
|
|
320
|
+
try {
|
|
321
|
+
const result = await this.config.embedder.embed(query);
|
|
322
|
+
queryEmbedding = result.embedding;
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
console.warn('Failed to generate query embedding:', error);
|
|
326
|
+
return this.keywordSearch(query, category);
|
|
327
|
+
}
|
|
328
|
+
const results = [];
|
|
329
|
+
for (const doc of this.documents.values()) {
|
|
330
|
+
// Filter by category if specified
|
|
331
|
+
if (category && doc.category !== category) {
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
// Skip documents without embeddings
|
|
335
|
+
if (!doc.embedding || doc.embedding.length === 0) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
// Calculate cosine similarity
|
|
339
|
+
try {
|
|
340
|
+
const score = cosineSimilarity(queryEmbedding, doc.embedding);
|
|
341
|
+
// Normalize score to 0-1 range (cosine similarity is -1 to 1)
|
|
342
|
+
const normalizedScore = (score + 1) / 2;
|
|
343
|
+
results.push({
|
|
344
|
+
document: this.toDocument(doc),
|
|
345
|
+
score: normalizedScore,
|
|
346
|
+
confidence: this.scoreToConfidence(normalizedScore),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
// Skip documents with incompatible embeddings
|
|
351
|
+
console.warn(`Skipping document ${doc.id} due to embedding error:`, error);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// Sort by score descending
|
|
355
|
+
return results.sort((a, b) => b.score - a.score);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Hybrid search combining keyword and semantic results
|
|
359
|
+
*/
|
|
360
|
+
async hybridSearch(query, category) {
|
|
361
|
+
const keywordResults = this.keywordSearch(query, category);
|
|
362
|
+
const semanticResults = await this.semanticSearch(query, category);
|
|
363
|
+
// Merge results with weighted scores
|
|
364
|
+
const scoreMap = new Map();
|
|
365
|
+
for (const result of keywordResults) {
|
|
366
|
+
scoreMap.set(result.document.id, { keyword: result.score, semantic: 0 });
|
|
367
|
+
}
|
|
368
|
+
for (const result of semanticResults) {
|
|
369
|
+
const existing = scoreMap.get(result.document.id);
|
|
370
|
+
if (existing) {
|
|
371
|
+
existing.semantic = result.score;
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
scoreMap.set(result.document.id, { keyword: 0, semantic: result.score });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Calculate combined scores (weighted average)
|
|
378
|
+
const keywordWeight = 0.3;
|
|
379
|
+
const semanticWeight = 0.7;
|
|
380
|
+
const results = [];
|
|
381
|
+
for (const [id, scores] of scoreMap.entries()) {
|
|
382
|
+
const doc = this.documents.get(id);
|
|
383
|
+
if (!doc)
|
|
384
|
+
continue;
|
|
385
|
+
const combinedScore = scores.keyword * keywordWeight + scores.semantic * semanticWeight;
|
|
386
|
+
results.push({
|
|
387
|
+
document: this.toDocument(doc),
|
|
388
|
+
score: combinedScore,
|
|
389
|
+
confidence: this.scoreToConfidence(combinedScore),
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
// Sort by score descending
|
|
393
|
+
return results.sort((a, b) => b.score - a.score);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Convert score to confidence level
|
|
397
|
+
*/
|
|
398
|
+
scoreToConfidence(score) {
|
|
399
|
+
if (score >= 0.8)
|
|
400
|
+
return 'high';
|
|
401
|
+
if (score >= 0.5)
|
|
402
|
+
return 'medium';
|
|
403
|
+
return 'low';
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Convert stored document to public document (without embedding)
|
|
407
|
+
*/
|
|
408
|
+
toDocument(doc) {
|
|
409
|
+
return {
|
|
410
|
+
id: doc.id,
|
|
411
|
+
category: doc.category,
|
|
412
|
+
title: doc.title,
|
|
413
|
+
content: doc.content,
|
|
414
|
+
metadata: doc.metadata,
|
|
415
|
+
createdAt: doc.createdAt,
|
|
416
|
+
updatedAt: doc.updatedAt,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/knowledge/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the common interface for all LLM providers.
|
|
5
|
+
* Each provider (OpenAI, Claude, Qwen, etc.) implements this interface.
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolDefinition } from '../types/tool.js';
|
|
8
|
+
/**
|
|
9
|
+
* Options for text generation
|
|
10
|
+
*/
|
|
11
|
+
export interface GenerateOptions {
|
|
12
|
+
/** Temperature for response generation (0-2) */
|
|
13
|
+
temperature?: number;
|
|
14
|
+
/** Maximum tokens in response */
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
/** Stop sequences */
|
|
17
|
+
stopSequences?: string[];
|
|
18
|
+
/** System prompt */
|
|
19
|
+
systemPrompt?: string;
|
|
20
|
+
/** Additional provider-specific options */
|
|
21
|
+
options?: Record<string, unknown>;
|
|
22
|
+
/** Abort signal for cancellation */
|
|
23
|
+
abortSignal?: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Message in a conversation
|
|
27
|
+
*/
|
|
28
|
+
export interface ChatMessage {
|
|
29
|
+
/** Role of the message sender */
|
|
30
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
31
|
+
/** Message content */
|
|
32
|
+
content: string;
|
|
33
|
+
/** Tool call ID (for tool responses) */
|
|
34
|
+
toolCallId?: string;
|
|
35
|
+
/** Tool name (for tool responses) */
|
|
36
|
+
toolName?: string;
|
|
37
|
+
/** Tool calls requested by assistant (for assistant messages) */
|
|
38
|
+
toolCalls?: ToolCall[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Tool call requested by the LLM
|
|
42
|
+
*/
|
|
43
|
+
export interface ToolCall {
|
|
44
|
+
/** Unique ID for this tool call */
|
|
45
|
+
id: string;
|
|
46
|
+
/** Name of the tool to call */
|
|
47
|
+
name: string;
|
|
48
|
+
/** Arguments for the tool */
|
|
49
|
+
arguments: Record<string, unknown>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Response from LLM generation with tools
|
|
53
|
+
*/
|
|
54
|
+
export interface LLMResponse {
|
|
55
|
+
/** Text content of the response */
|
|
56
|
+
content: string;
|
|
57
|
+
/** Tool calls requested by the LLM */
|
|
58
|
+
toolCalls?: ToolCall[];
|
|
59
|
+
/** Whether the response is complete or needs tool results */
|
|
60
|
+
finishReason: 'stop' | 'tool_calls' | 'length' | 'content_filter';
|
|
61
|
+
/** Token usage information */
|
|
62
|
+
usage?: {
|
|
63
|
+
promptTokens: number;
|
|
64
|
+
completionTokens: number;
|
|
65
|
+
totalTokens: number;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stream chunk from LLM
|
|
70
|
+
*/
|
|
71
|
+
export interface StreamChunk {
|
|
72
|
+
/** Type of the chunk */
|
|
73
|
+
type: 'content' | 'tool_call' | 'done';
|
|
74
|
+
/** Content delta (for content chunks) */
|
|
75
|
+
content?: string;
|
|
76
|
+
/** Tool call delta (for tool_call chunks) */
|
|
77
|
+
toolCall?: {
|
|
78
|
+
index: number;
|
|
79
|
+
id?: string;
|
|
80
|
+
name?: string;
|
|
81
|
+
arguments?: string;
|
|
82
|
+
};
|
|
83
|
+
/** Final response (for done chunks) */
|
|
84
|
+
response?: LLMResponse;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Callback for streaming chunks
|
|
88
|
+
*/
|
|
89
|
+
export type StreamCallback = (chunk: StreamChunk) => void;
|
|
90
|
+
/**
|
|
91
|
+
* Embedding result
|
|
92
|
+
*/
|
|
93
|
+
export interface EmbeddingResult {
|
|
94
|
+
/** The embedding vector */
|
|
95
|
+
embedding: number[];
|
|
96
|
+
/** Token count of the input */
|
|
97
|
+
tokenCount?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* LLM Adapter Interface
|
|
101
|
+
*
|
|
102
|
+
* All LLM providers must implement this interface to be used with the Agent.
|
|
103
|
+
*/
|
|
104
|
+
export interface LLMAdapter {
|
|
105
|
+
/** Provider name for identification */
|
|
106
|
+
readonly provider: string;
|
|
107
|
+
/** Model name being used */
|
|
108
|
+
readonly model: string;
|
|
109
|
+
/**
|
|
110
|
+
* Generate text from a prompt
|
|
111
|
+
*
|
|
112
|
+
* @param prompt - The input prompt or conversation messages
|
|
113
|
+
* @param options - Generation options
|
|
114
|
+
* @returns Generated text
|
|
115
|
+
*/
|
|
116
|
+
generate(prompt: string | ChatMessage[], options?: GenerateOptions): Promise<string>;
|
|
117
|
+
/**
|
|
118
|
+
* Generate text with tool calling support
|
|
119
|
+
*
|
|
120
|
+
* @param prompt - The input prompt or conversation messages
|
|
121
|
+
* @param tools - Available tools for the LLM to call
|
|
122
|
+
* @param options - Generation options
|
|
123
|
+
* @returns LLM response with potential tool calls
|
|
124
|
+
*/
|
|
125
|
+
generateWithTools(prompt: string | ChatMessage[], tools: ToolDefinition[], options?: GenerateOptions): Promise<LLMResponse>;
|
|
126
|
+
/**
|
|
127
|
+
* Generate text with tool calling support (streaming)
|
|
128
|
+
*
|
|
129
|
+
* @param prompt - The input prompt or conversation messages
|
|
130
|
+
* @param tools - Available tools for the LLM to call
|
|
131
|
+
* @param onChunk - Callback for each streaming chunk
|
|
132
|
+
* @param options - Generation options
|
|
133
|
+
* @returns Final LLM response with potential tool calls
|
|
134
|
+
*/
|
|
135
|
+
generateWithToolsStream(prompt: string | ChatMessage[], tools: ToolDefinition[], onChunk: StreamCallback, options?: GenerateOptions): Promise<LLMResponse>;
|
|
136
|
+
/**
|
|
137
|
+
* Check if the adapter supports streaming
|
|
138
|
+
*/
|
|
139
|
+
supportsStreaming(): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Generate embedding for text
|
|
142
|
+
*
|
|
143
|
+
* @param text - Text to embed
|
|
144
|
+
* @returns Embedding vector
|
|
145
|
+
*/
|
|
146
|
+
embed(text: string): Promise<EmbeddingResult>;
|
|
147
|
+
/**
|
|
148
|
+
* Check if the adapter supports embeddings
|
|
149
|
+
*/
|
|
150
|
+
supportsEmbeddings(): boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Check if the adapter supports tool calling
|
|
153
|
+
*/
|
|
154
|
+
supportsToolCalling(): boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Base configuration for creating an LLM adapter
|
|
158
|
+
*/
|
|
159
|
+
export interface LLMAdapterConfig {
|
|
160
|
+
/** API key for authentication */
|
|
161
|
+
apiKey: string;
|
|
162
|
+
/** Model identifier */
|
|
163
|
+
model: string;
|
|
164
|
+
/** Custom API endpoint */
|
|
165
|
+
baseUrl?: string;
|
|
166
|
+
/** Default temperature */
|
|
167
|
+
temperature?: number;
|
|
168
|
+
/** Default max tokens */
|
|
169
|
+
maxTokens?: number;
|
|
170
|
+
/** Request timeout in milliseconds */
|
|
171
|
+
timeoutMs?: number;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Error thrown by LLM adapters
|
|
175
|
+
*/
|
|
176
|
+
export declare class LLMError extends Error {
|
|
177
|
+
readonly code: LLMErrorCode;
|
|
178
|
+
readonly provider: string;
|
|
179
|
+
readonly cause?: Error;
|
|
180
|
+
constructor(message: string, code: LLMErrorCode, provider: string, cause?: Error);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* LLM error codes
|
|
184
|
+
*/
|
|
185
|
+
export type LLMErrorCode = 'AUTHENTICATION_ERROR' | 'RATE_LIMIT_ERROR' | 'INVALID_REQUEST' | 'MODEL_NOT_FOUND' | 'CONTEXT_LENGTH_EXCEEDED' | 'CONTENT_FILTER' | 'TIMEOUT' | 'NETWORK_ERROR' | 'CANCELLED' | 'UNKNOWN_ERROR';
|
|
186
|
+
/**
|
|
187
|
+
* Helper to convert string prompt to chat messages
|
|
188
|
+
*/
|
|
189
|
+
export declare function promptToMessages(prompt: string, systemPrompt?: string): ChatMessage[];
|
|
190
|
+
/**
|
|
191
|
+
* Helper to extract text content from messages
|
|
192
|
+
*/
|
|
193
|
+
export declare function messagesToPrompt(messages: ChatMessage[]): string;
|
|
194
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Adapter Interface
|
|
3
|
+
*
|
|
4
|
+
* Defines the common interface for all LLM providers.
|
|
5
|
+
* Each provider (OpenAI, Claude, Qwen, etc.) implements this interface.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown by LLM adapters
|
|
9
|
+
*/
|
|
10
|
+
export class LLMError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
provider;
|
|
13
|
+
cause;
|
|
14
|
+
constructor(message, code, provider, cause) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.provider = provider;
|
|
18
|
+
this.cause = cause;
|
|
19
|
+
this.name = 'LLMError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Helper to convert string prompt to chat messages
|
|
24
|
+
*/
|
|
25
|
+
export function promptToMessages(prompt, systemPrompt) {
|
|
26
|
+
const messages = [];
|
|
27
|
+
if (systemPrompt) {
|
|
28
|
+
messages.push({ role: 'system', content: systemPrompt });
|
|
29
|
+
}
|
|
30
|
+
messages.push({ role: 'user', content: prompt });
|
|
31
|
+
return messages;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Helper to extract text content from messages
|
|
35
|
+
*/
|
|
36
|
+
export function messagesToPrompt(messages) {
|
|
37
|
+
return messages
|
|
38
|
+
.filter((m) => m.role !== 'system')
|
|
39
|
+
.map((m) => `${m.role}: ${m.content}`)
|
|
40
|
+
.join('\n');
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmMH;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGf;IACA;IACA;IAJlB,YACE,OAAe,EACC,IAAkB,EAClB,QAAgB,EAChB,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAc;QAClB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAiBD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,YAAqB;IACpE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|