ai-cost-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 +228 -0
- package/dist/analytics.d.ts +8 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +128 -0
- package/dist/analytics.js.map +1 -0
- package/dist/api.d.ts +11 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +152 -0
- package/dist/api.js.map +1 -0
- package/dist/commands/analyze.d.ts +8 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +210 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +67 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +100 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/models.d.ts +6 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +74 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/optimize.d.ts +6 -0
- package/dist/commands/optimize.d.ts.map +1 -0
- package/dist/commands/optimize.js +129 -0
- package/dist/commands/optimize.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +31 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.optimizeCommand = optimizeCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const ora_1 = __importDefault(require("ora"));
|
|
9
|
+
const cli_table3_1 = __importDefault(require("cli-table3"));
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
const api_1 = require("../api");
|
|
12
|
+
async function optimizeCommand(options) {
|
|
13
|
+
console.log(chalk_1.default.bold.cyan('\nš”ļø AI Cost Guard ā Optimization Recommendations\n'));
|
|
14
|
+
const config = (0, config_1.getConfig)();
|
|
15
|
+
if (!config) {
|
|
16
|
+
console.log(chalk_1.default.red('ā Not connected. Run `ai-cost-cli connect` first.'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const spinner = (0, ora_1.default)('Generating optimization recommendations...').start();
|
|
20
|
+
try {
|
|
21
|
+
const models = await (0, api_1.apiRequest)({ path: '/pricing/models' });
|
|
22
|
+
spinner.succeed('Recommendations ready!\n');
|
|
23
|
+
// Build optimization recommendations based on model pricing
|
|
24
|
+
const optimizations = [];
|
|
25
|
+
// Group models by provider
|
|
26
|
+
const byProvider = {};
|
|
27
|
+
for (const m of models) {
|
|
28
|
+
if (!byProvider[m.provider])
|
|
29
|
+
byProvider[m.provider] = [];
|
|
30
|
+
byProvider[m.provider].push(m);
|
|
31
|
+
}
|
|
32
|
+
// Find cheaper alternatives
|
|
33
|
+
for (const [provider, providerModels] of Object.entries(byProvider)) {
|
|
34
|
+
const sorted = providerModels.sort((a, b) => Number(a.inputPricePerMillion) - Number(b.inputPricePerMillion));
|
|
35
|
+
for (let i = 1; i < sorted.length; i++) {
|
|
36
|
+
const expensive = sorted[i];
|
|
37
|
+
const cheaper = sorted[0];
|
|
38
|
+
const inputSaving = ((Number(expensive.inputPricePerMillion) - Number(cheaper.inputPricePerMillion)) /
|
|
39
|
+
Number(expensive.inputPricePerMillion)) *
|
|
40
|
+
100;
|
|
41
|
+
if (inputSaving > 30) {
|
|
42
|
+
optimizations.push({
|
|
43
|
+
current: `${provider}/${expensive.model}`,
|
|
44
|
+
recommended: `${provider}/${cheaper.model}`,
|
|
45
|
+
currentCost: Number(expensive.inputPricePerMillion),
|
|
46
|
+
newCost: Number(cheaper.inputPricePerMillion),
|
|
47
|
+
saving: `${inputSaving.toFixed(0)}%`,
|
|
48
|
+
reason: 'Lower cost per token for routine tasks',
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Display recommendations
|
|
54
|
+
console.log(chalk_1.default.bold('š MODEL SWITCH RECOMMENDATIONS\n'));
|
|
55
|
+
if (optimizations.length === 0) {
|
|
56
|
+
console.log(chalk_1.default.gray(' No model switch recommendations available.\n'));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const table = new cli_table3_1.default({
|
|
60
|
+
head: [
|
|
61
|
+
chalk_1.default.white('Current'),
|
|
62
|
+
chalk_1.default.white('ā'),
|
|
63
|
+
chalk_1.default.white('Recommended'),
|
|
64
|
+
chalk_1.default.white('Savings'),
|
|
65
|
+
],
|
|
66
|
+
colWidths: [28, 3, 28, 12],
|
|
67
|
+
style: { head: [], border: ['gray'] },
|
|
68
|
+
});
|
|
69
|
+
for (const opt of optimizations.slice(0, 8)) {
|
|
70
|
+
table.push([
|
|
71
|
+
chalk_1.default.red(opt.current),
|
|
72
|
+
chalk_1.default.green('ā'),
|
|
73
|
+
chalk_1.default.green(opt.recommended),
|
|
74
|
+
chalk_1.default.bold.green(opt.saving),
|
|
75
|
+
]);
|
|
76
|
+
}
|
|
77
|
+
console.log(table.toString());
|
|
78
|
+
}
|
|
79
|
+
// General optimization strategies
|
|
80
|
+
console.log(chalk_1.default.bold.green('\nš OPTIMIZATION STRATEGIES\n'));
|
|
81
|
+
const strategies = [
|
|
82
|
+
{
|
|
83
|
+
type: 'PROMPT COMPRESSION',
|
|
84
|
+
icon: 'š',
|
|
85
|
+
desc: 'Remove filler words, redundant instructions, and verbose examples from prompts',
|
|
86
|
+
impact: 'Reduce token usage by 30-60%',
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
type: 'RESPONSE CACHING',
|
|
90
|
+
icon: 'š¾',
|
|
91
|
+
desc: 'Cache identical or similar prompt responses to avoid duplicate API calls',
|
|
92
|
+
impact: 'Reduce costs by 20-50% for repeated queries',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
type: 'MODEL ROUTING',
|
|
96
|
+
icon: 'š',
|
|
97
|
+
desc: 'Route simple tasks to cheaper models (GPT-4o-mini, Claude Haiku) automatically',
|
|
98
|
+
impact: 'Save 70-90% on routine classification/extraction tasks',
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
type: 'BATCH PROCESSING',
|
|
102
|
+
icon: 'š¦',
|
|
103
|
+
desc: 'Group multiple small requests into a single prompt with structured output',
|
|
104
|
+
impact: 'Reduce overhead tokens by 40-60%',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'TOKEN BUDGETING',
|
|
108
|
+
icon: 'š°',
|
|
109
|
+
desc: 'Set max_tokens limits and use stop sequences to prevent runaway responses',
|
|
110
|
+
impact: 'Prevent 10-30% wasted output tokens',
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
for (const s of strategies) {
|
|
114
|
+
console.log(chalk_1.default.cyan(` ${s.icon} ${chalk_1.default.bold(s.type)}`));
|
|
115
|
+
console.log(chalk_1.default.gray(` ${s.desc}`));
|
|
116
|
+
console.log(chalk_1.default.yellow(` Impact: ${s.impact}\n`));
|
|
117
|
+
}
|
|
118
|
+
// SaaS upsell
|
|
119
|
+
console.log(chalk_1.default.bold.yellow('ā'.repeat(60)));
|
|
120
|
+
console.log(chalk_1.default.bold.yellow('\nš Want automatic optimization applied to your project?'));
|
|
121
|
+
console.log(chalk_1.default.yellow(' AI Cost Guard applies these optimizations automatically:'));
|
|
122
|
+
console.log(chalk_1.default.cyan(' https://aicostguard.com\n'));
|
|
123
|
+
console.log(chalk_1.default.bold.yellow('ā'.repeat(60)));
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
spinner.fail(`Failed to generate recommendations: ${err.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../../src/commands/optimize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,kBA0BlC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.statusCommand = statusCommand;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
async function statusCommand() {
|
|
10
|
+
console.log(chalk_1.default.bold.cyan('\nš”ļø AI Cost Guard ā Status\n'));
|
|
11
|
+
const config = (0, config_1.getConfig)();
|
|
12
|
+
if (!config) {
|
|
13
|
+
console.log(chalk_1.default.red('ā Not connected'));
|
|
14
|
+
console.log(chalk_1.default.gray('\nRun `ai-cost-cli connect` to set up your project'));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk_1.default.green('ā
Connected'));
|
|
18
|
+
console.log();
|
|
19
|
+
if (config.apiKey) {
|
|
20
|
+
console.log(chalk_1.default.white(' API Key: ') + chalk_1.default.gray(`${config.apiKey.substring(0, 12)}...${config.apiKey.slice(-4)}`));
|
|
21
|
+
}
|
|
22
|
+
console.log(chalk_1.default.white(' Server: ') + chalk_1.default.gray(config.baseUrl));
|
|
23
|
+
if (config.projectName) {
|
|
24
|
+
console.log(chalk_1.default.white(' Project: ') + chalk_1.default.cyan(config.projectName));
|
|
25
|
+
}
|
|
26
|
+
if (config.email) {
|
|
27
|
+
console.log(chalk_1.default.white(' Email: ') + chalk_1.default.gray(config.email));
|
|
28
|
+
}
|
|
29
|
+
console.log();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";;;;;AAGA,sCA0BC;AA7BD,kDAA0B;AAC1B,sCAAsC;AAE/B,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1H,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
projectId?: string;
|
|
5
|
+
projectName?: string;
|
|
6
|
+
token?: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getConfig(): Config | null;
|
|
10
|
+
export declare function saveConfig(config: Config): void;
|
|
11
|
+
export declare function updateConfig(partial: Partial<Config>): void;
|
|
12
|
+
export declare function clearConfig(): void;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAQzC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAG3D;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getConfig = getConfig;
|
|
37
|
+
exports.saveConfig = saveConfig;
|
|
38
|
+
exports.updateConfig = updateConfig;
|
|
39
|
+
exports.clearConfig = clearConfig;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const CONFIG_DIR = path.join(os.homedir(), '.ai-cost-guard');
|
|
44
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
45
|
+
function getConfig() {
|
|
46
|
+
try {
|
|
47
|
+
if (!fs.existsSync(CONFIG_FILE))
|
|
48
|
+
return null;
|
|
49
|
+
const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');
|
|
50
|
+
return JSON.parse(raw);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function saveConfig(config) {
|
|
57
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
58
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
59
|
+
}
|
|
60
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
61
|
+
}
|
|
62
|
+
function updateConfig(partial) {
|
|
63
|
+
const existing = getConfig() || { apiKey: '', baseUrl: 'http://localhost:4000' };
|
|
64
|
+
saveConfig({ ...existing, ...partial });
|
|
65
|
+
}
|
|
66
|
+
function clearConfig() {
|
|
67
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
68
|
+
fs.unlinkSync(CONFIG_FILE);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,8BAQC;AAED,gCAKC;AAED,oCAGC;AAED,kCAIC;AA1CD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAWzD,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAgB,YAAY,CAAC,OAAwB;IACnD,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACjF,UAAU,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const analyze_1 = require("./commands/analyze");
|
|
6
|
+
const connect_1 = require("./commands/connect");
|
|
7
|
+
const login_1 = require("./commands/login");
|
|
8
|
+
const status_1 = require("./commands/status");
|
|
9
|
+
const optimize_1 = require("./commands/optimize");
|
|
10
|
+
const models_1 = require("./commands/models");
|
|
11
|
+
const analytics_1 = require("./analytics");
|
|
12
|
+
const program = new commander_1.Command();
|
|
13
|
+
program
|
|
14
|
+
.name('ai-cost-cli')
|
|
15
|
+
.description('š”ļø AI Cost Guard ā Analyze and optimize your AI API costs from the terminal')
|
|
16
|
+
.version('1.0.0');
|
|
17
|
+
program
|
|
18
|
+
.command('login')
|
|
19
|
+
.description('Login with your AI Cost Guard account (email/password)')
|
|
20
|
+
.option('-e, --email <email>', 'Email address')
|
|
21
|
+
.option('-u, --url <url>', 'API base URL (default: http://localhost:4000)')
|
|
22
|
+
.action(login_1.loginCommand);
|
|
23
|
+
program
|
|
24
|
+
.command('analyze')
|
|
25
|
+
.description('Analyze AI API costs for a connected project')
|
|
26
|
+
.option('-d, --days <number>', 'Number of days to analyze', '30')
|
|
27
|
+
.option('-m, --model <model>', 'Filter by specific model')
|
|
28
|
+
.option('-p, --provider <provider>', 'Filter by provider (openai, anthropic, google)')
|
|
29
|
+
.action(analyze_1.analyzeCommand);
|
|
30
|
+
program
|
|
31
|
+
.command('connect')
|
|
32
|
+
.description('Connect to your AI Cost Guard project')
|
|
33
|
+
.option('-k, --key <apiKey>', 'API key for your project')
|
|
34
|
+
.option('-u, --url <url>', 'API base URL (default: http://localhost:4000)')
|
|
35
|
+
.action(connect_1.connectCommand);
|
|
36
|
+
program
|
|
37
|
+
.command('status')
|
|
38
|
+
.description('Show connection status and project info')
|
|
39
|
+
.action(status_1.statusCommand);
|
|
40
|
+
program
|
|
41
|
+
.command('optimize')
|
|
42
|
+
.description('Get AI cost optimization recommendations')
|
|
43
|
+
.option('-d, --days <number>', 'Analysis period in days', '30')
|
|
44
|
+
.action(optimize_1.optimizeCommand);
|
|
45
|
+
program
|
|
46
|
+
.command('models')
|
|
47
|
+
.description('List supported AI models and their pricing')
|
|
48
|
+
.option('-p, --provider <provider>', 'Filter by provider')
|
|
49
|
+
.action(models_1.modelsCommand);
|
|
50
|
+
program.parse();
|
|
51
|
+
// Fire-and-forget analytics ā track once per day
|
|
52
|
+
const command = process.argv[2] || 'unknown';
|
|
53
|
+
(0, analytics_1.trackCliUsage)(command).catch(() => { });
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,gDAAoD;AACpD,gDAAoD;AACpD,4CAAgD;AAChD,8CAAkD;AAClD,kDAAsD;AACtD,8CAAkD;AAClD,2CAA4C;AAE5C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,aAAa,CAAC;KACnB,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,MAAM,CAAC,qBAAqB,EAAE,eAAe,CAAC;KAC9C,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,oBAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,EAAE,IAAI,CAAC;KAChE,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;KACzD,MAAM,CAAC,2BAA2B,EAAE,gDAAgD,CAAC;KACrF,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,wBAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC9D,MAAM,CAAC,0BAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,2BAA2B,EAAE,oBAAoB,CAAC;KACzD,MAAM,CAAC,sBAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,iDAAiD;AACjD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AAC7C,IAAA,yBAAa,EAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-cost-cli",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Analyze and optimize your AI/LLM API costs from the terminal. Monitor OpenAI, Anthropic, Gemini spending with real-time dashboards, budget alerts, and cost breakdowns across 50+ models.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"ai-cost": "./dist/index.js",
|
|
7
|
+
"ai-cost-cli": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"files": ["dist", "README.md"],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "ts-node src/index.ts",
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"ai",
|
|
19
|
+
"llm",
|
|
20
|
+
"cost",
|
|
21
|
+
"cli",
|
|
22
|
+
"terminal",
|
|
23
|
+
"openai",
|
|
24
|
+
"gpt",
|
|
25
|
+
"gpt-4",
|
|
26
|
+
"chatgpt",
|
|
27
|
+
"anthropic",
|
|
28
|
+
"claude",
|
|
29
|
+
"gemini",
|
|
30
|
+
"monitor",
|
|
31
|
+
"monitoring",
|
|
32
|
+
"optimization",
|
|
33
|
+
"api-cost",
|
|
34
|
+
"token-tracking",
|
|
35
|
+
"budget",
|
|
36
|
+
"analytics",
|
|
37
|
+
"devtools",
|
|
38
|
+
"developer-tools",
|
|
39
|
+
"ai-ops"
|
|
40
|
+
],
|
|
41
|
+
"author": "AI Cost Guard <sdk@aicostguard.com>",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"homepage": "https://aicostguard.com",
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/crediblearena/ai-cost-guard",
|
|
47
|
+
"directory": "packages/cli"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/crediblearena/ai-cost-guard/issues"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=16.0.0"
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"chalk": "^4.1.2",
|
|
57
|
+
"cli-table3": "^0.6.5",
|
|
58
|
+
"commander": "^12.1.0",
|
|
59
|
+
"inquirer": "^8.2.6",
|
|
60
|
+
"ora": "^5.4.1",
|
|
61
|
+
"posthog-node": "^5.28.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/inquirer": "^8.2.10",
|
|
65
|
+
"@types/node": "^22.0.0",
|
|
66
|
+
"typescript": "^5.7.0"
|
|
67
|
+
}
|
|
68
|
+
}
|