cogeai 1.0.0 → 1.0.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/coge.js +28 -7
- package/package.json +1 -1
- package/providers/index.js +12 -1
package/coge.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import readline from "readline";
|
|
4
4
|
import { execSync } from "child_process";
|
|
5
5
|
import { loadConfig, writeDefaultConfigIfMissing, writeConfig, getConfigPath, defaultConfig } from "./lib/config.js";
|
|
6
|
-
import { getProvider, getConfiguredProviders, getDefaultModels, PROVIDER_MODELS, PROVIDER_FETCH_MODELS, PROVIDER_PAGE_URLS, getAvailableModels } from "./providers/index.js";
|
|
6
|
+
import { getProvider, getConfiguredProviders, getDefaultModels, PROVIDER_MODELS, PROVIDER_FETCH_MODELS, PROVIDER_PAGE_URLS, getAvailableModels, PROVIDER_ENV_KEYS } from "./providers/index.js";
|
|
7
7
|
import { loadBanditState, saveBanditState, updateArm, pickProviders } from "./lib/bandit.js";
|
|
8
8
|
import { recordAction, loadStats, formatStats } from "./lib/stats.js";
|
|
9
9
|
import { normalizeAvailableEntry, sortByCategory, isBlacklisted } from "./lib/model-classify.js";
|
|
@@ -399,16 +399,23 @@ Providers: ${PROVIDERS.join(", ")}`);
|
|
|
399
399
|
const { selected, banditArms } = pickProviders(config, configured, defaultModels, 3);
|
|
400
400
|
if (debug && banditArms) console.log(`Bandit arms: ${banditArms.join(", ")}`);
|
|
401
401
|
|
|
402
|
+
if (selected.length === 0) {
|
|
403
|
+
const envVars = [...new Set(Object.values(PROVIDER_ENV_KEYS).filter(Boolean))].sort().join(", ");
|
|
404
|
+
throw new Error(
|
|
405
|
+
`No provider configured. Set one of: ${envVars} — or run 'coge configure'.`
|
|
406
|
+
);
|
|
407
|
+
}
|
|
408
|
+
|
|
402
409
|
let command;
|
|
403
410
|
let winnerArm;
|
|
404
411
|
const startTime = Date.now();
|
|
405
412
|
|
|
406
|
-
if (selected.length
|
|
407
|
-
|
|
408
|
-
const provider = getProvider(config);
|
|
413
|
+
if (selected.length === 1) {
|
|
414
|
+
const providerName = selected[0];
|
|
415
|
+
const provider = getProvider({ ...config, provider: providerName });
|
|
409
416
|
command = await provider.generateContent(systemPrompt, promptText);
|
|
410
|
-
const model = config.providers?.[
|
|
411
|
-
winnerArm = `${
|
|
417
|
+
const model = config.providers?.[providerName]?.default ?? defaultModels[providerName] ?? config.model ?? "unknown";
|
|
418
|
+
winnerArm = `${providerName}:${model}`;
|
|
412
419
|
} else {
|
|
413
420
|
if (debug) {
|
|
414
421
|
console.log(`Racing providers: ${selected.join(", ")}`);
|
|
@@ -444,6 +451,11 @@ Providers: ${PROVIDERS.join(", ")}`);
|
|
|
444
451
|
}
|
|
445
452
|
|
|
446
453
|
process.stdout.write(`\n${command}\n`);
|
|
454
|
+
|
|
455
|
+
if (!process.stdin.isTTY) {
|
|
456
|
+
process.exit(0);
|
|
457
|
+
}
|
|
458
|
+
|
|
447
459
|
process.stdout.write(`\x1b[2m [Enter] Execute [c] Copy [Esc] Cancel\x1b[0m\n`);
|
|
448
460
|
|
|
449
461
|
process.stdin.setRawMode(true);
|
|
@@ -473,7 +485,16 @@ Providers: ${PROVIDERS.join(", ")}`);
|
|
|
473
485
|
}
|
|
474
486
|
|
|
475
487
|
main().catch((err) => {
|
|
476
|
-
|
|
488
|
+
const msg = err?.message ?? String(err);
|
|
489
|
+
const isConfigError =
|
|
490
|
+
msg.includes("No provider configured") ||
|
|
491
|
+
msg.includes("not set") ||
|
|
492
|
+
(msg.includes("requires ") && msg.includes("export "));
|
|
493
|
+
if (isConfigError) {
|
|
494
|
+
console.error("coge:", msg);
|
|
495
|
+
} else {
|
|
496
|
+
console.error("Error:", err);
|
|
497
|
+
}
|
|
477
498
|
process.exit(1);
|
|
478
499
|
});
|
|
479
500
|
}
|
package/package.json
CHANGED
package/providers/index.js
CHANGED
|
@@ -96,7 +96,8 @@ export function getAvailableModels(providerName) {
|
|
|
96
96
|
return defaultConfig.providers[providerName]?.available ?? [];
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
/** Env var name per provider (null = no key, e.g. ollama). */
|
|
100
|
+
export const PROVIDER_ENV_KEYS = {
|
|
100
101
|
gemini: "COGE_GEMINI_API_KEY",
|
|
101
102
|
openrouter: "COGE_OPENROUTER_API_KEY",
|
|
102
103
|
openai: "COGE_OPENAI_API_KEY",
|
|
@@ -137,6 +138,16 @@ export function getProvider(config) {
|
|
|
137
138
|
}
|
|
138
139
|
const envKey = PROVIDER_ENV_KEYS[name];
|
|
139
140
|
const apiKey = envKey ? process.env[envKey] : undefined;
|
|
141
|
+
if (envKey && !apiKey) {
|
|
142
|
+
const configured = getConfiguredProviders();
|
|
143
|
+
const hint =
|
|
144
|
+
configured.length > 0
|
|
145
|
+
? ` Configured providers: ${configured.join(", ")}. Run 'coge configure' to switch.`
|
|
146
|
+
: ` Run 'coge configure' to set up a provider.`;
|
|
147
|
+
throw new Error(
|
|
148
|
+
`Provider "${name}" requires ${envKey}. Set it: export ${envKey}=your-key.${hint}`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
140
151
|
const model = config.model ?? config.models?.[name];
|
|
141
152
|
return factory(apiKey, model);
|
|
142
153
|
}
|