@mhalder/qdrant-mcp-server 1.1.0

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.
Files changed (100) hide show
  1. package/.env.example +92 -0
  2. package/.github/workflows/ci.yml +61 -0
  3. package/.github/workflows/claude-code-review.yml +57 -0
  4. package/.github/workflows/claude.yml +50 -0
  5. package/.github/workflows/release.yml +52 -0
  6. package/.husky/commit-msg +1 -0
  7. package/.husky/pre-commit +1 -0
  8. package/.releaserc.json +59 -0
  9. package/.yamlfmt +4 -0
  10. package/CHANGELOG.md +73 -0
  11. package/CONTRIBUTING.md +176 -0
  12. package/LICENSE +21 -0
  13. package/README.md +714 -0
  14. package/build/embeddings/base.d.ts +23 -0
  15. package/build/embeddings/base.d.ts.map +1 -0
  16. package/build/embeddings/base.js +2 -0
  17. package/build/embeddings/base.js.map +1 -0
  18. package/build/embeddings/cohere.d.ts +17 -0
  19. package/build/embeddings/cohere.d.ts.map +1 -0
  20. package/build/embeddings/cohere.js +102 -0
  21. package/build/embeddings/cohere.js.map +1 -0
  22. package/build/embeddings/cohere.test.d.ts +2 -0
  23. package/build/embeddings/cohere.test.d.ts.map +1 -0
  24. package/build/embeddings/cohere.test.js +279 -0
  25. package/build/embeddings/cohere.test.js.map +1 -0
  26. package/build/embeddings/factory.d.ts +10 -0
  27. package/build/embeddings/factory.d.ts.map +1 -0
  28. package/build/embeddings/factory.js +98 -0
  29. package/build/embeddings/factory.js.map +1 -0
  30. package/build/embeddings/factory.test.d.ts +2 -0
  31. package/build/embeddings/factory.test.d.ts.map +1 -0
  32. package/build/embeddings/factory.test.js +329 -0
  33. package/build/embeddings/factory.test.js.map +1 -0
  34. package/build/embeddings/ollama.d.ts +18 -0
  35. package/build/embeddings/ollama.d.ts.map +1 -0
  36. package/build/embeddings/ollama.js +135 -0
  37. package/build/embeddings/ollama.js.map +1 -0
  38. package/build/embeddings/ollama.test.d.ts +2 -0
  39. package/build/embeddings/ollama.test.d.ts.map +1 -0
  40. package/build/embeddings/ollama.test.js +399 -0
  41. package/build/embeddings/ollama.test.js.map +1 -0
  42. package/build/embeddings/openai.d.ts +16 -0
  43. package/build/embeddings/openai.d.ts.map +1 -0
  44. package/build/embeddings/openai.js +108 -0
  45. package/build/embeddings/openai.js.map +1 -0
  46. package/build/embeddings/openai.test.d.ts +2 -0
  47. package/build/embeddings/openai.test.d.ts.map +1 -0
  48. package/build/embeddings/openai.test.js +283 -0
  49. package/build/embeddings/openai.test.js.map +1 -0
  50. package/build/embeddings/voyage.d.ts +19 -0
  51. package/build/embeddings/voyage.d.ts.map +1 -0
  52. package/build/embeddings/voyage.js +113 -0
  53. package/build/embeddings/voyage.js.map +1 -0
  54. package/build/embeddings/voyage.test.d.ts +2 -0
  55. package/build/embeddings/voyage.test.d.ts.map +1 -0
  56. package/build/embeddings/voyage.test.js +371 -0
  57. package/build/embeddings/voyage.test.js.map +1 -0
  58. package/build/index.d.ts +3 -0
  59. package/build/index.d.ts.map +1 -0
  60. package/build/index.js +534 -0
  61. package/build/index.js.map +1 -0
  62. package/build/index.test.d.ts +2 -0
  63. package/build/index.test.d.ts.map +1 -0
  64. package/build/index.test.js +241 -0
  65. package/build/index.test.js.map +1 -0
  66. package/build/qdrant/client.d.ts +37 -0
  67. package/build/qdrant/client.d.ts.map +1 -0
  68. package/build/qdrant/client.js +142 -0
  69. package/build/qdrant/client.js.map +1 -0
  70. package/build/qdrant/client.test.d.ts +2 -0
  71. package/build/qdrant/client.test.d.ts.map +1 -0
  72. package/build/qdrant/client.test.js +340 -0
  73. package/build/qdrant/client.test.js.map +1 -0
  74. package/commitlint.config.js +25 -0
  75. package/docker-compose.yml +22 -0
  76. package/docs/test_report.md +259 -0
  77. package/examples/README.md +315 -0
  78. package/examples/basic/README.md +111 -0
  79. package/examples/filters/README.md +262 -0
  80. package/examples/knowledge-base/README.md +207 -0
  81. package/examples/rate-limiting/README.md +376 -0
  82. package/package.json +59 -0
  83. package/scripts/verify-providers.js +238 -0
  84. package/src/embeddings/base.ts +25 -0
  85. package/src/embeddings/cohere.test.ts +408 -0
  86. package/src/embeddings/cohere.ts +152 -0
  87. package/src/embeddings/factory.test.ts +453 -0
  88. package/src/embeddings/factory.ts +163 -0
  89. package/src/embeddings/ollama.test.ts +543 -0
  90. package/src/embeddings/ollama.ts +196 -0
  91. package/src/embeddings/openai.test.ts +402 -0
  92. package/src/embeddings/openai.ts +158 -0
  93. package/src/embeddings/voyage.test.ts +520 -0
  94. package/src/embeddings/voyage.ts +168 -0
  95. package/src/index.test.ts +304 -0
  96. package/src/index.ts +614 -0
  97. package/src/qdrant/client.test.ts +456 -0
  98. package/src/qdrant/client.ts +195 -0
  99. package/tsconfig.json +19 -0
  100. package/vitest.config.ts +37 -0
