@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.
- package/.env.example +92 -0
- package/.github/workflows/ci.yml +61 -0
- package/.github/workflows/claude-code-review.yml +57 -0
- package/.github/workflows/claude.yml +50 -0
- package/.github/workflows/release.yml +52 -0
- package/.husky/commit-msg +1 -0
- package/.husky/pre-commit +1 -0
- package/.releaserc.json +59 -0
- package/.yamlfmt +4 -0
- package/CHANGELOG.md +73 -0
- package/CONTRIBUTING.md +176 -0
- package/LICENSE +21 -0
- package/README.md +714 -0
- package/build/embeddings/base.d.ts +23 -0
- package/build/embeddings/base.d.ts.map +1 -0
- package/build/embeddings/base.js +2 -0
- package/build/embeddings/base.js.map +1 -0
- package/build/embeddings/cohere.d.ts +17 -0
- package/build/embeddings/cohere.d.ts.map +1 -0
- package/build/embeddings/cohere.js +102 -0
- package/build/embeddings/cohere.js.map +1 -0
- package/build/embeddings/cohere.test.d.ts +2 -0
- package/build/embeddings/cohere.test.d.ts.map +1 -0
- package/build/embeddings/cohere.test.js +279 -0
- package/build/embeddings/cohere.test.js.map +1 -0
- package/build/embeddings/factory.d.ts +10 -0
- package/build/embeddings/factory.d.ts.map +1 -0
- package/build/embeddings/factory.js +98 -0
- package/build/embeddings/factory.js.map +1 -0
- package/build/embeddings/factory.test.d.ts +2 -0
- package/build/embeddings/factory.test.d.ts.map +1 -0
- package/build/embeddings/factory.test.js +329 -0
- package/build/embeddings/factory.test.js.map +1 -0
- package/build/embeddings/ollama.d.ts +18 -0
- package/build/embeddings/ollama.d.ts.map +1 -0
- package/build/embeddings/ollama.js +135 -0
- package/build/embeddings/ollama.js.map +1 -0
- package/build/embeddings/ollama.test.d.ts +2 -0
- package/build/embeddings/ollama.test.d.ts.map +1 -0
- package/build/embeddings/ollama.test.js +399 -0
- package/build/embeddings/ollama.test.js.map +1 -0
- package/build/embeddings/openai.d.ts +16 -0
- package/build/embeddings/openai.d.ts.map +1 -0
- package/build/embeddings/openai.js +108 -0
- package/build/embeddings/openai.js.map +1 -0
- package/build/embeddings/openai.test.d.ts +2 -0
- package/build/embeddings/openai.test.d.ts.map +1 -0
- package/build/embeddings/openai.test.js +283 -0
- package/build/embeddings/openai.test.js.map +1 -0
- package/build/embeddings/voyage.d.ts +19 -0
- package/build/embeddings/voyage.d.ts.map +1 -0
- package/build/embeddings/voyage.js +113 -0
- package/build/embeddings/voyage.js.map +1 -0
- package/build/embeddings/voyage.test.d.ts +2 -0
- package/build/embeddings/voyage.test.d.ts.map +1 -0
- package/build/embeddings/voyage.test.js +371 -0
- package/build/embeddings/voyage.test.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +534 -0
- package/build/index.js.map +1 -0
- package/build/index.test.d.ts +2 -0
- package/build/index.test.d.ts.map +1 -0
- package/build/index.test.js +241 -0
- package/build/index.test.js.map +1 -0
- package/build/qdrant/client.d.ts +37 -0
- package/build/qdrant/client.d.ts.map +1 -0
- package/build/qdrant/client.js +142 -0
- package/build/qdrant/client.js.map +1 -0
- package/build/qdrant/client.test.d.ts +2 -0
- package/build/qdrant/client.test.d.ts.map +1 -0
- package/build/qdrant/client.test.js +340 -0
- package/build/qdrant/client.test.js.map +1 -0
- package/commitlint.config.js +25 -0
- package/docker-compose.yml +22 -0
- package/docs/test_report.md +259 -0
- package/examples/README.md +315 -0
- package/examples/basic/README.md +111 -0
- package/examples/filters/README.md +262 -0
- package/examples/knowledge-base/README.md +207 -0
- package/examples/rate-limiting/README.md +376 -0
- package/package.json +59 -0
- package/scripts/verify-providers.js +238 -0
- package/src/embeddings/base.ts +25 -0
- package/src/embeddings/cohere.test.ts +408 -0
- package/src/embeddings/cohere.ts +152 -0
- package/src/embeddings/factory.test.ts +453 -0
- package/src/embeddings/factory.ts +163 -0
- package/src/embeddings/ollama.test.ts +543 -0
- package/src/embeddings/ollama.ts +196 -0
- package/src/embeddings/openai.test.ts +402 -0
- package/src/embeddings/openai.ts +158 -0
- package/src/embeddings/voyage.test.ts +520 -0
- package/src/embeddings/voyage.ts +168 -0
- package/src/index.test.ts +304 -0
- package/src/index.ts +614 -0
- package/src/qdrant/client.test.ts +456 -0
- package/src/qdrant/client.ts +195 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +37 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { OllamaEmbeddings } from "./ollama.js";
|
|
3
|
+
// Mock fetch globally
|
|
4
|
+
global.fetch = vi.fn();
|
|
5
|
+
describe("OllamaEmbeddings", () => {
|
|
6
|
+
let embeddings;
|
|
7
|
+
let mockFetch;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
mockFetch = global.fetch;
|
|
10
|
+
mockFetch.mockReset();
|
|
11
|
+
embeddings = new OllamaEmbeddings();
|
|
12
|
+
});
|
|
13
|
+
describe("constructor", () => {
|
|
14
|
+
it("should use default model and dimensions", () => {
|
|
15
|
+
expect(embeddings.getModel()).toBe("nomic-embed-text");
|
|
16
|
+
expect(embeddings.getDimensions()).toBe(768);
|
|
17
|
+
});
|
|
18
|
+
it("should use custom model", () => {
|
|
19
|
+
const customEmbeddings = new OllamaEmbeddings("mxbai-embed-large");
|
|
20
|
+
expect(customEmbeddings.getModel()).toBe("mxbai-embed-large");
|
|
21
|
+
expect(customEmbeddings.getDimensions()).toBe(1024);
|
|
22
|
+
});
|
|
23
|
+
it("should use custom dimensions", () => {
|
|
24
|
+
const customEmbeddings = new OllamaEmbeddings("nomic-embed-text", 512);
|
|
25
|
+
expect(customEmbeddings.getDimensions()).toBe(512);
|
|
26
|
+
});
|
|
27
|
+
it("should use default base URL", () => {
|
|
28
|
+
const defaultEmbeddings = new OllamaEmbeddings();
|
|
29
|
+
expect(defaultEmbeddings).toBeDefined();
|
|
30
|
+
});
|
|
31
|
+
it("should use custom base URL", () => {
|
|
32
|
+
const customEmbeddings = new OllamaEmbeddings("nomic-embed-text", undefined, undefined, "http://custom:11434");
|
|
33
|
+
expect(customEmbeddings).toBeDefined();
|
|
34
|
+
});
|
|
35
|
+
it("should default to 768 for unknown models", () => {
|
|
36
|
+
const unknownEmbeddings = new OllamaEmbeddings("custom-model");
|
|
37
|
+
expect(unknownEmbeddings.getDimensions()).toBe(768);
|
|
38
|
+
});
|
|
39
|
+
it("should use all-minilm model with 384 dimensions", () => {
|
|
40
|
+
const miniEmbeddings = new OllamaEmbeddings("all-minilm");
|
|
41
|
+
expect(miniEmbeddings.getModel()).toBe("all-minilm");
|
|
42
|
+
expect(miniEmbeddings.getDimensions()).toBe(384);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe("embed", () => {
|
|
46
|
+
it("should generate embedding for single text", async () => {
|
|
47
|
+
const mockEmbedding = Array(768)
|
|
48
|
+
.fill(0)
|
|
49
|
+
.map((_, i) => i * 0.001);
|
|
50
|
+
mockFetch.mockResolvedValue({
|
|
51
|
+
ok: true,
|
|
52
|
+
json: async () => ({
|
|
53
|
+
embedding: mockEmbedding,
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
const result = await embeddings.embed("test text");
|
|
57
|
+
expect(result).toEqual({
|
|
58
|
+
embedding: mockEmbedding,
|
|
59
|
+
dimensions: 768,
|
|
60
|
+
});
|
|
61
|
+
expect(mockFetch).toHaveBeenCalledWith("http://localhost:11434/api/embeddings", {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify({
|
|
67
|
+
model: "nomic-embed-text",
|
|
68
|
+
prompt: "test text",
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
it("should handle long text", async () => {
|
|
73
|
+
const longText = "word ".repeat(1000);
|
|
74
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
75
|
+
mockFetch.mockResolvedValue({
|
|
76
|
+
ok: true,
|
|
77
|
+
json: async () => ({
|
|
78
|
+
embedding: mockEmbedding,
|
|
79
|
+
}),
|
|
80
|
+
});
|
|
81
|
+
const result = await embeddings.embed(longText);
|
|
82
|
+
expect(result.embedding).toEqual(mockEmbedding);
|
|
83
|
+
});
|
|
84
|
+
it("should use custom base URL", async () => {
|
|
85
|
+
const customEmbeddings = new OllamaEmbeddings("nomic-embed-text", undefined, undefined, "http://custom:11434");
|
|
86
|
+
const mockEmbedding = Array(768).fill(0.1);
|
|
87
|
+
mockFetch.mockResolvedValue({
|
|
88
|
+
ok: true,
|
|
89
|
+
json: async () => ({
|
|
90
|
+
embedding: mockEmbedding,
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
await customEmbeddings.embed("test");
|
|
94
|
+
expect(mockFetch).toHaveBeenCalledWith("http://custom:11434/api/embeddings", expect.any(Object));
|
|
95
|
+
});
|
|
96
|
+
it("should throw error if no embedding returned", async () => {
|
|
97
|
+
mockFetch.mockResolvedValue({
|
|
98
|
+
ok: true,
|
|
99
|
+
json: async () => ({}),
|
|
100
|
+
});
|
|
101
|
+
await expect(embeddings.embed("test")).rejects.toThrow("No embedding returned from Ollama API");
|
|
102
|
+
});
|
|
103
|
+
it("should handle API errors", async () => {
|
|
104
|
+
mockFetch.mockResolvedValue({
|
|
105
|
+
ok: false,
|
|
106
|
+
status: 404,
|
|
107
|
+
text: async () => "Model not found",
|
|
108
|
+
});
|
|
109
|
+
await expect(embeddings.embed("test")).rejects.toThrow();
|
|
110
|
+
});
|
|
111
|
+
it("should propagate network errors", async () => {
|
|
112
|
+
mockFetch.mockRejectedValue(new Error("Network Error"));
|
|
113
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Network Error");
|
|
114
|
+
});
|
|
115
|
+
it("should include text preview in API error for long text", async () => {
|
|
116
|
+
const longText = "a".repeat(150);
|
|
117
|
+
mockFetch.mockResolvedValue({
|
|
118
|
+
ok: false,
|
|
119
|
+
status: 500,
|
|
120
|
+
text: async () => "Server error",
|
|
121
|
+
});
|
|
122
|
+
await expect(embeddings.embed(longText)).rejects.toThrow(expect.objectContaining({
|
|
123
|
+
message: expect.stringContaining("Text preview:"),
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
it("should include model and URL in network error messages for non-Error objects", async () => {
|
|
127
|
+
mockFetch.mockRejectedValue("Connection refused");
|
|
128
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Failed to call Ollama API at http://localhost:11434 with model nomic-embed-text");
|
|
129
|
+
});
|
|
130
|
+
it("should handle errors with message property", async () => {
|
|
131
|
+
mockFetch.mockRejectedValue({
|
|
132
|
+
message: "Custom error message",
|
|
133
|
+
});
|
|
134
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Custom error message");
|
|
135
|
+
});
|
|
136
|
+
it("should handle non-Error objects in catch block", async () => {
|
|
137
|
+
mockFetch.mockRejectedValue({ code: "ERR_UNKNOWN", details: "info" });
|
|
138
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Failed to call Ollama API at http://localhost:11434 with model nomic-embed-text");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
describe("embedBatch", () => {
|
|
142
|
+
it("should generate embeddings for multiple texts in parallel", async () => {
|
|
143
|
+
const mockEmbeddings = [
|
|
144
|
+
Array(768).fill(0.1),
|
|
145
|
+
Array(768).fill(0.2),
|
|
146
|
+
Array(768).fill(0.3),
|
|
147
|
+
];
|
|
148
|
+
// Mock sequential calls for each text
|
|
149
|
+
mockEmbeddings.forEach((embedding) => {
|
|
150
|
+
mockFetch.mockResolvedValueOnce({
|
|
151
|
+
ok: true,
|
|
152
|
+
json: async () => ({ embedding }),
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
const texts = ["text1", "text2", "text3"];
|
|
156
|
+
const results = await embeddings.embedBatch(texts);
|
|
157
|
+
expect(results).toEqual([
|
|
158
|
+
{ embedding: mockEmbeddings[0], dimensions: 768 },
|
|
159
|
+
{ embedding: mockEmbeddings[1], dimensions: 768 },
|
|
160
|
+
{ embedding: mockEmbeddings[2], dimensions: 768 },
|
|
161
|
+
]);
|
|
162
|
+
// Ollama processes each text individually
|
|
163
|
+
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
164
|
+
});
|
|
165
|
+
it("should handle empty batch", async () => {
|
|
166
|
+
const results = await embeddings.embedBatch([]);
|
|
167
|
+
expect(results).toEqual([]);
|
|
168
|
+
expect(mockFetch).not.toHaveBeenCalled();
|
|
169
|
+
});
|
|
170
|
+
it("should handle single item in batch", async () => {
|
|
171
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
172
|
+
mockFetch.mockResolvedValue({
|
|
173
|
+
ok: true,
|
|
174
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
175
|
+
});
|
|
176
|
+
const results = await embeddings.embedBatch(["single text"]);
|
|
177
|
+
expect(results).toHaveLength(1);
|
|
178
|
+
expect(results[0].embedding).toEqual(mockEmbedding);
|
|
179
|
+
});
|
|
180
|
+
it("should handle large batches with parallel processing", async () => {
|
|
181
|
+
const batchSize = 20;
|
|
182
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
183
|
+
// Mock all responses
|
|
184
|
+
for (let i = 0; i < batchSize; i++) {
|
|
185
|
+
mockFetch.mockResolvedValueOnce({
|
|
186
|
+
ok: true,
|
|
187
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const texts = Array(batchSize)
|
|
191
|
+
.fill(null)
|
|
192
|
+
.map((_, i) => `text ${i}`);
|
|
193
|
+
const results = await embeddings.embedBatch(texts);
|
|
194
|
+
expect(results).toHaveLength(batchSize);
|
|
195
|
+
expect(mockFetch).toHaveBeenCalledTimes(batchSize);
|
|
196
|
+
});
|
|
197
|
+
it("should propagate errors in batch", async () => {
|
|
198
|
+
mockFetch
|
|
199
|
+
.mockResolvedValueOnce({
|
|
200
|
+
ok: true,
|
|
201
|
+
json: async () => ({ embedding: Array(768).fill(0.1) }),
|
|
202
|
+
})
|
|
203
|
+
.mockRejectedValueOnce(new Error("Batch API Error"));
|
|
204
|
+
await expect(embeddings.embedBatch(["text1", "text2"])).rejects.toThrow("Batch API Error");
|
|
205
|
+
});
|
|
206
|
+
it("should handle partial failures in batch", async () => {
|
|
207
|
+
mockFetch
|
|
208
|
+
.mockResolvedValueOnce({
|
|
209
|
+
ok: true,
|
|
210
|
+
json: async () => ({ embedding: Array(768).fill(0.1) }),
|
|
211
|
+
})
|
|
212
|
+
.mockResolvedValueOnce({
|
|
213
|
+
ok: false,
|
|
214
|
+
status: 500,
|
|
215
|
+
text: async () => "Internal error",
|
|
216
|
+
});
|
|
217
|
+
await expect(embeddings.embedBatch(["text1", "text2"])).rejects.toThrow();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
describe("getDimensions", () => {
|
|
221
|
+
it("should return configured dimensions", () => {
|
|
222
|
+
expect(embeddings.getDimensions()).toBe(768);
|
|
223
|
+
});
|
|
224
|
+
it("should return custom dimensions", () => {
|
|
225
|
+
const customEmbeddings = new OllamaEmbeddings("nomic-embed-text", 512);
|
|
226
|
+
expect(customEmbeddings.getDimensions()).toBe(512);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe("getModel", () => {
|
|
230
|
+
it("should return configured model", () => {
|
|
231
|
+
expect(embeddings.getModel()).toBe("nomic-embed-text");
|
|
232
|
+
});
|
|
233
|
+
it("should return custom model", () => {
|
|
234
|
+
const customEmbeddings = new OllamaEmbeddings("mxbai-embed-large");
|
|
235
|
+
expect(customEmbeddings.getModel()).toBe("mxbai-embed-large");
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe("rate limiting", () => {
|
|
239
|
+
it("should retry on rate limit error (429 status)", async () => {
|
|
240
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
241
|
+
mockFetch
|
|
242
|
+
.mockResolvedValueOnce({
|
|
243
|
+
ok: false,
|
|
244
|
+
status: 429,
|
|
245
|
+
text: async () => "Rate limit exceeded",
|
|
246
|
+
})
|
|
247
|
+
.mockResolvedValueOnce({
|
|
248
|
+
ok: false,
|
|
249
|
+
status: 429,
|
|
250
|
+
text: async () => "Rate limit exceeded",
|
|
251
|
+
})
|
|
252
|
+
.mockResolvedValue({
|
|
253
|
+
ok: true,
|
|
254
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
255
|
+
});
|
|
256
|
+
const result = await embeddings.embed("test text");
|
|
257
|
+
expect(result.embedding).toEqual(mockEmbedding);
|
|
258
|
+
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
259
|
+
});
|
|
260
|
+
it("should retry on rate limit message", async () => {
|
|
261
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
262
|
+
mockFetch
|
|
263
|
+
.mockRejectedValueOnce({
|
|
264
|
+
message: "You have exceeded the rate limit",
|
|
265
|
+
})
|
|
266
|
+
.mockResolvedValue({
|
|
267
|
+
ok: true,
|
|
268
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
269
|
+
});
|
|
270
|
+
const result = await embeddings.embed("test text");
|
|
271
|
+
expect(result.embedding).toEqual(mockEmbedding);
|
|
272
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
273
|
+
});
|
|
274
|
+
it("should use exponential backoff with faster default delay", async () => {
|
|
275
|
+
const rateLimitEmbeddings = new OllamaEmbeddings("nomic-embed-text", undefined, {
|
|
276
|
+
retryAttempts: 3,
|
|
277
|
+
retryDelayMs: 100,
|
|
278
|
+
});
|
|
279
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
280
|
+
mockFetch
|
|
281
|
+
.mockResolvedValueOnce({
|
|
282
|
+
ok: false,
|
|
283
|
+
status: 429,
|
|
284
|
+
text: async () => "Rate limit",
|
|
285
|
+
})
|
|
286
|
+
.mockResolvedValueOnce({
|
|
287
|
+
ok: false,
|
|
288
|
+
status: 429,
|
|
289
|
+
text: async () => "Rate limit",
|
|
290
|
+
})
|
|
291
|
+
.mockResolvedValue({
|
|
292
|
+
ok: true,
|
|
293
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
294
|
+
});
|
|
295
|
+
const startTime = Date.now();
|
|
296
|
+
await rateLimitEmbeddings.embed("test text");
|
|
297
|
+
const duration = Date.now() - startTime;
|
|
298
|
+
// Should wait: 100ms (first retry) + 200ms (second retry) = 300ms
|
|
299
|
+
expect(duration).toBeGreaterThanOrEqual(250);
|
|
300
|
+
});
|
|
301
|
+
it("should throw error after max retries exceeded", async () => {
|
|
302
|
+
const rateLimitEmbeddings = new OllamaEmbeddings("nomic-embed-text", undefined, {
|
|
303
|
+
retryAttempts: 2,
|
|
304
|
+
retryDelayMs: 100,
|
|
305
|
+
});
|
|
306
|
+
mockFetch.mockResolvedValue({
|
|
307
|
+
ok: false,
|
|
308
|
+
status: 429,
|
|
309
|
+
text: async () => "Rate limit exceeded",
|
|
310
|
+
});
|
|
311
|
+
await expect(rateLimitEmbeddings.embed("test text")).rejects.toThrow("Ollama API rate limit exceeded after 2 retry attempts");
|
|
312
|
+
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
313
|
+
});
|
|
314
|
+
it("should handle rate limit errors in batch operations", async () => {
|
|
315
|
+
const mockEmbedding = Array(768).fill(0.5);
|
|
316
|
+
mockFetch
|
|
317
|
+
.mockResolvedValueOnce({
|
|
318
|
+
ok: false,
|
|
319
|
+
status: 429,
|
|
320
|
+
text: async () => "Rate limit",
|
|
321
|
+
})
|
|
322
|
+
.mockResolvedValueOnce({
|
|
323
|
+
ok: true,
|
|
324
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
325
|
+
})
|
|
326
|
+
.mockResolvedValueOnce({
|
|
327
|
+
ok: true,
|
|
328
|
+
json: async () => ({ embedding: mockEmbedding }),
|
|
329
|
+
});
|
|
330
|
+
const results = await embeddings.embedBatch(["text1", "text2"]);
|
|
331
|
+
expect(results).toHaveLength(2);
|
|
332
|
+
// First call fails and retries, then succeeds. Second call succeeds immediately.
|
|
333
|
+
expect(mockFetch).toHaveBeenCalledTimes(3);
|
|
334
|
+
});
|
|
335
|
+
it("should not retry on non-rate-limit errors", async () => {
|
|
336
|
+
mockFetch.mockResolvedValue({
|
|
337
|
+
ok: false,
|
|
338
|
+
status: 404,
|
|
339
|
+
text: async () => "Model not found",
|
|
340
|
+
});
|
|
341
|
+
await expect(embeddings.embed("test text")).rejects.toThrow();
|
|
342
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
343
|
+
});
|
|
344
|
+
it("should accept custom rate limit configuration", () => {
|
|
345
|
+
const customEmbeddings = new OllamaEmbeddings("nomic-embed-text", undefined, {
|
|
346
|
+
maxRequestsPerMinute: 2000,
|
|
347
|
+
retryAttempts: 5,
|
|
348
|
+
retryDelayMs: 1000,
|
|
349
|
+
});
|
|
350
|
+
expect(customEmbeddings).toBeDefined();
|
|
351
|
+
});
|
|
352
|
+
it("should have higher default rate limit for local deployment", () => {
|
|
353
|
+
// Ollama defaults to 1000 requests/minute (more lenient than cloud providers)
|
|
354
|
+
const defaultEmbeddings = new OllamaEmbeddings();
|
|
355
|
+
expect(defaultEmbeddings).toBeDefined();
|
|
356
|
+
});
|
|
357
|
+
it("should handle primitive error values in retry logic", async () => {
|
|
358
|
+
// This tests line 69: when error is not an OllamaError, convert to { status: 0, message: String(error) }
|
|
359
|
+
mockFetch.mockRejectedValue(null);
|
|
360
|
+
await expect(embeddings.embed("test")).rejects.toThrow();
|
|
361
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
362
|
+
});
|
|
363
|
+
it("should handle string primitive errors", async () => {
|
|
364
|
+
mockFetch.mockRejectedValue("Network unreachable");
|
|
365
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Network unreachable");
|
|
366
|
+
});
|
|
367
|
+
it("should handle error objects with non-string message property", async () => {
|
|
368
|
+
mockFetch.mockRejectedValue({
|
|
369
|
+
message: 404, // Non-string message
|
|
370
|
+
code: "NOT_FOUND",
|
|
371
|
+
});
|
|
372
|
+
// Should not treat this as a rate limit error even though it has a message property
|
|
373
|
+
await expect(embeddings.embed("test")).rejects.toThrow();
|
|
374
|
+
expect(mockFetch).toHaveBeenCalledTimes(1); // No retries
|
|
375
|
+
});
|
|
376
|
+
it("should handle Error instance in retry logic", async () => {
|
|
377
|
+
const testError = new Error("Connection timeout");
|
|
378
|
+
mockFetch.mockRejectedValue(testError);
|
|
379
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Connection timeout");
|
|
380
|
+
});
|
|
381
|
+
it("should handle Error instance from network error with enhanced message", async () => {
|
|
382
|
+
// This tests error instanceof Error path for network errors
|
|
383
|
+
const networkError = new Error("ECONNREFUSED");
|
|
384
|
+
mockFetch.mockRejectedValue(networkError);
|
|
385
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Failed to call Ollama API at http://localhost:11434 with model nomic-embed-text: ECONNREFUSED. Text preview:");
|
|
386
|
+
});
|
|
387
|
+
it("should handle object with string message property", async () => {
|
|
388
|
+
// This tests lines 143-144: object with message property that is a string
|
|
389
|
+
const customError = {
|
|
390
|
+
code: "API_ERROR",
|
|
391
|
+
message: "Custom API failure",
|
|
392
|
+
details: "Something went wrong",
|
|
393
|
+
};
|
|
394
|
+
mockFetch.mockRejectedValue(customError);
|
|
395
|
+
await expect(embeddings.embed("test")).rejects.toThrow("Custom API failure");
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
//# sourceMappingURL=ollama.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.test.js","sourceRoot":"","sources":["../../src/embeddings/ollama.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { EmbeddingProvider, EmbeddingResult, RateLimitConfig } from "./base.js";
|
|
2
|
+
export declare class OpenAIEmbeddings implements EmbeddingProvider {
|
|
3
|
+
private client;
|
|
4
|
+
private model;
|
|
5
|
+
private dimensions;
|
|
6
|
+
private limiter;
|
|
7
|
+
private retryAttempts;
|
|
8
|
+
private retryDelayMs;
|
|
9
|
+
constructor(apiKey: string, model?: string, dimensions?: number, rateLimitConfig?: RateLimitConfig);
|
|
10
|
+
private retryWithBackoff;
|
|
11
|
+
embed(text: string): Promise<EmbeddingResult>;
|
|
12
|
+
embedBatch(texts: string[]): Promise<EmbeddingResult[]>;
|
|
13
|
+
getDimensions(): number;
|
|
14
|
+
getModel(): string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EAEhB,MAAM,WAAW,CAAC;AAYnB,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;gBAG3B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAiC,EACxC,UAAU,CAAC,EAAE,MAAM,EACnB,eAAe,CAAC,EAAE,eAAe;YAiCrB,gBAAgB;IAoDxB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAiB7D,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAGnB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import Bottleneck from "bottleneck";
|
|
3
|
+
export class OpenAIEmbeddings {
|
|
4
|
+
client;
|
|
5
|
+
model;
|
|
6
|
+
dimensions;
|
|
7
|
+
limiter;
|
|
8
|
+
retryAttempts;
|
|
9
|
+
retryDelayMs;
|
|
10
|
+
constructor(apiKey, model = "text-embedding-3-small", dimensions, rateLimitConfig) {
|
|
11
|
+
this.client = new OpenAI({ apiKey });
|
|
12
|
+
this.model = model;
|
|
13
|
+
// Default dimensions for different models
|
|
14
|
+
const defaultDimensions = {
|
|
15
|
+
"text-embedding-3-small": 1536,
|
|
16
|
+
"text-embedding-3-large": 3072,
|
|
17
|
+
"text-embedding-ada-002": 1536,
|
|
18
|
+
};
|
|
19
|
+
this.dimensions = dimensions || defaultDimensions[model] || 1536;
|
|
20
|
+
// Rate limiting configuration
|
|
21
|
+
const maxRequestsPerMinute = rateLimitConfig?.maxRequestsPerMinute || 3500;
|
|
22
|
+
this.retryAttempts = rateLimitConfig?.retryAttempts || 3;
|
|
23
|
+
this.retryDelayMs = rateLimitConfig?.retryDelayMs || 1000;
|
|
24
|
+
// Initialize bottleneck limiter
|
|
25
|
+
// Uses reservoir (token bucket) pattern for burst handling with per-minute refresh
|
|
26
|
+
// Note: Using both reservoir and minTime provides defense in depth but may be
|
|
27
|
+
// more conservative than necessary. Future optimization could use reservoir-only
|
|
28
|
+
// for better burst handling or minTime-only for simpler even distribution.
|
|
29
|
+
this.limiter = new Bottleneck({
|
|
30
|
+
reservoir: maxRequestsPerMinute,
|
|
31
|
+
reservoirRefreshAmount: maxRequestsPerMinute,
|
|
32
|
+
reservoirRefreshInterval: 60 * 1000, // 1 minute
|
|
33
|
+
maxConcurrent: 10,
|
|
34
|
+
minTime: Math.floor((60 * 1000) / maxRequestsPerMinute),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async retryWithBackoff(fn, attempt = 0) {
|
|
38
|
+
try {
|
|
39
|
+
return await fn();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const apiError = error;
|
|
43
|
+
const isRateLimitError = apiError?.status === 429 ||
|
|
44
|
+
apiError?.code === "rate_limit_exceeded" ||
|
|
45
|
+
apiError?.message?.toLowerCase().includes("rate limit");
|
|
46
|
+
if (isRateLimitError && attempt < this.retryAttempts) {
|
|
47
|
+
// Check for Retry-After header (different HTTP clients may nest differently)
|
|
48
|
+
const retryAfter = apiError?.response?.headers?.["retry-after"] ||
|
|
49
|
+
apiError?.headers?.["retry-after"];
|
|
50
|
+
let delayMs;
|
|
51
|
+
if (retryAfter) {
|
|
52
|
+
// Use Retry-After header if available (in seconds)
|
|
53
|
+
const parsed = parseInt(retryAfter, 10);
|
|
54
|
+
delayMs =
|
|
55
|
+
!isNaN(parsed) && parsed > 0
|
|
56
|
+
? parsed * 1000
|
|
57
|
+
: this.retryDelayMs * Math.pow(2, attempt);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Exponential backoff: 1s, 2s, 4s, 8s...
|
|
61
|
+
delayMs = this.retryDelayMs * Math.pow(2, attempt);
|
|
62
|
+
}
|
|
63
|
+
const waitTimeSeconds = (delayMs / 1000).toFixed(1);
|
|
64
|
+
console.error(`Rate limit reached. Retrying in ${waitTimeSeconds}s (attempt ${attempt + 1}/${this.retryAttempts})...`);
|
|
65
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
66
|
+
return this.retryWithBackoff(fn, attempt + 1);
|
|
67
|
+
}
|
|
68
|
+
// If not a rate limit error or max retries exceeded, throw
|
|
69
|
+
if (isRateLimitError) {
|
|
70
|
+
throw new Error(`OpenAI API rate limit exceeded after ${this.retryAttempts} retry attempts. Please try again later or reduce request frequency.`);
|
|
71
|
+
}
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async embed(text) {
|
|
76
|
+
return this.limiter.schedule(() => this.retryWithBackoff(async () => {
|
|
77
|
+
const response = await this.client.embeddings.create({
|
|
78
|
+
model: this.model,
|
|
79
|
+
input: text,
|
|
80
|
+
dimensions: this.dimensions,
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
embedding: response.data[0].embedding,
|
|
84
|
+
dimensions: this.dimensions,
|
|
85
|
+
};
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
async embedBatch(texts) {
|
|
89
|
+
return this.limiter.schedule(() => this.retryWithBackoff(async () => {
|
|
90
|
+
const response = await this.client.embeddings.create({
|
|
91
|
+
model: this.model,
|
|
92
|
+
input: texts,
|
|
93
|
+
dimensions: this.dimensions,
|
|
94
|
+
});
|
|
95
|
+
return response.data.map((item) => ({
|
|
96
|
+
embedding: item.embedding,
|
|
97
|
+
dimensions: this.dimensions,
|
|
98
|
+
}));
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
getDimensions() {
|
|
102
|
+
return this.dimensions;
|
|
103
|
+
}
|
|
104
|
+
getModel() {
|
|
105
|
+
return this.model;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.test.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.test.ts"],"names":[],"mappings":""}
|