gemini-cost-tracker
Version:
CLI tool to display token usage and costs for Gemini and Vertex AI
54 lines • 2.26 kB
JavaScript
export class JSONFormatter {
format(data) {
const formattedData = {
period: {
start: data.period.start.toISOString(),
end: data.period.end.toISOString(),
},
summary: {
totalInputTokens: data.summary.totalInputTokens,
totalOutputTokens: data.summary.totalOutputTokens,
totalTokens: data.summary.totalInputTokens + data.summary.totalOutputTokens,
totalCost: data.summary.totalCost,
currency: data.summary.currency,
},
details: data.details.map((detail) => ({
date: detail.date.toISOString(),
service: detail.service,
model: detail.model,
usage: {
id: detail.usage.id,
timestamp: detail.usage.timestamp.toISOString(),
inputTokens: detail.usage.inputTokens,
outputTokens: detail.usage.outputTokens,
totalTokens: detail.usage.inputTokens + detail.usage.outputTokens,
project: detail.usage.project,
region: detail.usage.region,
},
cost: {
inputCost: detail.cost.inputCost,
outputCost: detail.cost.outputCost,
totalCost: detail.cost.totalCost,
currency: detail.cost.currency,
calculatedAt: detail.cost.calculatedAt.toISOString(),
},
})),
metadata: {
generatedAt: new Date().toISOString(),
recordCount: data.details.length,
services: this.getUniqueServices(data),
models: this.getUniqueModels(data),
},
};
return JSON.stringify(formattedData, null, 2);
}
getUniqueServices(data) {
const services = new Set(data.details.map((detail) => detail.service));
return Array.from(services).sort();
}
getUniqueModels(data) {
const models = new Set(data.details.map((detail) => detail.model));
return Array.from(models).sort();
}
}
//# sourceMappingURL=jsonFormatter.js.map