viho 0.0.5 → 0.0.7
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/README.md +10 -8
- package/bin/viho-ask.js +8 -18
- package/bin/viho-chat.js +7 -18
- package/bin/viho-model.js +39 -16
- package/package.json +4 -4
- package/{bin/util.js → src/llm.js} +0 -34
- package/src/model.js +51 -0
- package/src/util.js +36 -0
- package/logo.png +0 -0
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<p align="center">
|
|
2
|
-
<img src="
|
|
2
|
+
<img src="https://static-small.vincentqiao.com/viho/logo.png" alt="viho logo" width="200"/>
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<h1 align="center">viho</h1>
|
|
@@ -156,13 +156,15 @@ Configuration is stored in `~/viho.json`. You can manage all settings through th
|
|
|
156
156
|
|
|
157
157
|
```json
|
|
158
158
|
{
|
|
159
|
-
"
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
159
|
+
"models": [
|
|
160
|
+
{
|
|
161
|
+
"modelName": "mymodel",
|
|
162
|
+
"apiKey": "your-api-key",
|
|
163
|
+
"baseURL": "https://api.openai.com/v1",
|
|
164
|
+
"modelID": "gpt-4",
|
|
165
|
+
"modelThinking": "auto"
|
|
166
|
+
}
|
|
167
|
+
],
|
|
166
168
|
"default": "mymodel"
|
|
167
169
|
}
|
|
168
170
|
```
|
package/bin/viho-ask.js
CHANGED
|
@@ -5,7 +5,9 @@ const cli = require('qiao-cli');
|
|
|
5
5
|
const LLM = require('qiao-llm');
|
|
6
6
|
|
|
7
7
|
// util
|
|
8
|
-
const {
|
|
8
|
+
const { ask } = require('../src/llm.js');
|
|
9
|
+
const { getModelByName } = require('../src/model.js');
|
|
10
|
+
const { getDB, printLogo } = require('../src/util.js');
|
|
9
11
|
const db = getDB();
|
|
10
12
|
|
|
11
13
|
// cmd
|
|
@@ -13,24 +15,11 @@ cli.cmd
|
|
|
13
15
|
.command('ask [modelName]')
|
|
14
16
|
.description('Ask a question to an AI model')
|
|
15
17
|
.action(async (modelName) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.log(cli.colors.red('No default model set. Use: viho model default'));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
18
|
+
// model
|
|
19
|
+
const model = await getModelByName(db, modelName);
|
|
20
|
+
if (!model) return;
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// check
|
|
27
|
-
const model = await db.config(modelName);
|
|
28
|
-
if (!model) {
|
|
29
|
-
console.log(cli.colors.red(`Model not found: ${modelName}`));
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// init
|
|
22
|
+
// llm
|
|
34
23
|
const llm = LLM({
|
|
35
24
|
apiKey: model.apiKey,
|
|
36
25
|
baseURL: model.baseURL,
|
|
@@ -39,5 +28,6 @@ cli.cmd
|
|
|
39
28
|
// logo
|
|
40
29
|
printLogo();
|
|
41
30
|
|
|
31
|
+
// ask
|
|
42
32
|
await ask(llm, model);
|
|
43
33
|
});
|
package/bin/viho-chat.js
CHANGED
|
@@ -5,7 +5,9 @@ const cli = require('qiao-cli');
|
|
|
5
5
|
const LLM = require('qiao-llm');
|
|
6
6
|
|
|
7
7
|
// util
|
|
8
|
-
const {
|
|
8
|
+
const { ask } = require('../src/llm.js');
|
|
9
|
+
const { getModelByName } = require('../src/model.js');
|
|
10
|
+
const { getDB, printLogo } = require('../src/util.js');
|
|
9
11
|
const db = getDB();
|
|
10
12
|
|
|
11
13
|
// cmd
|
|
@@ -13,22 +15,9 @@ cli.cmd
|
|
|
13
15
|
.command('chat [modelName]')
|
|
14
16
|
.description('Start a continuous chat session with an AI model')
|
|
15
17
|
.action(async (modelName) => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
console.log(cli.colors.red('No default model set. Use: viho model default'));
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
modelName = defaultModel;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// check
|
|
27
|
-
const model = await db.config(modelName);
|
|
28
|
-
if (!model) {
|
|
29
|
-
console.log(cli.colors.red(`Model not found: ${modelName}`));
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
18
|
+
// model
|
|
19
|
+
const model = await getModelByName(db, modelName);
|
|
20
|
+
if (!model) return;
|
|
32
21
|
|
|
33
22
|
// init
|
|
34
23
|
const llm = LLM({
|
|
@@ -38,7 +27,7 @@ cli.cmd
|
|
|
38
27
|
|
|
39
28
|
// logo
|
|
40
29
|
printLogo();
|
|
41
|
-
console.log(cli.colors.cyan(`Welcome to viho chat! Using model: ${modelName}`));
|
|
30
|
+
console.log(cli.colors.cyan(`Welcome to viho chat! Using model: ${model.modelName}`));
|
|
42
31
|
console.log(cli.colors.gray('Press Ctrl+C to exit\n'));
|
|
43
32
|
|
|
44
33
|
// chat
|
package/bin/viho-model.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
const cli = require('qiao-cli');
|
|
3
3
|
|
|
4
4
|
// util
|
|
5
|
-
const {
|
|
5
|
+
const { getModels, setModels } = require('../src/model.js');
|
|
6
|
+
const { getDB, printLogo } = require('../src/util.js');
|
|
6
7
|
const db = getDB();
|
|
7
8
|
|
|
8
9
|
// actions
|
|
@@ -64,21 +65,23 @@ async function modelAdd() {
|
|
|
64
65
|
console.log();
|
|
65
66
|
|
|
66
67
|
// check
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
|
|
68
|
+
const modelName = answers.modelName;
|
|
69
|
+
const models = await getModels(db);
|
|
70
|
+
const isModelExists = models.some((model) => model.modelName === modelName);
|
|
71
|
+
if (isModelExists) {
|
|
70
72
|
console.log(cli.colors.red('Model name already exists'));
|
|
71
73
|
return;
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
// set
|
|
75
|
-
|
|
77
|
+
models.push(answers);
|
|
78
|
+
await setModels(db, models);
|
|
76
79
|
console.log(cli.colors.green('Model added'));
|
|
77
80
|
console.log();
|
|
78
81
|
|
|
79
82
|
// list
|
|
80
|
-
const
|
|
81
|
-
console.log(
|
|
83
|
+
const allModels = await getModels(db);
|
|
84
|
+
console.log(allModels);
|
|
82
85
|
} catch (e) {
|
|
83
86
|
console.log(cli.colors.red('Error: Failed to add model'));
|
|
84
87
|
console.log();
|
|
@@ -95,10 +98,10 @@ async function modelList() {
|
|
|
95
98
|
printLogo();
|
|
96
99
|
|
|
97
100
|
// list
|
|
98
|
-
const
|
|
101
|
+
const models = await getModels(db);
|
|
99
102
|
console.log(cli.colors.cyan('Configured models:'));
|
|
100
103
|
console.log();
|
|
101
|
-
console.log(
|
|
104
|
+
console.log(models);
|
|
102
105
|
} catch (e) {
|
|
103
106
|
console.log(cli.colors.red('Error: Failed to list models'));
|
|
104
107
|
console.log();
|
|
@@ -124,14 +127,34 @@ async function modelRemove() {
|
|
|
124
127
|
console.log();
|
|
125
128
|
|
|
126
129
|
// del
|
|
127
|
-
const
|
|
128
|
-
|
|
130
|
+
const models = await getModels(db);
|
|
131
|
+
const modelNameToRemove = answers.modelName;
|
|
132
|
+
|
|
133
|
+
// check if model exists
|
|
134
|
+
const modelExists = models.some((model) => model.modelName === modelNameToRemove);
|
|
135
|
+
if (!modelExists) {
|
|
136
|
+
console.log(cli.colors.red(`Model not found: ${modelNameToRemove}`));
|
|
137
|
+
console.log();
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const newModels = models.filter((model) => model.modelName !== modelNameToRemove);
|
|
142
|
+
await setModels(db, newModels);
|
|
143
|
+
|
|
144
|
+
// clear default if removed model was default
|
|
145
|
+
const defaultModel = await db.config('default');
|
|
146
|
+
if (defaultModel === modelNameToRemove) {
|
|
147
|
+
await db.config('default', null);
|
|
148
|
+
console.log(cli.colors.yellow('Removed model was set as default. Please set a new default.'));
|
|
149
|
+
console.log();
|
|
150
|
+
}
|
|
151
|
+
|
|
129
152
|
console.log(cli.colors.green('Model removed'));
|
|
130
153
|
console.log();
|
|
131
154
|
|
|
132
155
|
// list
|
|
133
|
-
const
|
|
134
|
-
console.log(
|
|
156
|
+
const allModels = await getModels(db);
|
|
157
|
+
console.log(allModels);
|
|
135
158
|
} catch (e) {
|
|
136
159
|
console.log(cli.colors.red('Error: Failed to remove model'));
|
|
137
160
|
console.log();
|
|
@@ -158,8 +181,8 @@ async function modelDefault() {
|
|
|
158
181
|
console.log();
|
|
159
182
|
|
|
160
183
|
// get keys
|
|
161
|
-
const
|
|
162
|
-
const keys =
|
|
184
|
+
const models = await getModels(db);
|
|
185
|
+
const keys = models.map((model) => model.modelName);
|
|
163
186
|
|
|
164
187
|
// check keys
|
|
165
188
|
if (!keys || !keys.length) {
|
|
@@ -172,7 +195,7 @@ async function modelDefault() {
|
|
|
172
195
|
if (!keys.includes(answers.modelName)) {
|
|
173
196
|
console.log(cli.colors.red('Model not found. Available models:'));
|
|
174
197
|
console.log();
|
|
175
|
-
console.log(
|
|
198
|
+
console.log(models);
|
|
176
199
|
return;
|
|
177
200
|
}
|
|
178
201
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "viho",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "A lightweight CLI tool for managing and interacting with AI models",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
33
|
"bin",
|
|
34
|
+
"src",
|
|
34
35
|
"LICENSE",
|
|
35
|
-
"README.md"
|
|
36
|
-
"logo.png"
|
|
36
|
+
"README.md"
|
|
37
37
|
],
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=18.0.0"
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"qiao-config": "^5.0.1",
|
|
44
44
|
"qiao-llm": "^0.2.5"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "b4d22881578a4da9c83d057f08b044bdd44c692a"
|
|
47
47
|
}
|
|
@@ -1,40 +1,6 @@
|
|
|
1
|
-
// os
|
|
2
|
-
const os = require('os');
|
|
3
|
-
|
|
4
|
-
// path
|
|
5
|
-
const path = require('path');
|
|
6
|
-
|
|
7
1
|
// qiao
|
|
8
2
|
const cli = require('qiao-cli');
|
|
9
3
|
|
|
10
|
-
// db
|
|
11
|
-
const DB = require('qiao-config');
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* getDB
|
|
15
|
-
* @returns
|
|
16
|
-
*/
|
|
17
|
-
exports.getDB = () => {
|
|
18
|
-
const dbPath = path.resolve(os.homedir(), './viho.json');
|
|
19
|
-
return DB(dbPath);
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* printLogo
|
|
24
|
-
*/
|
|
25
|
-
exports.printLogo = () => {
|
|
26
|
-
console.log(
|
|
27
|
-
cli.colors.green(`
|
|
28
|
-
██╗ ██╗██╗██╗ ██╗ ██████╗
|
|
29
|
-
██║ ██║██║██║ ██║██╔═══██╗
|
|
30
|
-
██║ ██║██║███████║██║ ██║
|
|
31
|
-
╚██╗ ██╔╝██║██╔══██║██║ ██║
|
|
32
|
-
╚████╔╝ ██║██║ ██║╚██████╔╝
|
|
33
|
-
╚═══╝ ╚═╝╚═╝ ╚═╝ ╚═════╝
|
|
34
|
-
`),
|
|
35
|
-
);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
4
|
/**
|
|
39
5
|
* ask
|
|
40
6
|
* @param {*} llm
|
package/src/model.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// qiao
|
|
2
|
+
const cli = require('qiao-cli');
|
|
3
|
+
|
|
4
|
+
// models
|
|
5
|
+
const modelsKey = 'models';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* getModels
|
|
9
|
+
* @param {*} db
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
exports.getModels = async (db) => {
|
|
13
|
+
return (await db.config(modelsKey)) || [];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* setModels
|
|
18
|
+
* @param {*} db
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
exports.setModels = async (db, models) => {
|
|
22
|
+
await db.config(modelsKey, models);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* getModelByName
|
|
27
|
+
* @param {*} db
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
exports.getModelByName = async (db, modelName) => {
|
|
31
|
+
if (!modelName) {
|
|
32
|
+
const defaultModel = await db.config('default');
|
|
33
|
+
if (!defaultModel) {
|
|
34
|
+
console.log(cli.colors.red('No default model set. Use: viho model default'));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
modelName = defaultModel;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// check
|
|
42
|
+
const models = await exports.getModels(db);
|
|
43
|
+
const model = models.find((m) => m.modelName === modelName);
|
|
44
|
+
if (!model) {
|
|
45
|
+
console.log(cli.colors.red(`Model not found: ${modelName}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// r
|
|
50
|
+
return model;
|
|
51
|
+
};
|
package/src/util.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// os
|
|
2
|
+
const os = require('os');
|
|
3
|
+
|
|
4
|
+
// path
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
// qiao
|
|
8
|
+
const cli = require('qiao-cli');
|
|
9
|
+
|
|
10
|
+
// db
|
|
11
|
+
const DB = require('qiao-config');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* getDB
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
exports.getDB = () => {
|
|
18
|
+
const dbPath = path.resolve(os.homedir(), './viho.json');
|
|
19
|
+
return DB(dbPath);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* printLogo
|
|
24
|
+
*/
|
|
25
|
+
exports.printLogo = () => {
|
|
26
|
+
console.log(
|
|
27
|
+
cli.colors.green(`
|
|
28
|
+
██╗ ██╗██╗██╗ ██╗ ██████╗
|
|
29
|
+
██║ ██║██║██║ ██║██╔═══██╗
|
|
30
|
+
██║ ██║██║███████║██║ ██║
|
|
31
|
+
╚██╗ ██╔╝██║██╔══██║██║ ██║
|
|
32
|
+
╚████╔╝ ██║██║ ██║╚██████╔╝
|
|
33
|
+
╚═══╝ ╚═╝╚═╝ ╚═╝ ╚═════╝
|
|
34
|
+
`),
|
|
35
|
+
);
|
|
36
|
+
};
|
package/logo.png
DELETED
|
Binary file
|