@pleaseai/context-please-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +24 -0
- package/README.md +287 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/context.d.ts +276 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1072 -0
- package/dist/context.js.map +1 -0
- package/dist/embedding/base-embedding.d.ts +51 -0
- package/dist/embedding/base-embedding.d.ts.map +1 -0
- package/dist/embedding/base-embedding.js +36 -0
- package/dist/embedding/base-embedding.js.map +1 -0
- package/dist/embedding/gemini-embedding.d.ts +53 -0
- package/dist/embedding/gemini-embedding.d.ts.map +1 -0
- package/dist/embedding/gemini-embedding.js +152 -0
- package/dist/embedding/gemini-embedding.js.map +1 -0
- package/dist/embedding/index.d.ts +6 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +24 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/ollama-embedding.d.ts +55 -0
- package/dist/embedding/ollama-embedding.d.ts.map +1 -0
- package/dist/embedding/ollama-embedding.js +192 -0
- package/dist/embedding/ollama-embedding.js.map +1 -0
- package/dist/embedding/openai-embedding.d.ts +36 -0
- package/dist/embedding/openai-embedding.d.ts.map +1 -0
- package/dist/embedding/openai-embedding.js +159 -0
- package/dist/embedding/openai-embedding.js.map +1 -0
- package/dist/embedding/voyageai-embedding.d.ts +44 -0
- package/dist/embedding/voyageai-embedding.d.ts.map +1 -0
- package/dist/embedding/voyageai-embedding.js +227 -0
- package/dist/embedding/voyageai-embedding.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/splitter/ast-splitter.d.ts +22 -0
- package/dist/splitter/ast-splitter.d.ts.map +1 -0
- package/dist/splitter/ast-splitter.js +234 -0
- package/dist/splitter/ast-splitter.js.map +1 -0
- package/dist/splitter/index.d.ts +41 -0
- package/dist/splitter/index.d.ts.map +1 -0
- package/dist/splitter/index.js +27 -0
- package/dist/splitter/index.js.map +1 -0
- package/dist/splitter/langchain-splitter.d.ts +13 -0
- package/dist/splitter/langchain-splitter.d.ts.map +1 -0
- package/dist/splitter/langchain-splitter.js +118 -0
- package/dist/splitter/langchain-splitter.js.map +1 -0
- package/dist/sync/merkle.d.ts +26 -0
- package/dist/sync/merkle.d.ts.map +1 -0
- package/dist/sync/merkle.js +112 -0
- package/dist/sync/merkle.js.map +1 -0
- package/dist/sync/synchronizer.d.ts +30 -0
- package/dist/sync/synchronizer.d.ts.map +1 -0
- package/dist/sync/synchronizer.js +339 -0
- package/dist/sync/synchronizer.js.map +1 -0
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/env-manager.d.ts +19 -0
- package/dist/utils/env-manager.d.ts.map +1 -0
- package/dist/utils/env-manager.js +125 -0
- package/dist/utils/env-manager.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/vectordb/base/base-vector-database.d.ts +58 -0
- package/dist/vectordb/base/base-vector-database.d.ts.map +1 -0
- package/dist/vectordb/base/base-vector-database.js +32 -0
- package/dist/vectordb/base/base-vector-database.js.map +1 -0
- package/dist/vectordb/factory.d.ts +80 -0
- package/dist/vectordb/factory.d.ts.map +1 -0
- package/dist/vectordb/factory.js +89 -0
- package/dist/vectordb/factory.js.map +1 -0
- package/dist/vectordb/index.d.ts +12 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +27 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/milvus-restful-vectordb.d.ts +75 -0
- package/dist/vectordb/milvus-restful-vectordb.d.ts.map +1 -0
- package/dist/vectordb/milvus-restful-vectordb.js +707 -0
- package/dist/vectordb/milvus-restful-vectordb.js.map +1 -0
- package/dist/vectordb/milvus-vectordb.d.ts +59 -0
- package/dist/vectordb/milvus-vectordb.d.ts.map +1 -0
- package/dist/vectordb/milvus-vectordb.js +641 -0
- package/dist/vectordb/milvus-vectordb.js.map +1 -0
- package/dist/vectordb/qdrant-vectordb.d.ts +124 -0
- package/dist/vectordb/qdrant-vectordb.d.ts.map +1 -0
- package/dist/vectordb/qdrant-vectordb.js +582 -0
- package/dist/vectordb/qdrant-vectordb.js.map +1 -0
- package/dist/vectordb/sparse/index.d.ts +4 -0
- package/dist/vectordb/sparse/index.d.ts.map +1 -0
- package/dist/vectordb/sparse/index.js +23 -0
- package/dist/vectordb/sparse/index.js.map +1 -0
- package/dist/vectordb/sparse/simple-bm25.d.ts +104 -0
- package/dist/vectordb/sparse/simple-bm25.d.ts.map +1 -0
- package/dist/vectordb/sparse/simple-bm25.js +189 -0
- package/dist/vectordb/sparse/simple-bm25.js.map +1 -0
- package/dist/vectordb/sparse/sparse-vector-generator.d.ts +54 -0
- package/dist/vectordb/sparse/sparse-vector-generator.d.ts.map +1 -0
- package/dist/vectordb/sparse/sparse-vector-generator.js +3 -0
- package/dist/vectordb/sparse/sparse-vector-generator.js.map +1 -0
- package/dist/vectordb/sparse/types.d.ts +38 -0
- package/dist/vectordb/sparse/types.d.ts.map +1 -0
- package/dist/vectordb/sparse/types.js +3 -0
- package/dist/vectordb/sparse/types.js.map +1 -0
- package/dist/vectordb/types.d.ts +120 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +9 -0
- package/dist/vectordb/types.js.map +1 -0
- package/dist/vectordb/zilliz-utils.d.ts +135 -0
- package/dist/vectordb/zilliz-utils.d.ts.map +1 -0
- package/dist/vectordb/zilliz-utils.js +192 -0
- package/dist/vectordb/zilliz-utils.js.map +1 -0
- package/package.json +61 -0
@@ -0,0 +1,641 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.MilvusVectorDatabase = void 0;
|
4
|
+
const milvus2_sdk_node_1 = require("@zilliz/milvus2-sdk-node");
|
5
|
+
const zilliz_utils_1 = require("./zilliz-utils");
|
6
|
+
const base_vector_database_1 = require("./base/base-vector-database");
|
7
|
+
class MilvusVectorDatabase extends base_vector_database_1.BaseVectorDatabase {
|
8
|
+
constructor(config) {
|
9
|
+
super(config);
|
10
|
+
this.client = null;
|
11
|
+
}
|
12
|
+
/**
|
13
|
+
* @override
|
14
|
+
* Initializes the Milvus vector database by resolving the address and creating a client connection.
|
15
|
+
*/
|
16
|
+
async initialize() {
|
17
|
+
const resolvedAddress = await this.resolveAddress();
|
18
|
+
await this.initializeClient(resolvedAddress);
|
19
|
+
}
|
20
|
+
async initializeClient(address) {
|
21
|
+
const milvusConfig = this.config;
|
22
|
+
console.log('🔌 Connecting to vector database at: ', address);
|
23
|
+
this.client = new milvus2_sdk_node_1.MilvusClient({
|
24
|
+
address: address,
|
25
|
+
username: milvusConfig.username,
|
26
|
+
password: milvusConfig.password,
|
27
|
+
token: milvusConfig.token,
|
28
|
+
ssl: milvusConfig.ssl || false,
|
29
|
+
});
|
30
|
+
}
|
31
|
+
/**
|
32
|
+
* Resolve address from config or token
|
33
|
+
* Common logic for both gRPC and REST implementations
|
34
|
+
*/
|
35
|
+
async resolveAddress() {
|
36
|
+
let finalConfig = { ...this.config };
|
37
|
+
// If address is not provided, get it using token
|
38
|
+
if (!finalConfig.address && finalConfig.token) {
|
39
|
+
finalConfig.address = await zilliz_utils_1.ClusterManager.getAddressFromToken(finalConfig.token);
|
40
|
+
}
|
41
|
+
if (!finalConfig.address) {
|
42
|
+
throw new Error('Address is required and could not be resolved from token');
|
43
|
+
}
|
44
|
+
return finalConfig.address;
|
45
|
+
}
|
46
|
+
/**
|
47
|
+
* Override to add client null check
|
48
|
+
*/
|
49
|
+
async ensureInitialized() {
|
50
|
+
await super.ensureInitialized();
|
51
|
+
if (!this.client) {
|
52
|
+
throw new Error('Client not initialized');
|
53
|
+
}
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* Ensure collection is loaded before search/query operations
|
57
|
+
*/
|
58
|
+
async ensureLoaded(collectionName) {
|
59
|
+
if (!this.client) {
|
60
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
61
|
+
}
|
62
|
+
try {
|
63
|
+
// Check if collection is loaded
|
64
|
+
const result = await this.client.getLoadState({
|
65
|
+
collection_name: collectionName
|
66
|
+
});
|
67
|
+
if (result.state !== milvus2_sdk_node_1.LoadState.LoadStateLoaded) {
|
68
|
+
console.log(`[MilvusDB] 🔄 Loading collection '${collectionName}' to memory...`);
|
69
|
+
await this.client.loadCollection({
|
70
|
+
collection_name: collectionName,
|
71
|
+
});
|
72
|
+
}
|
73
|
+
}
|
74
|
+
catch (error) {
|
75
|
+
console.error(`[MilvusDB] ❌ Failed to ensure collection '${collectionName}' is loaded:`, error);
|
76
|
+
throw error;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
/**
|
80
|
+
* Wait for an index to be ready before proceeding
|
81
|
+
* Polls index build progress with exponential backoff up to 60 seconds
|
82
|
+
*/
|
83
|
+
async waitForIndexReady(collectionName, fieldName, maxWaitTime = 60000, // 60 seconds
|
84
|
+
initialInterval = 500, // 500ms
|
85
|
+
maxInterval = 5000, // 5 seconds
|
86
|
+
backoffMultiplier = 1.5) {
|
87
|
+
if (!this.client) {
|
88
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
89
|
+
}
|
90
|
+
let interval = initialInterval;
|
91
|
+
const startTime = Date.now();
|
92
|
+
console.log(`[MilvusDB] ⏳ Waiting for index on field '${fieldName}' in collection '${collectionName}' to be ready...`);
|
93
|
+
while (Date.now() - startTime < maxWaitTime) {
|
94
|
+
try {
|
95
|
+
const indexBuildProgress = await this.client.getIndexBuildProgress({
|
96
|
+
collection_name: collectionName,
|
97
|
+
field_name: fieldName
|
98
|
+
});
|
99
|
+
// Debug logging to understand the progress
|
100
|
+
console.log(`[MilvusDB] 📊 Index build progress for '${fieldName}': indexed_rows=${indexBuildProgress.indexed_rows}, total_rows=${indexBuildProgress.total_rows}`);
|
101
|
+
console.log(`[MilvusDB] 📊 Full response:`, JSON.stringify(indexBuildProgress));
|
102
|
+
// Check if index building is complete
|
103
|
+
if (indexBuildProgress.indexed_rows === indexBuildProgress.total_rows) {
|
104
|
+
console.log(`[MilvusDB] ✅ Index on field '${fieldName}' is ready! (${indexBuildProgress.indexed_rows}/${indexBuildProgress.total_rows} rows indexed)`);
|
105
|
+
return;
|
106
|
+
}
|
107
|
+
// Check for error status
|
108
|
+
if (indexBuildProgress.status && indexBuildProgress.status.error_code !== 'Success') {
|
109
|
+
// Handle known issue with older Milvus versions where sparse vector index progress returns incorrect error
|
110
|
+
if (indexBuildProgress.status.reason && indexBuildProgress.status.reason.includes('index duplicates[indexName=]')) {
|
111
|
+
console.log(`[MilvusDB] ⚠️ Index progress check returned known older Milvus issue: ${indexBuildProgress.status.reason}`);
|
112
|
+
console.log(`[MilvusDB] ⚠️ This is a known issue with older Milvus versions - treating as index ready`);
|
113
|
+
return; // Treat as ready since this is a false error
|
114
|
+
}
|
115
|
+
throw new Error(`Index creation failed for field '${fieldName}' in collection '${collectionName}': ${indexBuildProgress.status.reason}`);
|
116
|
+
}
|
117
|
+
console.log(`[MilvusDB] 📊 Index building in progress: ${indexBuildProgress.indexed_rows}/${indexBuildProgress.total_rows} rows indexed`);
|
118
|
+
// Wait with exponential backoff
|
119
|
+
await new Promise(resolve => setTimeout(resolve, interval));
|
120
|
+
interval = Math.min(interval * backoffMultiplier, maxInterval);
|
121
|
+
}
|
122
|
+
catch (error) {
|
123
|
+
console.error(`[MilvusDB] ❌ Error checking index build progress for field '${fieldName}':`, error);
|
124
|
+
throw error;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
throw new Error(`Timeout waiting for index on field '${fieldName}' in collection '${collectionName}' to be ready after ${maxWaitTime}ms`);
|
128
|
+
}
|
129
|
+
/**
|
130
|
+
* Load collection with retry logic and exponential backoff
|
131
|
+
* Retries up to 5 times with exponential backoff
|
132
|
+
*/
|
133
|
+
async loadCollectionWithRetry(collectionName, maxRetries = 5, initialInterval = 1000, // 1 second
|
134
|
+
backoffMultiplier = 2) {
|
135
|
+
if (!this.client) {
|
136
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
137
|
+
}
|
138
|
+
let attempt = 1;
|
139
|
+
let interval = initialInterval;
|
140
|
+
while (attempt <= maxRetries) {
|
141
|
+
try {
|
142
|
+
console.log(`[MilvusDB] 🔄 Loading collection '${collectionName}' to memory (attempt ${attempt}/${maxRetries})...`);
|
143
|
+
await this.client.loadCollection({
|
144
|
+
collection_name: collectionName,
|
145
|
+
});
|
146
|
+
console.log(`[MilvusDB] ✅ Collection '${collectionName}' loaded successfully!`);
|
147
|
+
return;
|
148
|
+
}
|
149
|
+
catch (error) {
|
150
|
+
console.error(`[MilvusDB] ❌ Failed to load collection '${collectionName}' on attempt ${attempt}:`, error);
|
151
|
+
if (attempt === maxRetries) {
|
152
|
+
throw new Error(`Failed to load collection '${collectionName}' after ${maxRetries} attempts: ${error}`);
|
153
|
+
}
|
154
|
+
// Wait with exponential backoff before retry
|
155
|
+
console.log(`[MilvusDB] ⏳ Retrying collection load in ${interval}ms...`);
|
156
|
+
await new Promise(resolve => setTimeout(resolve, interval));
|
157
|
+
interval *= backoffMultiplier;
|
158
|
+
attempt++;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|
162
|
+
async createCollection(collectionName, dimension, description) {
|
163
|
+
await this.ensureInitialized();
|
164
|
+
console.log('Beginning collection creation:', collectionName);
|
165
|
+
console.log('Collection dimension:', dimension);
|
166
|
+
const schema = [
|
167
|
+
{
|
168
|
+
name: 'id',
|
169
|
+
description: 'Document ID',
|
170
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
171
|
+
max_length: 512,
|
172
|
+
is_primary_key: true,
|
173
|
+
},
|
174
|
+
{
|
175
|
+
name: 'vector',
|
176
|
+
description: 'Embedding vector',
|
177
|
+
data_type: milvus2_sdk_node_1.DataType.FloatVector,
|
178
|
+
dim: dimension,
|
179
|
+
},
|
180
|
+
{
|
181
|
+
name: 'content',
|
182
|
+
description: 'Document content',
|
183
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
184
|
+
max_length: 65535,
|
185
|
+
},
|
186
|
+
{
|
187
|
+
name: 'relativePath',
|
188
|
+
description: 'Relative path to the codebase',
|
189
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
190
|
+
max_length: 1024,
|
191
|
+
},
|
192
|
+
{
|
193
|
+
name: 'startLine',
|
194
|
+
description: 'Start line number of the chunk',
|
195
|
+
data_type: milvus2_sdk_node_1.DataType.Int64,
|
196
|
+
},
|
197
|
+
{
|
198
|
+
name: 'endLine',
|
199
|
+
description: 'End line number of the chunk',
|
200
|
+
data_type: milvus2_sdk_node_1.DataType.Int64,
|
201
|
+
},
|
202
|
+
{
|
203
|
+
name: 'fileExtension',
|
204
|
+
description: 'File extension',
|
205
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
206
|
+
max_length: 32,
|
207
|
+
},
|
208
|
+
{
|
209
|
+
name: 'metadata',
|
210
|
+
description: 'Additional document metadata as JSON string',
|
211
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
212
|
+
max_length: 65535,
|
213
|
+
},
|
214
|
+
];
|
215
|
+
const createCollectionParams = {
|
216
|
+
collection_name: collectionName,
|
217
|
+
description: description || `Claude Context collection: ${collectionName}`,
|
218
|
+
fields: schema,
|
219
|
+
};
|
220
|
+
if (!this.client) {
|
221
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
222
|
+
}
|
223
|
+
await this.client.createCollection(createCollectionParams);
|
224
|
+
// Create index
|
225
|
+
const indexParams = {
|
226
|
+
collection_name: collectionName,
|
227
|
+
field_name: 'vector',
|
228
|
+
index_name: 'vector_index',
|
229
|
+
index_type: 'AUTOINDEX',
|
230
|
+
metric_type: milvus2_sdk_node_1.MetricType.COSINE,
|
231
|
+
};
|
232
|
+
console.log(`[MilvusDB] 🔧 Creating index for field 'vector' in collection '${collectionName}'...`);
|
233
|
+
await this.client.createIndex(indexParams);
|
234
|
+
// Wait for index to be ready before loading collection
|
235
|
+
await this.waitForIndexReady(collectionName, 'vector');
|
236
|
+
// Load collection to memory with retry logic
|
237
|
+
await this.loadCollectionWithRetry(collectionName);
|
238
|
+
// Verify collection is created correctly
|
239
|
+
await this.client.describeCollection({
|
240
|
+
collection_name: collectionName,
|
241
|
+
});
|
242
|
+
}
|
243
|
+
async dropCollection(collectionName) {
|
244
|
+
await this.ensureInitialized();
|
245
|
+
if (!this.client) {
|
246
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
247
|
+
}
|
248
|
+
await this.client.dropCollection({
|
249
|
+
collection_name: collectionName,
|
250
|
+
});
|
251
|
+
}
|
252
|
+
async hasCollection(collectionName) {
|
253
|
+
await this.ensureInitialized();
|
254
|
+
if (!this.client) {
|
255
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
256
|
+
}
|
257
|
+
const result = await this.client.hasCollection({
|
258
|
+
collection_name: collectionName,
|
259
|
+
});
|
260
|
+
return Boolean(result.value);
|
261
|
+
}
|
262
|
+
async listCollections() {
|
263
|
+
await this.ensureInitialized();
|
264
|
+
if (!this.client) {
|
265
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
266
|
+
}
|
267
|
+
const result = await this.client.showCollections();
|
268
|
+
// Handle the response format - cast to any to avoid type errors
|
269
|
+
const collections = result.collection_names || result.collections || [];
|
270
|
+
return Array.isArray(collections) ? collections : [];
|
271
|
+
}
|
272
|
+
async insert(collectionName, documents) {
|
273
|
+
await this.ensureInitialized();
|
274
|
+
await this.ensureLoaded(collectionName);
|
275
|
+
if (!this.client) {
|
276
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
277
|
+
}
|
278
|
+
console.log('Inserting documents into collection:', collectionName);
|
279
|
+
const data = documents.map(doc => ({
|
280
|
+
id: doc.id,
|
281
|
+
vector: doc.vector,
|
282
|
+
content: doc.content,
|
283
|
+
relativePath: doc.relativePath,
|
284
|
+
startLine: doc.startLine,
|
285
|
+
endLine: doc.endLine,
|
286
|
+
fileExtension: doc.fileExtension,
|
287
|
+
metadata: JSON.stringify(doc.metadata),
|
288
|
+
}));
|
289
|
+
await this.client.insert({
|
290
|
+
collection_name: collectionName,
|
291
|
+
data: data,
|
292
|
+
});
|
293
|
+
}
|
294
|
+
async search(collectionName, queryVector, options) {
|
295
|
+
await this.ensureInitialized();
|
296
|
+
await this.ensureLoaded(collectionName);
|
297
|
+
if (!this.client) {
|
298
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
299
|
+
}
|
300
|
+
const searchParams = {
|
301
|
+
collection_name: collectionName,
|
302
|
+
data: [queryVector],
|
303
|
+
limit: options?.topK || 10,
|
304
|
+
output_fields: ['id', 'content', 'relativePath', 'startLine', 'endLine', 'fileExtension', 'metadata'],
|
305
|
+
};
|
306
|
+
// Apply boolean expression filter if provided (e.g., fileExtension in [".ts",".py"])
|
307
|
+
if (options?.filterExpr && options.filterExpr.trim().length > 0) {
|
308
|
+
searchParams.expr = options.filterExpr;
|
309
|
+
}
|
310
|
+
const searchResult = await this.client.search(searchParams);
|
311
|
+
if (!searchResult.results || searchResult.results.length === 0) {
|
312
|
+
return [];
|
313
|
+
}
|
314
|
+
return searchResult.results.map((result) => ({
|
315
|
+
document: {
|
316
|
+
id: result.id,
|
317
|
+
vector: queryVector,
|
318
|
+
content: result.content,
|
319
|
+
relativePath: result.relativePath,
|
320
|
+
startLine: result.startLine,
|
321
|
+
endLine: result.endLine,
|
322
|
+
fileExtension: result.fileExtension,
|
323
|
+
metadata: JSON.parse(result.metadata || '{}'),
|
324
|
+
},
|
325
|
+
score: result.score,
|
326
|
+
}));
|
327
|
+
}
|
328
|
+
async delete(collectionName, ids) {
|
329
|
+
await this.ensureInitialized();
|
330
|
+
await this.ensureLoaded(collectionName);
|
331
|
+
if (!this.client) {
|
332
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
333
|
+
}
|
334
|
+
await this.client.delete({
|
335
|
+
collection_name: collectionName,
|
336
|
+
filter: `id in [${ids.map(id => `"${id}"`).join(', ')}]`,
|
337
|
+
});
|
338
|
+
}
|
339
|
+
async query(collectionName, filter, outputFields, limit) {
|
340
|
+
await this.ensureInitialized();
|
341
|
+
await this.ensureLoaded(collectionName);
|
342
|
+
if (!this.client) {
|
343
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
344
|
+
}
|
345
|
+
try {
|
346
|
+
const queryParams = {
|
347
|
+
collection_name: collectionName,
|
348
|
+
filter: filter,
|
349
|
+
output_fields: outputFields,
|
350
|
+
};
|
351
|
+
// Add limit if provided, or default for empty filter expressions
|
352
|
+
if (limit !== undefined) {
|
353
|
+
queryParams.limit = limit;
|
354
|
+
}
|
355
|
+
else if (filter === '' || filter.trim() === '') {
|
356
|
+
// Milvus requires limit when using empty expressions
|
357
|
+
queryParams.limit = 16384; // Default limit for empty filters
|
358
|
+
}
|
359
|
+
const result = await this.client.query(queryParams);
|
360
|
+
if (result.status.error_code !== 'Success') {
|
361
|
+
throw new Error(`Failed to query Milvus: ${result.status.reason}`);
|
362
|
+
}
|
363
|
+
return result.data || [];
|
364
|
+
}
|
365
|
+
catch (error) {
|
366
|
+
console.error(`[MilvusDB] ❌ Failed to query collection '${collectionName}':`, error);
|
367
|
+
throw error;
|
368
|
+
}
|
369
|
+
}
|
370
|
+
async createHybridCollection(collectionName, dimension, description) {
|
371
|
+
await this.ensureInitialized();
|
372
|
+
console.log('Beginning hybrid collection creation:', collectionName);
|
373
|
+
console.log('Collection dimension:', dimension);
|
374
|
+
const schema = [
|
375
|
+
{
|
376
|
+
name: 'id',
|
377
|
+
description: 'Document ID',
|
378
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
379
|
+
max_length: 512,
|
380
|
+
is_primary_key: true,
|
381
|
+
},
|
382
|
+
{
|
383
|
+
name: 'content',
|
384
|
+
description: 'Full text content for BM25 and storage',
|
385
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
386
|
+
max_length: 65535,
|
387
|
+
enable_analyzer: true,
|
388
|
+
},
|
389
|
+
{
|
390
|
+
name: 'vector',
|
391
|
+
description: 'Dense vector embedding',
|
392
|
+
data_type: milvus2_sdk_node_1.DataType.FloatVector,
|
393
|
+
dim: dimension,
|
394
|
+
},
|
395
|
+
{
|
396
|
+
name: 'sparse_vector',
|
397
|
+
description: 'Sparse vector embedding from BM25',
|
398
|
+
data_type: milvus2_sdk_node_1.DataType.SparseFloatVector,
|
399
|
+
},
|
400
|
+
{
|
401
|
+
name: 'relativePath',
|
402
|
+
description: 'Relative path to the codebase',
|
403
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
404
|
+
max_length: 1024,
|
405
|
+
},
|
406
|
+
{
|
407
|
+
name: 'startLine',
|
408
|
+
description: 'Start line number of the chunk',
|
409
|
+
data_type: milvus2_sdk_node_1.DataType.Int64,
|
410
|
+
},
|
411
|
+
{
|
412
|
+
name: 'endLine',
|
413
|
+
description: 'End line number of the chunk',
|
414
|
+
data_type: milvus2_sdk_node_1.DataType.Int64,
|
415
|
+
},
|
416
|
+
{
|
417
|
+
name: 'fileExtension',
|
418
|
+
description: 'File extension',
|
419
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
420
|
+
max_length: 32,
|
421
|
+
},
|
422
|
+
{
|
423
|
+
name: 'metadata',
|
424
|
+
description: 'Additional document metadata as JSON string',
|
425
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
426
|
+
max_length: 65535,
|
427
|
+
},
|
428
|
+
];
|
429
|
+
// Add BM25 function
|
430
|
+
const functions = [
|
431
|
+
{
|
432
|
+
name: "content_bm25_emb",
|
433
|
+
description: "content bm25 function",
|
434
|
+
type: milvus2_sdk_node_1.FunctionType.BM25,
|
435
|
+
input_field_names: ["content"],
|
436
|
+
output_field_names: ["sparse_vector"],
|
437
|
+
params: {},
|
438
|
+
},
|
439
|
+
];
|
440
|
+
const createCollectionParams = {
|
441
|
+
collection_name: collectionName,
|
442
|
+
description: description || `Hybrid code context collection: ${collectionName}`,
|
443
|
+
fields: schema,
|
444
|
+
functions: functions,
|
445
|
+
};
|
446
|
+
if (!this.client) {
|
447
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
448
|
+
}
|
449
|
+
await this.client.createCollection(createCollectionParams);
|
450
|
+
// Create indexes for both vector fields
|
451
|
+
// Index for dense vector
|
452
|
+
const denseIndexParams = {
|
453
|
+
collection_name: collectionName,
|
454
|
+
field_name: 'vector',
|
455
|
+
index_name: 'vector_index',
|
456
|
+
index_type: 'AUTOINDEX',
|
457
|
+
metric_type: milvus2_sdk_node_1.MetricType.COSINE,
|
458
|
+
};
|
459
|
+
console.log(`[MilvusDB] 🔧 Creating dense vector index for field 'vector' in collection '${collectionName}'...`);
|
460
|
+
await this.client.createIndex(denseIndexParams);
|
461
|
+
// Wait for dense vector index to be ready
|
462
|
+
await this.waitForIndexReady(collectionName, 'vector');
|
463
|
+
// Index for sparse vector
|
464
|
+
const sparseIndexParams = {
|
465
|
+
collection_name: collectionName,
|
466
|
+
field_name: 'sparse_vector',
|
467
|
+
index_name: 'sparse_vector_index',
|
468
|
+
index_type: 'SPARSE_INVERTED_INDEX',
|
469
|
+
metric_type: milvus2_sdk_node_1.MetricType.BM25,
|
470
|
+
};
|
471
|
+
console.log(`[MilvusDB] 🔧 Creating sparse vector index for field 'sparse_vector' in collection '${collectionName}'...`);
|
472
|
+
await this.client.createIndex(sparseIndexParams);
|
473
|
+
// Wait for sparse vector index to be ready
|
474
|
+
await this.waitForIndexReady(collectionName, 'sparse_vector');
|
475
|
+
// Load collection to memory with retry logic
|
476
|
+
await this.loadCollectionWithRetry(collectionName);
|
477
|
+
// Verify collection is created correctly
|
478
|
+
await this.client.describeCollection({
|
479
|
+
collection_name: collectionName,
|
480
|
+
});
|
481
|
+
}
|
482
|
+
async insertHybrid(collectionName, documents) {
|
483
|
+
await this.ensureInitialized();
|
484
|
+
await this.ensureLoaded(collectionName);
|
485
|
+
if (!this.client) {
|
486
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
487
|
+
}
|
488
|
+
const data = documents.map(doc => ({
|
489
|
+
id: doc.id,
|
490
|
+
content: doc.content,
|
491
|
+
vector: doc.vector,
|
492
|
+
relativePath: doc.relativePath,
|
493
|
+
startLine: doc.startLine,
|
494
|
+
endLine: doc.endLine,
|
495
|
+
fileExtension: doc.fileExtension,
|
496
|
+
metadata: JSON.stringify(doc.metadata),
|
497
|
+
}));
|
498
|
+
await this.client.insert({
|
499
|
+
collection_name: collectionName,
|
500
|
+
data: data,
|
501
|
+
});
|
502
|
+
}
|
503
|
+
async hybridSearch(collectionName, searchRequests, options) {
|
504
|
+
await this.ensureInitialized();
|
505
|
+
await this.ensureLoaded(collectionName);
|
506
|
+
if (!this.client) {
|
507
|
+
throw new Error('MilvusClient is not initialized after ensureInitialized().');
|
508
|
+
}
|
509
|
+
try {
|
510
|
+
// Generate OpenAI embedding for the first search request (dense)
|
511
|
+
console.log(`[MilvusDB] 🔍 Preparing hybrid search for collection: ${collectionName}`);
|
512
|
+
// Prepare search requests in the correct Milvus format
|
513
|
+
const search_param_1 = {
|
514
|
+
data: Array.isArray(searchRequests[0].data) ? searchRequests[0].data : [searchRequests[0].data],
|
515
|
+
anns_field: searchRequests[0].anns_field, // "vector"
|
516
|
+
param: searchRequests[0].param, // {"nprobe": 10}
|
517
|
+
limit: searchRequests[0].limit
|
518
|
+
};
|
519
|
+
const search_param_2 = {
|
520
|
+
data: searchRequests[1].data, // query text for sparse search
|
521
|
+
anns_field: searchRequests[1].anns_field, // "sparse_vector"
|
522
|
+
param: searchRequests[1].param, // {"drop_ratio_search": 0.2}
|
523
|
+
limit: searchRequests[1].limit
|
524
|
+
};
|
525
|
+
// Set rerank strategy to RRF (100) by default
|
526
|
+
const rerank_strategy = {
|
527
|
+
strategy: "rrf",
|
528
|
+
params: {
|
529
|
+
k: 100
|
530
|
+
}
|
531
|
+
};
|
532
|
+
console.log(`[MilvusDB] 🔍 Dense search params:`, JSON.stringify({
|
533
|
+
anns_field: search_param_1.anns_field,
|
534
|
+
param: search_param_1.param,
|
535
|
+
limit: search_param_1.limit,
|
536
|
+
data_length: Array.isArray(search_param_1.data[0]) ? search_param_1.data[0].length : 'N/A'
|
537
|
+
}, null, 2));
|
538
|
+
console.log(`[MilvusDB] 🔍 Sparse search params:`, JSON.stringify({
|
539
|
+
anns_field: search_param_2.anns_field,
|
540
|
+
param: search_param_2.param,
|
541
|
+
limit: search_param_2.limit,
|
542
|
+
query_text: typeof search_param_2.data === 'string' ? search_param_2.data.substring(0, 50) + '...' : 'N/A'
|
543
|
+
}, null, 2));
|
544
|
+
console.log(`[MilvusDB] 🔍 Rerank strategy:`, JSON.stringify(rerank_strategy, null, 2));
|
545
|
+
// Execute hybrid search using the correct client.search format
|
546
|
+
const searchParams = {
|
547
|
+
collection_name: collectionName,
|
548
|
+
data: [search_param_1, search_param_2],
|
549
|
+
limit: options?.limit || searchRequests[0]?.limit || 10,
|
550
|
+
rerank: rerank_strategy,
|
551
|
+
output_fields: ['id', 'content', 'relativePath', 'startLine', 'endLine', 'fileExtension', 'metadata'],
|
552
|
+
};
|
553
|
+
if (options?.filterExpr && options.filterExpr.trim().length > 0) {
|
554
|
+
searchParams.expr = options.filterExpr;
|
555
|
+
}
|
556
|
+
console.log(`[MilvusDB] 🔍 Complete search request:`, JSON.stringify({
|
557
|
+
collection_name: searchParams.collection_name,
|
558
|
+
data_count: searchParams.data.length,
|
559
|
+
limit: searchParams.limit,
|
560
|
+
rerank: searchParams.rerank,
|
561
|
+
output_fields: searchParams.output_fields,
|
562
|
+
expr: searchParams.expr
|
563
|
+
}, null, 2));
|
564
|
+
const searchResult = await this.client.search(searchParams);
|
565
|
+
console.log(`[MilvusDB] 🔍 Search executed, processing results...`);
|
566
|
+
if (!searchResult.results || searchResult.results.length === 0) {
|
567
|
+
console.log(`[MilvusDB] ⚠️ No results returned from Milvus search`);
|
568
|
+
return [];
|
569
|
+
}
|
570
|
+
console.log(`[MilvusDB] ✅ Found ${searchResult.results.length} results from hybrid search`);
|
571
|
+
// Transform results to HybridSearchResult format
|
572
|
+
return searchResult.results.map((result) => ({
|
573
|
+
document: {
|
574
|
+
id: result.id,
|
575
|
+
content: result.content,
|
576
|
+
vector: [],
|
577
|
+
sparse_vector: [],
|
578
|
+
relativePath: result.relativePath,
|
579
|
+
startLine: result.startLine,
|
580
|
+
endLine: result.endLine,
|
581
|
+
fileExtension: result.fileExtension,
|
582
|
+
metadata: JSON.parse(result.metadata || '{}'),
|
583
|
+
},
|
584
|
+
score: result.score,
|
585
|
+
}));
|
586
|
+
}
|
587
|
+
catch (error) {
|
588
|
+
console.error(`[MilvusDB] ❌ Failed to perform hybrid search on collection '${collectionName}':`, error);
|
589
|
+
throw error;
|
590
|
+
}
|
591
|
+
}
|
592
|
+
/**
|
593
|
+
* Wrapper method to handle collection creation with limit detection for gRPC client
|
594
|
+
* Returns true if collection can be created, false if limit exceeded
|
595
|
+
*/
|
596
|
+
async checkCollectionLimit() {
|
597
|
+
if (!this.client) {
|
598
|
+
throw new Error('MilvusClient is not initialized. Call ensureInitialized() first.');
|
599
|
+
}
|
600
|
+
const collectionName = `dummy_collection_${Date.now()}`;
|
601
|
+
const createCollectionParams = {
|
602
|
+
collection_name: collectionName,
|
603
|
+
description: 'Test collection for limit check',
|
604
|
+
fields: [
|
605
|
+
{
|
606
|
+
name: 'id',
|
607
|
+
data_type: milvus2_sdk_node_1.DataType.VarChar,
|
608
|
+
max_length: 512,
|
609
|
+
is_primary_key: true,
|
610
|
+
},
|
611
|
+
{
|
612
|
+
name: 'vector',
|
613
|
+
data_type: milvus2_sdk_node_1.DataType.FloatVector,
|
614
|
+
dim: 128,
|
615
|
+
}
|
616
|
+
]
|
617
|
+
};
|
618
|
+
try {
|
619
|
+
await this.client.createCollection(createCollectionParams);
|
620
|
+
// Immediately drop the collection after successful creation
|
621
|
+
if (await this.client.hasCollection({ collection_name: collectionName })) {
|
622
|
+
await this.client.dropCollection({
|
623
|
+
collection_name: collectionName,
|
624
|
+
});
|
625
|
+
}
|
626
|
+
return true;
|
627
|
+
}
|
628
|
+
catch (error) {
|
629
|
+
// Check if the error message contains the collection limit exceeded pattern
|
630
|
+
const errorMessage = error.message || error.toString() || '';
|
631
|
+
if (/exceeded the limit number of collections/i.test(errorMessage)) {
|
632
|
+
// Return false for collection limit exceeded
|
633
|
+
return false;
|
634
|
+
}
|
635
|
+
// Re-throw other errors as-is
|
636
|
+
throw error;
|
637
|
+
}
|
638
|
+
}
|
639
|
+
}
|
640
|
+
exports.MilvusVectorDatabase = MilvusVectorDatabase;
|
641
|
+
//# sourceMappingURL=milvus-vectordb.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"milvus-vectordb.js","sourceRoot":"","sources":["../../src/vectordb/milvus-vectordb.ts"],"names":[],"mappings":"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"}
|