@zilliz/claude-context-core 0.1.12 → 0.1.13
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/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/context.abort.test.d.ts +2 -0
- package/dist/context.abort.test.d.ts.map +1 -0
- package/dist/context.abort.test.js +212 -0
- package/dist/context.abort.test.js.map +1 -0
- package/dist/context.d.ts +9 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -6
- package/dist/context.js.map +1 -1
- package/dist/embedding/gemini-embedding.d.ts +9 -6
- package/dist/embedding/gemini-embedding.d.ts.map +1 -1
- package/dist/embedding/gemini-embedding.js +31 -16
- package/dist/embedding/gemini-embedding.js.map +1 -1
- package/dist/embedding/gemini-embedding.test.d.ts +2 -0
- package/dist/embedding/gemini-embedding.test.d.ts.map +1 -0
- package/dist/embedding/gemini-embedding.test.js +105 -0
- package/dist/embedding/gemini-embedding.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/vectordb/__tests__/milvus-query-filter.test.d.ts +0 -9
- package/dist/vectordb/__tests__/milvus-query-filter.test.d.ts.map +0 -1
- package/dist/vectordb/__tests__/milvus-query-filter.test.js +0 -90
- package/dist/vectordb/__tests__/milvus-query-filter.test.js.map +0 -1
|
@@ -6,7 +6,7 @@ const base_embedding_1 = require("./base-embedding");
|
|
|
6
6
|
class GeminiEmbedding extends base_embedding_1.Embedding {
|
|
7
7
|
constructor(config) {
|
|
8
8
|
super();
|
|
9
|
-
this.dimension = 3072; // Default dimension for
|
|
9
|
+
this.dimension = 3072; // Default dimension for Gemini embedding models
|
|
10
10
|
this.maxTokens = 2048; // Maximum tokens for Gemini embedding models
|
|
11
11
|
this.config = config;
|
|
12
12
|
this.client = new genai_1.GoogleGenAI({
|
|
@@ -45,26 +45,16 @@ class GeminiEmbedding extends base_embedding_1.Embedding {
|
|
|
45
45
|
const processedText = this.preprocessText(text);
|
|
46
46
|
const model = this.config.model || 'gemini-embedding-001';
|
|
47
47
|
try {
|
|
48
|
-
|
|
49
|
-
model: model,
|
|
50
|
-
contents: processedText,
|
|
51
|
-
config: {
|
|
52
|
-
outputDimensionality: this.config.outputDimensionality || this.dimension,
|
|
53
|
-
},
|
|
54
|
-
});
|
|
55
|
-
if (!response.embeddings || !response.embeddings[0] || !response.embeddings[0].values) {
|
|
56
|
-
throw new Error('Gemini API returned invalid response');
|
|
57
|
-
}
|
|
58
|
-
return {
|
|
59
|
-
vector: response.embeddings[0].values,
|
|
60
|
-
dimension: response.embeddings[0].values.length
|
|
61
|
-
};
|
|
48
|
+
return await this.embedProcessedText(processedText, model);
|
|
62
49
|
}
|
|
63
50
|
catch (error) {
|
|
64
51
|
throw new Error(`Gemini embedding failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
65
52
|
}
|
|
66
53
|
}
|
|
67
54
|
async embedBatch(texts) {
|
|
55
|
+
if (texts.length === 0) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
68
58
|
const processedTexts = this.preprocessTexts(texts);
|
|
69
59
|
const model = this.config.model || 'gemini-embedding-001';
|
|
70
60
|
try {
|
|
@@ -78,6 +68,9 @@ class GeminiEmbedding extends base_embedding_1.Embedding {
|
|
|
78
68
|
if (!response.embeddings) {
|
|
79
69
|
throw new Error('Gemini API returned invalid response');
|
|
80
70
|
}
|
|
71
|
+
if (response.embeddings.length !== processedTexts.length) {
|
|
72
|
+
throw new Error(`Gemini API returned ${response.embeddings.length} embeddings for ${processedTexts.length} inputs`);
|
|
73
|
+
}
|
|
81
74
|
return response.embeddings.map((embedding) => {
|
|
82
75
|
if (!embedding.values) {
|
|
83
76
|
throw new Error('Gemini API returned invalid embedding data');
|
|
@@ -92,6 +85,22 @@ class GeminiEmbedding extends base_embedding_1.Embedding {
|
|
|
92
85
|
throw new Error(`Gemini batch embedding failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
93
86
|
}
|
|
94
87
|
}
|
|
88
|
+
async embedProcessedText(processedText, model) {
|
|
89
|
+
const response = await this.client.models.embedContent({
|
|
90
|
+
model: model,
|
|
91
|
+
contents: processedText,
|
|
92
|
+
config: {
|
|
93
|
+
outputDimensionality: this.config.outputDimensionality || this.dimension,
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
if (!response.embeddings || !response.embeddings[0] || !response.embeddings[0].values) {
|
|
97
|
+
throw new Error('Gemini API returned invalid response');
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
vector: response.embeddings[0].values,
|
|
101
|
+
dimension: response.embeddings[0].values.length
|
|
102
|
+
};
|
|
103
|
+
}
|
|
95
104
|
getDimension() {
|
|
96
105
|
return this.dimension;
|
|
97
106
|
}
|
|
@@ -128,8 +137,14 @@ class GeminiEmbedding extends base_embedding_1.Embedding {
|
|
|
128
137
|
'gemini-embedding-001': {
|
|
129
138
|
dimension: 3072,
|
|
130
139
|
contextLength: 2048,
|
|
131
|
-
description: '
|
|
140
|
+
description: 'Gemini embedding model with state-of-the-art performance',
|
|
132
141
|
supportedDimensions: [3072, 1536, 768, 256] // Matryoshka Representation Learning support
|
|
142
|
+
},
|
|
143
|
+
'gemini-embedding-2': {
|
|
144
|
+
dimension: 3072,
|
|
145
|
+
contextLength: 8192,
|
|
146
|
+
description: 'Gemini Embedding 2 model with improved embedding quality and longer context',
|
|
147
|
+
supportedDimensions: [3072, 1536, 768, 256]
|
|
133
148
|
}
|
|
134
149
|
};
|
|
135
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini-embedding.js","sourceRoot":"","sources":["../../src/embedding/gemini-embedding.ts"],"names":[],"mappings":";;;AAAA,yCAA4C;AAC5C,qDAA8D;
|
|
1
|
+
{"version":3,"file":"gemini-embedding.js","sourceRoot":"","sources":["../../src/embedding/gemini-embedding.ts"],"names":[],"mappings":";;;AAAA,yCAA4C;AAC5C,qDAA8D;AAgB9D,MAAa,eAAgB,SAAQ,0BAAS;IAM1C,YAAY,MAA6B;QACrC,KAAK,EAAE,CAAC;QAJJ,cAAS,GAAW,IAAI,CAAC,CAAC,gDAAgD;QACxE,cAAS,GAAW,IAAI,CAAC,CAAC,6CAA6C;QAI7E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAW,CAAC;YAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI;gBAClB,WAAW,EAAE;oBACT,OAAO,EAAE,MAAM,CAAC,OAAO;iBAC1B;aACJ,CAAC;SACL,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;QAErE,4CAA4C;QAC5C,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;QACjD,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,KAAa;QACzC,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;QAC7C,CAAC;aAAM,CAAC;YACJ,8DAA8D;YAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe;QACjB,qEAAqE;QACrE,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC;QAE1D,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAC5G,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC;QAE1D,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACnD,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE;oBACJ,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,SAAS;iBAC3E;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC5D,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,UAAU,CAAC,MAAM,mBAAmB,cAAc,CAAC,MAAM,SAAS,CAAC,CAAC;YACxH,CAAC;YAED,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAc,EAAE,EAAE;gBAC9C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO;oBACH,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;iBACrC,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QAClH,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,aAAqB,EAAE,KAAa;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;YACnD,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,aAAa;YACvB,MAAM,EAAE;gBACJ,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,SAAS;aAC3E;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACH,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM;YACrC,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;SAClD,CAAC;IACN,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,WAAW;QACP,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,KAAa;QAClB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,SAAiB;QACrC,IAAI,CAAC,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,SAAS;QACL,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB;QACrB,OAAO;YACH,sBAAsB,EAAE;gBACpB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,0DAA0D;gBACvE,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,6CAA6C;aAC5F;YACD,oBAAoB,EAAE;gBAClB,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,WAAW,EAAE,6EAA6E;gBAC1F,mBAAmB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;aAC9C;SACJ,CAAC;IACN,CAAC;IAED;;OAEG;IACH,sBAAsB;QAClB,MAAM,SAAS,GAAG,eAAe,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC;QACpG,OAAO,SAAS,EAAE,mBAAmB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,SAAiB;QAClC,MAAM,mBAAmB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC1D,OAAO,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;CACJ;AAvLD,0CAuLC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-embedding.test.d.ts","sourceRoot":"","sources":["../../src/embedding/gemini-embedding.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const genai_1 = require("@google/genai");
|
|
4
|
+
const gemini_embedding_1 = require("./gemini-embedding");
|
|
5
|
+
const mockEmbedContent = jest.fn();
|
|
6
|
+
jest.mock('@google/genai', () => ({
|
|
7
|
+
GoogleGenAI: jest.fn().mockImplementation(() => ({
|
|
8
|
+
models: {
|
|
9
|
+
embedContent: mockEmbedContent
|
|
10
|
+
}
|
|
11
|
+
}))
|
|
12
|
+
}));
|
|
13
|
+
describe('GeminiEmbedding', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
mockEmbedContent.mockReset();
|
|
16
|
+
genai_1.GoogleGenAI.mockClear();
|
|
17
|
+
});
|
|
18
|
+
it('exposes Gemini Embedding 2 model metadata', () => {
|
|
19
|
+
const supportedModels = gemini_embedding_1.GeminiEmbedding.getSupportedModels();
|
|
20
|
+
expect(supportedModels['gemini-embedding-2']).toMatchObject({
|
|
21
|
+
dimension: 3072,
|
|
22
|
+
contextLength: 8192,
|
|
23
|
+
});
|
|
24
|
+
const embedding = new gemini_embedding_1.GeminiEmbedding({
|
|
25
|
+
apiKey: 'test-api-key',
|
|
26
|
+
model: 'gemini-embedding-2',
|
|
27
|
+
});
|
|
28
|
+
expect(embedding.getDimension()).toBe(3072);
|
|
29
|
+
expect(embedding.getSupportedDimensions()).toContain(3072);
|
|
30
|
+
expect(embedding.getSupportedDimensions()).toContain(768);
|
|
31
|
+
});
|
|
32
|
+
it('keeps batched request behavior for Gemini Embedding 2', async () => {
|
|
33
|
+
mockEmbedContent.mockResolvedValue({
|
|
34
|
+
embeddings: [
|
|
35
|
+
{ values: [1, 0, 0] },
|
|
36
|
+
{ values: [0, 1, 0] },
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
const embedding = new gemini_embedding_1.GeminiEmbedding({
|
|
40
|
+
apiKey: 'test-api-key',
|
|
41
|
+
model: 'gemini-embedding-2',
|
|
42
|
+
});
|
|
43
|
+
const embeddings = await embedding.embedBatch(['first chunk', 'second chunk']);
|
|
44
|
+
expect(embeddings).toEqual([
|
|
45
|
+
{ vector: [1, 0, 0], dimension: 3 },
|
|
46
|
+
{ vector: [0, 1, 0], dimension: 3 },
|
|
47
|
+
]);
|
|
48
|
+
expect(mockEmbedContent).toHaveBeenCalledTimes(1);
|
|
49
|
+
expect(mockEmbedContent).toHaveBeenCalledWith({
|
|
50
|
+
model: 'gemini-embedding-2',
|
|
51
|
+
contents: ['first chunk', 'second chunk'],
|
|
52
|
+
config: {
|
|
53
|
+
outputDimensionality: 3072,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it('keeps the existing batched request behavior for Gemini Embedding 001', async () => {
|
|
58
|
+
mockEmbedContent.mockResolvedValue({
|
|
59
|
+
embeddings: [
|
|
60
|
+
{ values: [1, 0, 0] },
|
|
61
|
+
{ values: [0, 1, 0] },
|
|
62
|
+
],
|
|
63
|
+
});
|
|
64
|
+
const embedding = new gemini_embedding_1.GeminiEmbedding({
|
|
65
|
+
apiKey: 'test-api-key',
|
|
66
|
+
model: 'gemini-embedding-001',
|
|
67
|
+
});
|
|
68
|
+
const embeddings = await embedding.embedBatch(['first chunk', 'second chunk']);
|
|
69
|
+
expect(embeddings).toEqual([
|
|
70
|
+
{ vector: [1, 0, 0], dimension: 3 },
|
|
71
|
+
{ vector: [0, 1, 0], dimension: 3 },
|
|
72
|
+
]);
|
|
73
|
+
expect(mockEmbedContent).toHaveBeenCalledTimes(1);
|
|
74
|
+
expect(mockEmbedContent).toHaveBeenCalledWith({
|
|
75
|
+
model: 'gemini-embedding-001',
|
|
76
|
+
contents: ['first chunk', 'second chunk'],
|
|
77
|
+
config: {
|
|
78
|
+
outputDimensionality: 3072,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
it('throws a clear error when a batched response count does not match the inputs', async () => {
|
|
83
|
+
mockEmbedContent.mockResolvedValue({
|
|
84
|
+
embeddings: [
|
|
85
|
+
{ values: [1, 0, 0] },
|
|
86
|
+
],
|
|
87
|
+
});
|
|
88
|
+
const embedding = new gemini_embedding_1.GeminiEmbedding({
|
|
89
|
+
apiKey: 'test-api-key',
|
|
90
|
+
model: 'gemini-embedding-001',
|
|
91
|
+
});
|
|
92
|
+
await expect(embedding.embedBatch(['first chunk', 'second chunk']))
|
|
93
|
+
.rejects
|
|
94
|
+
.toThrow('Gemini API returned 1 embeddings for 2 inputs');
|
|
95
|
+
});
|
|
96
|
+
it('returns an empty batch without calling the Gemini API', async () => {
|
|
97
|
+
const embedding = new gemini_embedding_1.GeminiEmbedding({
|
|
98
|
+
apiKey: 'test-api-key',
|
|
99
|
+
model: 'gemini-embedding-2',
|
|
100
|
+
});
|
|
101
|
+
await expect(embedding.embedBatch([])).resolves.toEqual([]);
|
|
102
|
+
expect(mockEmbedContent).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=gemini-embedding.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-embedding.test.js","sourceRoot":"","sources":["../../src/embedding/gemini-embedding.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for Bug #279 fix: MilvusVectorDatabase.query() empty filter handling
|
|
3
|
-
*
|
|
4
|
-
* Before the fix, passing an empty string '' as filter to Milvus would cause
|
|
5
|
-
* the SDK to return empty results. The fix skips the filter param when it's
|
|
6
|
-
* empty or whitespace-only.
|
|
7
|
-
*/
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=milvus-query-filter.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"milvus-query-filter.test.d.ts","sourceRoot":"","sources":["../../../src/vectordb/__tests__/milvus-query-filter.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Tests for Bug #279 fix: MilvusVectorDatabase.query() empty filter handling
|
|
4
|
-
*
|
|
5
|
-
* Before the fix, passing an empty string '' as filter to Milvus would cause
|
|
6
|
-
* the SDK to return empty results. The fix skips the filter param when it's
|
|
7
|
-
* empty or whitespace-only.
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
// Mock the Milvus SDK before importing
|
|
11
|
-
const mockQuery = jest.fn();
|
|
12
|
-
const mockGetLoadState = jest.fn();
|
|
13
|
-
jest.mock('@zilliz/milvus2-sdk-node', () => ({
|
|
14
|
-
MilvusClient: jest.fn().mockImplementation(() => ({
|
|
15
|
-
query: mockQuery,
|
|
16
|
-
getLoadState: mockGetLoadState,
|
|
17
|
-
})),
|
|
18
|
-
DataType: { VarChar: 21, FloatVector: 101, Int64: 5, SparseFloatVector: 104 },
|
|
19
|
-
MetricType: { COSINE: 'COSINE', BM25: 'BM25' },
|
|
20
|
-
FunctionType: { BM25: 1 },
|
|
21
|
-
LoadState: { LoadStateLoaded: 'LoadStateLoaded' },
|
|
22
|
-
}));
|
|
23
|
-
jest.mock('../zilliz-utils', () => ({
|
|
24
|
-
ClusterManager: {
|
|
25
|
-
getAddressFromToken: jest.fn(),
|
|
26
|
-
},
|
|
27
|
-
}));
|
|
28
|
-
const milvus_vectordb_1 = require("../milvus-vectordb");
|
|
29
|
-
describe('MilvusVectorDatabase.query() - empty filter handling (Bug #279)', () => {
|
|
30
|
-
let db;
|
|
31
|
-
beforeEach(() => {
|
|
32
|
-
jest.clearAllMocks();
|
|
33
|
-
mockGetLoadState.mockResolvedValue({ state: 'LoadStateLoaded' });
|
|
34
|
-
mockQuery.mockResolvedValue({
|
|
35
|
-
status: { error_code: 'Success' },
|
|
36
|
-
data: [{ id: 'test-id', content: 'test-content' }],
|
|
37
|
-
});
|
|
38
|
-
db = new milvus_vectordb_1.MilvusVectorDatabase({ address: 'localhost:19530' });
|
|
39
|
-
});
|
|
40
|
-
test('empty string filter should NOT include filter in queryParams', async () => {
|
|
41
|
-
await db.query('test_collection', '', ['id', 'content']);
|
|
42
|
-
expect(mockQuery).toHaveBeenCalledTimes(1);
|
|
43
|
-
const params = mockQuery.mock.calls[0][0];
|
|
44
|
-
expect(params).not.toHaveProperty('filter');
|
|
45
|
-
expect(params.collection_name).toBe('test_collection');
|
|
46
|
-
expect(params.output_fields).toEqual(['id', 'content']);
|
|
47
|
-
// Should have default limit 16384 when no filter
|
|
48
|
-
expect(params.limit).toBe(16384);
|
|
49
|
-
});
|
|
50
|
-
test('whitespace-only filter should NOT include filter in queryParams', async () => {
|
|
51
|
-
await db.query('test_collection', ' ', ['id', 'content']);
|
|
52
|
-
const params = mockQuery.mock.calls[0][0];
|
|
53
|
-
expect(params).not.toHaveProperty('filter');
|
|
54
|
-
expect(params.limit).toBe(16384);
|
|
55
|
-
});
|
|
56
|
-
test('valid filter should include filter in queryParams', async () => {
|
|
57
|
-
await db.query('test_collection', 'id != ""', ['id', 'content']);
|
|
58
|
-
const params = mockQuery.mock.calls[0][0];
|
|
59
|
-
expect(params.filter).toBe('id != ""');
|
|
60
|
-
});
|
|
61
|
-
test('valid filter with explicit limit should use provided limit', async () => {
|
|
62
|
-
await db.query('test_collection', 'id != ""', ['id', 'content'], 50);
|
|
63
|
-
const params = mockQuery.mock.calls[0][0];
|
|
64
|
-
expect(params.filter).toBe('id != ""');
|
|
65
|
-
expect(params.limit).toBe(50);
|
|
66
|
-
});
|
|
67
|
-
test('empty filter with explicit limit should use provided limit, not default 16384', async () => {
|
|
68
|
-
await db.query('test_collection', '', ['metadata'], 1);
|
|
69
|
-
const params = mockQuery.mock.calls[0][0];
|
|
70
|
-
expect(params).not.toHaveProperty('filter');
|
|
71
|
-
expect(params.limit).toBe(1);
|
|
72
|
-
});
|
|
73
|
-
test('tab/newline-only filter should NOT include filter in queryParams', async () => {
|
|
74
|
-
await db.query('test_collection', '\t\n ', ['id']);
|
|
75
|
-
const params = mockQuery.mock.calls[0][0];
|
|
76
|
-
expect(params).not.toHaveProperty('filter');
|
|
77
|
-
expect(params.limit).toBe(16384);
|
|
78
|
-
});
|
|
79
|
-
test('query returns data from mock client', async () => {
|
|
80
|
-
const results = await db.query('test_collection', '', ['id', 'content']);
|
|
81
|
-
expect(results).toEqual([{ id: 'test-id', content: 'test-content' }]);
|
|
82
|
-
});
|
|
83
|
-
test('valid filter without explicit limit should NOT set default limit', async () => {
|
|
84
|
-
await db.query('test_collection', 'id != ""', ['id', 'content']);
|
|
85
|
-
const params = mockQuery.mock.calls[0][0];
|
|
86
|
-
expect(params.filter).toBe('id != ""');
|
|
87
|
-
expect(params.limit).toBeUndefined();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
//# sourceMappingURL=milvus-query-filter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"milvus-query-filter.test.js","sourceRoot":"","sources":["../../../src/vectordb/__tests__/milvus-query-filter.test.ts"],"names":[],"mappings":"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"}
|