@syntero/orca-cli 1.0.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/README.md +122 -0
- package/dist/assistant.d.ts +31 -0
- package/dist/assistant.d.ts.map +1 -0
- package/dist/assistant.js +280 -0
- package/dist/assistant.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +310 -0
- package/dist/index.js.map +1 -0
- package/dist/providers.d.ts +26 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +283 -0
- package/dist/providers.js.map +1 -0
- package/dist/settings.d.ts +41 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +132 -0
- package/dist/settings.js.map +1 -0
- package/dist/tools.d.ts +332 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +359 -0
- package/dist/tools.js.map +1 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +178 -0
- package/dist/utils.js.map +1 -0
- package/package.json +50 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import * as readline from 'readline';
|
|
3
|
+
import { createRequire } from 'module';
|
|
4
|
+
import updateNotifier from 'update-notifier';
|
|
5
|
+
import { Provider, loadSettings, saveSettings } from './settings.js';
|
|
6
|
+
import { createLLMClient, configureProvider, listAvailableModels, selectModel, } from './providers.js';
|
|
7
|
+
import { runAssistant } from './assistant.js';
|
|
8
|
+
import { Colors, color, promptInput, CancelledError } from './utils.js';
|
|
9
|
+
// Check for updates and auto-install if available
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const pkg = require('../package.json');
|
|
12
|
+
const notifier = updateNotifier({ pkg, updateCheckInterval: 0 }); // Check every time
|
|
13
|
+
if (notifier.update && notifier.update.latest !== pkg.version) {
|
|
14
|
+
console.log(`Updating ${pkg.name} from ${pkg.version} to ${notifier.update.latest}...`);
|
|
15
|
+
const { execSync } = await import('child_process');
|
|
16
|
+
try {
|
|
17
|
+
execSync(`npm install -g ${pkg.name}@latest`, { stdio: 'inherit' });
|
|
18
|
+
console.log('Update complete. Please restart the application.\n');
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
console.log('Auto-update failed. Run manually: npm install -g ' + pkg.name);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handle slash commands.
|
|
27
|
+
*/
|
|
28
|
+
async function handleCommand(command, settings) {
|
|
29
|
+
const parts = command.trim().split(/\s+/);
|
|
30
|
+
const cmd = parts[0].toLowerCase();
|
|
31
|
+
const args = parts.slice(1).join(' ');
|
|
32
|
+
if (cmd === '/login') {
|
|
33
|
+
await configureProvider(settings);
|
|
34
|
+
return { handled: true, message: color('Configuration updated. Reconnecting...', Colors.green) };
|
|
35
|
+
}
|
|
36
|
+
if (cmd === '/settings') {
|
|
37
|
+
return { handled: true, message: `\n${settings.getMaskedDisplay()}\n` };
|
|
38
|
+
}
|
|
39
|
+
if (cmd === '/provider') {
|
|
40
|
+
const validProviders = [Provider.ANTHROPIC, Provider.OPENAI, Provider.AZURE];
|
|
41
|
+
if (validProviders.includes(args)) {
|
|
42
|
+
if (args === Provider.ANTHROPIC && !settings.anthropic.api_key) {
|
|
43
|
+
return {
|
|
44
|
+
handled: true,
|
|
45
|
+
message: color('Anthropic not configured. Run /login first.', Colors.yellow),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
else if (args === Provider.OPENAI && !settings.openai.api_key) {
|
|
49
|
+
return {
|
|
50
|
+
handled: true,
|
|
51
|
+
message: color('OpenAI not configured. Run /login first.', Colors.yellow),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
else if (args === Provider.AZURE && !settings.isConfigured()) {
|
|
55
|
+
return {
|
|
56
|
+
handled: true,
|
|
57
|
+
message: color('Azure not configured. Run /login first.', Colors.yellow),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
settings.provider = args;
|
|
61
|
+
saveSettings(settings);
|
|
62
|
+
return { handled: true, message: color(`Switched to ${args}`, Colors.green) };
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return { handled: true, message: 'Available providers: anthropic, openai, azure' };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (cmd === '/models') {
|
|
69
|
+
const modelsList = await listAvailableModels(settings);
|
|
70
|
+
return { handled: true, message: modelsList };
|
|
71
|
+
}
|
|
72
|
+
if (cmd === '/model') {
|
|
73
|
+
try {
|
|
74
|
+
if (settings.provider === Provider.ANTHROPIC) {
|
|
75
|
+
settings.anthropic.model = await selectModel(settings.provider, settings.anthropic.model);
|
|
76
|
+
}
|
|
77
|
+
else if (settings.provider === Provider.OPENAI) {
|
|
78
|
+
settings.openai.model = await selectModel(settings.provider, settings.openai.model, settings.openai.api_key);
|
|
79
|
+
}
|
|
80
|
+
else if (settings.provider === Provider.AZURE) {
|
|
81
|
+
const newDeployment = await promptInput('Deployment name', settings.azure.deployment);
|
|
82
|
+
if (newDeployment) {
|
|
83
|
+
settings.azure.deployment = newDeployment;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
saveSettings(settings);
|
|
87
|
+
return { handled: true, message: color('Model updated.', Colors.green) };
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
if (e instanceof CancelledError) {
|
|
91
|
+
return { handled: true, message: color('Cancelled.', Colors.yellow) };
|
|
92
|
+
}
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (cmd === '/help') {
|
|
97
|
+
const helpText = `
|
|
98
|
+
Available commands:
|
|
99
|
+
/login Configure LLM credentials
|
|
100
|
+
/settings Show current settings
|
|
101
|
+
/models List available models
|
|
102
|
+
/model Change model for current provider
|
|
103
|
+
/provider <name> Switch provider (anthropic, openai, azure)
|
|
104
|
+
/clear Clear conversation
|
|
105
|
+
/help Show this help
|
|
106
|
+
quit, exit Exit
|
|
107
|
+
`;
|
|
108
|
+
return { handled: true, message: helpText };
|
|
109
|
+
}
|
|
110
|
+
if (cmd === '/clear') {
|
|
111
|
+
return { handled: true, message: '__CLEAR__' };
|
|
112
|
+
}
|
|
113
|
+
return { handled: false };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Run in interactive conversation mode.
|
|
117
|
+
*/
|
|
118
|
+
async function interactiveMode(settings) {
|
|
119
|
+
console.log(color('\nOrca Deployment Assistant', Colors.bold));
|
|
120
|
+
console.log(color('='.repeat(40), Colors.dim));
|
|
121
|
+
console.log(`Provider: ${color(settings.provider, Colors.cyan)}`);
|
|
122
|
+
console.log('Type /help for commands, /login to configure credentials.\n');
|
|
123
|
+
let client = createLLMClient(settings);
|
|
124
|
+
let messages = [];
|
|
125
|
+
const rl = readline.createInterface({
|
|
126
|
+
input: process.stdin,
|
|
127
|
+
output: process.stdout,
|
|
128
|
+
});
|
|
129
|
+
// Handle Ctrl+C gracefully
|
|
130
|
+
const handleSigint = () => {
|
|
131
|
+
console.log('\nGoodbye!');
|
|
132
|
+
rl.close();
|
|
133
|
+
process.exit(0);
|
|
134
|
+
};
|
|
135
|
+
process.on('SIGINT', handleSigint);
|
|
136
|
+
const promptUser = () => {
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
rl.question(color('\nYou: ', Colors.green), (answer) => {
|
|
139
|
+
resolve(answer.trim());
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
while (true) {
|
|
144
|
+
let userInput;
|
|
145
|
+
try {
|
|
146
|
+
userInput = await promptUser();
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
console.log('\nGoodbye!');
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
if (!userInput) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (['quit', 'exit', 'q'].includes(userInput.toLowerCase())) {
|
|
156
|
+
console.log('Goodbye!');
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
// Handle slash commands
|
|
160
|
+
if (userInput.startsWith('/')) {
|
|
161
|
+
const result = await handleCommand(userInput, settings);
|
|
162
|
+
if (result.handled) {
|
|
163
|
+
if (result.message === '__CLEAR__') {
|
|
164
|
+
messages = [];
|
|
165
|
+
console.log(color('Conversation cleared.', Colors.dim));
|
|
166
|
+
}
|
|
167
|
+
else if (result.message) {
|
|
168
|
+
console.log(result.message);
|
|
169
|
+
}
|
|
170
|
+
// Recreate client if settings changed
|
|
171
|
+
if (['/login', '/provider', '/model'].some((cmd) => userInput.startsWith(cmd))) {
|
|
172
|
+
client = createLLMClient(settings);
|
|
173
|
+
}
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
process.stdout.write(color('\nAssistant: ', Colors.blue));
|
|
178
|
+
try {
|
|
179
|
+
const generator = runAssistant(client, settings, userInput, messages);
|
|
180
|
+
let result = await generator.next();
|
|
181
|
+
while (!result.done) {
|
|
182
|
+
process.stdout.write(result.value);
|
|
183
|
+
result = await generator.next();
|
|
184
|
+
}
|
|
185
|
+
// Update messages with the returned value
|
|
186
|
+
if (result.value) {
|
|
187
|
+
messages = result.value;
|
|
188
|
+
}
|
|
189
|
+
console.log();
|
|
190
|
+
}
|
|
191
|
+
catch (e) {
|
|
192
|
+
console.log(color(`\nError: ${e instanceof Error ? e.message : String(e)}`, Colors.red));
|
|
193
|
+
if (e instanceof Error && e.stack) {
|
|
194
|
+
console.error(e.stack);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
rl.close();
|
|
199
|
+
process.removeListener('SIGINT', handleSigint);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Run a single query and exit.
|
|
203
|
+
*/
|
|
204
|
+
async function singleQueryMode(settings, query) {
|
|
205
|
+
console.log(color('Orca Deployment Assistant', Colors.bold));
|
|
206
|
+
console.log(color(`Provider: ${settings.provider}`, Colors.dim));
|
|
207
|
+
console.log(color(`\nQuery: ${query}\n`, Colors.dim));
|
|
208
|
+
const client = createLLMClient(settings);
|
|
209
|
+
try {
|
|
210
|
+
const generator = runAssistant(client, settings, query);
|
|
211
|
+
let result = await generator.next();
|
|
212
|
+
while (!result.done) {
|
|
213
|
+
process.stdout.write(result.value);
|
|
214
|
+
result = await generator.next();
|
|
215
|
+
}
|
|
216
|
+
console.log();
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
console.log(color(`\nError: ${e instanceof Error ? e.message : String(e)}`, Colors.red));
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Parse command line arguments.
|
|
225
|
+
*/
|
|
226
|
+
function parseArgs() {
|
|
227
|
+
const args = process.argv.slice(2);
|
|
228
|
+
const result = {
|
|
229
|
+
query: undefined,
|
|
230
|
+
interactive: false,
|
|
231
|
+
deploymentDir: undefined,
|
|
232
|
+
login: false,
|
|
233
|
+
};
|
|
234
|
+
for (let i = 0; i < args.length; i++) {
|
|
235
|
+
const arg = args[i];
|
|
236
|
+
if (arg === '-i' || arg === '--interactive') {
|
|
237
|
+
result.interactive = true;
|
|
238
|
+
}
|
|
239
|
+
else if (arg === '-d' || arg === '--deployment-dir') {
|
|
240
|
+
result.deploymentDir = args[++i];
|
|
241
|
+
}
|
|
242
|
+
else if (arg === '--login') {
|
|
243
|
+
result.login = true;
|
|
244
|
+
}
|
|
245
|
+
else if (arg === '-h' || arg === '--help') {
|
|
246
|
+
console.log(`
|
|
247
|
+
Orca Deployment Assistant - LLM-powered troubleshooting
|
|
248
|
+
|
|
249
|
+
Usage:
|
|
250
|
+
orca [options] [query]
|
|
251
|
+
|
|
252
|
+
Options:
|
|
253
|
+
-i, --interactive Force interactive mode
|
|
254
|
+
-d, --deployment-dir Path to deployment directory
|
|
255
|
+
--login Configure LLM credentials
|
|
256
|
+
-h, --help Show this help
|
|
257
|
+
|
|
258
|
+
Examples:
|
|
259
|
+
orca "Why is the backend restarting?"
|
|
260
|
+
orca --interactive
|
|
261
|
+
orca # Interactive mode (default)
|
|
262
|
+
`);
|
|
263
|
+
process.exit(0);
|
|
264
|
+
}
|
|
265
|
+
else if (!arg.startsWith('-')) {
|
|
266
|
+
result.query = arg;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Main entry point.
|
|
273
|
+
*/
|
|
274
|
+
async function main() {
|
|
275
|
+
const args = parseArgs();
|
|
276
|
+
// Set deployment directory if provided
|
|
277
|
+
if (args.deploymentDir) {
|
|
278
|
+
process.env.DEPLOYMENT_DIR = args.deploymentDir;
|
|
279
|
+
}
|
|
280
|
+
// Load settings
|
|
281
|
+
const settings = loadSettings();
|
|
282
|
+
// Handle --login flag
|
|
283
|
+
if (args.login) {
|
|
284
|
+
await configureProvider(settings);
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
// Check if configured, prompt if not
|
|
288
|
+
if (!settings.isConfigured()) {
|
|
289
|
+
console.log(color('Welcome to Orca Deployment Assistant!', Colors.bold));
|
|
290
|
+
console.log(color("First, let's configure your LLM provider.\n", Colors.dim));
|
|
291
|
+
const configured = await configureProvider(settings);
|
|
292
|
+
if (!configured) {
|
|
293
|
+
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
console.log();
|
|
296
|
+
}
|
|
297
|
+
// Run appropriate mode
|
|
298
|
+
if (args.query && !args.interactive) {
|
|
299
|
+
await singleQueryMode(settings, args.query);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
await interactiveMode(settings);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Run main
|
|
306
|
+
main().catch((e) => {
|
|
307
|
+
console.error(color(`Fatal error: ${e.message}`, Colors.red));
|
|
308
|
+
process.exit(1);
|
|
309
|
+
});
|
|
310
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import OpenAI, { AzureOpenAI } from 'openai';
|
|
3
|
+
import { Settings } from './settings.js';
|
|
4
|
+
export type LLMClient = Anthropic | OpenAI | AzureOpenAI;
|
|
5
|
+
/**
|
|
6
|
+
* Create the appropriate LLM client based on settings.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createLLMClient(settings: Settings): LLMClient;
|
|
9
|
+
/**
|
|
10
|
+
* Fetch available models from OpenAI API.
|
|
11
|
+
*/
|
|
12
|
+
export declare function fetchOpenAIModels(apiKey: string): Promise<Array<[string, string]>>;
|
|
13
|
+
/**
|
|
14
|
+
* List available models for all providers.
|
|
15
|
+
*/
|
|
16
|
+
export declare function listAvailableModels(settings: Settings): Promise<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Interactive model selection for a provider.
|
|
19
|
+
*/
|
|
20
|
+
export declare function selectModel(provider: string, current: string, apiKey?: string): Promise<string>;
|
|
21
|
+
/**
|
|
22
|
+
* Configure credentials for a provider.
|
|
23
|
+
* Returns true if configuration was saved, false if cancelled.
|
|
24
|
+
*/
|
|
25
|
+
export declare function configureProvider(settings: Settings, provider?: string): Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAwC,MAAM,eAAe,CAAC;AAI/E,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC;AAEzD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAgB7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CA0CxF;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC7E;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAiFjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/F"}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import OpenAI, { AzureOpenAI } from 'openai';
|
|
3
|
+
import { Provider, KNOWN_MODELS, saveSettings } from './settings.js';
|
|
4
|
+
import { Colors, color, promptInput, CancelledError } from './utils.js';
|
|
5
|
+
import * as readline from 'readline';
|
|
6
|
+
/**
|
|
7
|
+
* Create the appropriate LLM client based on settings.
|
|
8
|
+
*/
|
|
9
|
+
export function createLLMClient(settings) {
|
|
10
|
+
const provider = settings.provider;
|
|
11
|
+
if (provider === Provider.ANTHROPIC) {
|
|
12
|
+
return new Anthropic({ apiKey: settings.anthropic.api_key });
|
|
13
|
+
}
|
|
14
|
+
else if (provider === Provider.OPENAI) {
|
|
15
|
+
return new OpenAI({ apiKey: settings.openai.api_key });
|
|
16
|
+
}
|
|
17
|
+
else if (provider === Provider.AZURE) {
|
|
18
|
+
return new AzureOpenAI({
|
|
19
|
+
apiKey: settings.azure.api_key,
|
|
20
|
+
endpoint: settings.azure.endpoint,
|
|
21
|
+
apiVersion: settings.azure.api_version,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fetch available models from OpenAI API.
|
|
30
|
+
*/
|
|
31
|
+
export async function fetchOpenAIModels(apiKey) {
|
|
32
|
+
try {
|
|
33
|
+
const client = new OpenAI({ apiKey });
|
|
34
|
+
const models = await client.models.list();
|
|
35
|
+
// Filter for chat models (gpt-*)
|
|
36
|
+
const chatModels = [];
|
|
37
|
+
for (const model of models.data) {
|
|
38
|
+
if (model.id.startsWith('gpt-')) {
|
|
39
|
+
// Skip deprecated/fine-tuned models
|
|
40
|
+
if (model.id.includes('instruct') || model.id.includes('ft:')) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
chatModels.push([model.id, 'OpenAI model']);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Sort: newer models first (by name heuristic)
|
|
47
|
+
chatModels.sort((a, b) => {
|
|
48
|
+
const scoreA = a[0].includes('gpt-5')
|
|
49
|
+
? -5
|
|
50
|
+
: a[0].includes('gpt-4o')
|
|
51
|
+
? -4
|
|
52
|
+
: a[0].includes('gpt-4')
|
|
53
|
+
? -3
|
|
54
|
+
: 0;
|
|
55
|
+
const scoreB = b[0].includes('gpt-5')
|
|
56
|
+
? -5
|
|
57
|
+
: b[0].includes('gpt-4o')
|
|
58
|
+
? -4
|
|
59
|
+
: b[0].includes('gpt-4')
|
|
60
|
+
? -3
|
|
61
|
+
: 0;
|
|
62
|
+
if (scoreA !== scoreB)
|
|
63
|
+
return scoreA - scoreB;
|
|
64
|
+
return a[0].localeCompare(b[0]);
|
|
65
|
+
});
|
|
66
|
+
return chatModels.slice(0, 10); // Limit to top 10
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
console.log(color(`Could not fetch models from API: ${e}`, Colors.yellow));
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* List available models for all providers.
|
|
75
|
+
*/
|
|
76
|
+
export async function listAvailableModels(settings) {
|
|
77
|
+
const lines = [];
|
|
78
|
+
for (const provider of [Provider.ANTHROPIC, Provider.OPENAI, Provider.AZURE]) {
|
|
79
|
+
const isCurrent = provider === settings.provider;
|
|
80
|
+
const marker = isCurrent ? color(' (active)', Colors.green) : '';
|
|
81
|
+
lines.push(`\n${color(provider.toUpperCase(), Colors.bold)}${marker}`);
|
|
82
|
+
if (provider === Provider.ANTHROPIC) {
|
|
83
|
+
for (const [modelId, desc] of KNOWN_MODELS.anthropic) {
|
|
84
|
+
const current = modelId === settings.anthropic.model ? ' <--' : '';
|
|
85
|
+
lines.push(` ${modelId}: ${desc}${current}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else if (provider === Provider.OPENAI) {
|
|
89
|
+
if (settings.openai.api_key) {
|
|
90
|
+
const apiModels = await fetchOpenAIModels(settings.openai.api_key);
|
|
91
|
+
if (apiModels.length > 0) {
|
|
92
|
+
lines.push(color(' (from API)', Colors.dim));
|
|
93
|
+
for (const [modelId] of apiModels.slice(0, 8)) {
|
|
94
|
+
const current = modelId === settings.openai.model ? ' <--' : '';
|
|
95
|
+
lines.push(` ${modelId}${current}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
for (const [modelId, desc] of KNOWN_MODELS.openai) {
|
|
100
|
+
const current = modelId === settings.openai.model ? ' <--' : '';
|
|
101
|
+
lines.push(` ${modelId}: ${desc}${current}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
lines.push(color(' (configure API key to see available models)', Colors.dim));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (provider === Provider.AZURE) {
|
|
110
|
+
if (settings.azure.deployment) {
|
|
111
|
+
lines.push(` Deployment: ${settings.azure.deployment}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
lines.push(color(' (deployments are configured per Azure resource)', Colors.dim));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return lines.join('\n');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Interactive model selection for a provider.
|
|
122
|
+
*/
|
|
123
|
+
export async function selectModel(provider, current, apiKey) {
|
|
124
|
+
let models;
|
|
125
|
+
if (provider === Provider.ANTHROPIC) {
|
|
126
|
+
models = KNOWN_MODELS.anthropic;
|
|
127
|
+
}
|
|
128
|
+
else if (provider === Provider.OPENAI) {
|
|
129
|
+
if (apiKey) {
|
|
130
|
+
const apiModels = await fetchOpenAIModels(apiKey);
|
|
131
|
+
models = apiModels.length > 0 ? apiModels : KNOWN_MODELS.openai;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
models = KNOWN_MODELS.openai;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
return current; // Azure uses deployment names
|
|
139
|
+
}
|
|
140
|
+
console.log(color('\nAvailable models:', Colors.dim));
|
|
141
|
+
for (let i = 0; i < models.length; i++) {
|
|
142
|
+
const [modelId, desc] = models[i];
|
|
143
|
+
const marker = modelId === current ? ' (current)' : '';
|
|
144
|
+
console.log(` ${i + 1}. ${modelId}${marker}`);
|
|
145
|
+
if (desc && !desc.startsWith('OpenAI')) {
|
|
146
|
+
console.log(color(` ${desc}`, Colors.dim));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
console.log(` ${models.length + 1}. Enter custom model ID`);
|
|
150
|
+
console.log(color(' q. Cancel', Colors.dim));
|
|
151
|
+
const rl = readline.createInterface({
|
|
152
|
+
input: process.stdin,
|
|
153
|
+
output: process.stdout,
|
|
154
|
+
});
|
|
155
|
+
return new Promise((resolve, reject) => {
|
|
156
|
+
const handleSigint = () => {
|
|
157
|
+
rl.close();
|
|
158
|
+
process.stdout.write('\n');
|
|
159
|
+
reject(new CancelledError());
|
|
160
|
+
};
|
|
161
|
+
rl.once('SIGINT', handleSigint);
|
|
162
|
+
rl.question(`\nChoice [1-${models.length + 1}, Enter for current, q to cancel]: `, async (answer) => {
|
|
163
|
+
rl.removeListener('SIGINT', handleSigint);
|
|
164
|
+
rl.close();
|
|
165
|
+
const choice = answer.trim();
|
|
166
|
+
if (['q', 'quit', 'cancel'].includes(choice.toLowerCase())) {
|
|
167
|
+
reject(new CancelledError());
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!choice) {
|
|
171
|
+
resolve(current);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const idx = parseInt(choice, 10) - 1;
|
|
175
|
+
if (!isNaN(idx) && idx >= 0 && idx < models.length) {
|
|
176
|
+
resolve(models[idx][0]);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
else if (!isNaN(idx) && idx === models.length) {
|
|
180
|
+
try {
|
|
181
|
+
const custom = await promptInput('Enter model ID', current);
|
|
182
|
+
resolve(custom || current);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
reject(new CancelledError());
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// Assume they typed a model ID directly
|
|
190
|
+
if (choice) {
|
|
191
|
+
resolve(choice);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
resolve(current);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Configure credentials for a provider.
|
|
200
|
+
* Returns true if configuration was saved, false if cancelled.
|
|
201
|
+
*/
|
|
202
|
+
export async function configureProvider(settings, provider) {
|
|
203
|
+
try {
|
|
204
|
+
return await _configureProviderImpl(settings, provider);
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
if (e instanceof CancelledError) {
|
|
208
|
+
console.log(color('\nConfiguration cancelled.', Colors.yellow));
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
throw e;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async function _configureProviderImpl(settings, provider) {
|
|
215
|
+
if (!provider) {
|
|
216
|
+
console.log(color('\nSelect LLM Provider:', Colors.bold));
|
|
217
|
+
console.log(' 1. Anthropic (Claude)');
|
|
218
|
+
console.log(' 2. OpenAI (GPT)');
|
|
219
|
+
console.log(' 3. Azure OpenAI');
|
|
220
|
+
console.log(color(' q. Cancel', Colors.dim));
|
|
221
|
+
const rl = readline.createInterface({
|
|
222
|
+
input: process.stdin,
|
|
223
|
+
output: process.stdout,
|
|
224
|
+
});
|
|
225
|
+
provider = await new Promise((resolve, reject) => {
|
|
226
|
+
const handleSigint = () => {
|
|
227
|
+
rl.close();
|
|
228
|
+
process.stdout.write('\n');
|
|
229
|
+
reject(new CancelledError());
|
|
230
|
+
};
|
|
231
|
+
rl.once('SIGINT', handleSigint);
|
|
232
|
+
rl.question('\nChoice [1-3]: ', (answer) => {
|
|
233
|
+
rl.removeListener('SIGINT', handleSigint);
|
|
234
|
+
rl.close();
|
|
235
|
+
const choice = answer.trim();
|
|
236
|
+
if (['q', 'quit', 'cancel'].includes(choice.toLowerCase())) {
|
|
237
|
+
reject(new CancelledError());
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const providerMap = {
|
|
241
|
+
'1': Provider.ANTHROPIC,
|
|
242
|
+
'2': Provider.OPENAI,
|
|
243
|
+
'3': Provider.AZURE,
|
|
244
|
+
};
|
|
245
|
+
resolve(providerMap[choice]);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
if (!provider) {
|
|
249
|
+
console.log(color('Invalid choice.', Colors.red));
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
settings.provider = provider;
|
|
254
|
+
console.log(color(`\nConfiguring ${provider.toUpperCase()}:`, Colors.bold));
|
|
255
|
+
if (provider === Provider.ANTHROPIC) {
|
|
256
|
+
settings.anthropic.api_key = await promptInput('API Key (sk-ant-...)', settings.anthropic.api_key, { secret: true });
|
|
257
|
+
settings.anthropic.model = await selectModel(provider, settings.anthropic.model);
|
|
258
|
+
}
|
|
259
|
+
else if (provider === Provider.OPENAI) {
|
|
260
|
+
settings.openai.api_key = await promptInput('API Key (sk-...)', settings.openai.api_key, { secret: true });
|
|
261
|
+
// Fetch models from API with the new key
|
|
262
|
+
settings.openai.model = await selectModel(provider, settings.openai.model, settings.openai.api_key);
|
|
263
|
+
}
|
|
264
|
+
else if (provider === Provider.AZURE) {
|
|
265
|
+
console.log(color('\nAzure OpenAI requires:', Colors.dim));
|
|
266
|
+
console.log(color(' - Endpoint: Your Azure OpenAI resource endpoint', Colors.dim));
|
|
267
|
+
console.log(color(' - API Key: Your Azure API key', Colors.dim));
|
|
268
|
+
console.log(color(' - Deployment: The name of your model deployment', Colors.dim));
|
|
269
|
+
console.log();
|
|
270
|
+
settings.azure.endpoint = await promptInput('Endpoint (https://xxx.openai.azure.com/)', settings.azure.endpoint);
|
|
271
|
+
// Ensure endpoint ends with /
|
|
272
|
+
if (settings.azure.endpoint && !settings.azure.endpoint.endsWith('/')) {
|
|
273
|
+
settings.azure.endpoint += '/';
|
|
274
|
+
}
|
|
275
|
+
settings.azure.api_key = await promptInput('API Key', settings.azure.api_key, { secret: true });
|
|
276
|
+
settings.azure.api_version = await promptInput('API Version', settings.azure.api_version);
|
|
277
|
+
settings.azure.deployment = await promptInput('Deployment name', settings.azure.deployment);
|
|
278
|
+
}
|
|
279
|
+
saveSettings(settings);
|
|
280
|
+
console.log(color('\nSettings saved!', Colors.green));
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|