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 CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="./logo.png" alt="viho logo" width="200"/>
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
- "mymodel": {
160
- "modelName": "mymodel",
161
- "apiKey": "your-api-key",
162
- "baseURL": "https://api.openai.com/v1",
163
- "modelID": "gpt-4",
164
- "modelThinking": "auto"
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 { getDB, ask, printLogo } = require('./util.js');
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
- if (!modelName) {
17
- const defaultModel = await db.config('default');
18
- if (!defaultModel) {
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
- 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
- }
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 { getDB, ask, printLogo } = require('./util.js');
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
- if (!modelName) {
17
- const defaultModel = await db.config('default');
18
- if (!defaultModel) {
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 { getDB, printLogo } = require('./util.js');
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 dbKey = answers.modelName;
68
- const dbValue = await db.config(dbKey);
69
- if (dbValue) {
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
- await db.config(dbKey, answers);
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 all = await db.all();
81
- console.log(all);
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 all = await db.all();
101
+ const models = await getModels(db);
99
102
  console.log(cli.colors.cyan('Configured models:'));
100
103
  console.log();
101
- console.log(all);
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 dbKey = answers.modelName;
128
- await db.config(dbKey, null);
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 all = await db.all();
134
- console.log(all);
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 all = await db.all();
162
- const keys = Object.keys(all);
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(all);
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.5",
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": "4536783e6823add1a9556e0fb2f569e8d1f5bac0"
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