@anvia/milvus 0.3.8 → 1.0.0-rc.10

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 CHANGED
@@ -1,8 +1,5 @@
1
- import { VectorFilter, VectorSearchIndex, VectorSearchRequest, VectorSearchResult, VectorSearchToolOptions } from '@anvia/core/vector-store';
2
- import { VectorMetadata, EmbeddingModel, EmbeddedDocument } from '@anvia/core/embeddings';
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 MilvusVectorStoreConnectOptions = {
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
- vectorSize: number;
26
- createIfMissing?: boolean | undefined;
27
- metric?: MilvusMetric | undefined;
31
+ dimensions: number;
32
+ metric?: VectorMetric | undefined;
28
33
  };
29
34
 
30
- declare class MilvusVectorIndex<T, Metadata extends VectorMetadata = VectorMetadata> implements VectorSearchIndex<T, Metadata> {
31
- private readonly model;
32
- private readonly client;
33
- private readonly collectionName;
34
- constructor(model: EmbeddingModel, client: MilvusClientLike, collectionName: string);
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 MilvusVectorStore<T, Metadata extends VectorMetadata = VectorMetadata> {
47
- private readonly client;
48
- private readonly collectionName;
49
- private constructor();
50
- static connect<T, Metadata extends VectorMetadata = VectorMetadata>(options: MilvusVectorStoreConnectOptions): Promise<MilvusVectorStore<T, Metadata>>;
51
- upsertDocuments(documents: Array<EmbeddedDocument<T, Metadata>>): Promise<void>;
52
- index(model: EmbeddingModel): MilvusVectorIndex<T, Metadata>;
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
- export { type MilvusClientLike, type MilvusMetric, MilvusVectorIndex, MilvusVectorStore, type MilvusVectorStoreConnectOptions, filterToMilvusExpr };
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, threshold) {
98
- const raw = response;
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 score = match.score ?? 0;
103
- if (threshold !== void 0 && score < threshold) {
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
- async function defaultMilvusClient() {
124
- const { MilvusClient } = await import("@zilliz/milvus2-sdk-node");
125
- return new MilvusClient({ address: "localhost:19530" });
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,172 @@ function metadataFromRow(row) {
157
172
  return Object.keys(metadata).length === 0 ? void 0 : metadata;
158
173
  }
159
174
 
160
- // src/search-index.ts
161
- var MilvusVectorIndex = class {
162
- constructor(model, client, collectionName) {
163
- this.model = model;
164
- this.client = client;
165
- this.collectionName = collectionName;
166
- }
167
- model;
168
- client;
169
- collectionName;
170
- async search(request) {
171
- const queryEmbedding = await embedText(this.model, request.query);
172
- const filterExpr = filterToMilvusExpr(request.filter);
173
- const options = {
174
- collection_name: this.collectionName,
175
- vector: [queryEmbedding.vector],
176
- limit: request.topK,
177
- output_fields: [documentIdFieldName, documentFieldName, "*"]
178
- };
179
- if (filterExpr !== void 0) {
180
- options.filter = filterExpr;
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
- const response = await this.client.search(options);
183
- return parseQueryResults(response, request.threshold);
205
+ await client.loadCollection({ collection_name: this.options.collectionName });
184
206
  }
185
- async searchIds(request) {
186
- return (await this.search(request)).map(({ score, id }) => ({ score, id }));
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
- asTool(options) {
189
- return createVectorSearchTool(this, options);
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/store.ts
194
- var MilvusVectorStore = class _MilvusVectorStore {
195
- constructor(client, collectionName) {
196
- this.client = client;
197
- this.collectionName = collectionName;
198
- }
199
- client;
200
- collectionName;
201
- static async connect(options) {
202
- const client = options.client ?? await defaultMilvusClient();
203
- if (options.createIfMissing !== false) {
204
- await ensureCollection(
205
- client,
206
- options.collectionName,
207
- options.vectorSize,
208
- options.metric ?? "COSINE"
209
- );
210
- }
211
- await client.loadCollection({ collection_name: options.collectionName });
212
- return new _MilvusVectorStore(client, options.collectionName);
213
- }
214
- async upsertDocuments(documents) {
215
- const rows = documents.flatMap((document) => milvusRows(document));
216
- await this.client.insert({
217
- collection_name: this.collectionName,
218
- data: rows
219
- });
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
+ const options = {
330
+ address: this.options.address ?? "localhost:19530"
331
+ };
332
+ if (this.options.token !== void 0) options.token = this.options.token;
333
+ return new MilvusClient(options);
220
334
  }
221
- index(model) {
222
- return new MilvusVectorIndex(model, this.client, this.collectionName);
335
+ assertOpen() {
336
+ if (this.closed) throw new Error("MilvusVectorClient is closed.");
223
337
  }
224
338
  };
225
339
  export {
226
- MilvusVectorIndex,
340
+ MilvusVectorClient,
227
341
  MilvusVectorStore,
228
342
  filterToMilvusExpr
229
343
  };
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 const options: { address: string; token?: string } = {\n address: this.options.address ?? \"localhost:19530\",\n };\n if (this.options.token !== undefined) options.token = this.options.token;\n return new MilvusClient(options) 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.8",
3
+ "version": "1.0.0-rc.10",
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.25.1"
36
+ "@anvia/core": "1.0.0-rc.10"
37
37
  },
38
38
  "peerDependencies": {
39
- "@anvia/core": ">=0.7.1 <1.0.0"
39
+ "@anvia/core": "1.0.0-rc.10"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsup src/index.ts --format esm --dts --sourcemap --clean",