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,94 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { mkdir, writeFile, access } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { saveConfig } from '../storage/config.js';
|
|
5
|
+
const CONFIG_FILE = '.ftpipeline.json';
|
|
6
|
+
const DEFAULT_MODELS = {
|
|
7
|
+
together: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
8
|
+
openai: 'gpt-4o-mini-2024-07-18',
|
|
9
|
+
};
|
|
10
|
+
export function registerInit(program) {
|
|
11
|
+
program
|
|
12
|
+
.command('init')
|
|
13
|
+
.description('Initialize a new fine-tuning project')
|
|
14
|
+
.action(async () => {
|
|
15
|
+
try {
|
|
16
|
+
await initCommand();
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async function initCommand() {
|
|
25
|
+
const cwd = process.cwd();
|
|
26
|
+
// Check if project is already initialized
|
|
27
|
+
try {
|
|
28
|
+
await access(join(cwd, CONFIG_FILE));
|
|
29
|
+
throw new Error('Project already initialized. .ftpipeline.json already exists.');
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// File doesn't exist, continue with init
|
|
33
|
+
if (error.code !== 'ENOENT') {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Interactive prompts
|
|
38
|
+
const answers = await inquirer.prompt([
|
|
39
|
+
{
|
|
40
|
+
type: 'input',
|
|
41
|
+
name: 'name',
|
|
42
|
+
message: 'Project name:',
|
|
43
|
+
validate: (input) => {
|
|
44
|
+
if (!input.trim()) {
|
|
45
|
+
return 'Project name is required';
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
type: 'list',
|
|
52
|
+
name: 'provider',
|
|
53
|
+
message: 'Choose a provider:',
|
|
54
|
+
choices: [
|
|
55
|
+
{ name: 'Together.ai', value: 'together' },
|
|
56
|
+
{ name: 'OpenAI', value: 'openai' },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'input',
|
|
61
|
+
name: 'model',
|
|
62
|
+
message: 'Base model:',
|
|
63
|
+
default: (answers) => DEFAULT_MODELS[answers.provider],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
type: 'input',
|
|
67
|
+
name: 'systemPrompt',
|
|
68
|
+
message: 'System prompt (optional, press Enter to skip):',
|
|
69
|
+
default: '',
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
// Create config
|
|
73
|
+
const config = {
|
|
74
|
+
name: answers.name.trim(),
|
|
75
|
+
provider: answers.provider,
|
|
76
|
+
model: answers.model,
|
|
77
|
+
systemPrompt: answers.systemPrompt || undefined,
|
|
78
|
+
qualityThreshold: 8,
|
|
79
|
+
runs: [],
|
|
80
|
+
};
|
|
81
|
+
// Save config file
|
|
82
|
+
await saveConfig(config, cwd);
|
|
83
|
+
console.log('✓ Created .ftpipeline.json');
|
|
84
|
+
// Create data directory structure
|
|
85
|
+
const dataDir = join(cwd, 'data');
|
|
86
|
+
const evalsDir = join(dataDir, 'evals');
|
|
87
|
+
await mkdir(evalsDir, { recursive: true });
|
|
88
|
+
await writeFile(join(dataDir, 'examples.jsonl'), '');
|
|
89
|
+
await writeFile(join(dataDir, 'train.jsonl'), '');
|
|
90
|
+
await writeFile(join(dataDir, 'val.jsonl'), '');
|
|
91
|
+
console.log('✓ Created data/ directory');
|
|
92
|
+
console.log('✓ Ready to add training examples with `ft add`');
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { writeFile, access, readFile, mkdtemp, rm } 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 { registerInit } from './init.js';
|
|
8
|
+
describe('ft init', () => {
|
|
9
|
+
let testDir;
|
|
10
|
+
let originalCwd;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
// Create a temporary directory for each test
|
|
13
|
+
testDir = await mkdtemp(join(tmpdir(), 'ft-init-test-'));
|
|
14
|
+
originalCwd = process.cwd();
|
|
15
|
+
process.chdir(testDir);
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
process.chdir(originalCwd);
|
|
19
|
+
await rm(testDir, { recursive: true, force: true });
|
|
20
|
+
vi.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it('should initialize a new project with valid inputs', async () => {
|
|
23
|
+
// Mock inquirer prompts
|
|
24
|
+
vi.spyOn(inquirer, 'prompt').mockResolvedValue({
|
|
25
|
+
name: 'my-support-bot',
|
|
26
|
+
provider: 'together',
|
|
27
|
+
model: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
28
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
29
|
+
});
|
|
30
|
+
const program = new Command();
|
|
31
|
+
registerInit(program);
|
|
32
|
+
await program.parseAsync(['node', 'test', 'init']);
|
|
33
|
+
// Verify config file was created
|
|
34
|
+
const configPath = join(testDir, '.ftpipeline.json');
|
|
35
|
+
const configContent = await readFile(configPath, 'utf-8');
|
|
36
|
+
const config = JSON.parse(configContent);
|
|
37
|
+
expect(config).toEqual({
|
|
38
|
+
name: 'my-support-bot',
|
|
39
|
+
provider: 'together',
|
|
40
|
+
model: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
41
|
+
systemPrompt: 'You are a helpful assistant.',
|
|
42
|
+
qualityThreshold: 8,
|
|
43
|
+
runs: [],
|
|
44
|
+
});
|
|
45
|
+
// Verify data directory structure
|
|
46
|
+
const dataDir = join(testDir, 'data');
|
|
47
|
+
await access(dataDir);
|
|
48
|
+
await access(join(dataDir, 'examples.jsonl'));
|
|
49
|
+
await access(join(dataDir, 'train.jsonl'));
|
|
50
|
+
await access(join(dataDir, 'val.jsonl'));
|
|
51
|
+
await access(join(dataDir, 'evals'));
|
|
52
|
+
});
|
|
53
|
+
it('should initialize with OpenAI provider and default model', async () => {
|
|
54
|
+
vi.spyOn(inquirer, 'prompt').mockResolvedValue({
|
|
55
|
+
name: 'openai-project',
|
|
56
|
+
provider: 'openai',
|
|
57
|
+
model: 'gpt-4o-mini-2024-07-18',
|
|
58
|
+
systemPrompt: '',
|
|
59
|
+
});
|
|
60
|
+
const program = new Command();
|
|
61
|
+
registerInit(program);
|
|
62
|
+
await program.parseAsync(['node', 'test', 'init']);
|
|
63
|
+
const configPath = join(testDir, '.ftpipeline.json');
|
|
64
|
+
const configContent = await readFile(configPath, 'utf-8');
|
|
65
|
+
const config = JSON.parse(configContent);
|
|
66
|
+
expect(config.provider).toBe('openai');
|
|
67
|
+
expect(config.model).toBe('gpt-4o-mini-2024-07-18');
|
|
68
|
+
expect(config.systemPrompt).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
it('should fail if project is already initialized', async () => {
|
|
71
|
+
// Create an existing config file
|
|
72
|
+
await writeFile(join(testDir, '.ftpipeline.json'), '{}');
|
|
73
|
+
vi.spyOn(inquirer, 'prompt').mockResolvedValue({
|
|
74
|
+
name: 'test-project',
|
|
75
|
+
provider: 'together',
|
|
76
|
+
model: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
77
|
+
systemPrompt: '',
|
|
78
|
+
});
|
|
79
|
+
const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
80
|
+
throw new Error('process.exit called');
|
|
81
|
+
});
|
|
82
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
83
|
+
const program = new Command();
|
|
84
|
+
registerInit(program);
|
|
85
|
+
await expect(program.parseAsync(['node', 'test', 'init'])).rejects.toThrow('process.exit called');
|
|
86
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Project already initialized'));
|
|
87
|
+
expect(mockExit).toHaveBeenCalledWith(1);
|
|
88
|
+
});
|
|
89
|
+
it('should trim whitespace from project name', async () => {
|
|
90
|
+
vi.spyOn(inquirer, 'prompt').mockResolvedValue({
|
|
91
|
+
name: ' spaced-project ',
|
|
92
|
+
provider: 'together',
|
|
93
|
+
model: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
94
|
+
systemPrompt: '',
|
|
95
|
+
});
|
|
96
|
+
const program = new Command();
|
|
97
|
+
registerInit(program);
|
|
98
|
+
await program.parseAsync(['node', 'test', 'init']);
|
|
99
|
+
const configPath = join(testDir, '.ftpipeline.json');
|
|
100
|
+
const configContent = await readFile(configPath, 'utf-8');
|
|
101
|
+
const config = JSON.parse(configContent);
|
|
102
|
+
expect(config.name).toBe('spaced-project');
|
|
103
|
+
});
|
|
104
|
+
it('should create empty JSONL files in data directory', async () => {
|
|
105
|
+
vi.spyOn(inquirer, 'prompt').mockResolvedValue({
|
|
106
|
+
name: 'test-project',
|
|
107
|
+
provider: 'together',
|
|
108
|
+
model: 'meta-llama/Llama-3.3-70B-Instruct',
|
|
109
|
+
systemPrompt: '',
|
|
110
|
+
});
|
|
111
|
+
const program = new Command();
|
|
112
|
+
registerInit(program);
|
|
113
|
+
await program.parseAsync(['node', 'test', 'init']);
|
|
114
|
+
// Verify JSONL files are empty
|
|
115
|
+
const examplesContent = await readFile(join(testDir, 'data', 'examples.jsonl'), 'utf-8');
|
|
116
|
+
const trainContent = await readFile(join(testDir, 'data', 'train.jsonl'), 'utf-8');
|
|
117
|
+
const valContent = await readFile(join(testDir, 'data', 'val.jsonl'), 'utf-8');
|
|
118
|
+
expect(examplesContent).toBe('');
|
|
119
|
+
expect(trainContent).toBe('');
|
|
120
|
+
expect(valContent).toBe('');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../src/commands/init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.d.ts","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiBnD"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { access } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { readExamples, writeExamples } from '../storage/dataset.js';
|
|
5
|
+
const CONFIG_FILE = '.ftpipeline.json';
|
|
6
|
+
const EXAMPLES_FILE = 'data/examples.jsonl';
|
|
7
|
+
export function registerRate(program) {
|
|
8
|
+
program
|
|
9
|
+
.command('rate')
|
|
10
|
+
.description('Rate and optionally rewrite training examples')
|
|
11
|
+
.option('--min <rating>', 'Minimum rating threshold (show unrated + examples below threshold)', '0')
|
|
12
|
+
.action(async (options) => {
|
|
13
|
+
try {
|
|
14
|
+
await rateCommand(options);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function rateCommand(options) {
|
|
23
|
+
const cwd = process.cwd();
|
|
24
|
+
// Check if project is initialized
|
|
25
|
+
try {
|
|
26
|
+
await access(join(cwd, CONFIG_FILE));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new Error('Project not initialized. Run `ft init` first to create .ftpipeline.json');
|
|
30
|
+
}
|
|
31
|
+
// Parse and validate --min flag
|
|
32
|
+
const minRating = parseFloat(options.min);
|
|
33
|
+
if (isNaN(minRating) || minRating < 0 || minRating > 10) {
|
|
34
|
+
throw new Error('--min must be a number between 0 and 10');
|
|
35
|
+
}
|
|
36
|
+
// Load all examples
|
|
37
|
+
const examplesPath = join(cwd, EXAMPLES_FILE);
|
|
38
|
+
let examples;
|
|
39
|
+
try {
|
|
40
|
+
examples = await readExamples(examplesPath);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error.code === 'ENOENT') {
|
|
44
|
+
console.log('No examples found. Add examples with `ft add` first.');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
// Check if file has any examples
|
|
50
|
+
if (examples.length === 0) {
|
|
51
|
+
console.log('No examples found. Add examples with `ft add` first.');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Filter examples to rate
|
|
55
|
+
const toRate = filterExamples(examples, minRating);
|
|
56
|
+
if (toRate.length === 0) {
|
|
57
|
+
if (minRating === 0) {
|
|
58
|
+
console.log('No unrated examples found. All examples have been rated.');
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.log(`No examples to rate. All examples are rated ${minRating} or higher.`);
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Initialize session stats
|
|
66
|
+
const stats = {
|
|
67
|
+
shown: 0,
|
|
68
|
+
rated: 0,
|
|
69
|
+
rewritten: 0,
|
|
70
|
+
skipped: 0,
|
|
71
|
+
ratings: [],
|
|
72
|
+
};
|
|
73
|
+
// Main rating loop
|
|
74
|
+
for (const example of toRate) {
|
|
75
|
+
stats.shown++;
|
|
76
|
+
displayExample(example);
|
|
77
|
+
const action = await promptAction();
|
|
78
|
+
if (action === 'quit') {
|
|
79
|
+
console.log('\nQuitting...');
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
if (action === 'skip') {
|
|
83
|
+
stats.skipped++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (action === 'rate') {
|
|
87
|
+
const rating = await promptRating();
|
|
88
|
+
example.rating = rating;
|
|
89
|
+
stats.rated++;
|
|
90
|
+
stats.ratings.push(rating);
|
|
91
|
+
console.log(`✓ Rated as ${rating}/10\n`);
|
|
92
|
+
}
|
|
93
|
+
if (action === 'rewrite') {
|
|
94
|
+
const assistantMsg = example.messages.find((m) => m.role === 'assistant');
|
|
95
|
+
if (!assistantMsg) {
|
|
96
|
+
console.log('No assistant message found in this example. Skipping rewrite.\n');
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const newOutput = await promptRewrite(assistantMsg.content);
|
|
100
|
+
// Save original output on first rewrite only
|
|
101
|
+
if (!example.originalOutput) {
|
|
102
|
+
example.originalOutput = assistantMsg.content;
|
|
103
|
+
}
|
|
104
|
+
// Update assistant message
|
|
105
|
+
assistantMsg.content = newOutput;
|
|
106
|
+
stats.rewritten++;
|
|
107
|
+
// Prompt for rating after rewrite
|
|
108
|
+
const rating = await promptRating();
|
|
109
|
+
example.rating = rating;
|
|
110
|
+
stats.rated++;
|
|
111
|
+
stats.ratings.push(rating);
|
|
112
|
+
console.log(`✓ Rewritten and rated as ${rating}/10\n`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Write all changes back to file
|
|
116
|
+
await writeExamples(examplesPath, examples);
|
|
117
|
+
// Display session summary
|
|
118
|
+
displaySummary(stats);
|
|
119
|
+
}
|
|
120
|
+
function filterExamples(examples, minRating) {
|
|
121
|
+
return examples
|
|
122
|
+
.filter((e) => e.rating === null || e.rating < minRating)
|
|
123
|
+
.sort((a, b) => a.id - b.id);
|
|
124
|
+
}
|
|
125
|
+
function displayExample(example) {
|
|
126
|
+
console.log(`\nExample #${example.id}`);
|
|
127
|
+
console.log('━'.repeat(70));
|
|
128
|
+
for (const msg of example.messages) {
|
|
129
|
+
const label = msg.role.charAt(0).toUpperCase() + msg.role.slice(1);
|
|
130
|
+
console.log(`${label}: ${msg.content}`);
|
|
131
|
+
}
|
|
132
|
+
console.log('━'.repeat(70));
|
|
133
|
+
const ratingText = example.rating === null ? 'unrated' : `${example.rating}/10`;
|
|
134
|
+
console.log(`Current rating: ${ratingText}`);
|
|
135
|
+
if (example.originalOutput) {
|
|
136
|
+
console.log('(This example has been rewritten)');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function promptAction() {
|
|
140
|
+
const answer = await inquirer.prompt([
|
|
141
|
+
{
|
|
142
|
+
type: 'list',
|
|
143
|
+
name: 'action',
|
|
144
|
+
message: 'What would you like to do?',
|
|
145
|
+
choices: [
|
|
146
|
+
{ name: 'Rate this example', value: 'rate' },
|
|
147
|
+
{ name: 'Rewrite assistant output', value: 'rewrite' },
|
|
148
|
+
{ name: 'Skip', value: 'skip' },
|
|
149
|
+
{ name: 'Quit', value: 'quit' },
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
]);
|
|
153
|
+
return answer.action;
|
|
154
|
+
}
|
|
155
|
+
async function promptRating() {
|
|
156
|
+
const answer = await inquirer.prompt([
|
|
157
|
+
{
|
|
158
|
+
type: 'input',
|
|
159
|
+
name: 'rating',
|
|
160
|
+
message: 'Rate this example (1-10):',
|
|
161
|
+
validate: (input) => {
|
|
162
|
+
const num = parseFloat(input);
|
|
163
|
+
if (isNaN(num)) {
|
|
164
|
+
return 'Please enter a valid number';
|
|
165
|
+
}
|
|
166
|
+
if (num < 1 || num > 10) {
|
|
167
|
+
return 'Rating must be between 1 and 10';
|
|
168
|
+
}
|
|
169
|
+
if (!Number.isInteger(num)) {
|
|
170
|
+
return 'Rating must be a whole number';
|
|
171
|
+
}
|
|
172
|
+
return true;
|
|
173
|
+
},
|
|
174
|
+
},
|
|
175
|
+
]);
|
|
176
|
+
return parseInt(answer.rating, 10);
|
|
177
|
+
}
|
|
178
|
+
async function promptRewrite(currentOutput) {
|
|
179
|
+
const answer = await inquirer.prompt([
|
|
180
|
+
{
|
|
181
|
+
type: 'editor',
|
|
182
|
+
name: 'output',
|
|
183
|
+
message: 'Edit the assistant output:',
|
|
184
|
+
default: currentOutput,
|
|
185
|
+
validate: (input) => {
|
|
186
|
+
if (!input.trim()) {
|
|
187
|
+
return 'Output cannot be empty';
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
]);
|
|
193
|
+
return answer.output.trim();
|
|
194
|
+
}
|
|
195
|
+
function displaySummary(stats) {
|
|
196
|
+
console.log('\n' + '═'.repeat(70));
|
|
197
|
+
console.log('Rating Session Complete');
|
|
198
|
+
console.log('═'.repeat(70));
|
|
199
|
+
console.log(`Examples shown: ${stats.shown}`);
|
|
200
|
+
console.log(`Rated: ${stats.rated}`);
|
|
201
|
+
console.log(`Rewritten: ${stats.rewritten}`);
|
|
202
|
+
console.log(`Skipped: ${stats.skipped}`);
|
|
203
|
+
if (stats.ratings.length > 0) {
|
|
204
|
+
const avg = stats.ratings.reduce((sum, r) => sum + r, 0) / stats.ratings.length;
|
|
205
|
+
console.log(`Average rating: ${avg.toFixed(1)}/10`);
|
|
206
|
+
}
|
|
207
|
+
console.log('═'.repeat(70));
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=rate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.js","sourceRoot":"","sources":["../../src/commands/rate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate.test.d.ts","sourceRoot":"","sources":["../../src/commands/rate.test.ts"],"names":[],"mappings":""}
|