@anvia/milvus 1.0.0 → 1.0.1
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.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -216,7 +216,7 @@ var MilvusVectorStore = class {
|
|
|
216
216
|
const data = options.documents.flatMap((document) => milvusRows(document));
|
|
217
217
|
if (data.length > 0)
|
|
218
218
|
await client.insert({
|
|
219
|
-
...options.providerOptions
|
|
219
|
+
...options.providerOptions,
|
|
220
220
|
collection_name: this.options.collectionName,
|
|
221
221
|
data
|
|
222
222
|
});
|
|
@@ -227,7 +227,7 @@ var MilvusVectorStore = class {
|
|
|
227
227
|
let candidateLimit = request.topK;
|
|
228
228
|
for (; ; ) {
|
|
229
229
|
const response = await client.search({
|
|
230
|
-
...request.providerOptions
|
|
230
|
+
...request.providerOptions,
|
|
231
231
|
collection_name: this.options.collectionName,
|
|
232
232
|
data: [request.vector],
|
|
233
233
|
limit: candidateLimit,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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<\n T,\n Metadata extends VectorMetadata = VectorMetadata,\n> implements VectorStore<T, Metadata> {\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": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
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": "1.0.
|
|
36
|
+
"@anvia/core": "1.0.1"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "1.0.
|
|
39
|
+
"@anvia/core": "1.0.1"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|