intentiai 0.1.0 → 0.1.1
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/commands/deploy.js +9 -8
- package/commands/intent.js +11 -10
- package/commands/project.js +30 -27
- package/commands/prompt.js +11 -11
- package/commands/route.js +11 -11
- package/commands/test.js +8 -6
- package/commands/train.js +7 -7
- package/lib/api.js +131 -12
- package/package.json +1 -1
package/commands/deploy.js
CHANGED
|
@@ -4,13 +4,13 @@ const api = require('../lib/api');
|
|
|
4
4
|
const config = require('../lib/config');
|
|
5
5
|
|
|
6
6
|
function requireProject() {
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
7
|
+
const currentProject = config.getCurrentProject();
|
|
8
|
+
if (!currentProject || !currentProject.id) {
|
|
9
9
|
console.error(chalk.red('No project selected'));
|
|
10
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
10
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
11
11
|
process.exit(1);
|
|
12
12
|
}
|
|
13
|
-
return
|
|
13
|
+
return currentProject;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
module.exports = (program) => {
|
|
@@ -19,13 +19,14 @@ module.exports = (program) => {
|
|
|
19
19
|
.command('deploy')
|
|
20
20
|
.description('Deploy your chatbot (show integration info)')
|
|
21
21
|
.action(async () => {
|
|
22
|
-
const
|
|
22
|
+
const currentProject = requireProject();
|
|
23
23
|
|
|
24
24
|
try {
|
|
25
25
|
const spinner = ora('Fetching project details...').start();
|
|
26
26
|
|
|
27
|
-
const project = await api.getProject(
|
|
27
|
+
const project = await api.getProject(currentProject.id);
|
|
28
28
|
const apiUrl = config.getApiUrl();
|
|
29
|
+
const projectKey = project.project_key;
|
|
29
30
|
|
|
30
31
|
spinner.stop();
|
|
31
32
|
|
|
@@ -113,9 +114,9 @@ print(response.choices[0].message.content)
|
|
|
113
114
|
|
|
114
115
|
console.log(chalk.cyan('\n=== Next Steps ===\n'));
|
|
115
116
|
console.log(chalk.gray('1. Test your deployment:'));
|
|
116
|
-
console.log(chalk.white(`
|
|
117
|
+
console.log(chalk.white(` intentiai test "Hello, how are you?"\n`));
|
|
117
118
|
console.log(chalk.gray('2. View project details:'));
|
|
118
|
-
console.log(chalk.white(`
|
|
119
|
+
console.log(chalk.white(` intentiai project current\n`));
|
|
119
120
|
console.log(chalk.gray('3. Monitor in production:'));
|
|
120
121
|
console.log(chalk.white(` Check logs at: ${apiUrl}/logs (coming soon)\n`));
|
|
121
122
|
|
package/commands/intent.js
CHANGED
|
@@ -6,13 +6,13 @@ const api = require('../lib/api');
|
|
|
6
6
|
const config = require('../lib/config');
|
|
7
7
|
|
|
8
8
|
function requireProject() {
|
|
9
|
-
const
|
|
10
|
-
if (!
|
|
9
|
+
const currentProject = config.getCurrentProject();
|
|
10
|
+
if (!currentProject || !currentProject.id) {
|
|
11
11
|
console.error(chalk.red('No project selected'));
|
|
12
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
12
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
|
-
return
|
|
15
|
+
return currentProject;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
module.exports = (program) => {
|
|
@@ -26,6 +26,7 @@ module.exports = (program) => {
|
|
|
26
26
|
.option('-e, --examples <examples...>', 'Example queries (comma-separated or multiple -e flags)')
|
|
27
27
|
.action(async (name, options) => {
|
|
28
28
|
requireProject();
|
|
29
|
+
let spinner;
|
|
29
30
|
|
|
30
31
|
try {
|
|
31
32
|
let { description, examples } = options;
|
|
@@ -46,7 +47,7 @@ module.exports = (program) => {
|
|
|
46
47
|
// Parse examples
|
|
47
48
|
const examplesList = examples || [];
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
spinner = ora('Creating intent...').start();
|
|
50
51
|
|
|
51
52
|
await api.createIntent(name, description, examplesList);
|
|
52
53
|
|
|
@@ -58,10 +59,10 @@ module.exports = (program) => {
|
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
console.log('\n' + chalk.yellow('Next steps:'));
|
|
61
|
-
console.log(chalk.gray(' 1. Add routing rule:'), chalk.cyan(`
|
|
62
|
-
console.log(chalk.gray(' 2. Set system prompt:'), chalk.cyan(`
|
|
62
|
+
console.log(chalk.gray(' 1. Add routing rule:'), chalk.cyan(`intentiai route add --intent "${name}"`));
|
|
63
|
+
console.log(chalk.gray(' 2. Set system prompt:'), chalk.cyan(`intentiai prompt set --intent "${name}"`));
|
|
63
64
|
} catch (error) {
|
|
64
|
-
spinner.fail(chalk.red('Failed to create intent'));
|
|
65
|
+
if (spinner) spinner.fail(chalk.red('Failed to create intent'));
|
|
65
66
|
console.error(chalk.red('Error:'), error.message);
|
|
66
67
|
process.exit(1);
|
|
67
68
|
}
|
|
@@ -78,7 +79,7 @@ module.exports = (program) => {
|
|
|
78
79
|
try {
|
|
79
80
|
const spinner = ora('Fetching intents...').start();
|
|
80
81
|
|
|
81
|
-
const intents = await api.
|
|
82
|
+
const intents = await api.listCurrentProjectIntents();
|
|
82
83
|
|
|
83
84
|
spinner.stop();
|
|
84
85
|
|
|
@@ -166,7 +167,7 @@ module.exports = (program) => {
|
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
const spinner = ora('Deleting intent...').start();
|
|
169
|
-
await api.
|
|
170
|
+
await api.deleteIntentByName(name);
|
|
170
171
|
spinner.succeed(chalk.green('Intent deleted successfully'));
|
|
171
172
|
} catch (error) {
|
|
172
173
|
console.error(chalk.red('Failed to delete intent:'), error.message);
|
package/commands/project.js
CHANGED
|
@@ -20,10 +20,11 @@ module.exports = (program) => {
|
|
|
20
20
|
const response = await api.createProject(name, options.description || '');
|
|
21
21
|
|
|
22
22
|
// Auto-select the new project
|
|
23
|
-
config.setCurrentProject(response.
|
|
23
|
+
config.setCurrentProject(response.id, response.name);
|
|
24
24
|
|
|
25
25
|
spinner.succeed(chalk.green('Project created successfully!'));
|
|
26
|
-
console.log(chalk.gray('Name:'), name);
|
|
26
|
+
console.log(chalk.gray('Name:'), response.name);
|
|
27
|
+
console.log(chalk.gray('Project ID:'), chalk.cyan(response.id));
|
|
27
28
|
console.log(chalk.gray('Project Key:'), chalk.cyan(response.project_key));
|
|
28
29
|
console.log(chalk.gray('Status:'), chalk.green('Active (selected)'));
|
|
29
30
|
|
|
@@ -54,20 +55,20 @@ module.exports = (program) => {
|
|
|
54
55
|
|
|
55
56
|
if (projects.length === 0) {
|
|
56
57
|
console.log(chalk.yellow('No projects found'));
|
|
57
|
-
console.log(chalk.gray('Create one with:'), chalk.cyan('
|
|
58
|
+
console.log(chalk.gray('Create one with:'), chalk.cyan('intentiai project create <name>'));
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
61
|
|
|
61
62
|
const table = new Table({
|
|
62
|
-
head: [chalk.cyan('
|
|
63
|
-
colWidths: [25, 40,
|
|
63
|
+
head: [chalk.cyan('ID'), chalk.cyan('Name'), chalk.cyan('Description'), chalk.cyan('Status')],
|
|
64
|
+
colWidths: [8, 25, 40, 12]
|
|
64
65
|
});
|
|
65
66
|
|
|
66
67
|
projects.forEach(proj => {
|
|
67
|
-
const isActive = proj.
|
|
68
|
+
const isActive = currentProject && proj.id === currentProject.id;
|
|
68
69
|
table.push([
|
|
70
|
+
proj.id,
|
|
69
71
|
isActive ? chalk.green(`${proj.name} *`) : proj.name,
|
|
70
|
-
proj.project_key,
|
|
71
72
|
proj.description || chalk.gray('(no description)'),
|
|
72
73
|
isActive ? chalk.green('Active') : chalk.gray('---')
|
|
73
74
|
]);
|
|
@@ -83,11 +84,11 @@ module.exports = (program) => {
|
|
|
83
84
|
|
|
84
85
|
// Select project
|
|
85
86
|
project
|
|
86
|
-
.command('select [
|
|
87
|
+
.command('select [projectId]')
|
|
87
88
|
.description('Select a project to work with')
|
|
88
|
-
.action(async (
|
|
89
|
+
.action(async (projectId) => {
|
|
89
90
|
try {
|
|
90
|
-
if (!
|
|
91
|
+
if (!projectId) {
|
|
91
92
|
// Show interactive selection
|
|
92
93
|
const projects = await api.listProjects();
|
|
93
94
|
|
|
@@ -99,25 +100,25 @@ module.exports = (program) => {
|
|
|
99
100
|
const answers = await inquirer.prompt([
|
|
100
101
|
{
|
|
101
102
|
type: 'list',
|
|
102
|
-
name: '
|
|
103
|
+
name: 'projectId',
|
|
103
104
|
message: 'Select a project:',
|
|
104
105
|
choices: projects.map(p => ({
|
|
105
|
-
name: `${p.name} (${p.
|
|
106
|
-
value: p.
|
|
106
|
+
name: `${p.name} (ID: ${p.id})`,
|
|
107
|
+
value: p.id
|
|
107
108
|
}))
|
|
108
109
|
}
|
|
109
110
|
]);
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
projectId = answers.projectId;
|
|
112
113
|
}
|
|
113
114
|
|
|
114
115
|
// Verify project exists
|
|
115
|
-
const project = await api.getProject(
|
|
116
|
+
const project = await api.getProject(projectId);
|
|
116
117
|
|
|
117
|
-
config.setCurrentProject(
|
|
118
|
+
config.setCurrentProject(project.id, project.name);
|
|
118
119
|
|
|
119
120
|
console.log(chalk.green('Project selected:'), project.name);
|
|
120
|
-
console.log(chalk.gray('Project
|
|
121
|
+
console.log(chalk.gray('Project ID:'), chalk.cyan(project.id));
|
|
121
122
|
} catch (error) {
|
|
122
123
|
console.error(chalk.red('Failed to select project:'), error.message);
|
|
123
124
|
process.exit(1);
|
|
@@ -129,21 +130,22 @@ module.exports = (program) => {
|
|
|
129
130
|
.command('current')
|
|
130
131
|
.description('Show currently selected project')
|
|
131
132
|
.action(async () => {
|
|
132
|
-
const
|
|
133
|
+
const currentProject = config.getCurrentProject();
|
|
133
134
|
|
|
134
|
-
if (!
|
|
135
|
+
if (!currentProject || !currentProject.id) {
|
|
135
136
|
console.log(chalk.yellow('No project selected'));
|
|
136
|
-
console.log(chalk.gray('Select one with:'), chalk.cyan('
|
|
137
|
+
console.log(chalk.gray('Select one with:'), chalk.cyan('intentiai project select'));
|
|
137
138
|
return;
|
|
138
139
|
}
|
|
139
140
|
|
|
140
141
|
try {
|
|
141
142
|
const spinner = ora('Fetching project details...').start();
|
|
142
|
-
const project = await api.getProject(
|
|
143
|
+
const project = await api.getProject(currentProject.id);
|
|
143
144
|
spinner.stop();
|
|
144
145
|
|
|
145
146
|
console.log(chalk.green('Current Project:'));
|
|
146
147
|
console.log(chalk.gray(' Name:'), project.name);
|
|
148
|
+
console.log(chalk.gray(' Project ID:'), chalk.cyan(project.id));
|
|
147
149
|
console.log(chalk.gray(' Project Key:'), chalk.cyan(project.project_key));
|
|
148
150
|
console.log(chalk.gray(' Description:'), project.description || chalk.gray('(no description)'));
|
|
149
151
|
console.log(chalk.gray(' Created:'), new Date(project.created_at).toLocaleString());
|
|
@@ -155,17 +157,17 @@ module.exports = (program) => {
|
|
|
155
157
|
|
|
156
158
|
// Delete project
|
|
157
159
|
project
|
|
158
|
-
.command('delete <
|
|
160
|
+
.command('delete <projectId>')
|
|
159
161
|
.description('Delete a project')
|
|
160
162
|
.option('-y, --yes', 'Skip confirmation')
|
|
161
|
-
.action(async (
|
|
163
|
+
.action(async (projectId, options) => {
|
|
162
164
|
try {
|
|
163
165
|
if (!options.yes) {
|
|
164
166
|
const answers = await inquirer.prompt([
|
|
165
167
|
{
|
|
166
168
|
type: 'confirm',
|
|
167
169
|
name: 'confirm',
|
|
168
|
-
message: `Are you sure you want to delete project ${
|
|
170
|
+
message: `Are you sure you want to delete project ${projectId}?`,
|
|
169
171
|
default: false
|
|
170
172
|
}
|
|
171
173
|
]);
|
|
@@ -177,11 +179,12 @@ module.exports = (program) => {
|
|
|
177
179
|
}
|
|
178
180
|
|
|
179
181
|
const spinner = ora('Deleting project...').start();
|
|
180
|
-
await api.deleteProject(
|
|
182
|
+
await api.deleteProject(projectId);
|
|
181
183
|
|
|
182
184
|
// Clear current project if it's the one being deleted
|
|
183
|
-
|
|
184
|
-
|
|
185
|
+
const currentProject = config.getCurrentProject();
|
|
186
|
+
if (currentProject && currentProject.id == projectId) {
|
|
187
|
+
config.clearCurrentProject();
|
|
185
188
|
}
|
|
186
189
|
|
|
187
190
|
spinner.succeed(chalk.green('Project deleted successfully'));
|
package/commands/prompt.js
CHANGED
|
@@ -8,13 +8,13 @@ const api = require('../lib/api');
|
|
|
8
8
|
const config = require('../lib/config');
|
|
9
9
|
|
|
10
10
|
function requireProject() {
|
|
11
|
-
const
|
|
12
|
-
if (!
|
|
11
|
+
const currentProject = config.getCurrentProject();
|
|
12
|
+
if (!currentProject || !currentProject.id) {
|
|
13
13
|
console.error(chalk.red('No project selected'));
|
|
14
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
14
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
15
15
|
process.exit(1);
|
|
16
16
|
}
|
|
17
|
-
return
|
|
17
|
+
return currentProject;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
module.exports = (program) => {
|
|
@@ -29,17 +29,17 @@ module.exports = (program) => {
|
|
|
29
29
|
.option('-f, --file <file>', 'Load system message from file')
|
|
30
30
|
.option('-m, --modifier <modifier>', 'High difficulty modifier')
|
|
31
31
|
.action(async (options) => {
|
|
32
|
-
requireProject();
|
|
32
|
+
const project = requireProject();
|
|
33
33
|
|
|
34
34
|
try {
|
|
35
35
|
let { intent, system, file, modifier } = options;
|
|
36
36
|
|
|
37
37
|
// Get intents
|
|
38
|
-
const intents = await api.
|
|
38
|
+
const intents = await api.listCurrentProjectIntents();
|
|
39
39
|
|
|
40
40
|
if (intents.length === 0) {
|
|
41
41
|
console.error(chalk.red('No intents found'));
|
|
42
|
-
console.log(chalk.gray('Create an intent first:'), chalk.cyan('
|
|
42
|
+
console.log(chalk.gray('Create an intent first:'), chalk.cyan('intentiai intent add <name>'));
|
|
43
43
|
process.exit(1);
|
|
44
44
|
}
|
|
45
45
|
|
|
@@ -81,7 +81,7 @@ module.exports = (program) => {
|
|
|
81
81
|
|
|
82
82
|
const spinner = ora('Setting prompt...').start();
|
|
83
83
|
|
|
84
|
-
await api.
|
|
84
|
+
await api.setPromptByIntentName(intent, system, modifier);
|
|
85
85
|
|
|
86
86
|
spinner.succeed(chalk.green('Prompt set successfully!'));
|
|
87
87
|
console.log(chalk.gray('Intent:'), intent);
|
|
@@ -104,7 +104,7 @@ module.exports = (program) => {
|
|
|
104
104
|
|
|
105
105
|
try {
|
|
106
106
|
const spinner = ora('Fetching prompt...').start();
|
|
107
|
-
const promptData = await api.
|
|
107
|
+
const promptData = await api.getPromptByIntentName(intent);
|
|
108
108
|
spinner.stop();
|
|
109
109
|
|
|
110
110
|
console.log(chalk.green('System Prompt:'));
|
|
@@ -132,12 +132,12 @@ module.exports = (program) => {
|
|
|
132
132
|
|
|
133
133
|
try {
|
|
134
134
|
const spinner = ora('Fetching prompts...').start();
|
|
135
|
-
const prompts = await api.
|
|
135
|
+
const prompts = await api.listAllPrompts();
|
|
136
136
|
spinner.stop();
|
|
137
137
|
|
|
138
138
|
if (prompts.length === 0) {
|
|
139
139
|
console.log(chalk.yellow('No prompts configured'));
|
|
140
|
-
console.log(chalk.gray('Set one with:'), chalk.cyan('
|
|
140
|
+
console.log(chalk.gray('Set one with:'), chalk.cyan('intentiai prompt set'));
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
143
|
|
package/commands/route.js
CHANGED
|
@@ -6,13 +6,13 @@ const api = require('../lib/api');
|
|
|
6
6
|
const config = require('../lib/config');
|
|
7
7
|
|
|
8
8
|
function requireProject() {
|
|
9
|
-
const
|
|
10
|
-
if (!
|
|
9
|
+
const currentProject = config.getCurrentProject();
|
|
10
|
+
if (!currentProject || !currentProject.id) {
|
|
11
11
|
console.error(chalk.red('No project selected'));
|
|
12
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
12
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
13
13
|
process.exit(1);
|
|
14
14
|
}
|
|
15
|
-
return
|
|
15
|
+
return currentProject;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
const DIFFICULTY_LEVELS = ['easy', 'medium', 'hard'];
|
|
@@ -35,17 +35,17 @@ module.exports = (program) => {
|
|
|
35
35
|
.option('-m, --model <model>', 'Model name')
|
|
36
36
|
.option('-p, --provider <provider>', 'Provider (openai/groq/anthropic/gemini)')
|
|
37
37
|
.action(async (options) => {
|
|
38
|
-
requireProject();
|
|
38
|
+
const project = requireProject();
|
|
39
39
|
|
|
40
40
|
try {
|
|
41
41
|
let { intent, difficulty, model, provider } = options;
|
|
42
42
|
|
|
43
43
|
// Interactive prompts for missing options
|
|
44
|
-
const intents = await api.
|
|
44
|
+
const intents = await api.listCurrentProjectIntents();
|
|
45
45
|
|
|
46
46
|
if (intents.length === 0) {
|
|
47
47
|
console.error(chalk.red('No intents found'));
|
|
48
|
-
console.log(chalk.gray('Create an intent first:'), chalk.cyan('
|
|
48
|
+
console.log(chalk.gray('Create an intent first:'), chalk.cyan('intentiai intent add <name>'));
|
|
49
49
|
process.exit(1);
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -89,7 +89,7 @@ module.exports = (program) => {
|
|
|
89
89
|
|
|
90
90
|
const spinner = ora('Creating routing rule...').start();
|
|
91
91
|
|
|
92
|
-
await api.
|
|
92
|
+
await api.addRoute(project.id, intent, difficulty, provider, model);
|
|
93
93
|
|
|
94
94
|
spinner.succeed(chalk.green('Routing rule created successfully!'));
|
|
95
95
|
console.log(chalk.gray('Intent:'), intent);
|
|
@@ -107,18 +107,18 @@ module.exports = (program) => {
|
|
|
107
107
|
.alias('ls')
|
|
108
108
|
.description('List all routing rules')
|
|
109
109
|
.action(async () => {
|
|
110
|
-
requireProject();
|
|
110
|
+
const project = requireProject();
|
|
111
111
|
|
|
112
112
|
try {
|
|
113
113
|
const spinner = ora('Fetching routes...').start();
|
|
114
114
|
|
|
115
|
-
const routes = await api.listRoutes();
|
|
115
|
+
const routes = await api.listRoutes(project.id);
|
|
116
116
|
|
|
117
117
|
spinner.stop();
|
|
118
118
|
|
|
119
119
|
if (routes.length === 0) {
|
|
120
120
|
console.log(chalk.yellow('No routing rules found'));
|
|
121
|
-
console.log(chalk.gray('Create one with:'), chalk.cyan('
|
|
121
|
+
console.log(chalk.gray('Create one with:'), chalk.cyan('intentiai route add'));
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
124
124
|
|
package/commands/test.js
CHANGED
|
@@ -4,13 +4,13 @@ const api = require('../lib/api');
|
|
|
4
4
|
const config = require('../lib/config');
|
|
5
5
|
|
|
6
6
|
function requireProject() {
|
|
7
|
-
const
|
|
8
|
-
if (!
|
|
7
|
+
const currentProject = config.getCurrentProject();
|
|
8
|
+
if (!currentProject || !currentProject.id) {
|
|
9
9
|
console.error(chalk.red('No project selected'));
|
|
10
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
10
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
11
11
|
process.exit(1);
|
|
12
12
|
}
|
|
13
|
-
return
|
|
13
|
+
return currentProject;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
module.exports = (program) => {
|
|
@@ -20,12 +20,14 @@ module.exports = (program) => {
|
|
|
20
20
|
.description('Test a query against your chatbot')
|
|
21
21
|
.option('-s, --stream', 'Stream the response')
|
|
22
22
|
.action(async (query, options) => {
|
|
23
|
-
requireProject();
|
|
23
|
+
const project = requireProject();
|
|
24
24
|
|
|
25
25
|
try {
|
|
26
26
|
const spinner = ora('Processing query...').start();
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
// Get project details to get the project key
|
|
29
|
+
const projectDetails = await api.getProject(project.id);
|
|
30
|
+
const response = await api.testQuery(projectDetails.project_key, query);
|
|
29
31
|
|
|
30
32
|
spinner.stop();
|
|
31
33
|
|
package/commands/train.js
CHANGED
|
@@ -5,13 +5,13 @@ const api = require('../lib/api');
|
|
|
5
5
|
const config = require('../lib/config');
|
|
6
6
|
|
|
7
7
|
function requireProject() {
|
|
8
|
-
const
|
|
9
|
-
if (!
|
|
8
|
+
const currentProject = config.getCurrentProject();
|
|
9
|
+
if (!currentProject || !currentProject.id) {
|
|
10
10
|
console.error(chalk.red('No project selected'));
|
|
11
|
-
console.log(chalk.gray('Select a project with:'), chalk.cyan('
|
|
11
|
+
console.log(chalk.gray('Select a project with:'), chalk.cyan('intentiai project select'));
|
|
12
12
|
process.exit(1);
|
|
13
13
|
}
|
|
14
|
-
return
|
|
14
|
+
return currentProject;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
async function sleep(ms) {
|
|
@@ -29,14 +29,14 @@ module.exports = (program) => {
|
|
|
29
29
|
.option('-n, --samples <number>', 'Number of samples per intent', '100')
|
|
30
30
|
.option('-w, --watch', 'Watch training progress')
|
|
31
31
|
.action(async (options) => {
|
|
32
|
-
requireProject();
|
|
32
|
+
const project = requireProject();
|
|
33
33
|
|
|
34
34
|
try {
|
|
35
35
|
const numSamples = parseInt(options.samples);
|
|
36
36
|
|
|
37
37
|
const spinner = ora('Starting training...').start();
|
|
38
38
|
|
|
39
|
-
const response = await api.startTraining(
|
|
39
|
+
const response = await api.startTraining(project.id, numSamples);
|
|
40
40
|
|
|
41
41
|
spinner.succeed(chalk.green('Training started!'));
|
|
42
42
|
console.log(chalk.gray('Task ID:'), chalk.cyan(response.task_id));
|
|
@@ -83,7 +83,7 @@ module.exports = (program) => {
|
|
|
83
83
|
}
|
|
84
84
|
} else {
|
|
85
85
|
console.log(chalk.gray('\nCheck training status with:'));
|
|
86
|
-
console.log(chalk.cyan(`
|
|
86
|
+
console.log(chalk.cyan(` intentiai train status ${response.task_id}`));
|
|
87
87
|
}
|
|
88
88
|
} catch (error) {
|
|
89
89
|
console.error(chalk.red('Failed to start training:'), error.message);
|
package/lib/api.js
CHANGED
|
@@ -23,15 +23,9 @@ function createClient() {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// Auth endpoints
|
|
26
|
-
async function login(
|
|
26
|
+
async function login(email, password) {
|
|
27
27
|
const client = createClient();
|
|
28
|
-
const
|
|
29
|
-
formData.append('username', username);
|
|
30
|
-
formData.append('password', password);
|
|
31
|
-
|
|
32
|
-
const response = await client.post('/auth/login', formData, {
|
|
33
|
-
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
|
|
34
|
-
});
|
|
28
|
+
const response = await client.post('/auth/login', { email, password });
|
|
35
29
|
return response.data;
|
|
36
30
|
}
|
|
37
31
|
|
|
@@ -55,7 +49,8 @@ async function createProject(name, description = '') {
|
|
|
55
49
|
async function listProjects() {
|
|
56
50
|
const client = createClient();
|
|
57
51
|
const response = await client.get('/projects');
|
|
58
|
-
|
|
52
|
+
// Backend returns {projects: [...]}
|
|
53
|
+
return response.data.projects || response.data;
|
|
59
54
|
}
|
|
60
55
|
|
|
61
56
|
async function getProject(projectId) {
|
|
@@ -84,6 +79,71 @@ async function addIntent(projectId, name, description, examples = []) {
|
|
|
84
79
|
async function listIntents(projectId) {
|
|
85
80
|
const client = createClient();
|
|
86
81
|
const response = await client.get(`/projects/${projectId}/intents`);
|
|
82
|
+
// Backend returns {intents: [...]}
|
|
83
|
+
return response.data.intents || response.data;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Alias for CLI compatibility - creates intent using current project from config
|
|
87
|
+
async function createIntent(name, description, examples = []) {
|
|
88
|
+
const config = require('./config');
|
|
89
|
+
const project = config.getCurrentProject();
|
|
90
|
+
if (!project || !project.id) {
|
|
91
|
+
throw new Error('No project selected');
|
|
92
|
+
}
|
|
93
|
+
return addIntent(project.id, name, description, examples);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Get intent by name
|
|
97
|
+
async function getIntent(name) {
|
|
98
|
+
const config = require('./config');
|
|
99
|
+
const project = config.getCurrentProject();
|
|
100
|
+
if (!project || !project.id) {
|
|
101
|
+
throw new Error('No project selected');
|
|
102
|
+
}
|
|
103
|
+
const intents = await listIntents(project.id);
|
|
104
|
+
const intent = intents.find(i => i.name === name);
|
|
105
|
+
if (!intent) {
|
|
106
|
+
throw new Error(`Intent "${name}" not found`);
|
|
107
|
+
}
|
|
108
|
+
return intent;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Delete intent by name (for CLI)
|
|
112
|
+
async function deleteIntentByName(name) {
|
|
113
|
+
const config = require('./config');
|
|
114
|
+
const project = config.getCurrentProject();
|
|
115
|
+
if (!project || !project.id) {
|
|
116
|
+
throw new Error('No project selected');
|
|
117
|
+
}
|
|
118
|
+
const intents = await listIntents(project.id);
|
|
119
|
+
const intent = intents.find(i => i.name === name);
|
|
120
|
+
if (!intent) {
|
|
121
|
+
throw new Error(`Intent "${name}" not found`);
|
|
122
|
+
}
|
|
123
|
+
return deleteIntent(project.id, intent.id);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// List intents for current project (for CLI)
|
|
127
|
+
async function listCurrentProjectIntents() {
|
|
128
|
+
const config = require('./config');
|
|
129
|
+
const project = config.getCurrentProject();
|
|
130
|
+
if (!project || !project.id) {
|
|
131
|
+
throw new Error('No project selected');
|
|
132
|
+
}
|
|
133
|
+
return listIntents(project.id);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Batch create intents
|
|
137
|
+
async function batchCreateIntents(intents) {
|
|
138
|
+
const config = require('./config');
|
|
139
|
+
const project = config.getCurrentProject();
|
|
140
|
+
if (!project || !project.id) {
|
|
141
|
+
throw new Error('No project selected');
|
|
142
|
+
}
|
|
143
|
+
const client = createClient();
|
|
144
|
+
const response = await client.post(`/projects/${project.id}/intents/batch`, {
|
|
145
|
+
intents: intents.map(i => ({ name: i.name, description: i.description }))
|
|
146
|
+
});
|
|
87
147
|
return response.data;
|
|
88
148
|
}
|
|
89
149
|
|
|
@@ -108,7 +168,8 @@ async function addRoute(projectId, intentName, difficulty, provider, model) {
|
|
|
108
168
|
async function listRoutes(projectId) {
|
|
109
169
|
const client = createClient();
|
|
110
170
|
const response = await client.get(`/projects/${projectId}/routing-rules`);
|
|
111
|
-
|
|
171
|
+
// Backend returns {rules: [...]}
|
|
172
|
+
return response.data.rules || response.data;
|
|
112
173
|
}
|
|
113
174
|
|
|
114
175
|
async function deleteRoute(routeId) {
|
|
@@ -133,6 +194,46 @@ async function getPrompts(projectId, intentId) {
|
|
|
133
194
|
return response.data;
|
|
134
195
|
}
|
|
135
196
|
|
|
197
|
+
// CLI-compatible prompt methods
|
|
198
|
+
async function setPromptByIntentName(intentName, systemMessage, modifier = null) {
|
|
199
|
+
const config = require('./config');
|
|
200
|
+
const project = config.getCurrentProject();
|
|
201
|
+
if (!project || !project.id) {
|
|
202
|
+
throw new Error('No project selected');
|
|
203
|
+
}
|
|
204
|
+
const intents = await listIntents(project.id);
|
|
205
|
+
const intent = intents.find(i => i.name === intentName);
|
|
206
|
+
if (!intent) {
|
|
207
|
+
throw new Error(`Intent "${intentName}" not found`);
|
|
208
|
+
}
|
|
209
|
+
return setPrompt(project.id, intent.id, systemMessage, modifier);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function getPromptByIntentName(intentName) {
|
|
213
|
+
const config = require('./config');
|
|
214
|
+
const project = config.getCurrentProject();
|
|
215
|
+
if (!project || !project.id) {
|
|
216
|
+
throw new Error('No project selected');
|
|
217
|
+
}
|
|
218
|
+
const intents = await listIntents(project.id);
|
|
219
|
+
const intent = intents.find(i => i.name === intentName);
|
|
220
|
+
if (!intent) {
|
|
221
|
+
throw new Error(`Intent "${intentName}" not found`);
|
|
222
|
+
}
|
|
223
|
+
return getPrompts(project.id, intent.id);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
async function listAllPrompts() {
|
|
227
|
+
const config = require('./config');
|
|
228
|
+
const project = config.getCurrentProject();
|
|
229
|
+
if (!project || !project.id) {
|
|
230
|
+
throw new Error('No project selected');
|
|
231
|
+
}
|
|
232
|
+
const client = createClient();
|
|
233
|
+
const response = await client.get(`/projects/${project.id}/prompts`);
|
|
234
|
+
return response.data.prompts || response.data;
|
|
235
|
+
}
|
|
236
|
+
|
|
136
237
|
// Document endpoints
|
|
137
238
|
async function uploadDocument(projectId, filePath) {
|
|
138
239
|
const client = createClient();
|
|
@@ -158,9 +259,11 @@ async function deleteDocument(documentId) {
|
|
|
158
259
|
}
|
|
159
260
|
|
|
160
261
|
// Training endpoints
|
|
161
|
-
async function startTraining(projectId) {
|
|
262
|
+
async function startTraining(projectId, numSamples = 100) {
|
|
162
263
|
const client = createClient();
|
|
163
|
-
const response = await client.post(`/projects/${projectId}/train
|
|
264
|
+
const response = await client.post(`/projects/${projectId}/train`, {
|
|
265
|
+
num_samples: numSamples
|
|
266
|
+
});
|
|
164
267
|
return response.data;
|
|
165
268
|
}
|
|
166
269
|
|
|
@@ -189,6 +292,13 @@ async function getProjectKey(projectId) {
|
|
|
189
292
|
return response.data.project_key;
|
|
190
293
|
}
|
|
191
294
|
|
|
295
|
+
// Health check
|
|
296
|
+
async function health() {
|
|
297
|
+
const client = createClient();
|
|
298
|
+
const response = await client.get('/health');
|
|
299
|
+
return response.data;
|
|
300
|
+
}
|
|
301
|
+
|
|
192
302
|
// Device auth endpoints (for browser-based login)
|
|
193
303
|
async function checkDeviceAuth(deviceCode) {
|
|
194
304
|
const client = createClient();
|
|
@@ -214,13 +324,21 @@ module.exports = {
|
|
|
214
324
|
getProject,
|
|
215
325
|
deleteProject,
|
|
216
326
|
addIntent,
|
|
327
|
+
createIntent,
|
|
217
328
|
listIntents,
|
|
329
|
+
listCurrentProjectIntents,
|
|
330
|
+
getIntent,
|
|
218
331
|
deleteIntent,
|
|
332
|
+
deleteIntentByName,
|
|
333
|
+
batchCreateIntents,
|
|
219
334
|
addRoute,
|
|
220
335
|
listRoutes,
|
|
221
336
|
deleteRoute,
|
|
222
337
|
setPrompt,
|
|
338
|
+
setPromptByIntentName,
|
|
223
339
|
getPrompts,
|
|
340
|
+
getPromptByIntentName,
|
|
341
|
+
listAllPrompts,
|
|
224
342
|
uploadDocument,
|
|
225
343
|
listDocuments,
|
|
226
344
|
deleteDocument,
|
|
@@ -228,6 +346,7 @@ module.exports = {
|
|
|
228
346
|
getTrainingStatus,
|
|
229
347
|
testQuery,
|
|
230
348
|
getProjectKey,
|
|
349
|
+
health,
|
|
231
350
|
checkDeviceAuth,
|
|
232
351
|
completeDeviceAuth
|
|
233
352
|
};
|