aitelier 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 (97) hide show
  1. package/dist/commands/add.d.ts +3 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +141 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/add.test.d.ts +2 -0
  6. package/dist/commands/add.test.d.ts.map +1 -0
  7. package/dist/commands/add.test.js +203 -0
  8. package/dist/commands/add.test.js.map +1 -0
  9. package/dist/commands/eval.d.ts +3 -0
  10. package/dist/commands/eval.d.ts.map +1 -0
  11. package/dist/commands/eval.js +505 -0
  12. package/dist/commands/eval.js.map +1 -0
  13. package/dist/commands/eval.test.d.ts +2 -0
  14. package/dist/commands/eval.test.d.ts.map +1 -0
  15. package/dist/commands/eval.test.js +804 -0
  16. package/dist/commands/eval.test.js.map +1 -0
  17. package/dist/commands/format.d.ts +3 -0
  18. package/dist/commands/format.d.ts.map +1 -0
  19. package/dist/commands/format.js +198 -0
  20. package/dist/commands/format.js.map +1 -0
  21. package/dist/commands/format.test.d.ts +2 -0
  22. package/dist/commands/format.test.d.ts.map +1 -0
  23. package/dist/commands/format.test.js +568 -0
  24. package/dist/commands/format.test.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +94 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/init.test.d.ts +2 -0
  30. package/dist/commands/init.test.d.ts.map +1 -0
  31. package/dist/commands/init.test.js +123 -0
  32. package/dist/commands/init.test.js.map +1 -0
  33. package/dist/commands/rate.d.ts +3 -0
  34. package/dist/commands/rate.d.ts.map +1 -0
  35. package/dist/commands/rate.js +209 -0
  36. package/dist/commands/rate.js.map +1 -0
  37. package/dist/commands/rate.test.d.ts +2 -0
  38. package/dist/commands/rate.test.d.ts.map +1 -0
  39. package/dist/commands/rate.test.js +393 -0
  40. package/dist/commands/rate.test.js.map +1 -0
  41. package/dist/commands/split.d.ts +3 -0
  42. package/dist/commands/split.d.ts.map +1 -0
  43. package/dist/commands/split.js +210 -0
  44. package/dist/commands/split.js.map +1 -0
  45. package/dist/commands/split.test.d.ts +2 -0
  46. package/dist/commands/split.test.d.ts.map +1 -0
  47. package/dist/commands/split.test.js +503 -0
  48. package/dist/commands/split.test.js.map +1 -0
  49. package/dist/commands/stats.d.ts +3 -0
  50. package/dist/commands/stats.d.ts.map +1 -0
  51. package/dist/commands/stats.js +209 -0
  52. package/dist/commands/stats.js.map +1 -0
  53. package/dist/commands/stats.test.d.ts +2 -0
  54. package/dist/commands/stats.test.d.ts.map +1 -0
  55. package/dist/commands/stats.test.js +476 -0
  56. package/dist/commands/stats.test.js.map +1 -0
  57. package/dist/commands/status.d.ts +3 -0
  58. package/dist/commands/status.d.ts.map +1 -0
  59. package/dist/commands/status.js +132 -0
  60. package/dist/commands/status.js.map +1 -0
  61. package/dist/commands/status.test.d.ts +2 -0
  62. package/dist/commands/status.test.d.ts.map +1 -0
  63. package/dist/commands/status.test.js +443 -0
  64. package/dist/commands/status.test.js.map +1 -0
  65. package/dist/commands/train.d.ts +3 -0
  66. package/dist/commands/train.d.ts.map +1 -0
  67. package/dist/commands/train.js +139 -0
  68. package/dist/commands/train.js.map +1 -0
  69. package/dist/commands/train.test.d.ts +2 -0
  70. package/dist/commands/train.test.d.ts.map +1 -0
  71. package/dist/commands/train.test.js +288 -0
  72. package/dist/commands/train.test.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +27 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/providers/openai.d.ts +9 -0
  78. package/dist/providers/openai.d.ts.map +1 -0
  79. package/dist/providers/openai.js +20 -0
  80. package/dist/providers/openai.js.map +1 -0
  81. package/dist/providers/together.d.ts +11 -0
  82. package/dist/providers/together.d.ts.map +1 -0
  83. package/dist/providers/together.js +118 -0
  84. package/dist/providers/together.js.map +1 -0
  85. package/dist/providers/types.d.ts +28 -0
  86. package/dist/providers/types.d.ts.map +1 -0
  87. package/dist/providers/types.js +2 -0
  88. package/dist/providers/types.js.map +1 -0
  89. package/dist/storage/config.d.ts +24 -0
  90. package/dist/storage/config.d.ts.map +1 -0
  91. package/dist/storage/config.js +11 -0
  92. package/dist/storage/config.js.map +1 -0
  93. package/dist/storage/dataset.d.ts +14 -0
  94. package/dist/storage/dataset.d.ts.map +1 -0
  95. package/dist/storage/dataset.js +18 -0
  96. package/dist/storage/dataset.js.map +1 -0
  97. package/package.json +58 -0
