@anvia/milvus 0.3.7-preview.20260628T094557.2ab9488 → 0.3.7
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 +16 -9
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -84,13 +84,14 @@ function milvusRows(document) {
|
|
|
84
84
|
assertNoReservedFields(document.metadata);
|
|
85
85
|
return document.embeddings.map((embedding, index) => {
|
|
86
86
|
const logicalId = document.embeddings.length === 1 ? document.id : `${document.id}#embedding:${index}`;
|
|
87
|
-
|
|
87
|
+
const row = {
|
|
88
88
|
id: pointId(logicalId),
|
|
89
89
|
[documentIdFieldName]: document.id,
|
|
90
90
|
[documentFieldName]: serializeDocument(document.document),
|
|
91
|
-
vector: embedding.vector
|
|
92
|
-
...document.metadata ?? {}
|
|
91
|
+
vector: embedding.vector
|
|
93
92
|
};
|
|
93
|
+
Object.assign(row, document.metadata);
|
|
94
|
+
return row;
|
|
94
95
|
});
|
|
95
96
|
}
|
|
96
97
|
function parseQueryResults(response, threshold) {
|
|
@@ -106,9 +107,12 @@ function parseQueryResults(response, threshold) {
|
|
|
106
107
|
const result = {
|
|
107
108
|
id,
|
|
108
109
|
score,
|
|
109
|
-
document: parseDocument(match[documentFieldName])
|
|
110
|
-
...metadataFromRow(match)
|
|
110
|
+
document: parseDocument(match[documentFieldName])
|
|
111
111
|
};
|
|
112
|
+
const metadata = metadataFromRow(match);
|
|
113
|
+
if (metadata !== void 0) {
|
|
114
|
+
result.metadata = metadata;
|
|
115
|
+
}
|
|
112
116
|
const current = byId.get(id);
|
|
113
117
|
if (current === void 0 || result.score > current.score) {
|
|
114
118
|
byId.set(id, result);
|
|
@@ -150,7 +154,7 @@ function metadataFromRow(row) {
|
|
|
150
154
|
([key]) => !skipKeys.has(key) && !key.startsWith(reservedFieldPrefix)
|
|
151
155
|
)
|
|
152
156
|
);
|
|
153
|
-
return Object.keys(metadata).length === 0 ?
|
|
157
|
+
return Object.keys(metadata).length === 0 ? void 0 : metadata;
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
// src/search-index.ts
|
|
@@ -166,13 +170,16 @@ var MilvusVectorIndex = class {
|
|
|
166
170
|
async search(request) {
|
|
167
171
|
const queryEmbedding = await embedText(this.model, request.query);
|
|
168
172
|
const filterExpr = filterToMilvusExpr(request.filter);
|
|
169
|
-
const
|
|
173
|
+
const options = {
|
|
170
174
|
collection_name: this.collectionName,
|
|
171
175
|
vector: [queryEmbedding.vector],
|
|
172
176
|
limit: request.topK,
|
|
173
|
-
...filterExpr !== void 0 ? { filter: filterExpr } : {},
|
|
174
177
|
output_fields: [documentIdFieldName, documentFieldName, "*"]
|
|
175
|
-
}
|
|
178
|
+
};
|
|
179
|
+
if (filterExpr !== void 0) {
|
|
180
|
+
options.filter = filterExpr;
|
|
181
|
+
}
|
|
182
|
+
const response = await this.client.search(options);
|
|
176
183
|
return parseQueryResults(response, request.threshold);
|
|
177
184
|
}
|
|
178
185
|
async searchIds(request) {
|
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 response = await this.client.search({\n collection_name: this.collectionName,\n vector: [queryEmbedding.vector],\n limit: request.topK,\n ...(filterExpr !== undefined ? { filter: filterExpr } : {}),\n output_fields: [documentIdFieldName, documentFieldName, \"*\"],\n });\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 return {\n id: pointId(logicalId),\n [documentIdFieldName]: document.id,\n [documentFieldName]: serializeDocument(document.document),\n vector: embedding.vector,\n ...(document.metadata ?? {}),\n };\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 = {\n id,\n score,\n document: parseDocument(match[documentFieldName]),\n ...metadataFromRow<Metadata>(match),\n } as VectorSearchResult<T, Metadata>;\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?: 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 ? {} : { 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":";AAEO,SAAS,mBAAmB,QAAsD;AACvF,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,MAAM;AACT,YAAM,MAAM,cAAc,OAAO,KAAK;AACtC,aAAO,GAAG,OAAO,GAAG,OAAO,GAAG;AAAA,IAChC;AAAA,IACA,KAAK,MAAM;AACT,YAAM,MAAM,cAAc,OAAO,KAAK;AACtC,aAAO,GAAG,OAAO,GAAG,MAAM,GAAG;AAAA,IAC/B;AAAA,IACA,KAAK,MAAM;AACT,YAAM,MAAM,cAAc,OAAO,KAAK;AACtC,aAAO,GAAG,OAAO,GAAG,MAAM,GAAG;AAAA,IAC/B;AAAA,IACA,KAAK,OAAO;AACV,YAAM,QAAQ,OAAO,QAClB,IAAI,kBAAkB,EACtB,OAAO,CAAC,SAAyB,SAAS,MAAS;AACtD,aAAO,MAAM,SAAS,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,MAAM,IAAI;AAAA,IACtE;AAAA,IACA,KAAK,MAAM;AACT,YAAM,QAAQ,OAAO,QAClB,IAAI,kBAAkB,EACtB,OAAO,CAAC,SAAyB,SAAS,MAAS;AACtD,aAAO,MAAM,SAAS,IAAI,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,MAAM,IAAI;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAiD;AACtE,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AAAA,EAC9D;AACA,SAAO,OAAO,KAAK;AACrB;;;AC3CA,SAA8B,iBAAsC;AAEpE;AAAA,EACE;AAAA,OAKK;;;ACRP,SAAS,kBAAkB;;;ACApB,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAC1B,IAAM,sBAAsB;;;ADS5B,SAAS,QAAQ,IAAoB;AAC1C,SAAO,WAAW,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAClE;AAEO,SAAS,kBAAkB,UAA2B;AAC3D,SAAO,OAAO,aAAa,WAAW,WAAW,KAAK,UAAU,QAAQ;AAC1E;AAEO,SAAS,cAAiB,UAAsB;AACrD,MAAI,aAAa,QAAQ,aAAa,QAAW;AAC/C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,QAAQ;AAAA,EAC5B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,uBAAuB,UAA4C;AACjF,aAAW,OAAO,OAAO,KAAK,YAAY,CAAC,CAAC,GAAG;AAC7C,QAAI,IAAI,WAAW,mBAAmB,GAAG;AACvC,YAAM,IAAI,MAAM,gBAAgB,GAAG,sCAAsC;AAAA,IAC3E;AAAA,EACF;AACF;AAEO,SAAS,WACd,UACgC;AAChC,MAAI,SAAS,WAAW,WAAW,GAAG;AACpC,UAAM,IAAI,MAAM,YAAY,SAAS,EAAE,oBAAoB;AAAA,EAC7D;AAEA,yBAAuB,SAAS,QAAQ;AAExC,SAAO,SAAS,WAAW,IAAI,CAAC,WAAW,UAAU;AACnD,UAAM,YACJ,SAAS,WAAW,WAAW,IAAI,SAAS,KAAK,GAAG,SAAS,EAAE,cAAc,KAAK;AACpF,WAAO;AAAA,MACL,IAAI,QAAQ,SAAS;AAAA,MACrB,CAAC,mBAAmB,GAAG,SAAS;AAAA,MAChC,CAAC,iBAAiB,GAAG,kBAAkB,SAAS,QAAQ;AAAA,MACxD,QAAQ,UAAU;AAAA,MAClB,GAAI,SAAS,YAAY,CAAC;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBACd,UACA,WACwC;AACxC,QAAM,MAAM;AAWZ,QAAM,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC;AAErC,QAAM,OAAO,oBAAI,IAA6C;AAE9D,aAAW,SAAS,SAAS;AAC3B,UAAM,QAAQ,MAAM,SAAS;AAC7B,QAAI,cAAc,UAAa,QAAQ,WAAW;AAChD;AAAA,IACF;AAEA,UAAM,KAAK,OAAO,MAAM,mBAAmB,KAAK,MAAM,EAAE;AACxD,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA,UAAU,cAAc,MAAM,iBAAiB,CAAC;AAAA,MAChD,GAAG,gBAA0B,KAAK;AAAA,IACpC;AAEA,UAAM,UAAU,KAAK,IAAI,EAAE;AAC3B,QAAI,YAAY,UAAa,OAAO,QAAQ,QAAQ,OAAO;AACzD,WAAK,IAAI,IAAI,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEA,eAAsB,sBAAiD;AACrE,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,0BAA0B;AAChE,SAAO,IAAI,aAAa,EAAE,SAAS,kBAAkB,CAAC;AACxD;AAEA,eAAsB,iBACpB,QACA,gBACA,YACA,QACe;AACf,QAAM,EAAE,OAAO,OAAO,IAAI,MAAM,OAAO,cAAc,EAAE,iBAAiB,eAAe,CAAC;AACxF,MAAI,QAAQ;AACV;AAAA,EACF;AAEA,QAAM,OAAO,iBAAiB;AAAA,IAC5B,iBAAiB;AAAA,IACjB,QAAQ;AAAA,MACN,EAAE,MAAM,MAAM,WAAW,WAAW,YAAY,IAAI,gBAAgB,KAAK;AAAA,MACzE,EAAE,MAAM,qBAAqB,WAAW,WAAW,YAAY,KAAK;AAAA,MACpE,EAAE,MAAM,mBAAmB,WAAW,WAAW,YAAY,MAAM;AAAA,MACnE,EAAE,MAAM,UAAU,WAAW,eAAe,KAAK,WAAW;AAAA,IAC9D;AAAA,IACA,aAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,YAAY;AAAA,IACvB,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ,EAAE,GAAG,IAAI,gBAAgB,IAAI;AAAA,EACvC,CAAC;AACH;AAEA,SAAS,gBACP,KACqC;AACrC,QAAM,WAAW,oBAAI,IAAI,CAAC,MAAM,SAAS,qBAAqB,mBAAmB,QAAQ,CAAC;AAC1F,QAAM,WAAW,OAAO;AAAA,IACtB,OAAO,QAAQ,GAAG,EAAE;AAAA,MAClB,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,KAAK,CAAC,IAAI,WAAW,mBAAmB;AAAA,IACtE;AAAA,EACF;AACA,SAAO,OAAO,KAAK,QAAQ,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,SAAS;AAC9D;;;AD1IO,IAAM,oBAAN,MAEP;AAAA,EACE,YACmB,OACA,QACA,gBACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,OAAO,SAA+E;AAC1F,UAAM,iBAAiB,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK;AAChE,UAAM,aAAa,mBAAmB,QAAQ,MAAM;AACpD,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO;AAAA,MACxC,iBAAiB,KAAK;AAAA,MACtB,QAAQ,CAAC,eAAe,MAAM;AAAA,MAC9B,OAAO,QAAQ;AAAA,MACf,GAAI,eAAe,SAAY,EAAE,QAAQ,WAAW,IAAI,CAAC;AAAA,MACzD,eAAe,CAAC,qBAAqB,mBAAmB,GAAG;AAAA,IAC7D,CAAC;AACD,WAAO,kBAA+B,UAAU,QAAQ,SAAS;AAAA,EACnE;AAAA,EAEA,MAAM,UAAU,SAA6E;AAC3F,YAAQ,MAAM,KAAK,OAAO,OAAO,GAAG,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,EAAE;AAAA,EAC5E;AAAA,EAEA,OAAO,SAAmF;AACxF,WAAO,uBAAuB,MAAM,OAAO;AAAA,EAC7C;AACF;;;AGrCO,IAAM,oBAAN,MAAM,mBAAuE;AAAA,EAC1E,YACW,QACA,gBACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,aAAa,QACX,SACyC;AACzC,UAAM,SAAS,QAAQ,UAAW,MAAM,oBAAoB;AAE5D,QAAI,QAAQ,oBAAoB,OAAO;AACrC,YAAM;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,UAAU;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,OAAO,eAAe,EAAE,iBAAiB,QAAQ,eAAe,CAAC;AACvE,WAAO,IAAI,mBAA+B,QAAQ,QAAQ,cAAc;AAAA,EAC1E;AAAA,EAEA,MAAM,gBAAgB,WAAgE;AACpF,UAAM,OAAO,UAAU,QAAQ,CAAC,aAAa,WAAW,QAAQ,CAAC;AACjE,UAAM,KAAK,OAAO,OAAO;AAAA,MACvB,iBAAiB,KAAK;AAAA,MACtB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAuD;AAC3D,WAAO,IAAI,kBAAkB,OAAO,KAAK,QAAQ,KAAK,cAAc;AAAA,EACtE;AACF;","names":[]}
|
|
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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@anvia/milvus",
|
|
3
|
-
"version": "0.3.7
|
|
3
|
+
"version": "0.3.7",
|
|
4
4
|
"description": "Milvus vector store adapter for Anvia.",
|
|
5
5
|
"author": "anvia",
|
|
6
6
|
"maintainer": "Indra Zulfi",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"@zilliz/milvus2-sdk-node": "^3.0.3"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@anvia/core": "0.11.1-preview.20260628T094557.2ab9488",
|
|
33
32
|
"@types/node": "^24.9.1",
|
|
34
33
|
"tsup": "^8.5.0",
|
|
35
34
|
"typescript": "^5.9.3",
|
|
36
|
-
"vitest": "^4.0.8"
|
|
35
|
+
"vitest": "^4.0.8",
|
|
36
|
+
"@anvia/core": "0.13.1"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"@anvia/core": "0.
|
|
39
|
+
"@anvia/core": ">=0.7.1 <1.0.0"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "tsup src/index.ts --format esm --dts --sourcemap --clean",
|