@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.
@@ -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 gemini-embedding-001
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
- const response = await this.client.models.embedContent({
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: 'Latest Gemini embedding model with state-of-the-art performance (recommended)',
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":"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"}
1
+ {"version":3,"file":"gemini-embedding.js","sourceRoot":"","sources":["../../src/embedding/gemini-embedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gemini-embedding.test.d.ts.map
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@zilliz/claude-context-core",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Core indexing engine for Claude Context",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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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"}