@anvia/milvus 0.3.8 → 1.0.0-rc.2
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/dist/index.d.ts +35 -30
- package/dist/index.js +183 -70
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { Tool } from '@anvia/core/tool';
|
|
4
|
-
|
|
5
|
-
declare function filterToMilvusExpr(filter: VectorFilter | undefined): string | undefined;
|
|
1
|
+
import { VectorMetadata } from '@anvia/core/embeddings';
|
|
2
|
+
import { VectorMetric, VectorStore, VectorStoreUpsertOptions, VectorSearchRequest, VectorSearchResult, VectorFilter } from '@anvia/core/vector-store';
|
|
6
3
|
|
|
7
4
|
type MilvusMetric = "COSINE" | "L2" | "IP";
|
|
8
5
|
type MilvusClientLike = {
|
|
@@ -11,45 +8,53 @@ type MilvusClientLike = {
|
|
|
11
8
|
}): Promise<{
|
|
12
9
|
value: boolean;
|
|
13
10
|
}>;
|
|
11
|
+
describeCollection?(options: {
|
|
12
|
+
collection_name: string;
|
|
13
|
+
}): Promise<unknown>;
|
|
14
14
|
createCollection(options: Record<string, unknown>): Promise<unknown>;
|
|
15
15
|
createIndex(options: Record<string, unknown>): Promise<unknown>;
|
|
16
16
|
loadCollection(options: {
|
|
17
17
|
collection_name: string;
|
|
18
18
|
}): Promise<unknown>;
|
|
19
19
|
insert(options: Record<string, unknown>): Promise<unknown>;
|
|
20
|
+
delete(options: Record<string, unknown>): Promise<unknown>;
|
|
20
21
|
search(options: Record<string, unknown>): Promise<unknown>;
|
|
22
|
+
closeConnection?(): Promise<unknown> | unknown;
|
|
21
23
|
};
|
|
22
|
-
type
|
|
24
|
+
type MilvusVectorClientOptions = {
|
|
23
25
|
client?: MilvusClientLike | undefined;
|
|
26
|
+
address?: string | undefined;
|
|
27
|
+
token?: string | undefined;
|
|
28
|
+
};
|
|
29
|
+
type MilvusVectorStoreOptions = {
|
|
24
30
|
collectionName: string;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
metric?: MilvusMetric | undefined;
|
|
31
|
+
dimensions: number;
|
|
32
|
+
metric?: VectorMetric | undefined;
|
|
28
33
|
};
|
|
29
34
|
|
|
30
|
-
declare class
|
|
31
|
-
private readonly
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
declare class MilvusVectorStore<T, Metadata extends VectorMetadata = VectorMetadata> implements VectorStore<T, Metadata> {
|
|
36
|
+
private readonly owner;
|
|
37
|
+
readonly options: MilvusVectorStoreOptions;
|
|
38
|
+
constructor(owner: MilvusVectorClient, options: MilvusVectorStoreOptions);
|
|
39
|
+
ensure(): Promise<void>;
|
|
40
|
+
validate(): Promise<void>;
|
|
41
|
+
upsert(options: VectorStoreUpsertOptions<T, Metadata>): Promise<void>;
|
|
35
42
|
search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>>;
|
|
36
|
-
searchIds(request: VectorSearchRequest): Promise<Array<{
|
|
37
|
-
score: number;
|
|
38
|
-
id: string;
|
|
39
|
-
}>>;
|
|
40
|
-
asTool(options: VectorSearchToolOptions): Tool<{
|
|
41
|
-
query: string;
|
|
42
|
-
topK?: number;
|
|
43
|
-
}, unknown>;
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
declare class
|
|
47
|
-
private readonly
|
|
48
|
-
private readonly
|
|
49
|
-
private
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
declare class MilvusVectorClient {
|
|
46
|
+
private readonly options;
|
|
47
|
+
private readonly injected;
|
|
48
|
+
private clientPromise;
|
|
49
|
+
private closed;
|
|
50
|
+
constructor(options?: MilvusVectorClientOptions);
|
|
51
|
+
vectorStore<T, Metadata extends VectorMetadata = VectorMetadata>(options: MilvusVectorStoreOptions): MilvusVectorStore<T, Metadata>;
|
|
52
|
+
nativeClient(): Promise<MilvusClientLike>;
|
|
53
|
+
close(): Promise<void>;
|
|
54
|
+
private createClient;
|
|
55
|
+
private assertOpen;
|
|
53
56
|
}
|
|
54
57
|
|
|
55
|
-
|
|
58
|
+
declare function filterToMilvusExpr(filter: VectorFilter | undefined): string | undefined;
|
|
59
|
+
|
|
60
|
+
export { type MilvusClientLike, type MilvusMetric, MilvusVectorClient, type MilvusVectorClientOptions, MilvusVectorStore, type MilvusVectorStoreOptions, filterToMilvusExpr };
|
package/dist/index.js
CHANGED
|
@@ -36,12 +36,6 @@ function milvusLiteral(value) {
|
|
|
36
36
|
return String(value);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
// src/search-index.ts
|
|
40
|
-
import { embedText } from "@anvia/core/embeddings";
|
|
41
|
-
import {
|
|
42
|
-
createVectorSearchTool
|
|
43
|
-
} from "@anvia/core/vector-store";
|
|
44
|
-
|
|
45
39
|
// src/helpers.ts
|
|
46
40
|
import { createHash } from "crypto";
|
|
47
41
|
|
|
@@ -94,13 +88,13 @@ function milvusRows(document) {
|
|
|
94
88
|
return row;
|
|
95
89
|
});
|
|
96
90
|
}
|
|
97
|
-
function parseQueryResults(response,
|
|
98
|
-
const
|
|
99
|
-
const matches = raw.results?.[0] ?? [];
|
|
91
|
+
function parseQueryResults(response, minScore, metric) {
|
|
92
|
+
const matches = milvusMatches(response);
|
|
100
93
|
const byId = /* @__PURE__ */ new Map();
|
|
101
94
|
for (const match of matches) {
|
|
102
|
-
const
|
|
103
|
-
|
|
95
|
+
const rawScore = match.score ?? 0;
|
|
96
|
+
const score = metric === "L2" ? -rawScore : rawScore;
|
|
97
|
+
if (minScore !== void 0 && score < minScore) {
|
|
104
98
|
continue;
|
|
105
99
|
}
|
|
106
100
|
const id = String(match[documentIdFieldName] ?? match.id);
|
|
@@ -120,9 +114,13 @@ function parseQueryResults(response, threshold) {
|
|
|
120
114
|
}
|
|
121
115
|
return [...byId.values()];
|
|
122
116
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
117
|
+
function milvusResultCount(response) {
|
|
118
|
+
return milvusMatches(response).length;
|
|
119
|
+
}
|
|
120
|
+
function milvusMatches(response) {
|
|
121
|
+
const results = response.results ?? [];
|
|
122
|
+
const first = results[0];
|
|
123
|
+
return Array.isArray(first) ? first : results;
|
|
126
124
|
}
|
|
127
125
|
async function ensureCollection(client, collectionName, vectorSize, metric) {
|
|
128
126
|
const { value: exists } = await client.hasCollection({ collection_name: collectionName });
|
|
@@ -131,6 +129,7 @@ async function ensureCollection(client, collectionName, vectorSize, metric) {
|
|
|
131
129
|
}
|
|
132
130
|
await client.createCollection({
|
|
133
131
|
collection_name: collectionName,
|
|
132
|
+
enable_dynamic_field: true,
|
|
134
133
|
fields: [
|
|
135
134
|
{ name: "id", data_type: "VarChar", max_length: 64, is_primary_key: true },
|
|
136
135
|
{ name: documentIdFieldName, data_type: "VarChar", max_length: 4096 },
|
|
@@ -147,6 +146,22 @@ async function ensureCollection(client, collectionName, vectorSize, metric) {
|
|
|
147
146
|
params: { M: 16, efConstruction: 256 }
|
|
148
147
|
});
|
|
149
148
|
}
|
|
149
|
+
function validateMilvusCollection(response, collectionName, dimensions) {
|
|
150
|
+
const schema = response.schema;
|
|
151
|
+
if (schema?.fields === void 0) return;
|
|
152
|
+
const vector = schema.fields.find(
|
|
153
|
+
(field) => typeof field === "object" && field !== null && field.name === "vector"
|
|
154
|
+
);
|
|
155
|
+
if (vector === void 0) {
|
|
156
|
+
throw new Error(`Milvus collection ${collectionName} is missing its vector field`);
|
|
157
|
+
}
|
|
158
|
+
const rawDimensions = vector.dim ?? vector.type_params?.find((parameter) => parameter.key === "dim")?.value;
|
|
159
|
+
if (rawDimensions !== void 0 && Number(rawDimensions) !== dimensions) {
|
|
160
|
+
throw new Error(
|
|
161
|
+
`Milvus collection ${collectionName} has ${String(rawDimensions)} dimensions; expected ${dimensions}`
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
150
165
|
function metadataFromRow(row) {
|
|
151
166
|
const skipKeys = /* @__PURE__ */ new Set(["id", "score", documentIdFieldName, documentFieldName, "vector"]);
|
|
152
167
|
const metadata = Object.fromEntries(
|
|
@@ -157,73 +172,171 @@ function metadataFromRow(row) {
|
|
|
157
172
|
return Object.keys(metadata).length === 0 ? void 0 : metadata;
|
|
158
173
|
}
|
|
159
174
|
|
|
160
|
-
// src/
|
|
161
|
-
var
|
|
162
|
-
constructor(
|
|
163
|
-
this.
|
|
164
|
-
this.
|
|
165
|
-
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
175
|
+
// src/store.ts
|
|
176
|
+
var MilvusVectorStore = class {
|
|
177
|
+
constructor(owner, options) {
|
|
178
|
+
this.owner = owner;
|
|
179
|
+
this.options = options;
|
|
180
|
+
assertDimensions(options.dimensions);
|
|
181
|
+
}
|
|
182
|
+
owner;
|
|
183
|
+
options;
|
|
184
|
+
async ensure() {
|
|
185
|
+
const client = await this.owner.nativeClient();
|
|
186
|
+
await ensureCollection(
|
|
187
|
+
client,
|
|
188
|
+
this.options.collectionName,
|
|
189
|
+
this.options.dimensions,
|
|
190
|
+
metricName(this.options.metric)
|
|
191
|
+
);
|
|
192
|
+
await this.validate();
|
|
193
|
+
}
|
|
194
|
+
async validate() {
|
|
195
|
+
const client = await this.owner.nativeClient();
|
|
196
|
+
const { value } = await client.hasCollection({ collection_name: this.options.collectionName });
|
|
197
|
+
if (!value) throw new Error(`Milvus collection ${this.options.collectionName} does not exist`);
|
|
198
|
+
if (client.describeCollection !== void 0) {
|
|
199
|
+
validateMilvusCollection(
|
|
200
|
+
await client.describeCollection({ collection_name: this.options.collectionName }),
|
|
201
|
+
this.options.collectionName,
|
|
202
|
+
this.options.dimensions
|
|
203
|
+
);
|
|
181
204
|
}
|
|
182
|
-
|
|
183
|
-
return parseQueryResults(response, request.threshold);
|
|
205
|
+
await client.loadCollection({ collection_name: this.options.collectionName });
|
|
184
206
|
}
|
|
185
|
-
async
|
|
186
|
-
|
|
207
|
+
async upsert(options) {
|
|
208
|
+
validateDocuments(options.documents, this.options.dimensions);
|
|
209
|
+
if (options.documents.length === 0) return;
|
|
210
|
+
const client = await this.owner.nativeClient();
|
|
211
|
+
const ids = options.documents.map((document) => JSON.stringify(document.id)).join(", ");
|
|
212
|
+
await client.delete({
|
|
213
|
+
collection_name: this.options.collectionName,
|
|
214
|
+
filter: `${documentIdFieldName} in [${ids}]`
|
|
215
|
+
});
|
|
216
|
+
const data = options.documents.flatMap((document) => milvusRows(document));
|
|
217
|
+
if (data.length > 0)
|
|
218
|
+
await client.insert({
|
|
219
|
+
...options.providerOptions ?? {},
|
|
220
|
+
collection_name: this.options.collectionName,
|
|
221
|
+
data
|
|
222
|
+
});
|
|
187
223
|
}
|
|
188
|
-
|
|
189
|
-
|
|
224
|
+
async search(request) {
|
|
225
|
+
validateSearchRequest(request, this.options.dimensions);
|
|
226
|
+
const client = await this.owner.nativeClient();
|
|
227
|
+
let candidateLimit = request.topK;
|
|
228
|
+
for (; ; ) {
|
|
229
|
+
const response = await client.search({
|
|
230
|
+
...request.providerOptions ?? {},
|
|
231
|
+
collection_name: this.options.collectionName,
|
|
232
|
+
data: [request.vector],
|
|
233
|
+
limit: candidateLimit,
|
|
234
|
+
filter: filterToMilvusExpr(request.filter),
|
|
235
|
+
output_fields: ["*"]
|
|
236
|
+
});
|
|
237
|
+
throwIfAborted(request.abortSignal);
|
|
238
|
+
const unfiltered = parseQueryResults(
|
|
239
|
+
response,
|
|
240
|
+
void 0,
|
|
241
|
+
metricName(this.options.metric)
|
|
242
|
+
);
|
|
243
|
+
const results = selectResults(unfiltered, request);
|
|
244
|
+
if (results.length >= request.topK || milvusResultCount(response) < candidateLimit || hasResultBelowMinimum(unfiltered, request.minScore))
|
|
245
|
+
return results;
|
|
246
|
+
const nextLimit = nextCandidateLimit(candidateLimit);
|
|
247
|
+
if (nextLimit === candidateLimit) return results;
|
|
248
|
+
candidateLimit = nextLimit;
|
|
249
|
+
}
|
|
190
250
|
}
|
|
191
251
|
};
|
|
252
|
+
function selectResults(results, request) {
|
|
253
|
+
return results.filter((result) => request.minScore === void 0 || result.score >= request.minScore).sort((left, right) => right.score - left.score).slice(0, request.topK);
|
|
254
|
+
}
|
|
255
|
+
function hasResultBelowMinimum(results, minScore) {
|
|
256
|
+
return minScore !== void 0 && results.some((result) => result.score < minScore);
|
|
257
|
+
}
|
|
258
|
+
function nextCandidateLimit(current) {
|
|
259
|
+
return current > Math.floor(Number.MAX_SAFE_INTEGER / 2) ? current : current * 2;
|
|
260
|
+
}
|
|
261
|
+
function metricName(metric) {
|
|
262
|
+
if (metric === "euclidean") return "L2";
|
|
263
|
+
if (metric === "dotProduct") return "IP";
|
|
264
|
+
return "COSINE";
|
|
265
|
+
}
|
|
266
|
+
function throwIfAborted(signal) {
|
|
267
|
+
if (signal?.aborted) {
|
|
268
|
+
const error = new Error("The operation was aborted.");
|
|
269
|
+
error.name = "AbortError";
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function assertDimensions(dimensions) {
|
|
274
|
+
if (!Number.isSafeInteger(dimensions) || dimensions < 1)
|
|
275
|
+
throw new RangeError("Vector dimensions must be a positive safe integer.");
|
|
276
|
+
}
|
|
277
|
+
function validateDocuments(documents, dimensions) {
|
|
278
|
+
const ids = /* @__PURE__ */ new Set();
|
|
279
|
+
for (const document of documents) {
|
|
280
|
+
if (ids.has(document.id)) throw new TypeError(`Duplicate vector document id: ${document.id}`);
|
|
281
|
+
ids.add(document.id);
|
|
282
|
+
if (document.embeddings.length === 0)
|
|
283
|
+
throw new TypeError(`Vector document ${document.id} must contain at least one embedding.`);
|
|
284
|
+
for (const embedding of document.embeddings)
|
|
285
|
+
if (embedding.vector.length !== dimensions)
|
|
286
|
+
throw new Error(`Vector dimension mismatch for document ${document.id}`);
|
|
287
|
+
else if (!embedding.vector.every(Number.isFinite))
|
|
288
|
+
throw new Error(`Vector for document ${document.id} must contain only finite numbers`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
function validateSearchRequest(request, dimensions) {
|
|
292
|
+
throwIfAborted(request.abortSignal);
|
|
293
|
+
if (!Number.isSafeInteger(request.topK) || request.topK < 1)
|
|
294
|
+
throw new RangeError("Vector search topK must be a positive safe integer.");
|
|
295
|
+
if (request.minScore !== void 0 && !Number.isFinite(request.minScore))
|
|
296
|
+
throw new RangeError("Vector search minScore must be a finite number.");
|
|
297
|
+
if (request.vector.length !== dimensions) throw new Error("Vector dimension mismatch for query");
|
|
298
|
+
if (!request.vector.every(Number.isFinite))
|
|
299
|
+
throw new Error("Vector search query must contain only finite numbers");
|
|
300
|
+
}
|
|
192
301
|
|
|
193
|
-
// src/
|
|
194
|
-
var
|
|
195
|
-
constructor(
|
|
196
|
-
this.
|
|
197
|
-
this.
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
await this.
|
|
217
|
-
|
|
218
|
-
|
|
302
|
+
// src/client.ts
|
|
303
|
+
var MilvusVectorClient = class {
|
|
304
|
+
constructor(options = {}) {
|
|
305
|
+
this.options = options;
|
|
306
|
+
this.injected = options.client;
|
|
307
|
+
}
|
|
308
|
+
options;
|
|
309
|
+
injected;
|
|
310
|
+
clientPromise;
|
|
311
|
+
closed = false;
|
|
312
|
+
vectorStore(options) {
|
|
313
|
+
this.assertOpen();
|
|
314
|
+
return new MilvusVectorStore(this, options);
|
|
315
|
+
}
|
|
316
|
+
nativeClient() {
|
|
317
|
+
this.assertOpen();
|
|
318
|
+
this.clientPromise ??= this.injected === void 0 ? this.createClient() : Promise.resolve(this.injected);
|
|
319
|
+
return this.clientPromise;
|
|
320
|
+
}
|
|
321
|
+
async close() {
|
|
322
|
+
if (this.closed) return;
|
|
323
|
+
this.closed = true;
|
|
324
|
+
if (this.injected !== void 0 || this.clientPromise === void 0) return;
|
|
325
|
+
await (await this.clientPromise).closeConnection?.();
|
|
326
|
+
}
|
|
327
|
+
async createClient() {
|
|
328
|
+
const { MilvusClient } = await import("@zilliz/milvus2-sdk-node");
|
|
329
|
+
return new MilvusClient({
|
|
330
|
+
address: this.options.address ?? "localhost:19530",
|
|
331
|
+
...this.options.token === void 0 ? {} : { token: this.options.token }
|
|
219
332
|
});
|
|
220
333
|
}
|
|
221
|
-
|
|
222
|
-
|
|
334
|
+
assertOpen() {
|
|
335
|
+
if (this.closed) throw new Error("MilvusVectorClient is closed.");
|
|
223
336
|
}
|
|
224
337
|
};
|
|
225
338
|
export {
|
|
226
|
-
|
|
339
|
+
MilvusVectorClient,
|
|
227
340
|
MilvusVectorStore,
|
|
228
341
|
filterToMilvusExpr
|
|
229
342
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/filters.ts","../src/search-index.ts","../src/helpers.ts","../src/types.ts","../src/store.ts"],"sourcesContent":["import type { VectorFilter } from \"@anvia/core/vector-store\";\n\nexport function filterToMilvusExpr(filter: VectorFilter | undefined): string | undefined {\n if (filter === undefined) {\n return undefined;\n }\n\n switch (filter.type) {\n case \"eq\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} == ${val}`;\n }\n case \"gt\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} > ${val}`;\n }\n case \"lt\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} < ${val}`;\n }\n case \"and\": {\n const parts = filter.filters\n .map(filterToMilvusExpr)\n .filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.map((p) => `(${p})`).join(\" && \") : undefined;\n }\n case \"or\": {\n const parts = filter.filters\n .map(filterToMilvusExpr)\n .filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.map((p) => `(${p})`).join(\" || \") : undefined;\n }\n }\n}\n\nfunction milvusLiteral(value: string | number | boolean | null): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return String(value);\n}\n","import { type EmbeddingModel, embedText, type VectorMetadata } from \"@anvia/core/embeddings\";\nimport type { Tool } from \"@anvia/core/tool\";\nimport {\n createVectorSearchTool,\n type VectorSearchIndex,\n type VectorSearchRequest,\n type VectorSearchResult,\n type VectorSearchToolOptions,\n} from \"@anvia/core/vector-store\";\nimport { filterToMilvusExpr } from \"./filters.js\";\nimport { parseQueryResults } from \"./helpers.js\";\nimport { documentFieldName, documentIdFieldName, type MilvusClientLike } from \"./types.js\";\n\nexport class MilvusVectorIndex<T, Metadata extends VectorMetadata = VectorMetadata>\n implements VectorSearchIndex<T, Metadata>\n{\n constructor(\n private readonly model: EmbeddingModel,\n private readonly client: MilvusClientLike,\n private readonly collectionName: string,\n ) {}\n\n async search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>> {\n const queryEmbedding = await embedText(this.model, request.query);\n const filterExpr = filterToMilvusExpr(request.filter);\n const options: Record<string, unknown> = {\n collection_name: this.collectionName,\n vector: [queryEmbedding.vector],\n limit: request.topK,\n output_fields: [documentIdFieldName, documentFieldName, \"*\"],\n };\n if (filterExpr !== undefined) {\n options.filter = filterExpr;\n }\n const response = await this.client.search(options);\n return parseQueryResults<T, Metadata>(response, request.threshold);\n }\n\n async searchIds(request: VectorSearchRequest): Promise<Array<{ score: number; id: string }>> {\n return (await this.search(request)).map(({ score, id }) => ({ score, id }));\n }\n\n asTool(options: VectorSearchToolOptions): Tool<{ query: string; topK?: number }, unknown> {\n return createVectorSearchTool(this, options);\n }\n}\n","import { createHash } from \"node:crypto\";\nimport type { EmbeddedDocument, VectorMetadata } from \"@anvia/core/embeddings\";\nimport type { VectorSearchResult } from \"@anvia/core/vector-store\";\nimport {\n documentFieldName,\n documentIdFieldName,\n type MilvusClientLike,\n type MilvusMetric,\n reservedFieldPrefix,\n} from \"./types.js\";\n\nexport function pointId(id: string): string {\n return createHash(\"sha256\").update(id).digest(\"hex\").slice(0, 32);\n}\n\nexport function serializeDocument(document: unknown): string {\n return typeof document === \"string\" ? document : JSON.stringify(document);\n}\n\nexport function parseDocument<T>(document: unknown): T {\n if (document === null || document === undefined) {\n return \"\" as T;\n }\n if (typeof document !== \"string\") {\n return document as T;\n }\n try {\n return JSON.parse(document) as T;\n } catch {\n return document as T;\n }\n}\n\nexport function assertNoReservedFields(metadata: VectorMetadata | undefined): void {\n for (const key of Object.keys(metadata ?? {})) {\n if (key.startsWith(reservedFieldPrefix)) {\n throw new Error(`Metadata key ${key} is reserved for Anvia Milvus fields`);\n }\n }\n}\n\nexport function milvusRows<T, Metadata extends VectorMetadata>(\n document: EmbeddedDocument<T, Metadata>,\n): Array<Record<string, unknown>> {\n if (document.embeddings.length === 0) {\n throw new Error(`Document ${document.id} has no embeddings`);\n }\n\n assertNoReservedFields(document.metadata);\n\n return document.embeddings.map((embedding, index) => {\n const logicalId =\n document.embeddings.length === 1 ? document.id : `${document.id}#embedding:${index}`;\n const row: Record<string, unknown> = {\n id: pointId(logicalId),\n [documentIdFieldName]: document.id,\n [documentFieldName]: serializeDocument(document.document),\n vector: embedding.vector,\n };\n Object.assign(row, document.metadata);\n return row;\n });\n}\n\nexport function parseQueryResults<T, Metadata extends VectorMetadata>(\n response: unknown,\n threshold: number | undefined,\n): Array<VectorSearchResult<T, Metadata>> {\n const raw = response as {\n results?: Array<\n Array<{\n id: string;\n score?: number;\n [documentIdFieldName]?: string;\n [documentFieldName]?: string;\n [key: string]: unknown;\n }>\n >;\n };\n const matches = raw.results?.[0] ?? [];\n\n const byId = new Map<string, VectorSearchResult<T, Metadata>>();\n\n for (const match of matches) {\n const score = match.score ?? 0;\n if (threshold !== undefined && score < threshold) {\n continue;\n }\n\n const id = String(match[documentIdFieldName] ?? match.id);\n const result: VectorSearchResult<T, Metadata> = {\n id,\n score,\n document: parseDocument(match[documentFieldName]),\n };\n const metadata = metadataFromRow<Metadata>(match);\n if (metadata !== undefined) {\n result.metadata = metadata;\n }\n\n const current = byId.get(id);\n if (current === undefined || result.score > current.score) {\n byId.set(id, result);\n }\n }\n\n return [...byId.values()];\n}\n\nexport async function defaultMilvusClient(): Promise<MilvusClientLike> {\n const { MilvusClient } = await import(\"@zilliz/milvus2-sdk-node\");\n return new MilvusClient({ address: \"localhost:19530\" }) as unknown as MilvusClientLike;\n}\n\nexport async function ensureCollection(\n client: MilvusClientLike,\n collectionName: string,\n vectorSize: number,\n metric: MilvusMetric,\n): Promise<void> {\n const { value: exists } = await client.hasCollection({ collection_name: collectionName });\n if (exists) {\n return;\n }\n\n await client.createCollection({\n collection_name: collectionName,\n fields: [\n { name: \"id\", data_type: \"VarChar\", max_length: 64, is_primary_key: true },\n { name: documentIdFieldName, data_type: \"VarChar\", max_length: 4096 },\n { name: documentFieldName, data_type: \"VarChar\", max_length: 65535 },\n { name: \"vector\", data_type: \"FloatVector\", dim: vectorSize },\n ],\n metric_type: metric,\n });\n\n await client.createIndex({\n collection_name: collectionName,\n field_name: \"vector\",\n index_type: \"HNSW\",\n metric_type: metric,\n params: { M: 16, efConstruction: 256 },\n });\n}\n\nfunction metadataFromRow<Metadata extends VectorMetadata>(\n row: Record<string, unknown>,\n): Metadata | undefined {\n const skipKeys = new Set([\"id\", \"score\", documentIdFieldName, documentFieldName, \"vector\"]);\n const metadata = Object.fromEntries(\n Object.entries(row).filter(\n ([key]) => !skipKeys.has(key) && !key.startsWith(reservedFieldPrefix),\n ),\n ) as Metadata;\n return Object.keys(metadata).length === 0 ? undefined : metadata;\n}\n","export const documentIdFieldName = \"__anvia_document_id\";\nexport const documentFieldName = \"__anvia_document\";\nexport const reservedFieldPrefix = \"__anvia_\";\n\nexport type MilvusMetric = \"COSINE\" | \"L2\" | \"IP\";\n\nexport type MilvusClientLike = {\n hasCollection(options: { collection_name: string }): Promise<{ value: boolean }>;\n createCollection(options: Record<string, unknown>): Promise<unknown>;\n createIndex(options: Record<string, unknown>): Promise<unknown>;\n loadCollection(options: { collection_name: string }): Promise<unknown>;\n insert(options: Record<string, unknown>): Promise<unknown>;\n search(options: Record<string, unknown>): Promise<unknown>;\n};\n\nexport type MilvusVectorStoreConnectOptions = {\n client?: MilvusClientLike | undefined;\n collectionName: string;\n vectorSize: number;\n createIfMissing?: boolean | undefined;\n metric?: MilvusMetric | undefined;\n};\n","import type { EmbeddedDocument, EmbeddingModel, VectorMetadata } from \"@anvia/core/embeddings\";\nimport { defaultMilvusClient, ensureCollection, milvusRows } from \"./helpers.js\";\nimport { MilvusVectorIndex } from \"./search-index.js\";\nimport type { MilvusClientLike, MilvusVectorStoreConnectOptions } from \"./types.js\";\n\nexport class MilvusVectorStore<T, Metadata extends VectorMetadata = VectorMetadata> {\n private constructor(\n private readonly client: MilvusClientLike,\n private readonly collectionName: string,\n ) {}\n\n static async connect<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: MilvusVectorStoreConnectOptions,\n ): Promise<MilvusVectorStore<T, Metadata>> {\n const client = options.client ?? (await defaultMilvusClient());\n\n if (options.createIfMissing !== false) {\n await ensureCollection(\n client,\n options.collectionName,\n options.vectorSize,\n options.metric ?? \"COSINE\",\n );\n }\n\n await client.loadCollection({ collection_name: options.collectionName });\n return new MilvusVectorStore<T, Metadata>(client, options.collectionName);\n }\n\n async upsertDocuments(documents: Array<EmbeddedDocument<T, Metadata>>): Promise<void> {\n const rows = documents.flatMap((document) => milvusRows(document));\n await this.client.insert({\n collection_name: this.collectionName,\n data: rows,\n });\n }\n\n index(model: EmbeddingModel): MilvusVectorIndex<T, Metadata> {\n return new MilvusVectorIndex(model, this.client, this.collectionName);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/filters.ts","../src/helpers.ts","../src/types.ts","../src/store.ts","../src/client.ts"],"sourcesContent":["import type { VectorFilter } from \"@anvia/core/vector-store\";\n\nexport function filterToMilvusExpr(filter: VectorFilter | undefined): string | undefined {\n if (filter === undefined) {\n return undefined;\n }\n\n switch (filter.type) {\n case \"eq\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} == ${val}`;\n }\n case \"gt\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} > ${val}`;\n }\n case \"lt\": {\n const val = milvusLiteral(filter.value);\n return `${filter.key} < ${val}`;\n }\n case \"and\": {\n const parts = filter.filters\n .map(filterToMilvusExpr)\n .filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.map((p) => `(${p})`).join(\" && \") : undefined;\n }\n case \"or\": {\n const parts = filter.filters\n .map(filterToMilvusExpr)\n .filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.map((p) => `(${p})`).join(\" || \") : undefined;\n }\n }\n}\n\nfunction milvusLiteral(value: string | number | boolean | null): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"string\") {\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n }\n return String(value);\n}\n","import { createHash } from \"node:crypto\";\nimport type { EmbeddedDocument, VectorMetadata } from \"@anvia/core/embeddings\";\nimport type { VectorSearchResult } from \"@anvia/core/vector-store\";\nimport {\n documentFieldName,\n documentIdFieldName,\n type MilvusClientLike,\n type MilvusMetric,\n reservedFieldPrefix,\n} from \"./types.js\";\n\nexport function pointId(id: string): string {\n return createHash(\"sha256\").update(id).digest(\"hex\").slice(0, 32);\n}\n\nexport function serializeDocument(document: unknown): string {\n return typeof document === \"string\" ? document : JSON.stringify(document);\n}\n\nexport function parseDocument<T>(document: unknown): T {\n if (document === null || document === undefined) {\n return \"\" as T;\n }\n if (typeof document !== \"string\") {\n return document as T;\n }\n try {\n return JSON.parse(document) as T;\n } catch {\n return document as T;\n }\n}\n\nexport function assertNoReservedFields(metadata: VectorMetadata | undefined): void {\n for (const key of Object.keys(metadata ?? {})) {\n if (key.startsWith(reservedFieldPrefix)) {\n throw new Error(`Metadata key ${key} is reserved for Anvia Milvus fields`);\n }\n }\n}\n\nexport function milvusRows<T, Metadata extends VectorMetadata>(\n document: EmbeddedDocument<T, Metadata>,\n): Array<Record<string, unknown>> {\n if (document.embeddings.length === 0) {\n throw new Error(`Document ${document.id} has no embeddings`);\n }\n\n assertNoReservedFields(document.metadata);\n\n return document.embeddings.map((embedding, index) => {\n const logicalId =\n document.embeddings.length === 1 ? document.id : `${document.id}#embedding:${index}`;\n const row: Record<string, unknown> = {\n id: pointId(logicalId),\n [documentIdFieldName]: document.id,\n [documentFieldName]: serializeDocument(document.document),\n vector: embedding.vector,\n };\n Object.assign(row, document.metadata);\n return row;\n });\n}\n\nexport function parseQueryResults<T, Metadata extends VectorMetadata>(\n response: unknown,\n minScore: number | undefined,\n metric: MilvusMetric,\n): Array<VectorSearchResult<T, Metadata>> {\n const matches = milvusMatches(response);\n\n const byId = new Map<string, VectorSearchResult<T, Metadata>>();\n\n for (const match of matches) {\n const rawScore = match.score ?? 0;\n const score = metric === \"L2\" ? -rawScore : rawScore;\n if (minScore !== undefined && score < minScore) {\n continue;\n }\n\n const id = String(match[documentIdFieldName] ?? match.id);\n const result: VectorSearchResult<T, Metadata> = {\n id,\n score,\n document: parseDocument(match[documentFieldName]),\n };\n const metadata = metadataFromRow<Metadata>(match);\n if (metadata !== undefined) {\n result.metadata = metadata;\n }\n\n const current = byId.get(id);\n if (current === undefined || result.score > current.score) {\n byId.set(id, result);\n }\n }\n\n return [...byId.values()];\n}\n\nexport function milvusResultCount(response: unknown): number {\n return milvusMatches(response).length;\n}\n\ntype MilvusMatch = {\n id: string;\n score?: number;\n [documentIdFieldName]?: string;\n [documentFieldName]?: string;\n [key: string]: unknown;\n};\n\nfunction milvusMatches(response: unknown): MilvusMatch[] {\n const results = (response as { results?: Array<MilvusMatch | MilvusMatch[]> }).results ?? [];\n const first = results[0];\n return Array.isArray(first) ? first : (results as MilvusMatch[]);\n}\n\nexport async function ensureCollection(\n client: MilvusClientLike,\n collectionName: string,\n vectorSize: number,\n metric: MilvusMetric,\n): Promise<void> {\n const { value: exists } = await client.hasCollection({ collection_name: collectionName });\n if (exists) {\n return;\n }\n\n await client.createCollection({\n collection_name: collectionName,\n enable_dynamic_field: true,\n fields: [\n { name: \"id\", data_type: \"VarChar\", max_length: 64, is_primary_key: true },\n { name: documentIdFieldName, data_type: \"VarChar\", max_length: 4096 },\n { name: documentFieldName, data_type: \"VarChar\", max_length: 65535 },\n { name: \"vector\", data_type: \"FloatVector\", dim: vectorSize },\n ],\n metric_type: metric,\n });\n\n await client.createIndex({\n collection_name: collectionName,\n field_name: \"vector\",\n index_type: \"HNSW\",\n metric_type: metric,\n params: { M: 16, efConstruction: 256 },\n });\n}\n\nexport function validateMilvusCollection(\n response: unknown,\n collectionName: string,\n dimensions: number,\n): void {\n const schema = (response as { schema?: { fields?: unknown[] } }).schema;\n if (schema?.fields === undefined) return;\n const vector = schema.fields.find(\n (\n field,\n ): field is {\n name?: string;\n dim?: unknown;\n type_params?: Array<{ key?: string; value?: unknown }>;\n } =>\n typeof field === \"object\" &&\n field !== null &&\n (field as { name?: unknown }).name === \"vector\",\n );\n if (vector === undefined) {\n throw new Error(`Milvus collection ${collectionName} is missing its vector field`);\n }\n const rawDimensions =\n vector.dim ?? vector.type_params?.find((parameter) => parameter.key === \"dim\")?.value;\n if (rawDimensions !== undefined && Number(rawDimensions) !== dimensions) {\n throw new Error(\n `Milvus collection ${collectionName} has ${String(rawDimensions)} dimensions; expected ${dimensions}`,\n );\n }\n}\n\nfunction metadataFromRow<Metadata extends VectorMetadata>(\n row: Record<string, unknown>,\n): Metadata | undefined {\n const skipKeys = new Set([\"id\", \"score\", documentIdFieldName, documentFieldName, \"vector\"]);\n const metadata = Object.fromEntries(\n Object.entries(row).filter(\n ([key]) => !skipKeys.has(key) && !key.startsWith(reservedFieldPrefix),\n ),\n ) as Metadata;\n return Object.keys(metadata).length === 0 ? undefined : metadata;\n}\n","import type { VectorMetric } from \"@anvia/core/vector-store\";\n\nexport const documentIdFieldName = \"__anvia_document_id\";\nexport const documentFieldName = \"__anvia_document\";\nexport const reservedFieldPrefix = \"__anvia_\";\n\nexport type MilvusMetric = \"COSINE\" | \"L2\" | \"IP\";\n\nexport type MilvusClientLike = {\n hasCollection(options: { collection_name: string }): Promise<{ value: boolean }>;\n describeCollection?(options: { collection_name: string }): Promise<unknown>;\n createCollection(options: Record<string, unknown>): Promise<unknown>;\n createIndex(options: Record<string, unknown>): Promise<unknown>;\n loadCollection(options: { collection_name: string }): Promise<unknown>;\n insert(options: Record<string, unknown>): Promise<unknown>;\n delete(options: Record<string, unknown>): Promise<unknown>;\n search(options: Record<string, unknown>): Promise<unknown>;\n closeConnection?(): Promise<unknown> | unknown;\n};\n\nexport type MilvusVectorClientOptions = {\n client?: MilvusClientLike | undefined;\n address?: string | undefined;\n token?: string | undefined;\n};\n\nexport type MilvusVectorStoreOptions = {\n collectionName: string;\n dimensions: number;\n metric?: VectorMetric | undefined;\n};\n","import type { EmbeddedDocument, VectorMetadata } from \"@anvia/core/embeddings\";\nimport type {\n VectorSearchRequest,\n VectorSearchResult,\n VectorStore,\n VectorStoreUpsertOptions,\n} from \"@anvia/core/vector-store\";\nimport type { MilvusVectorClient } from \"./client.js\";\nimport { filterToMilvusExpr } from \"./filters.js\";\nimport {\n ensureCollection,\n milvusResultCount,\n milvusRows,\n parseQueryResults,\n validateMilvusCollection,\n} from \"./helpers.js\";\nimport { documentIdFieldName, type MilvusMetric, type MilvusVectorStoreOptions } from \"./types.js\";\n\nexport class MilvusVectorStore<T, Metadata extends VectorMetadata = VectorMetadata>\n implements VectorStore<T, Metadata>\n{\n constructor(\n private readonly owner: MilvusVectorClient,\n readonly options: MilvusVectorStoreOptions,\n ) {\n assertDimensions(options.dimensions);\n }\n\n async ensure(): Promise<void> {\n const client = await this.owner.nativeClient();\n await ensureCollection(\n client,\n this.options.collectionName,\n this.options.dimensions,\n metricName(this.options.metric),\n );\n await this.validate();\n }\n\n async validate(): Promise<void> {\n const client = await this.owner.nativeClient();\n const { value } = await client.hasCollection({ collection_name: this.options.collectionName });\n if (!value) throw new Error(`Milvus collection ${this.options.collectionName} does not exist`);\n if (client.describeCollection !== undefined) {\n validateMilvusCollection(\n await client.describeCollection({ collection_name: this.options.collectionName }),\n this.options.collectionName,\n this.options.dimensions,\n );\n }\n await client.loadCollection({ collection_name: this.options.collectionName });\n }\n\n async upsert(options: VectorStoreUpsertOptions<T, Metadata>): Promise<void> {\n validateDocuments(options.documents, this.options.dimensions);\n if (options.documents.length === 0) return;\n const client = await this.owner.nativeClient();\n const ids = options.documents.map((document) => JSON.stringify(document.id)).join(\", \");\n await client.delete({\n collection_name: this.options.collectionName,\n filter: `${documentIdFieldName} in [${ids}]`,\n });\n const data = options.documents.flatMap((document) => milvusRows(document));\n if (data.length > 0)\n await client.insert({\n ...(options.providerOptions ?? {}),\n collection_name: this.options.collectionName,\n data,\n });\n }\n\n async search(request: VectorSearchRequest): Promise<Array<VectorSearchResult<T, Metadata>>> {\n validateSearchRequest(request, this.options.dimensions);\n const client = await this.owner.nativeClient();\n let candidateLimit = request.topK;\n for (;;) {\n const response = await client.search({\n ...(request.providerOptions ?? {}),\n collection_name: this.options.collectionName,\n data: [request.vector],\n limit: candidateLimit,\n filter: filterToMilvusExpr(request.filter),\n output_fields: [\"*\"],\n });\n throwIfAborted(request.abortSignal);\n const unfiltered = parseQueryResults<T, Metadata>(\n response,\n undefined,\n metricName(this.options.metric),\n );\n const results = selectResults(unfiltered, request);\n if (\n results.length >= request.topK ||\n milvusResultCount(response) < candidateLimit ||\n hasResultBelowMinimum(unfiltered, request.minScore)\n )\n return results;\n const nextLimit = nextCandidateLimit(candidateLimit);\n if (nextLimit === candidateLimit) return results;\n candidateLimit = nextLimit;\n }\n }\n}\n\nfunction selectResults<T, Metadata extends VectorMetadata>(\n results: Array<VectorSearchResult<T, Metadata>>,\n request: VectorSearchRequest,\n): Array<VectorSearchResult<T, Metadata>> {\n return results\n .filter((result) => request.minScore === undefined || result.score >= request.minScore)\n .sort((left, right) => right.score - left.score)\n .slice(0, request.topK);\n}\n\nfunction hasResultBelowMinimum<T, Metadata extends VectorMetadata>(\n results: Array<VectorSearchResult<T, Metadata>>,\n minScore: number | undefined,\n): boolean {\n return minScore !== undefined && results.some((result) => result.score < minScore);\n}\n\nfunction nextCandidateLimit(current: number): number {\n return current > Math.floor(Number.MAX_SAFE_INTEGER / 2) ? current : current * 2;\n}\n\nfunction metricName(metric: MilvusVectorStoreOptions[\"metric\"]): MilvusMetric {\n if (metric === \"euclidean\") return \"L2\";\n if (metric === \"dotProduct\") return \"IP\";\n return \"COSINE\";\n}\nfunction throwIfAborted(signal: AbortSignal | undefined): void {\n if (signal?.aborted) {\n const error = new Error(\"The operation was aborted.\");\n error.name = \"AbortError\";\n throw error;\n }\n}\nfunction assertDimensions(dimensions: number): void {\n if (!Number.isSafeInteger(dimensions) || dimensions < 1)\n throw new RangeError(\"Vector dimensions must be a positive safe integer.\");\n}\nfunction validateDocuments<T, Metadata extends VectorMetadata>(\n documents: Array<EmbeddedDocument<T, Metadata>>,\n dimensions: number,\n): void {\n const ids = new Set<string>();\n for (const document of documents) {\n if (ids.has(document.id)) throw new TypeError(`Duplicate vector document id: ${document.id}`);\n ids.add(document.id);\n if (document.embeddings.length === 0)\n throw new TypeError(`Vector document ${document.id} must contain at least one embedding.`);\n for (const embedding of document.embeddings)\n if (embedding.vector.length !== dimensions)\n throw new Error(`Vector dimension mismatch for document ${document.id}`);\n else if (!embedding.vector.every(Number.isFinite))\n throw new Error(`Vector for document ${document.id} must contain only finite numbers`);\n }\n}\n\nfunction validateSearchRequest(request: VectorSearchRequest, dimensions: number): void {\n throwIfAborted(request.abortSignal);\n if (!Number.isSafeInteger(request.topK) || request.topK < 1)\n throw new RangeError(\"Vector search topK must be a positive safe integer.\");\n if (request.minScore !== undefined && !Number.isFinite(request.minScore))\n throw new RangeError(\"Vector search minScore must be a finite number.\");\n if (request.vector.length !== dimensions) throw new Error(\"Vector dimension mismatch for query\");\n if (!request.vector.every(Number.isFinite))\n throw new Error(\"Vector search query must contain only finite numbers\");\n}\n","import type { VectorMetadata } from \"@anvia/core/embeddings\";\nimport { MilvusVectorStore } from \"./store.js\";\nimport type {\n MilvusClientLike,\n MilvusVectorClientOptions,\n MilvusVectorStoreOptions,\n} from \"./types.js\";\n\nexport class MilvusVectorClient {\n private readonly injected: MilvusClientLike | undefined;\n private clientPromise: Promise<MilvusClientLike> | undefined;\n private closed = false;\n\n constructor(private readonly options: MilvusVectorClientOptions = {}) {\n this.injected = options.client;\n }\n\n vectorStore<T, Metadata extends VectorMetadata = VectorMetadata>(\n options: MilvusVectorStoreOptions,\n ): MilvusVectorStore<T, Metadata> {\n this.assertOpen();\n return new MilvusVectorStore<T, Metadata>(this, options);\n }\n\n nativeClient(): Promise<MilvusClientLike> {\n this.assertOpen();\n this.clientPromise ??=\n this.injected === undefined ? this.createClient() : Promise.resolve(this.injected);\n return this.clientPromise;\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.injected !== undefined || this.clientPromise === undefined) return;\n await (await this.clientPromise).closeConnection?.();\n }\n\n private async createClient(): Promise<MilvusClientLike> {\n const { MilvusClient } = await import(\"@zilliz/milvus2-sdk-node\");\n return new MilvusClient({\n address: this.options.address ?? \"localhost:19530\",\n ...(this.options.token === undefined ? {} : { token: this.options.token }),\n }) as unknown as MilvusClientLike;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error(\"MilvusVectorClient is closed.\");\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/milvus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-rc.2",
|
|
4
4
|
"description": "Milvus vector store adapter for Anvia.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"tsup": "^8.5.0",
|
|
34
34
|
"typescript": "^5.9.3",
|
|
35
35
|
"vitest": "^4.0.8",
|
|
36
|
-
"@anvia/core": "0.
|
|
36
|
+
"@anvia/core": "1.0.0-rc.2"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "
|
|
39
|
+
"@anvia/core": "1.0.0-rc.2"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|