capsule-ai-cli
Version:
The AI Model Orchestrator - Intelligent multi-model workflows with device-locked licensing
53 lines ⢠2.44 kB
JavaScript
import { contextManager } from '../../services/context.js';
import chalk from 'chalk';
export const costCommand = {
name: 'cost',
description: 'Show cost summary',
async execute() {
const allContexts = contextManager.contexts;
let totalCost = 0;
let totalTokens = 0;
let totalMessages = 0;
const providerCosts = {};
const modelCosts = {};
allContexts.forEach((context) => {
totalCost += context.metadata.totalCost || 0;
totalTokens += context.metadata.totalTokens || 0;
totalMessages += context.messages.length;
context.messages.forEach((msg) => {
if (msg.role === 'assistant' && msg.metadata?.cost) {
const provider = msg.metadata.provider || 'unknown';
const model = msg.metadata.model || 'unknown';
providerCosts[provider] = (providerCosts[provider] || 0) + msg.metadata.cost;
modelCosts[model] = (modelCosts[model] || 0) + msg.metadata.cost;
}
});
});
let message = `${chalk.bold('š° Total Cost Summary')}
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Total Cost: $${totalCost.toFixed(4)}
Total Tokens: ${totalTokens.toLocaleString()}
Total Messages: ${totalMessages}
Total Chats: ${allContexts.size}`;
if (Object.keys(providerCosts).length > 0) {
message += '\n\nš Cost by Provider:\n';
Object.entries(providerCosts).sort(([, a], [, b]) => b - a).forEach(([provider, cost]) => {
const percentage = (cost / totalCost * 100).toFixed(1);
message += ` ${provider.padEnd(12)} $${cost.toFixed(4)} (${percentage}%)\n`;
});
}
if (Object.keys(modelCosts).length > 0) {
message += '\nš¤ Cost by Model:\n';
Object.entries(modelCosts).sort(([, a], [, b]) => b - a).slice(0, 5).forEach(([model, cost]) => {
const percentage = (cost / totalCost * 100).toFixed(1);
message += ` ${model.padEnd(12)} $${cost.toFixed(4)} (${percentage}%)\n`;
});
}
message += '\nāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā';
return {
success: true,
message
};
}
};
//# sourceMappingURL=cost.js.map