@@ -0,0 +1,503 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { writeFile, readFile, mkdtemp, rm, mkdir } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import inquirer from 'inquirer';
6
+ import { Command } from 'commander';
7
+ import { registerSplit } from './split.js';
8
+ describe('ft split', () => {
9
+ let testDir;
10
+ let originalCwd;
11
+ beforeEach(async () => {
12
+ // Create a temporary directory for each test
13
+ testDir = await mkdtemp(join(tmpdir(), 'ft-split-test-'));
14
+ originalCwd = process.cwd();
15
+ process.chdir(testDir);
16
+ // Create basic project structure
17
+ const config = {
18
+ name: 'test-project',
19
+ provider: 'together',
20
+ model: 'meta-llama/Llama-3.3-70B-Instruct',
21
+ qualityThreshold: 8,
22
+ runs: [],
23
+ };
24
+ await writeFile('.ftpipeline.json', JSON.stringify(config, null, 2));
25
+ await mkdir('data', { recursive: true });
26
+ });
27
+ afterEach(async () => {
28
+ process.chdir(originalCwd);
29
+ await rm(testDir, { recursive: true, force: true });
30
+ vi.restoreAllMocks();
31
+ });
32
+ it('should split examples with 80/20 ratio by default', async () => {
33
+ // Create 10 rated examples above threshold
34
+ const examples = Array.from({ length: 10 }, (_, i) => ({
35
+ id: i + 1,
36
+ messages: [
37
+ { role: 'user', content: `Question ${i + 1}` },
38
+ { role: 'assistant', content: `Answer ${i + 1}` },
39
+ ],
40
+ rating: 8,
41
+ createdAt: new Date().toISOString(),
42
+ version: 1,
43
+ }));
44
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
45
+ const program = new Command();
46
+ registerSplit(program);
47
+ await program.parseAsync(['node', 'test', 'split']);
48
+ // Verify split was assigned
49
+ const content = await readFile('data/examples.jsonl', 'utf-8');
50
+ const updated = content
51
+ .trim()
52
+ .split('\n')
53
+ .map((line) => JSON.parse(line));
54
+ const trainCount = updated.filter((e) => e.split === 'train').length;
55
+ const valCount = updated.filter((e) => e.split === 'val').length;
56
+ expect(trainCount).toBe(8); // 80% of 10
57
+ expect(valCount).toBe(2); // 20% of 10
58
+ expect(trainCount + valCount).toBe(10);
59
+ });
60
+ it('should split with custom --ratio flag', async () => {
61
+ // Create 10 rated examples above threshold
62
+ const examples = Array.from({ length: 10 }, (_, i) => ({
63
+ id: i + 1,
64
+ messages: [
65
+ { role: 'user', content: `Question ${i + 1}` },
66
+ { role: 'assistant', content: `Answer ${i + 1}` },
67
+ ],
68
+ rating: 9,
69
+ createdAt: new Date().toISOString(),
70
+ version: 1,
71
+ }));
72
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
73
+ const program = new Command();
74
+ registerSplit(program);
75
+ await program.parseAsync(['node', 'test', 'split', '--ratio', '0.9']);
76
+ // Verify split was assigned with 90/10 ratio
77
+ const content = await readFile('data/examples.jsonl', 'utf-8');
78
+ const updated = content
79
+ .trim()
80
+ .split('\n')
81
+ .map((line) => JSON.parse(line));
82
+ const trainCount = updated.filter((e) => e.split === 'train').length;
83
+ const valCount = updated.filter((e) => e.split === 'val').length;
84
+ expect(trainCount).toBe(9); // 90% of 10
85
+ expect(valCount).toBe(1); // 10% of 10
86
+ });
87
+ it('should only split examples meeting quality threshold', async () => {
88
+ const examples = [
89
+ {
90
+ id: 1,
91
+ messages: [
92
+ { role: 'user', content: 'Q1' },
93
+ { role: 'assistant', content: 'A1' },
94
+ ],
95
+ rating: 9, // Above threshold
96
+ createdAt: new Date().toISOString(),
97
+ version: 1,
98
+ },
99
+ {
100
+ id: 2,
101
+ messages: [
102
+ { role: 'user', content: 'Q2' },
103
+ { role: 'assistant', content: 'A2' },
104
+ ],
105
+ rating: 5, // Below threshold
106
+ createdAt: new Date().toISOString(),
107
+ version: 1,
108
+ },
109
+ {
110
+ id: 3,
111
+ messages: [
112
+ { role: 'user', content: 'Q3' },
113
+ { role: 'assistant', content: 'A3' },
114
+ ],
115
+ rating: 8, // At threshold
116
+ createdAt: new Date().toISOString(),
117
+ version: 1,
118
+ },
119
+ {
120
+ id: 4,
121
+ messages: [
122
+ { role: 'user', content: 'Q4' },
123
+ { role: 'assistant', content: 'A4' },
124
+ ],
125
+ rating: null, // Unrated
126
+ createdAt: new Date().toISOString(),
127
+ version: 1,
128
+ },
129
+ ];
130
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
131
+ const program = new Command();
132
+ registerSplit(program);
133
+ await program.parseAsync(['node', 'test', 'split']);
134
+ // Verify only examples with rating >= 8 were split
135
+ const content = await readFile('data/examples.jsonl', 'utf-8');
136
+ const updated = content
137
+ .trim()
138
+ .split('\n')
139
+ .map((line) => JSON.parse(line));
140
+ const hasSplit = updated.filter((e) => e.split !== undefined);
141
+ expect(hasSplit.length).toBe(2); // Only ID 1 (rating 9) and ID 3 (rating 8)
142
+ const belowThreshold = updated.find((e) => e.id === 2);
143
+ expect(belowThreshold.split).toBeUndefined();
144
+ const unrated = updated.find((e) => e.id === 4);
145
+ expect(unrated.split).toBeUndefined();
146
+ });
147
+ it('should lock validation set on second split', async () => {
148
+ // First split: Create examples with existing split assignments
149
+ const examples = [
150
+ {
151
+ id: 1,
152
+ messages: [
153
+ { role: 'user', content: 'Q1' },
154
+ { role: 'assistant', content: 'A1' },
155
+ ],
156
+ rating: 9,
157
+ split: 'val', // Existing validation example
158
+ createdAt: new Date().toISOString(),
159
+ version: 1,
160
+ },
161
+ {
162
+ id: 2,
163
+ messages: [
164
+ { role: 'user', content: 'Q2' },
165
+ { role: 'assistant', content: 'A2' },
166
+ ],
167
+ rating: 8,
168
+ split: 'train', // Existing train example
169
+ createdAt: new Date().toISOString(),
170
+ version: 1,
171
+ },
172
+ {
173
+ id: 3,
174
+ messages: [
175
+ { role: 'user', content: 'Q3' },
176
+ { role: 'assistant', content: 'A3' },
177
+ ],
178
+ rating: 9, // New example without split
179
+ createdAt: new Date().toISOString(),
180
+ version: 1,
181
+ },
182
+ ];
183
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
184
+ const program = new Command();
185
+ registerSplit(program);
186
+ await program.parseAsync(['node', 'test', 'split']);
187
+ // Verify validation example remained locked
188
+ const content = await readFile('data/examples.jsonl', 'utf-8');
189
+ const updated = content
190
+ .trim()
191
+ .split('\n')
192
+ .map((line) => JSON.parse(line));
193
+ const val1 = updated.find((e) => e.id === 1);
194
+ expect(val1.split).toBe('val'); // Should still be val (locked)
195
+ const train2 = updated.find((e) => e.id === 2);
196
+ // ID 2 can be reassigned since it was train
197
+ expect(train2.split).toBeDefined();
198
+ const new3 = updated.find((e) => e.id === 3);
199
+ expect(new3.split).toBeDefined(); // Should be assigned
200
+ });
201
+ it('should reshuffle with --reshuffle flag and confirmation', async () => {
202
+ // Create examples with existing split
203
+ const examples = Array.from({ length: 5 }, (_, i) => ({
204
+ id: i + 1,
205
+ messages: [
206
+ { role: 'user', content: `Question ${i + 1}` },
207
+ { role: 'assistant', content: `Answer ${i + 1}` },
208
+ ],
209
+ rating: 8,
210
+ split: i < 1 ? 'val' : 'train',
211
+ createdAt: new Date().toISOString(),
212
+ version: 1,
213
+ }));
214
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
215
+ // Mock user confirming reshuffle
216
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({ confirm: true });
217
+ const program = new Command();
218
+ registerSplit(program);
219
+ await program.parseAsync(['node', 'test', 'split', '--reshuffle']);
220
+ // Verify all examples were reshuffled
221
+ const content = await readFile('data/examples.jsonl', 'utf-8');
222
+ const updated = content
223
+ .trim()
224
+ .split('\n')
225
+ .map((line) => JSON.parse(line));
226
+ const trainCount = updated.filter((e) => e.split === 'train').length;
227
+ const valCount = updated.filter((e) => e.split === 'val').length;
228
+ expect(trainCount + valCount).toBe(5);
229
+ // The first example might not be 'val' anymore after reshuffle
230
+ });
231
+ it('should cancel split when reshuffle is not confirmed', async () => {
232
+ // Create examples with existing split
233
+ const examples = [
234
+ {
235
+ id: 1,
236
+ messages: [
237
+ { role: 'user', content: 'Q1' },
238
+ { role: 'assistant', content: 'A1' },
239
+ ],
240
+ rating: 8,
241
+ split: 'val',
242
+ createdAt: new Date().toISOString(),
243
+ version: 1,
244
+ },
245
+ {
246
+ id: 2,
247
+ messages: [
248
+ { role: 'user', content: 'Q2' },
249
+ { role: 'assistant', content: 'A2' },
250
+ ],
251
+ rating: 9,
252
+ split: 'train',
253
+ createdAt: new Date().toISOString(),
254
+ version: 1,
255
+ },
256
+ ];
257
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
258
+ // Mock user rejecting reshuffle
259
+ vi.spyOn(inquirer, 'prompt').mockResolvedValueOnce({ confirm: false });
260
+ const consoleLogSpy = vi.spyOn(console, 'log');
261
+ const program = new Command();
262
+ registerSplit(program);
263
+ await program.parseAsync(['node', 'test', 'split', '--reshuffle']);
264
+ // Verify split was cancelled
265
+ expect(consoleLogSpy).toHaveBeenCalledWith('Split cancelled.');
266
+ // Verify examples were not modified
267
+ const content = await readFile('data/examples.jsonl', 'utf-8');
268
+ const updated = content
269
+ .trim()
270
+ .split('\n')
271
+ .map((line) => JSON.parse(line));
272
+ const val = updated.find((e) => e.id === 1);
273
+ expect(val.split).toBe('val');
274
+ const train = updated.find((e) => e.id === 2);
275
+ expect(train.split).toBe('train');
276
+ });
277
+ it('should proceed with initial split when --reshuffle used but no existing split', async () => {
278
+ // Create examples without splits
279
+ const examples = Array.from({ length: 5 }, (_, i) => ({
280
+ id: i + 1,
281
+ messages: [
282
+ { role: 'user', content: `Question ${i + 1}` },
283
+ { role: 'assistant', content: `Answer ${i + 1}` },
284
+ ],
285
+ rating: 8,
286
+ createdAt: new Date().toISOString(),
287
+ version: 1,
288
+ }));
289
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
290
+ const consoleLogSpy = vi.spyOn(console, 'log');
291
+ const program = new Command();
292
+ registerSplit(program);
293
+ await program.parseAsync(['node', 'test', 'split', '--reshuffle']);
294
+ // Should not prompt for confirmation
295
+ expect(consoleLogSpy).toHaveBeenCalledWith('No existing split found. Proceeding with initial split.');
296
+ // Verify split was performed
297
+ const content = await readFile('data/examples.jsonl', 'utf-8');
298
+ const updated = content
299
+ .trim()
300
+ .split('\n')
301
+ .map((line) => JSON.parse(line));
302
+ const withSplit = updated.filter((e) => e.split !== undefined);
303
+ expect(withSplit.length).toBe(5);
304
+ });
305
+ it('should display message when no examples exist', async () => {
306
+ await writeFile('data/examples.jsonl', '');
307
+ const consoleLogSpy = vi.spyOn(console, 'log');
308
+ const program = new Command();
309
+ registerSplit(program);
310
+ await program.parseAsync(['node', 'test', 'split']);
311
+ expect(consoleLogSpy).toHaveBeenCalledWith('No examples found. Add examples with `ft add` first.');
312
+ });
313
+ it('should display message when no examples meet threshold', async () => {
314
+ const examples = [
315
+ {
316
+ id: 1,
317
+ messages: [
318
+ { role: 'user', content: 'Q1' },
319
+ { role: 'assistant', content: 'A1' },
320
+ ],
321
+ rating: 5, // Below threshold
322
+ createdAt: new Date().toISOString(),
323
+ version: 1,
324
+ },
325
+ {
326
+ id: 2,
327
+ messages: [
328
+ { role: 'user', content: 'Q2' },
329
+ { role: 'assistant', content: 'A2' },
330
+ ],
331
+ rating: null, // Unrated
332
+ createdAt: new Date().toISOString(),
333
+ version: 1,
334
+ },
335
+ ];
336
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
337
+ const consoleLogSpy = vi.spyOn(console, 'log');
338
+ const program = new Command();
339
+ registerSplit(program);
340
+ await program.parseAsync(['node', 'test', 'split']);
341
+ expect(consoleLogSpy).toHaveBeenCalledWith('No examples meet quality threshold (8/10). Rate examples with `ft rate` first.');
342
+ });
343
+ it('should fail if project is not initialized', async () => {
344
+ await rm('.ftpipeline.json');
345
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
346
+ throw new Error('process.exit called');
347
+ });
348
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
349
+ const program = new Command();
350
+ registerSplit(program);
351
+ await expect(program.parseAsync(['node', 'test', 'split'])).rejects.toThrow('process.exit called');
352
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Project not initialized'));
353
+ expect(mockExit).toHaveBeenCalledWith(1);
354
+ });
355
+ it('should validate --ratio flag', async () => {
356
+ await writeFile('data/examples.jsonl', '');
357
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
358
+ throw new Error('process.exit called');
359
+ });
360
+ const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
361
+ const program = new Command();
362
+ registerSplit(program);
363
+ await expect(program.parseAsync(['node', 'test', 'split', '--ratio', '1.5'])).rejects.toThrow('process.exit called');
364
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('--ratio must be a number between 0 and 1'));
365
+ expect(mockExit).toHaveBeenCalledWith(1);
366
+ });
367
+ it('should ensure at least 1 validation example', async () => {
368
+ // Create only 2 examples with high train ratio
369
+ const examples = [
370
+ {
371
+ id: 1,
372
+ messages: [
373
+ { role: 'user', content: 'Q1' },
374
+ { role: 'assistant', content: 'A1' },
375
+ ],
376
+ rating: 8,
377
+ createdAt: new Date().toISOString(),
378
+ version: 1,
379
+ },
380
+ {
381
+ id: 2,
382
+ messages: [
383
+ { role: 'user', content: 'Q2' },
384
+ { role: 'assistant', content: 'A2' },
385
+ ],
386
+ rating: 9,
387
+ createdAt: new Date().toISOString(),
388
+ version: 1,
389
+ },
390
+ ];
391
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
392
+ const program = new Command();
393
+ registerSplit(program);
394
+ await program.parseAsync(['node', 'test', 'split', '--ratio', '0.99']);
395
+ // Verify at least 1 validation example exists
396
+ const content = await readFile('data/examples.jsonl', 'utf-8');
397
+ const updated = content
398
+ .trim()
399
+ .split('\n')
400
+ .map((line) => JSON.parse(line));
401
+ const valCount = updated.filter((e) => e.split === 'val').length;
402
+ expect(valCount).toBeGreaterThanOrEqual(1);
403
+ });
404
+ it('should perform stratified sampling by rating', async () => {
405
+ // Create examples with varying ratings
406
+ const examples = [
407
+ ...Array.from({ length: 10 }, (_, i) => ({
408
+ id: i + 1,
409
+ messages: [
410
+ { role: 'user', content: `Q${i + 1}` },
411
+ { role: 'assistant', content: `A${i + 1}` },
412
+ ],
413
+ rating: 8,
414
+ createdAt: new Date().toISOString(),
415
+ version: 1,
416
+ })),
417
+ ...Array.from({ length: 10 }, (_, i) => ({
418
+ id: i + 11,
419
+ messages: [
420
+ { role: 'user', content: `Q${i + 11}` },
421
+ { role: 'assistant', content: `A${i + 11}` },
422
+ ],
423
+ rating: 9,
424
+ createdAt: new Date().toISOString(),
425
+ version: 1,
426
+ })),
427
+ ...Array.from({ length: 10 }, (_, i) => ({
428
+ id: i + 21,
429
+ messages: [
430
+ { role: 'user', content: `Q${i + 21}` },
431
+ { role: 'assistant', content: `A${i + 21}` },
432
+ ],
433
+ rating: 10,
434
+ createdAt: new Date().toISOString(),
435
+ version: 1,
436
+ })),
437
+ ];
438
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
439
+ const program = new Command();
440
+ registerSplit(program);
441
+ await program.parseAsync(['node', 'test', 'split']);
442
+ // Verify split was performed
443
+ const content = await readFile('data/examples.jsonl', 'utf-8');
444
+ const updated = content
445
+ .trim()
446
+ .split('\n')
447
+ .map((line) => JSON.parse(line));
448
+ // Check that each rating group has representation in both train and val
449
+ const valExamples = updated.filter((e) => e.split === 'val');
450
+ const trainExamples = updated.filter((e) => e.split === 'train');
451
+ // With 30 examples and 80/20 split, we expect ~6 val and ~24 train
452
+ expect(valExamples.length).toBeGreaterThan(0);
453
+ expect(trainExamples.length).toBeGreaterThan(0);
454
+ // Verify ratings are represented in both sets (stratification)
455
+ const valRatings = new Set(valExamples.map((e) => e.rating));
456
+ const trainRatings = new Set(trainExamples.map((e) => e.rating));
457
+ // With enough examples, both should have multiple rating levels
458
+ expect(valRatings.size).toBeGreaterThan(0);
459
+ expect(trainRatings.size).toBeGreaterThan(0);
460
+ });
461
+ it('should handle examples with system messages', async () => {
462
+ const examples = [
463
+ {
464
+ id: 1,
465
+ messages: [
466
+ { role: 'system', content: 'You are a helpful assistant.' },
467
+ { role: 'user', content: 'Q1' },
468
+ { role: 'assistant', content: 'A1' },
469
+ ],
470
+ rating: 9,
471
+ createdAt: new Date().toISOString(),
472
+ version: 1,
473
+ },
474
+ {
475
+ id: 2,
476
+ messages: [
477
+ { role: 'system', content: 'You are a helpful assistant.' },
478
+ { role: 'user', content: 'Q2' },
479
+ { role: 'assistant', content: 'A2' },
480
+ ],
481
+ rating: 8,
482
+ createdAt: new Date().toISOString(),
483
+ version: 1,
484
+ },
485
+ ];
486
+ await writeFile('data/examples.jsonl', examples.map((e) => JSON.stringify(e)).join('\n') + '\n');
487
+ const program = new Command();
488
+ registerSplit(program);
489
+ await program.parseAsync(['node', 'test', 'split']);
490
+ // Verify split was assigned and messages preserved
491
+ const content = await readFile('data/examples.jsonl', 'utf-8');
492
+ const updated = content
493
+ .trim()
494
+ .split('\n')
495
+ .map((line) => JSON.parse(line));
496
+ for (const example of updated) {
497
+ expect(example.split).toBeDefined();
498
+ expect(example.messages).toHaveLength(3);
499
+ expect(example.messages[0].role).toBe('system');
500
+ }
501
+ });
502
+ });
503
+ //# sourceMappingURL=split.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../src/commands/split.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerStats(program: Command): void;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBzC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAYpD"}