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.
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +141 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/add.test.d.ts +2 -0
- package/dist/commands/add.test.d.ts.map +1 -0
- package/dist/commands/add.test.js +203 -0
- package/dist/commands/add.test.js.map +1 -0
- package/dist/commands/eval.d.ts +3 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +505 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/eval.test.d.ts +2 -0
- package/dist/commands/eval.test.d.ts.map +1 -0
- package/dist/commands/eval.test.js +804 -0
- package/dist/commands/eval.test.js.map +1 -0
- package/dist/commands/format.d.ts +3 -0
- package/dist/commands/format.d.ts.map +1 -0
- package/dist/commands/format.js +198 -0
- package/dist/commands/format.js.map +1 -0
- package/dist/commands/format.test.d.ts +2 -0
- package/dist/commands/format.test.d.ts.map +1 -0
- package/dist/commands/format.test.js +568 -0
- package/dist/commands/format.test.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +123 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/rate.d.ts +3 -0
- package/dist/commands/rate.d.ts.map +1 -0
- package/dist/commands/rate.js +209 -0
- package/dist/commands/rate.js.map +1 -0
- package/dist/commands/rate.test.d.ts +2 -0
- package/dist/commands/rate.test.d.ts.map +1 -0
- package/dist/commands/rate.test.js +393 -0
- package/dist/commands/rate.test.js.map +1 -0
- package/dist/commands/split.d.ts +3 -0
- package/dist/commands/split.d.ts.map +1 -0
- package/dist/commands/split.js +210 -0
- package/dist/commands/split.js.map +1 -0
- package/dist/commands/split.test.d.ts +2 -0
- package/dist/commands/split.test.d.ts.map +1 -0
- package/dist/commands/split.test.js +503 -0
- package/dist/commands/split.test.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +209 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/stats.test.d.ts +2 -0
- package/dist/commands/stats.test.d.ts.map +1 -0
- package/dist/commands/stats.test.js +476 -0
- package/dist/commands/stats.test.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +132 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.test.d.ts +2 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +443 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/commands/train.d.ts +3 -0
- package/dist/commands/train.d.ts.map +1 -0
- package/dist/commands/train.js +139 -0
- package/dist/commands/train.js.map +1 -0
- package/dist/commands/train.test.d.ts +2 -0
- package/dist/commands/train.test.d.ts.map +1 -0
- package/dist/commands/train.test.js +288 -0
- package/dist/commands/train.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/openai.d.ts +9 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +20 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/together.d.ts +11 -0
- package/dist/providers/together.d.ts.map +1 -0
- package/dist/providers/together.js +118 -0
- package/dist/providers/together.js.map +1 -0
- package/dist/providers/types.d.ts +28 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/storage/config.d.ts +24 -0
- package/dist/storage/config.d.ts.map +1 -0
- package/dist/storage/config.js +11 -0
- package/dist/storage/config.js.map +1 -0
- package/dist/storage/dataset.d.ts +14 -0
- package/dist/storage/dataset.d.ts.map +1 -0
- package/dist/storage/dataset.js +18 -0
- package/dist/storage/dataset.js.map +1 -0
- 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 @@
|
|
|
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"}
|