@@ -0,0 +1,23 @@
1
+ export interface EmbeddingResult {
2
+ embedding: number[];
3
+ dimensions: number;
4
+ }
5
+ export interface RateLimitConfig {
6
+ maxRequestsPerMinute?: number;
7
+ retryAttempts?: number;
8
+ retryDelayMs?: number;
9
+ }
10
+ export interface EmbeddingProvider {
11
+ embed(text: string): Promise<EmbeddingResult>;
12
+ embedBatch(texts: string[]): Promise<EmbeddingResult[]>;
13
+ getDimensions(): number;
14
+ getModel(): string;
15
+ }
16
+ export interface ProviderConfig {
17
+ model?: string;
18
+ dimensions?: number;
19
+ rateLimitConfig?: RateLimitConfig;
20
+ apiKey?: string;
21
+ baseUrl?: string;
22
+ }
23
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/embeddings/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxD,aAAa,IAAI,MAAM,CAAC;IACxB,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/embeddings/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { EmbeddingProvider, EmbeddingResult, RateLimitConfig } from "./base.js";
2
+ export declare class CohereEmbeddings implements EmbeddingProvider {
3
+ private client;
4
+ private model;
5
+ private dimensions;
6
+ private limiter;
7
+ private retryAttempts;
8
+ private retryDelayMs;
9
+ private inputType;
10
+ constructor(apiKey: string, model?: string, dimensions?: number, rateLimitConfig?: RateLimitConfig, inputType?: "search_document" | "search_query" | "classification" | "clustering");
11
+ private retryWithBackoff;
12
+ embed(text: string): Promise<EmbeddingResult>;
13
+ embedBatch(texts: string[]): Promise<EmbeddingResult[]>;
14
+ getDimensions(): number;
15
+ getModel(): string;
16
+ }
17
+ //# sourceMappingURL=cohere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.d.ts","sourceRoot":"","sources":["../../src/embeddings/cohere.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQhF,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAIA;gBAGf,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAA6B,EACpC,UAAU,CAAC,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,eAAe,EACjC,SAAS,GACL,iBAAiB,GACjB,cAAc,GACd,gBAAgB,GAChB,YAAgC;YA8BxB,gBAAgB;IAkCxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAwB7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwB7D,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,102 @@
1
+ import { CohereClient } from "cohere-ai";
2
+ import Bottleneck from "bottleneck";
3
+ export class CohereEmbeddings {
4
+ client;
5
+ model;
6
+ dimensions;
7
+ limiter;
8
+ retryAttempts;
9
+ retryDelayMs;
10
+ inputType;
11
+ constructor(apiKey, model = "embed-english-v3.0", dimensions, rateLimitConfig, inputType = "search_document") {
12
+ this.client = new CohereClient({ token: apiKey });
13
+ this.model = model;
14
+ this.inputType = inputType;
15
+ // Default dimensions for different models
16
+ const defaultDimensions = {
17
+ "embed-english-v3.0": 1024,
18
+ "embed-multilingual-v3.0": 1024,
19
+ "embed-english-light-v3.0": 384,
20
+ "embed-multilingual-light-v3.0": 384,
21
+ };
22
+ this.dimensions = dimensions || defaultDimensions[model] || 1024;
23
+ // Rate limiting configuration
24
+ const maxRequestsPerMinute = rateLimitConfig?.maxRequestsPerMinute || 100;
25
+ this.retryAttempts = rateLimitConfig?.retryAttempts || 3;
26
+ this.retryDelayMs = rateLimitConfig?.retryDelayMs || 1000;
27
+ this.limiter = new Bottleneck({
28
+ reservoir: maxRequestsPerMinute,
29
+ reservoirRefreshAmount: maxRequestsPerMinute,
30
+ reservoirRefreshInterval: 60 * 1000,
31
+ maxConcurrent: 5,
32
+ minTime: Math.floor((60 * 1000) / maxRequestsPerMinute),
33
+ });
34
+ }
35
+ async retryWithBackoff(fn, attempt = 0) {
36
+ try {
37
+ return await fn();
38
+ }
39
+ catch (error) {
40
+ const apiError = error;
41
+ const isRateLimitError = apiError?.status === 429 ||
42
+ apiError?.statusCode === 429 ||
43
+ apiError?.message?.toLowerCase().includes("rate limit");
44
+ if (isRateLimitError && attempt < this.retryAttempts) {
45
+ const delayMs = this.retryDelayMs * Math.pow(2, attempt);
46
+ const waitTimeSeconds = (delayMs / 1000).toFixed(1);
47
+ console.error(`Rate limit reached. Retrying in ${waitTimeSeconds}s (attempt ${attempt + 1}/${this.retryAttempts})...`);
48
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
49
+ return this.retryWithBackoff(fn, attempt + 1);
50
+ }
51
+ if (isRateLimitError) {
52
+ throw new Error(`Cohere API rate limit exceeded after ${this.retryAttempts} retry attempts. Please try again later or reduce request frequency.`);
53
+ }
54
+ throw error;
55
+ }
56
+ }
57
+ async embed(text) {
58
+ return this.limiter.schedule(() => this.retryWithBackoff(async () => {
59
+ const response = await this.client.embed({
60
+ texts: [text],
61
+ model: this.model,
62
+ inputType: this.inputType,
63
+ embeddingTypes: ["float"],
64
+ });
65
+ // Cohere v7+ returns embeddings as number[][]
66
+ const embeddings = response.embeddings;
67
+ if (!embeddings || embeddings.length === 0) {
68
+ throw new Error("No embedding returned from Cohere API");
69
+ }
70
+ return {
71
+ embedding: embeddings[0],
72
+ dimensions: this.dimensions,
73
+ };
74
+ }));
75
+ }
76
+ async embedBatch(texts) {
77
+ return this.limiter.schedule(() => this.retryWithBackoff(async () => {
78
+ const response = await this.client.embed({
79
+ texts,
80
+ model: this.model,
81
+ inputType: this.inputType,
82
+ embeddingTypes: ["float"],
83
+ });
84
+ // Cohere v7+ returns embeddings as number[][]
85
+ const embeddings = response.embeddings;
86
+ if (!embeddings) {
87
+ throw new Error("No embeddings returned from Cohere API");
88
+ }
89
+ return embeddings.map((embedding) => ({
90
+ embedding,
91
+ dimensions: this.dimensions,
92
+ }));
93
+ }));
94
+ }
95
+ getDimensions() {
96
+ return this.dimensions;
97
+ }
98
+ getModel() {
99
+ return this.model;
100
+ }
101
+ }
102
+ //# sourceMappingURL=cohere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.js","sourceRoot":"","sources":["../../src/embeddings/cohere.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cohere.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.test.d.ts","sourceRoot":"","sources":["../../src/embeddings/cohere.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,279 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { CohereEmbeddings } from "./cohere.js";
3
+ import { CohereClient } from "cohere-ai";
4
+ vi.mock("cohere-ai", () => ({
5
+ CohereClient: vi.fn(),
6
+ }));
7
+ describe("CohereEmbeddings", () => {
8
+ let embeddings;
9
+ let mockClient;
10
+ beforeEach(() => {
11
+ mockClient = {
12
+ embed: vi.fn(),
13
+ };
14
+ vi.mocked(CohereClient).mockImplementation(() => mockClient);
15
+ embeddings = new CohereEmbeddings("test-api-key");
16
+ });
17
+ describe("constructor", () => {
18
+ it("should use default model and dimensions", () => {
19
+ expect(embeddings.getModel()).toBe("embed-english-v3.0");
20
+ expect(embeddings.getDimensions()).toBe(1024);
21
+ });
22
+ it("should use custom model", () => {
23
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-multilingual-v3.0");
24
+ expect(customEmbeddings.getModel()).toBe("embed-multilingual-v3.0");
25
+ expect(customEmbeddings.getDimensions()).toBe(1024);
26
+ });
27
+ it("should use custom dimensions", () => {
28
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", 512);
29
+ expect(customEmbeddings.getDimensions()).toBe(512);
30
+ });
31
+ it("should use default dimensions for light models", () => {
32
+ const lightEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-light-v3.0");
33
+ expect(lightEmbeddings.getDimensions()).toBe(384);
34
+ });
35
+ it("should default to 1024 for unknown models", () => {
36
+ const unknownEmbeddings = new CohereEmbeddings("test-api-key", "custom-model");
37
+ expect(unknownEmbeddings.getDimensions()).toBe(1024);
38
+ });
39
+ it("should accept custom input type", () => {
40
+ const searchQueryEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", undefined, undefined, "search_query");
41
+ expect(searchQueryEmbeddings).toBeInstanceOf(CohereEmbeddings);
42
+ });
43
+ });
44
+ describe("embed", () => {
45
+ it("should generate embedding for single text", async () => {
46
+ const mockEmbedding = Array(1024)
47
+ .fill(0)
48
+ .map((_, i) => i * 0.001);
49
+ mockClient.embed.mockResolvedValue({
50
+ embeddings: [mockEmbedding],
51
+ });
52
+ const result = await embeddings.embed("test text");
53
+ expect(result).toEqual({
54
+ embedding: mockEmbedding,
55
+ dimensions: 1024,
56
+ });
57
+ expect(mockClient.embed).toHaveBeenCalledWith({
58
+ texts: ["test text"],
59
+ model: "embed-english-v3.0",
60
+ inputType: "search_document",
61
+ embeddingTypes: ["float"],
62
+ });
63
+ });
64
+ it("should handle long text", async () => {
65
+ const longText = "word ".repeat(1000);
66
+ const mockEmbedding = Array(1024).fill(0.5);
67
+ mockClient.embed.mockResolvedValue({
68
+ embeddings: [mockEmbedding],
69
+ });
70
+ const result = await embeddings.embed(longText);
71
+ expect(result.embedding).toEqual(mockEmbedding);
72
+ expect(mockClient.embed).toHaveBeenCalledWith({
73
+ texts: [longText],
74
+ model: "embed-english-v3.0",
75
+ inputType: "search_document",
76
+ embeddingTypes: ["float"],
77
+ });
78
+ });
79
+ it("should use custom model configuration", async () => {
80
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-multilingual-v3.0", 1024);
81
+ const mockEmbedding = Array(1024).fill(0.1);
82
+ mockClient.embed.mockResolvedValue({
83
+ embeddings: [mockEmbedding],
84
+ });
85
+ await customEmbeddings.embed("test");
86
+ expect(mockClient.embed).toHaveBeenCalledWith({
87
+ texts: ["test"],
88
+ model: "embed-multilingual-v3.0",
89
+ inputType: "search_document",
90
+ embeddingTypes: ["float"],
91
+ });
92
+ });
93
+ it("should throw error if no embedding returned", async () => {
94
+ mockClient.embed.mockResolvedValue({
95
+ embeddings: [],
96
+ });
97
+ await expect(embeddings.embed("test")).rejects.toThrow("No embedding returned from Cohere API");
98
+ });
99
+ it("should propagate errors", async () => {
100
+ mockClient.embed.mockRejectedValue(new Error("API Error"));
101
+ await expect(embeddings.embed("test")).rejects.toThrow("API Error");
102
+ });
103
+ });
104
+ describe("embedBatch", () => {
105
+ it("should generate embeddings for multiple texts", async () => {
106
+ const mockEmbeddings = [
107
+ Array(1024).fill(0.1),
108
+ Array(1024).fill(0.2),
109
+ Array(1024).fill(0.3),
110
+ ];
111
+ mockClient.embed.mockResolvedValue({
112
+ embeddings: mockEmbeddings,
113
+ });
114
+ const texts = ["text1", "text2", "text3"];
115
+ const results = await embeddings.embedBatch(texts);
116
+ expect(results).toEqual([
117
+ { embedding: mockEmbeddings[0], dimensions: 1024 },
118
+ { embedding: mockEmbeddings[1], dimensions: 1024 },
119
+ { embedding: mockEmbeddings[2], dimensions: 1024 },
120
+ ]);
121
+ expect(mockClient.embed).toHaveBeenCalledWith({
122
+ texts,
123
+ model: "embed-english-v3.0",
124
+ inputType: "search_document",
125
+ embeddingTypes: ["float"],
126
+ });
127
+ });
128
+ it("should handle empty batch", async () => {
129
+ mockClient.embed.mockResolvedValue({
130
+ embeddings: [],
131
+ });
132
+ const results = await embeddings.embedBatch([]);
133
+ expect(results).toEqual([]);
134
+ });
135
+ it("should handle single item in batch", async () => {
136
+ const mockEmbedding = Array(1024).fill(0.5);
137
+ mockClient.embed.mockResolvedValue({
138
+ embeddings: [mockEmbedding],
139
+ });
140
+ const results = await embeddings.embedBatch(["single text"]);
141
+ expect(results).toHaveLength(1);
142
+ expect(results[0].embedding).toEqual(mockEmbedding);
143
+ });
144
+ it("should handle large batches", async () => {
145
+ const batchSize = 100;
146
+ const mockEmbeddings = Array(batchSize)
147
+ .fill(null)
148
+ .map(() => Array(1024).fill(Math.random()));
149
+ mockClient.embed.mockResolvedValue({
150
+ embeddings: mockEmbeddings,
151
+ });
152
+ const texts = Array(batchSize)
153
+ .fill(null)
154
+ .map((_, i) => `text ${i}`);
155
+ const results = await embeddings.embedBatch(texts);
156
+ expect(results).toHaveLength(batchSize);
157
+ });
158
+ it("should throw error if no embeddings returned", async () => {
159
+ mockClient.embed.mockResolvedValue({});
160
+ await expect(embeddings.embedBatch(["text1"])).rejects.toThrow("No embeddings returned from Cohere API");
161
+ });
162
+ it("should propagate errors in batch", async () => {
163
+ mockClient.embed.mockRejectedValue(new Error("Batch API Error"));
164
+ await expect(embeddings.embedBatch(["text1", "text2"])).rejects.toThrow("Batch API Error");
165
+ });
166
+ });
167
+ describe("getDimensions", () => {
168
+ it("should return configured dimensions", () => {
169
+ expect(embeddings.getDimensions()).toBe(1024);
170
+ });
171
+ it("should return custom dimensions", () => {
172
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", 512);
173
+ expect(customEmbeddings.getDimensions()).toBe(512);
174
+ });
175
+ });
176
+ describe("getModel", () => {
177
+ it("should return configured model", () => {
178
+ expect(embeddings.getModel()).toBe("embed-english-v3.0");
179
+ });
180
+ it("should return custom model", () => {
181
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-multilingual-v3.0");
182
+ expect(customEmbeddings.getModel()).toBe("embed-multilingual-v3.0");
183
+ });
184
+ });
185
+ describe("rate limiting", () => {
186
+ it("should retry on rate limit error (status 429)", async () => {
187
+ const mockEmbedding = Array(1024).fill(0.5);
188
+ mockClient.embed
189
+ .mockRejectedValueOnce({ status: 429, message: "Rate limit exceeded" })
190
+ .mockRejectedValueOnce({ status: 429, message: "Rate limit exceeded" })
191
+ .mockResolvedValue({ embeddings: [mockEmbedding] });
192
+ const result = await embeddings.embed("test text");
193
+ expect(result.embedding).toEqual(mockEmbedding);
194
+ expect(mockClient.embed).toHaveBeenCalledTimes(3);
195
+ });
196
+ it("should retry on rate limit error (statusCode 429)", async () => {
197
+ const mockEmbedding = Array(1024).fill(0.5);
198
+ mockClient.embed
199
+ .mockRejectedValueOnce({
200
+ statusCode: 429,
201
+ message: "Rate limit exceeded",
202
+ })
203
+ .mockResolvedValue({ embeddings: [mockEmbedding] });
204
+ const result = await embeddings.embed("test text");
205
+ expect(result.embedding).toEqual(mockEmbedding);
206
+ expect(mockClient.embed).toHaveBeenCalledTimes(2);
207
+ });
208
+ it("should retry on rate limit message", async () => {
209
+ const mockEmbedding = Array(1024).fill(0.5);
210
+ mockClient.embed
211
+ .mockRejectedValueOnce({
212
+ message: "You have exceeded the rate limit",
213
+ })
214
+ .mockResolvedValue({ embeddings: [mockEmbedding] });
215
+ const result = await embeddings.embed("test text");
216
+ expect(result.embedding).toEqual(mockEmbedding);
217
+ expect(mockClient.embed).toHaveBeenCalledTimes(2);
218
+ });
219
+ it("should use exponential backoff", async () => {
220
+ const rateLimitEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", undefined, {
221
+ retryAttempts: 3,
222
+ retryDelayMs: 100,
223
+ });
224
+ const mockEmbedding = Array(1024).fill(0.5);
225
+ const rateLimitError = {
226
+ status: 429,
227
+ message: "Rate limit exceeded",
228
+ };
229
+ mockClient.embed
230
+ .mockRejectedValueOnce(rateLimitError)
231
+ .mockRejectedValueOnce(rateLimitError)
232
+ .mockResolvedValue({ embeddings: [mockEmbedding] });
233
+ const startTime = Date.now();
234
+ await rateLimitEmbeddings.embed("test text");
235
+ const duration = Date.now() - startTime;
236
+ // Should wait: 100ms (first retry) + 200ms (second retry) = 300ms
237
+ expect(duration).toBeGreaterThanOrEqual(250);
238
+ });
239
+ it("should throw error after max retries exceeded", async () => {
240
+ const rateLimitEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", undefined, {
241
+ retryAttempts: 2,
242
+ retryDelayMs: 100,
243
+ });
244
+ const rateLimitError = {
245
+ status: 429,
246
+ message: "Rate limit exceeded",
247
+ };
248
+ mockClient.embed.mockRejectedValue(rateLimitError);
249
+ await expect(rateLimitEmbeddings.embed("test text")).rejects.toThrow("Cohere API rate limit exceeded after 2 retry attempts");
250
+ expect(mockClient.embed).toHaveBeenCalledTimes(3);
251
+ });
252
+ it("should handle rate limit errors in batch operations", async () => {
253
+ const mockEmbeddings = [Array(1024).fill(0.1), Array(1024).fill(0.2)];
254
+ mockClient.embed
255
+ .mockRejectedValueOnce({ status: 429, message: "Rate limit exceeded" })
256
+ .mockResolvedValue({
257
+ embeddings: mockEmbeddings,
258
+ });
259
+ const results = await embeddings.embedBatch(["text1", "text2"]);
260
+ expect(results).toHaveLength(2);
261
+ expect(mockClient.embed).toHaveBeenCalledTimes(2);
262
+ });
263
+ it("should not retry on non-rate-limit errors", async () => {
264
+ const apiError = new Error("Invalid API key");
265
+ mockClient.embed.mockRejectedValue(apiError);
266
+ await expect(embeddings.embed("test text")).rejects.toThrow("Invalid API key");
267
+ expect(mockClient.embed).toHaveBeenCalledTimes(1);
268
+ });
269
+ it("should accept custom rate limit configuration", () => {
270
+ const customEmbeddings = new CohereEmbeddings("test-api-key", "embed-english-v3.0", undefined, {
271
+ maxRequestsPerMinute: 200,
272
+ retryAttempts: 5,
273
+ retryDelayMs: 2000,
274
+ });
275
+ expect(customEmbeddings).toBeDefined();
276
+ });
277
+ });
278
+ });
279
+ //# sourceMappingURL=cohere.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.test.js","sourceRoot":"","sources":["../../src/embeddings/cohere.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { EmbeddingProvider, ProviderConfig } from "./base.js";
2
+ export type EmbeddingProviderType = "openai" | "cohere" | "voyage" | "ollama";
3
+ export interface FactoryConfig extends ProviderConfig {
4
+ provider: EmbeddingProviderType;
5
+ }
6
+ export declare class EmbeddingProviderFactory {
7
+ static create(config: FactoryConfig): EmbeddingProvider;
8
+ static createFromEnv(): EmbeddingProvider;
9
+ }
10
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAM9D,MAAM,MAAM,qBAAqB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9E,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,qBAAa,wBAAwB;IACnC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB;IAsDvD,MAAM,CAAC,aAAa,IAAI,iBAAiB;CA+F1C"}
@@ -0,0 +1,98 @@
1
+ import { OpenAIEmbeddings } from "./openai.js";
2
+ import { CohereEmbeddings } from "./cohere.js";
3
+ import { VoyageEmbeddings } from "./voyage.js";
4
+ import { OllamaEmbeddings } from "./ollama.js";
5
+ export class EmbeddingProviderFactory {
6
+ static create(config) {
7
+ const { provider, model, dimensions, rateLimitConfig, apiKey, baseUrl } = config;
8
+ switch (provider) {
9
+ case "openai":
10
+ if (!apiKey) {
11
+ throw new Error("API key is required for OpenAI provider");
12
+ }
13
+ return new OpenAIEmbeddings(apiKey, model || "text-embedding-3-small", dimensions, rateLimitConfig);
14
+ case "cohere":
15
+ if (!apiKey) {
16
+ throw new Error("API key is required for Cohere provider");
17
+ }
18
+ return new CohereEmbeddings(apiKey, model || "embed-english-v3.0", dimensions, rateLimitConfig);
19
+ case "voyage":
20
+ if (!apiKey) {
21
+ throw new Error("API key is required for Voyage AI provider");
22
+ }
23
+ return new VoyageEmbeddings(apiKey, model || "voyage-2", dimensions, rateLimitConfig, baseUrl || "https://api.voyageai.com/v1");
24
+ case "ollama":
25
+ return new OllamaEmbeddings(model || "nomic-embed-text", dimensions, rateLimitConfig, baseUrl || "http://localhost:11434");
26
+ default:
27
+ throw new Error(`Unknown embedding provider: ${provider}. Supported providers: openai, cohere, voyage, ollama`);
28
+ }
29
+ }
30
+ static createFromEnv() {
31
+ const provider = (process.env.EMBEDDING_PROVIDER || "ollama").toLowerCase();
32
+ // Select API key based on provider
33
+ let apiKey;
34
+ switch (provider) {
35
+ case "openai":
36
+ apiKey = process.env.OPENAI_API_KEY;
37
+ break;
38
+ case "cohere":
39
+ apiKey = process.env.COHERE_API_KEY;
40
+ break;
41
+ case "voyage":
42
+ apiKey = process.env.VOYAGE_API_KEY;
43
+ break;
44
+ case "ollama":
45
+ // No API key needed for local Ollama
46
+ break;
47
+ }
48
+ // Common configuration
49
+ const model = process.env.EMBEDDING_MODEL;
50
+ const dimensions = process.env.EMBEDDING_DIMENSIONS
51
+ ? parseInt(process.env.EMBEDDING_DIMENSIONS, 10)
52
+ : undefined;
53
+ // Validate dimensions
54
+ if (dimensions !== undefined && (isNaN(dimensions) || dimensions <= 0)) {
55
+ throw new Error(`Invalid EMBEDDING_DIMENSIONS: must be a positive integer, got "${process.env.EMBEDDING_DIMENSIONS}"`);
56
+ }
57
+ const baseUrl = process.env.EMBEDDING_BASE_URL;
58
+ // Rate limiting configuration
59
+ const maxRequestsPerMinute = process.env.EMBEDDING_MAX_REQUESTS_PER_MINUTE
60
+ ? parseInt(process.env.EMBEDDING_MAX_REQUESTS_PER_MINUTE, 10)
61
+ : undefined;
62
+ // Validate maxRequestsPerMinute
63
+ if (maxRequestsPerMinute !== undefined &&
64
+ (isNaN(maxRequestsPerMinute) || maxRequestsPerMinute <= 0)) {
65
+ throw new Error(`Invalid EMBEDDING_MAX_REQUESTS_PER_MINUTE: must be a positive integer, got "${process.env.EMBEDDING_MAX_REQUESTS_PER_MINUTE}"`);
66
+ }
67
+ const retryAttempts = process.env.EMBEDDING_RETRY_ATTEMPTS
68
+ ? parseInt(process.env.EMBEDDING_RETRY_ATTEMPTS, 10)
69
+ : undefined;
70
+ // Validate retryAttempts
71
+ if (retryAttempts !== undefined &&
72
+ (isNaN(retryAttempts) || retryAttempts < 0)) {
73
+ throw new Error(`Invalid EMBEDDING_RETRY_ATTEMPTS: must be a non-negative integer, got "${process.env.EMBEDDING_RETRY_ATTEMPTS}"`);
74
+ }
75
+ const retryDelayMs = process.env.EMBEDDING_RETRY_DELAY
76
+ ? parseInt(process.env.EMBEDDING_RETRY_DELAY, 10)
77
+ : undefined;
78
+ // Validate retryDelayMs
79
+ if (retryDelayMs !== undefined &&
80
+ (isNaN(retryDelayMs) || retryDelayMs < 0)) {
81
+ throw new Error(`Invalid EMBEDDING_RETRY_DELAY: must be a non-negative integer, got "${process.env.EMBEDDING_RETRY_DELAY}"`);
82
+ }
83
+ const rateLimitConfig = {
84
+ maxRequestsPerMinute,
85
+ retryAttempts,
86
+ retryDelayMs,
87
+ };
88
+ return this.create({
89
+ provider,
90
+ model,
91
+ dimensions,
92
+ rateLimitConfig,
93
+ apiKey,
94
+ baseUrl,
95
+ });
96
+ }
97
+ }
98
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embeddings/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.test.d.ts","sourceRoot":"","sources":["../../src/embeddings/factory.test.ts"],"names":[],"mappings":""}