@ordis-dev/ordis 0.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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/__tests__/api.test.d.ts +5 -0
  4. package/dist/__tests__/api.test.d.ts.map +1 -0
  5. package/dist/__tests__/api.test.js +95 -0
  6. package/dist/__tests__/api.test.js.map +1 -0
  7. package/dist/__tests__/cli.test.d.ts +6 -0
  8. package/dist/__tests__/cli.test.d.ts.map +1 -0
  9. package/dist/__tests__/cli.test.js +103 -0
  10. package/dist/__tests__/cli.test.js.map +1 -0
  11. package/dist/cli/__tests__/cli.test.d.ts +5 -0
  12. package/dist/cli/__tests__/cli.test.d.ts.map +1 -0
  13. package/dist/cli/__tests__/cli.test.js +13 -0
  14. package/dist/cli/__tests__/cli.test.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +225 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/core/__tests__/pipeline.test.d.ts +5 -0
  20. package/dist/core/__tests__/pipeline.test.d.ts.map +1 -0
  21. package/dist/core/__tests__/pipeline.test.js +334 -0
  22. package/dist/core/__tests__/pipeline.test.js.map +1 -0
  23. package/dist/core/__tests__/validator.test.d.ts +5 -0
  24. package/dist/core/__tests__/validator.test.d.ts.map +1 -0
  25. package/dist/core/__tests__/validator.test.js +124 -0
  26. package/dist/core/__tests__/validator.test.js.map +1 -0
  27. package/dist/core/errors.d.ts +27 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +35 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/index.d.ts +8 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +7 -0
  34. package/dist/core/index.js.map +1 -0
  35. package/dist/core/pipeline.d.ts +28 -0
  36. package/dist/core/pipeline.d.ts.map +1 -0
  37. package/dist/core/pipeline.js +212 -0
  38. package/dist/core/pipeline.js.map +1 -0
  39. package/dist/core/types.d.ts +55 -0
  40. package/dist/core/types.d.ts.map +1 -0
  41. package/dist/core/types.js +5 -0
  42. package/dist/core/types.js.map +1 -0
  43. package/dist/core/validator.d.ts +19 -0
  44. package/dist/core/validator.d.ts.map +1 -0
  45. package/dist/core/validator.js +147 -0
  46. package/dist/core/validator.js.map +1 -0
  47. package/dist/index.d.ts +19 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +18 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/llm/__tests__/client.test.d.ts +5 -0
  52. package/dist/llm/__tests__/client.test.d.ts.map +1 -0
  53. package/dist/llm/__tests__/client.test.js +350 -0
  54. package/dist/llm/__tests__/client.test.js.map +1 -0
  55. package/dist/llm/__tests__/prompt-builder.test.d.ts +5 -0
  56. package/dist/llm/__tests__/prompt-builder.test.d.ts.map +1 -0
  57. package/dist/llm/__tests__/prompt-builder.test.js +171 -0
  58. package/dist/llm/__tests__/prompt-builder.test.js.map +1 -0
  59. package/dist/llm/__tests__/retry.test.d.ts +5 -0
  60. package/dist/llm/__tests__/retry.test.d.ts.map +1 -0
  61. package/dist/llm/__tests__/retry.test.js +350 -0
  62. package/dist/llm/__tests__/retry.test.js.map +1 -0
  63. package/dist/llm/__tests__/token-counter.test.d.ts +5 -0
  64. package/dist/llm/__tests__/token-counter.test.d.ts.map +1 -0
  65. package/dist/llm/__tests__/token-counter.test.js +166 -0
  66. package/dist/llm/__tests__/token-counter.test.js.map +1 -0
  67. package/dist/llm/client.d.ts +56 -0
  68. package/dist/llm/client.d.ts.map +1 -0
  69. package/dist/llm/client.js +266 -0
  70. package/dist/llm/client.js.map +1 -0
  71. package/dist/llm/errors.d.ts +27 -0
  72. package/dist/llm/errors.d.ts.map +1 -0
  73. package/dist/llm/errors.js +35 -0
  74. package/dist/llm/errors.js.map +1 -0
  75. package/dist/llm/index.d.ts +10 -0
  76. package/dist/llm/index.d.ts.map +1 -0
  77. package/dist/llm/index.js +8 -0
  78. package/dist/llm/index.js.map +1 -0
  79. package/dist/llm/prompt-builder.d.ts +13 -0
  80. package/dist/llm/prompt-builder.d.ts.map +1 -0
  81. package/dist/llm/prompt-builder.js +107 -0
  82. package/dist/llm/prompt-builder.js.map +1 -0
  83. package/dist/llm/token-counter.d.ts +82 -0
  84. package/dist/llm/token-counter.d.ts.map +1 -0
  85. package/dist/llm/token-counter.js +109 -0
  86. package/dist/llm/token-counter.js.map +1 -0
  87. package/dist/llm/types.d.ts +96 -0
  88. package/dist/llm/types.d.ts.map +1 -0
  89. package/dist/llm/types.js +5 -0
  90. package/dist/llm/types.js.map +1 -0
  91. package/dist/schemas/__tests__/integration.test.d.ts +5 -0
  92. package/dist/schemas/__tests__/integration.test.d.ts.map +1 -0
  93. package/dist/schemas/__tests__/integration.test.js +366 -0
  94. package/dist/schemas/__tests__/integration.test.js.map +1 -0
  95. package/dist/schemas/__tests__/loader.test.d.ts +5 -0
  96. package/dist/schemas/__tests__/loader.test.d.ts.map +1 -0
  97. package/dist/schemas/__tests__/loader.test.js +271 -0
  98. package/dist/schemas/__tests__/loader.test.js.map +1 -0
  99. package/dist/schemas/__tests__/validator.test.d.ts +5 -0
  100. package/dist/schemas/__tests__/validator.test.d.ts.map +1 -0
  101. package/dist/schemas/__tests__/validator.test.js +592 -0
  102. package/dist/schemas/__tests__/validator.test.js.map +1 -0
  103. package/dist/schemas/errors.d.ts +38 -0
  104. package/dist/schemas/errors.d.ts.map +1 -0
  105. package/dist/schemas/errors.js +49 -0
  106. package/dist/schemas/errors.js.map +1 -0
  107. package/dist/schemas/index.d.ts +8 -0
  108. package/dist/schemas/index.d.ts.map +1 -0
  109. package/dist/schemas/index.js +7 -0
  110. package/dist/schemas/index.js.map +1 -0
  111. package/dist/schemas/loader.d.ts +29 -0
  112. package/dist/schemas/loader.d.ts.map +1 -0
  113. package/dist/schemas/loader.js +71 -0
  114. package/dist/schemas/loader.js.map +1 -0
  115. package/dist/schemas/types.d.ts +75 -0
  116. package/dist/schemas/types.d.ts.map +1 -0
  117. package/dist/schemas/types.js +7 -0
  118. package/dist/schemas/types.js.map +1 -0
  119. package/dist/schemas/validator.d.ts +12 -0
  120. package/dist/schemas/validator.d.ts.map +1 -0
  121. package/dist/schemas/validator.js +211 -0
  122. package/dist/schemas/validator.js.map +1 -0
  123. package/package.json +60 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Tests for prompt builder
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { buildSystemPrompt, buildUserPrompt } from '../prompt-builder.js';
6
+ describe('Prompt Builder', () => {
7
+ describe('buildSystemPrompt', () => {
8
+ it('should build basic system prompt', () => {
9
+ const schema = {
10
+ fields: {
11
+ name: { type: 'string' },
12
+ age: { type: 'number' },
13
+ },
14
+ };
15
+ const prompt = buildSystemPrompt(schema);
16
+ expect(prompt).toContain('data extraction');
17
+ expect(prompt).toContain('name: string');
18
+ expect(prompt).toContain('age: number');
19
+ expect(prompt).toContain('only valid JSON');
20
+ });
21
+ it('should include field descriptions', () => {
22
+ const schema = {
23
+ fields: {
24
+ email: {
25
+ type: 'string',
26
+ description: 'User email address',
27
+ },
28
+ },
29
+ };
30
+ const prompt = buildSystemPrompt(schema);
31
+ expect(prompt).toContain('User email address');
32
+ });
33
+ it('should mark optional fields', () => {
34
+ const schema = {
35
+ fields: {
36
+ name: { type: 'string' },
37
+ nickname: { type: 'string', optional: true },
38
+ },
39
+ };
40
+ const prompt = buildSystemPrompt(schema);
41
+ expect(prompt).toContain('nickname: string (optional)');
42
+ });
43
+ it('should include enum values', () => {
44
+ const schema = {
45
+ fields: {
46
+ status: {
47
+ type: 'enum',
48
+ enum: ['active', 'inactive', 'pending'],
49
+ },
50
+ },
51
+ };
52
+ const prompt = buildSystemPrompt(schema);
53
+ expect(prompt).toContain('active, inactive, pending');
54
+ });
55
+ it('should include number constraints', () => {
56
+ const schema = {
57
+ fields: {
58
+ age: { type: 'number', min: 0, max: 120 },
59
+ },
60
+ };
61
+ const prompt = buildSystemPrompt(schema);
62
+ expect(prompt).toContain('range: 0 to 120');
63
+ });
64
+ it('should include pattern for strings', () => {
65
+ const schema = {
66
+ fields: {
67
+ zipcode: {
68
+ type: 'string',
69
+ pattern: '^\\d{5}$',
70
+ },
71
+ },
72
+ };
73
+ const prompt = buildSystemPrompt(schema);
74
+ expect(prompt).toContain('pattern: ^\\d{5}$');
75
+ });
76
+ it('should include confidence requirements', () => {
77
+ const schema = {
78
+ fields: {
79
+ name: { type: 'string' },
80
+ },
81
+ confidence: {
82
+ threshold: 85,
83
+ failOnLowConfidence: true,
84
+ },
85
+ };
86
+ const prompt = buildSystemPrompt(schema);
87
+ expect(prompt).toContain('threshold: 85%');
88
+ expect(prompt).toContain('confidence score');
89
+ });
90
+ it('should include response format', () => {
91
+ const schema = {
92
+ fields: {
93
+ id: { type: 'string' },
94
+ count: { type: 'number' },
95
+ },
96
+ };
97
+ const prompt = buildSystemPrompt(schema);
98
+ expect(prompt).toContain('"data"');
99
+ expect(prompt).toContain('"confidence"');
100
+ expect(prompt).toContain('"confidenceByField"');
101
+ });
102
+ it('should NOT include few-shot examples by default', () => {
103
+ const schema = {
104
+ fields: {
105
+ name: { type: 'string' },
106
+ age: { type: 'number' },
107
+ },
108
+ };
109
+ const prompt = buildSystemPrompt(schema);
110
+ expect(prompt).not.toContain('Example extraction:');
111
+ expect(prompt).not.toContain('INV-2024-0042');
112
+ });
113
+ it('should include few-shot examples when explicitly enabled', () => {
114
+ const schema = {
115
+ fields: {
116
+ name: { type: 'string' },
117
+ age: { type: 'number' },
118
+ },
119
+ prompt: {
120
+ includeFewShotExamples: true,
121
+ },
122
+ };
123
+ const prompt = buildSystemPrompt(schema);
124
+ expect(prompt).toContain('Example extraction:');
125
+ expect(prompt).toContain('Input text:');
126
+ expect(prompt).toContain('Output:');
127
+ });
128
+ it('should include example with null values when enabled', () => {
129
+ const schema = {
130
+ fields: {
131
+ email: { type: 'string' },
132
+ phone: { type: 'string', optional: true },
133
+ },
134
+ prompt: {
135
+ includeFewShotExamples: true,
136
+ },
137
+ };
138
+ const prompt = buildSystemPrompt(schema);
139
+ expect(prompt).toContain('null');
140
+ expect(prompt).toContain('missing or uncertain');
141
+ });
142
+ it('should include invoice example when enabled', () => {
143
+ const schema = {
144
+ fields: {
145
+ invoice_id: { type: 'string' },
146
+ amount: { type: 'number' },
147
+ },
148
+ prompt: {
149
+ includeFewShotExamples: true,
150
+ },
151
+ };
152
+ const prompt = buildSystemPrompt(schema);
153
+ expect(prompt).toContain('INV-2024-0042');
154
+ expect(prompt).toContain('1250.00');
155
+ });
156
+ });
157
+ describe('buildUserPrompt', () => {
158
+ it('should wrap input text', () => {
159
+ const input = 'Name: John Doe\nAge: 30';
160
+ const prompt = buildUserPrompt(input);
161
+ expect(prompt).toContain('Extract data');
162
+ expect(prompt).toContain(input);
163
+ });
164
+ it('should handle multiline input', () => {
165
+ const input = 'Line 1\nLine 2\nLine 3';
166
+ const prompt = buildUserPrompt(input);
167
+ expect(prompt).toContain(input);
168
+ });
169
+ });
170
+ });
171
+ //# sourceMappingURL=prompt-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.test.js","sourceRoot":"","sources":["../../../src/llm/__tests__/prompt-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for retry logic
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=retry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../../src/llm/__tests__/retry.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Tests for retry logic
3
+ */
4
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
5
+ import { LLMClient } from '../client.js';
6
+ // Mock fetch globally
7
+ global.fetch = vi.fn();
8
+ describe('Retry Logic', () => {
9
+ beforeEach(() => {
10
+ vi.clearAllMocks();
11
+ });
12
+ const mockSuccessResponse = {
13
+ id: 'test-id',
14
+ object: 'chat.completion',
15
+ created: Date.now(),
16
+ model: 'test-model',
17
+ choices: [
18
+ {
19
+ index: 0,
20
+ message: {
21
+ role: 'assistant',
22
+ content: JSON.stringify({
23
+ data: { name: 'Test' },
24
+ confidence: 95,
25
+ confidenceByField: { name: 95 },
26
+ }),
27
+ },
28
+ finish_reason: 'stop',
29
+ },
30
+ ],
31
+ };
32
+ const schema = {
33
+ fields: {
34
+ name: { type: 'string' },
35
+ },
36
+ };
37
+ describe('Network errors', () => {
38
+ it('should retry on network errors', async () => {
39
+ let callCount = 0;
40
+ vi.mocked(fetch).mockImplementation(async () => {
41
+ callCount++;
42
+ if (callCount < 3) {
43
+ throw new Error('Network failure');
44
+ }
45
+ return {
46
+ ok: true,
47
+ json: async () => mockSuccessResponse,
48
+ };
49
+ });
50
+ const client = new LLMClient({
51
+ baseURL: 'http://localhost:11434/v1',
52
+ model: 'llama3',
53
+ retries: {
54
+ maxRetries: 3,
55
+ initialDelay: 10,
56
+ maxDelay: 100,
57
+ backoffFactor: 2,
58
+ },
59
+ });
60
+ const result = await client.extract({
61
+ schema,
62
+ input: 'Name: Test',
63
+ });
64
+ expect(result.data.name).toBe('Test');
65
+ expect(callCount).toBe(3);
66
+ });
67
+ it('should fail after max retries', async () => {
68
+ vi.mocked(fetch).mockRejectedValue(new Error('Network failure'));
69
+ const client = new LLMClient({
70
+ baseURL: 'http://localhost:11434/v1',
71
+ model: 'llama3',
72
+ retries: {
73
+ maxRetries: 2,
74
+ initialDelay: 10,
75
+ maxDelay: 100,
76
+ backoffFactor: 2,
77
+ },
78
+ });
79
+ await expect(client.extract({
80
+ schema,
81
+ input: 'Name: Test',
82
+ })).rejects.toThrow('Network error');
83
+ });
84
+ });
85
+ describe('Rate limiting', () => {
86
+ it('should retry on 429 errors', async () => {
87
+ let callCount = 0;
88
+ vi.mocked(fetch).mockImplementation(async () => {
89
+ callCount++;
90
+ if (callCount < 2) {
91
+ return {
92
+ ok: false,
93
+ status: 429,
94
+ statusText: 'Too Many Requests',
95
+ headers: new Headers(),
96
+ json: async () => ({ error: { message: 'Rate limit exceeded' } }),
97
+ };
98
+ }
99
+ return {
100
+ ok: true,
101
+ json: async () => mockSuccessResponse,
102
+ };
103
+ });
104
+ const client = new LLMClient({
105
+ baseURL: 'http://localhost:11434/v1',
106
+ model: 'llama3',
107
+ retries: {
108
+ maxRetries: 2,
109
+ initialDelay: 10,
110
+ maxDelay: 100,
111
+ backoffFactor: 2,
112
+ },
113
+ });
114
+ const result = await client.extract({
115
+ schema,
116
+ input: 'Name: Test',
117
+ });
118
+ expect(result.data.name).toBe('Test');
119
+ expect(callCount).toBe(2);
120
+ });
121
+ it('should respect Retry-After header', async () => {
122
+ let callCount = 0;
123
+ const startTime = Date.now();
124
+ vi.mocked(fetch).mockImplementation(async () => {
125
+ callCount++;
126
+ if (callCount < 2) {
127
+ const headers = new Headers();
128
+ headers.set('Retry-After', '0'); // Use 0 for testing
129
+ return {
130
+ ok: false,
131
+ status: 429,
132
+ statusText: 'Too Many Requests',
133
+ headers,
134
+ json: async () => ({ error: { message: 'Rate limit exceeded' } }),
135
+ };
136
+ }
137
+ return {
138
+ ok: true,
139
+ json: async () => mockSuccessResponse,
140
+ };
141
+ });
142
+ const client = new LLMClient({
143
+ baseURL: 'http://localhost:11434/v1',
144
+ model: 'llama3',
145
+ retries: {
146
+ maxRetries: 2,
147
+ initialDelay: 100,
148
+ maxDelay: 10000,
149
+ backoffFactor: 2,
150
+ },
151
+ });
152
+ const result = await client.extract({
153
+ schema,
154
+ input: 'Name: Test',
155
+ });
156
+ expect(result.data.name).toBe('Test');
157
+ // Should complete quickly since Retry-After is 0
158
+ const elapsed = Date.now() - startTime;
159
+ expect(elapsed).toBeLessThan(1000);
160
+ });
161
+ });
162
+ describe('Non-retryable errors', () => {
163
+ it('should not retry on authentication errors', async () => {
164
+ let callCount = 0;
165
+ vi.mocked(fetch).mockImplementation(async () => {
166
+ callCount++;
167
+ return {
168
+ ok: false,
169
+ status: 401,
170
+ statusText: 'Unauthorized',
171
+ headers: new Headers(),
172
+ json: async () => ({ error: { message: 'Invalid API key' } }),
173
+ };
174
+ });
175
+ const client = new LLMClient({
176
+ baseURL: 'http://localhost:11434/v1',
177
+ model: 'llama3',
178
+ apiKey: 'invalid',
179
+ retries: {
180
+ maxRetries: 3,
181
+ initialDelay: 10,
182
+ maxDelay: 100,
183
+ backoffFactor: 2,
184
+ },
185
+ });
186
+ await expect(client.extract({
187
+ schema,
188
+ input: 'Name: Test',
189
+ })).rejects.toThrow('Invalid API key');
190
+ expect(callCount).toBe(1); // Should not retry
191
+ });
192
+ it('should not retry on invalid response', async () => {
193
+ let callCount = 0;
194
+ vi.mocked(fetch).mockImplementation(async () => {
195
+ callCount++;
196
+ return {
197
+ ok: true,
198
+ json: async () => ({
199
+ id: 'test-id',
200
+ object: 'chat.completion',
201
+ created: Date.now(),
202
+ model: 'test-model',
203
+ choices: [
204
+ {
205
+ index: 0,
206
+ message: {
207
+ role: 'assistant',
208
+ content: 'This is not valid JSON',
209
+ },
210
+ finish_reason: 'stop',
211
+ },
212
+ ],
213
+ }),
214
+ };
215
+ });
216
+ const client = new LLMClient({
217
+ baseURL: 'http://localhost:11434/v1',
218
+ model: 'llama3',
219
+ retries: {
220
+ maxRetries: 3,
221
+ initialDelay: 10,
222
+ maxDelay: 100,
223
+ backoffFactor: 2,
224
+ },
225
+ });
226
+ await expect(client.extract({
227
+ schema,
228
+ input: 'Name: Test',
229
+ })).rejects.toThrow('Failed to parse');
230
+ expect(callCount).toBe(1); // Should not retry
231
+ });
232
+ });
233
+ describe('Exponential backoff', () => {
234
+ it('should use exponential backoff with jitter', async () => {
235
+ const delays = [];
236
+ let callCount = 0;
237
+ // Spy on the sleep method to capture delays
238
+ const sleepSpy = vi.fn(async (ms) => {
239
+ delays.push(ms);
240
+ await new Promise(resolve => setTimeout(resolve, 1)); // Fast forward
241
+ });
242
+ vi.mocked(fetch).mockImplementation(async () => {
243
+ callCount++;
244
+ if (callCount < 4) {
245
+ throw new Error('Network failure');
246
+ }
247
+ return {
248
+ ok: true,
249
+ json: async () => mockSuccessResponse,
250
+ };
251
+ });
252
+ const client = new LLMClient({
253
+ baseURL: 'http://localhost:11434/v1',
254
+ model: 'llama3',
255
+ retries: {
256
+ maxRetries: 3,
257
+ initialDelay: 1000,
258
+ maxDelay: 10000,
259
+ backoffFactor: 2,
260
+ },
261
+ });
262
+ // Replace sleep method
263
+ client.sleep = sleepSpy;
264
+ await client.extract({
265
+ schema,
266
+ input: 'Name: Test',
267
+ });
268
+ // Should have 3 retries (after 1st, 2nd, and 3rd failures)
269
+ expect(delays.length).toBe(3);
270
+ // Check exponential backoff pattern with jitter
271
+ // First retry: ~1000ms (1000 * 2^0)
272
+ expect(delays[0]).toBeGreaterThanOrEqual(1000);
273
+ expect(delays[0]).toBeLessThan(1250);
274
+ // Second retry: ~2000ms (1000 * 2^1)
275
+ expect(delays[1]).toBeGreaterThanOrEqual(2000);
276
+ expect(delays[1]).toBeLessThan(2500);
277
+ // Third retry: ~4000ms (1000 * 2^2)
278
+ expect(delays[2]).toBeGreaterThanOrEqual(4000);
279
+ expect(delays[2]).toBeLessThan(5000);
280
+ });
281
+ it('should cap delay at maxDelay', async () => {
282
+ const delays = [];
283
+ let callCount = 0;
284
+ const sleepSpy = vi.fn(async (ms) => {
285
+ delays.push(ms);
286
+ await new Promise(resolve => setTimeout(resolve, 1));
287
+ });
288
+ vi.mocked(fetch).mockImplementation(async () => {
289
+ callCount++;
290
+ if (callCount < 4) {
291
+ throw new Error('Network failure');
292
+ }
293
+ return {
294
+ ok: true,
295
+ json: async () => mockSuccessResponse,
296
+ };
297
+ });
298
+ const client = new LLMClient({
299
+ baseURL: 'http://localhost:11434/v1',
300
+ model: 'llama3',
301
+ retries: {
302
+ maxRetries: 3,
303
+ initialDelay: 5000,
304
+ maxDelay: 6000,
305
+ backoffFactor: 3,
306
+ },
307
+ });
308
+ client.sleep = sleepSpy;
309
+ await client.extract({
310
+ schema,
311
+ input: 'Name: Test',
312
+ });
313
+ // All delays should be capped at maxDelay (6000ms)
314
+ delays.forEach(delay => {
315
+ expect(delay).toBeLessThanOrEqual(6000);
316
+ });
317
+ });
318
+ });
319
+ describe('Default configuration', () => {
320
+ it('should use default retry config when not specified', async () => {
321
+ let callCount = 0;
322
+ vi.mocked(fetch).mockImplementation(async () => {
323
+ callCount++;
324
+ if (callCount < 3) {
325
+ throw new Error('Network failure');
326
+ }
327
+ return {
328
+ ok: true,
329
+ json: async () => mockSuccessResponse,
330
+ };
331
+ });
332
+ const client = new LLMClient({
333
+ baseURL: 'http://localhost:11434/v1',
334
+ model: 'llama3',
335
+ // No retry config provided - should use defaults
336
+ });
337
+ // Replace sleep to speed up test
338
+ client.sleep = async () => {
339
+ await new Promise(resolve => setTimeout(resolve, 1));
340
+ };
341
+ const result = await client.extract({
342
+ schema,
343
+ input: 'Name: Test',
344
+ });
345
+ expect(result.data.name).toBe('Test');
346
+ expect(callCount).toBe(3);
347
+ });
348
+ });
349
+ });
350
+ //# sourceMappingURL=retry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../../src/llm/__tests__/retry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Token counter tests
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=token-counter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-counter.test.d.ts","sourceRoot":"","sources":["../../../src/llm/__tests__/token-counter.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}