@ericdahl.dev/openai-and-claude-usage-report-generator 1.0.3
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 +246 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +103 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +46 -0
- package/dist/index.test.js.map +1 -0
- package/dist/integration.test.d.ts +2 -0
- package/dist/integration.test.d.ts.map +1 -0
- package/dist/integration.test.js +44 -0
- package/dist/integration.test.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/usage-report.d.ts +17 -0
- package/dist/usage-report.d.ts.map +1 -0
- package/dist/usage-report.js +359 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-report.test.d.ts +2 -0
- package/dist/usage-report.test.d.ts.map +1 -0
- package/dist/usage-report.test.js +630 -0
- package/dist/usage-report.test.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Implementation Functions
|
|
3
|
+
*
|
|
4
|
+
* Contains all the core functionality for fetching costs, aggregating data,
|
|
5
|
+
* and generating reports. This module is used by both the CLI and library entry points.
|
|
6
|
+
*/
|
|
7
|
+
import axios from 'axios';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
const DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
|
|
11
|
+
const OPENAI_API_BASE = 'https://api.openai.com/v1';
|
|
12
|
+
const ANTHROPIC_API_BASE = 'https://api.anthropic.com/v1';
|
|
13
|
+
const ANTHROPIC_VERSION = '2023-06-01';
|
|
14
|
+
export function parseDate(dateStr) {
|
|
15
|
+
if (!DATE_PATTERN.test(dateStr)) {
|
|
16
|
+
throw new Error(`Invalid date format: ${dateStr}. Expected YYYY-MM-DD`);
|
|
17
|
+
}
|
|
18
|
+
const date = new Date(dateStr + 'T00:00:00Z');
|
|
19
|
+
if (isNaN(date.getTime())) {
|
|
20
|
+
throw new Error(`Invalid date: ${dateStr}`);
|
|
21
|
+
}
|
|
22
|
+
// Verify the date wasn't adjusted by checking it matches the input
|
|
23
|
+
const isoDate = date.toISOString().split('T')[0];
|
|
24
|
+
if (isoDate !== dateStr) {
|
|
25
|
+
throw new Error(`Invalid date: ${dateStr}`);
|
|
26
|
+
}
|
|
27
|
+
return date;
|
|
28
|
+
}
|
|
29
|
+
export function validateDateRange(start, end) {
|
|
30
|
+
if (end <= start) {
|
|
31
|
+
throw new Error('End date must be after start date');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function toUnixTimestamp(date) {
|
|
35
|
+
return Math.floor(date.getTime() / 1000);
|
|
36
|
+
}
|
|
37
|
+
export function loadConfig(startDate, endDate, provider) {
|
|
38
|
+
if (provider === 'openai') {
|
|
39
|
+
const required = ['OPENAI_ADMIN_KEY', 'OPENAI_ORG_ID', 'OPENAI_PROJECT_ID'];
|
|
40
|
+
for (const v of required) {
|
|
41
|
+
if (!process.env[v])
|
|
42
|
+
throw new Error(`Missing required environment variable: ${v}`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
provider: 'openai',
|
|
46
|
+
startDate,
|
|
47
|
+
endDate,
|
|
48
|
+
apiKey: process.env.OPENAI_ADMIN_KEY,
|
|
49
|
+
orgId: process.env.OPENAI_ORG_ID,
|
|
50
|
+
projectId: process.env.OPENAI_PROJECT_ID,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (!process.env.ANTHROPIC_ADMIN_API_KEY) {
|
|
54
|
+
throw new Error('Missing required environment variable: ANTHROPIC_ADMIN_API_KEY');
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
provider: 'claude',
|
|
58
|
+
startDate,
|
|
59
|
+
endDate,
|
|
60
|
+
apiKey: process.env.ANTHROPIC_ADMIN_API_KEY,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function fetchOpenAICosts(config) {
|
|
64
|
+
const allBuckets = [];
|
|
65
|
+
let nextPage = null;
|
|
66
|
+
const startTime = toUnixTimestamp(parseDate(config.startDate));
|
|
67
|
+
const endTime = toUnixTimestamp(parseDate(config.endDate));
|
|
68
|
+
do {
|
|
69
|
+
const params = {
|
|
70
|
+
start_time: startTime,
|
|
71
|
+
end_time: endTime,
|
|
72
|
+
project_ids: [config.projectId],
|
|
73
|
+
group_by: ['line_item'],
|
|
74
|
+
limit: 180,
|
|
75
|
+
bucket_width: '1d',
|
|
76
|
+
};
|
|
77
|
+
if (nextPage) {
|
|
78
|
+
params.page = nextPage;
|
|
79
|
+
}
|
|
80
|
+
const response = await axios.get(`${OPENAI_API_BASE}/organization/costs`, {
|
|
81
|
+
params,
|
|
82
|
+
headers: {
|
|
83
|
+
'Authorization': `Bearer ${config.apiKey}`,
|
|
84
|
+
'Content-Type': 'application/json',
|
|
85
|
+
'OpenAI-Organization': config.orgId,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
allBuckets.push(...response.data.data);
|
|
89
|
+
nextPage = response.data.has_more ? response.data.next_page : null;
|
|
90
|
+
} while (nextPage);
|
|
91
|
+
return allBuckets;
|
|
92
|
+
}
|
|
93
|
+
function toRfc3339(dateStr) {
|
|
94
|
+
return new Date(dateStr + 'T00:00:00Z').toISOString();
|
|
95
|
+
}
|
|
96
|
+
function claudeBucketToCostBucket(b) {
|
|
97
|
+
const startMs = new Date(b.starting_at).getTime();
|
|
98
|
+
const endMs = new Date(b.ending_at).getTime();
|
|
99
|
+
return {
|
|
100
|
+
object: 'bucket',
|
|
101
|
+
start_time: Math.floor(startMs / 1000),
|
|
102
|
+
end_time: Math.floor(endMs / 1000),
|
|
103
|
+
results: b.results.map((r) => {
|
|
104
|
+
const costUsd = parseFloat(r.amount) / 100;
|
|
105
|
+
const lineItem = (r.description ?? [r.model, r.cost_type].filter(Boolean).join(' ')) || 'unknown';
|
|
106
|
+
return {
|
|
107
|
+
object: 'organization.costs.result',
|
|
108
|
+
amount: { value: costUsd, currency: r.currency },
|
|
109
|
+
line_item: lineItem,
|
|
110
|
+
project_id: null,
|
|
111
|
+
};
|
|
112
|
+
}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
export async function fetchClaudeCosts(config) {
|
|
116
|
+
const allBuckets = [];
|
|
117
|
+
let nextPage = null;
|
|
118
|
+
const startingAt = toRfc3339(config.startDate);
|
|
119
|
+
const endingAt = toRfc3339(config.endDate);
|
|
120
|
+
do {
|
|
121
|
+
const params = {
|
|
122
|
+
starting_at: startingAt,
|
|
123
|
+
ending_at: endingAt,
|
|
124
|
+
bucket_width: '1d',
|
|
125
|
+
limit: 31,
|
|
126
|
+
'group_by[]': ['description'],
|
|
127
|
+
};
|
|
128
|
+
if (nextPage) {
|
|
129
|
+
params.page = nextPage;
|
|
130
|
+
}
|
|
131
|
+
const response = await axios.get(`${ANTHROPIC_API_BASE}/organizations/cost_report`, {
|
|
132
|
+
params,
|
|
133
|
+
headers: {
|
|
134
|
+
'x-api-key': config.apiKey,
|
|
135
|
+
'anthropic-version': ANTHROPIC_VERSION,
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
for (const b of response.data.data) {
|
|
139
|
+
allBuckets.push(claudeBucketToCostBucket(b));
|
|
140
|
+
}
|
|
141
|
+
nextPage = response.data.has_more ? response.data.next_page : null;
|
|
142
|
+
} while (nextPage);
|
|
143
|
+
return allBuckets;
|
|
144
|
+
}
|
|
145
|
+
export function aggregateCosts(buckets, startDate, endDate, projectId) {
|
|
146
|
+
const dailyCosts = [];
|
|
147
|
+
const costsByLineItem = new Map();
|
|
148
|
+
let totalCost = 0;
|
|
149
|
+
for (const bucket of buckets) {
|
|
150
|
+
const date = new Date(bucket.start_time * 1000).toISOString().split('T')[0];
|
|
151
|
+
for (const result of bucket.results) {
|
|
152
|
+
// Ensure cost is a number (API might return string)
|
|
153
|
+
const cost = typeof result.amount.value === 'string'
|
|
154
|
+
? parseFloat(result.amount.value)
|
|
155
|
+
: result.amount.value;
|
|
156
|
+
const lineItem = result.line_item || 'unknown';
|
|
157
|
+
totalCost += cost;
|
|
158
|
+
// Aggregate by line item
|
|
159
|
+
const currentLineItemCost = costsByLineItem.get(lineItem) || 0;
|
|
160
|
+
costsByLineItem.set(lineItem, currentLineItemCost + cost);
|
|
161
|
+
// Daily breakdown
|
|
162
|
+
dailyCosts.push({
|
|
163
|
+
date,
|
|
164
|
+
lineItem,
|
|
165
|
+
cost,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const billingDays = buckets.length;
|
|
170
|
+
const averageDailyCost = billingDays > 0 ? totalCost / billingDays : 0;
|
|
171
|
+
return {
|
|
172
|
+
totalCost,
|
|
173
|
+
startDate,
|
|
174
|
+
endDate,
|
|
175
|
+
projectId,
|
|
176
|
+
dailyCosts,
|
|
177
|
+
costsByLineItem,
|
|
178
|
+
billingDays,
|
|
179
|
+
averageDailyCost,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
export function generateMarkdownReport(aggregated, orgId, provider) {
|
|
183
|
+
const lines = [];
|
|
184
|
+
const title = provider === 'claude' ? 'Claude API Usage Report' : 'OpenAI API Usage Report';
|
|
185
|
+
lines.push(`# ${title}`);
|
|
186
|
+
lines.push('');
|
|
187
|
+
// Format dates
|
|
188
|
+
const startDate = new Date(aggregated.startDate + 'T00:00:00Z');
|
|
189
|
+
const endDate = new Date(aggregated.endDate + 'T00:00:00Z');
|
|
190
|
+
const startFormatted = formatDateForReport(startDate, false);
|
|
191
|
+
const endFormatted = formatDateForReport(endDate, true);
|
|
192
|
+
const generated = new Date().toISOString();
|
|
193
|
+
lines.push(`**Billing Period:** ${startFormatted} - ${endFormatted}`);
|
|
194
|
+
lines.push(`**Project ID:** ${aggregated.projectId}`);
|
|
195
|
+
lines.push(`**Organization:** ${orgId}`);
|
|
196
|
+
lines.push(`**Generated:** ${generated}`);
|
|
197
|
+
lines.push('');
|
|
198
|
+
// Summary
|
|
199
|
+
lines.push('## Summary');
|
|
200
|
+
lines.push('');
|
|
201
|
+
lines.push(`- **Total Cost:** $${aggregated.totalCost.toFixed(2)} USD`);
|
|
202
|
+
lines.push(`- **Billing Days:** ${aggregated.billingDays} days`);
|
|
203
|
+
lines.push(`- **Average Daily Cost:** $${aggregated.averageDailyCost.toFixed(2)} USD`);
|
|
204
|
+
lines.push('');
|
|
205
|
+
// Cost by line item
|
|
206
|
+
if (aggregated.costsByLineItem.size > 0) {
|
|
207
|
+
lines.push('## Cost by Model/Service');
|
|
208
|
+
lines.push('');
|
|
209
|
+
lines.push('| Model/Service | Total Cost | % of Total |');
|
|
210
|
+
lines.push('|---------------|-----------|------------|');
|
|
211
|
+
// Sort by cost descending
|
|
212
|
+
const sortedLineItems = Array.from(aggregated.costsByLineItem.entries())
|
|
213
|
+
.sort((a, b) => b[1] - a[1]);
|
|
214
|
+
for (const [lineItem, cost] of sortedLineItems) {
|
|
215
|
+
const percentage = aggregated.totalCost > 0
|
|
216
|
+
? (cost / aggregated.totalCost * 100).toFixed(1)
|
|
217
|
+
: '0.0';
|
|
218
|
+
lines.push(`| ${lineItem} | $${cost.toFixed(2)} | ${percentage}% |`);
|
|
219
|
+
}
|
|
220
|
+
lines.push('');
|
|
221
|
+
// Daily breakdown
|
|
222
|
+
lines.push('## Daily Usage Breakdown');
|
|
223
|
+
lines.push('');
|
|
224
|
+
lines.push('| Date | Model/Service | Cost (USD) |');
|
|
225
|
+
lines.push('|------|---------------|-----------|');
|
|
226
|
+
for (const daily of aggregated.dailyCosts) {
|
|
227
|
+
lines.push(`| ${daily.date} | ${daily.lineItem} | $${daily.cost.toFixed(2)} |`);
|
|
228
|
+
}
|
|
229
|
+
lines.push('');
|
|
230
|
+
// Daily totals
|
|
231
|
+
lines.push('## Total by Day');
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push('| Date | Total Cost |');
|
|
234
|
+
lines.push('|------|-----------|');
|
|
235
|
+
const dailyTotals = new Map();
|
|
236
|
+
for (const daily of aggregated.dailyCosts) {
|
|
237
|
+
const current = dailyTotals.get(daily.date) || 0;
|
|
238
|
+
dailyTotals.set(daily.date, current + daily.cost);
|
|
239
|
+
}
|
|
240
|
+
const sortedDates = Array.from(dailyTotals.entries()).sort((a, b) => a[0].localeCompare(b[0]));
|
|
241
|
+
for (const [date, total] of sortedDates) {
|
|
242
|
+
lines.push(`| ${date} | $${total.toFixed(2)} |`);
|
|
243
|
+
}
|
|
244
|
+
lines.push('');
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
lines.push('No usage data for this period.');
|
|
248
|
+
lines.push('');
|
|
249
|
+
}
|
|
250
|
+
return lines.join('\n');
|
|
251
|
+
}
|
|
252
|
+
function formatDateForReport(date, includeYear) {
|
|
253
|
+
const month = date.toLocaleDateString('en-US', { month: 'long', timeZone: 'UTC' });
|
|
254
|
+
const day = date.toLocaleDateString('en-US', { day: 'numeric', timeZone: 'UTC' });
|
|
255
|
+
const year = date.toLocaleDateString('en-US', { year: 'numeric', timeZone: 'UTC' });
|
|
256
|
+
if (includeYear) {
|
|
257
|
+
return `${month} ${day}, ${year}`;
|
|
258
|
+
}
|
|
259
|
+
return `${month} ${day}`;
|
|
260
|
+
}
|
|
261
|
+
export function generateCSVReport(aggregated) {
|
|
262
|
+
const lines = [];
|
|
263
|
+
// Header
|
|
264
|
+
lines.push('date,line_item,cost_usd,project_id');
|
|
265
|
+
// Sort by date then line item
|
|
266
|
+
const sortedDailyCosts = [...aggregated.dailyCosts].sort((a, b) => {
|
|
267
|
+
const dateCompare = a.date.localeCompare(b.date);
|
|
268
|
+
if (dateCompare !== 0)
|
|
269
|
+
return dateCompare;
|
|
270
|
+
return a.lineItem.localeCompare(b.lineItem);
|
|
271
|
+
});
|
|
272
|
+
// Data rows
|
|
273
|
+
for (const daily of sortedDailyCosts) {
|
|
274
|
+
const lineItem = escapeCSV(daily.lineItem);
|
|
275
|
+
lines.push(`${daily.date},${lineItem},${daily.cost.toFixed(2)},${aggregated.projectId}`);
|
|
276
|
+
}
|
|
277
|
+
return lines.join('\n') + '\n';
|
|
278
|
+
}
|
|
279
|
+
export function generateJSONReport(aggregated, orgId, provider) {
|
|
280
|
+
// Convert Map to array of objects for JSON serialization
|
|
281
|
+
const costsByLineItem = Array.from(aggregated.costsByLineItem.entries())
|
|
282
|
+
.map(([lineItem, cost]) => ({
|
|
283
|
+
lineItem,
|
|
284
|
+
cost,
|
|
285
|
+
percentage: aggregated.totalCost > 0 ? (cost / aggregated.totalCost * 100) : 0,
|
|
286
|
+
}))
|
|
287
|
+
.sort((a, b) => b.cost - a.cost);
|
|
288
|
+
// Calculate daily totals
|
|
289
|
+
const dailyTotals = new Map();
|
|
290
|
+
for (const daily of aggregated.dailyCosts) {
|
|
291
|
+
const current = dailyTotals.get(daily.date) || 0;
|
|
292
|
+
dailyTotals.set(daily.date, current + daily.cost);
|
|
293
|
+
}
|
|
294
|
+
const dailyTotalsArray = Array.from(dailyTotals.entries())
|
|
295
|
+
.map(([date, total]) => ({ date, total }))
|
|
296
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
297
|
+
const json = {
|
|
298
|
+
metadata: {
|
|
299
|
+
provider,
|
|
300
|
+
generated: new Date().toISOString(),
|
|
301
|
+
billingPeriod: {
|
|
302
|
+
startDate: aggregated.startDate,
|
|
303
|
+
endDate: aggregated.endDate,
|
|
304
|
+
},
|
|
305
|
+
projectId: aggregated.projectId,
|
|
306
|
+
organizationId: orgId,
|
|
307
|
+
},
|
|
308
|
+
summary: {
|
|
309
|
+
totalCost: aggregated.totalCost,
|
|
310
|
+
billingDays: aggregated.billingDays,
|
|
311
|
+
averageDailyCost: aggregated.averageDailyCost,
|
|
312
|
+
},
|
|
313
|
+
costsByLineItem,
|
|
314
|
+
dailyBreakdown: aggregated.dailyCosts
|
|
315
|
+
.map(d => ({
|
|
316
|
+
date: d.date,
|
|
317
|
+
lineItem: d.lineItem,
|
|
318
|
+
cost: d.cost,
|
|
319
|
+
}))
|
|
320
|
+
.sort((a, b) => {
|
|
321
|
+
const dateCompare = a.date.localeCompare(b.date);
|
|
322
|
+
if (dateCompare !== 0)
|
|
323
|
+
return dateCompare;
|
|
324
|
+
return a.lineItem.localeCompare(b.lineItem);
|
|
325
|
+
}),
|
|
326
|
+
dailyTotals: dailyTotalsArray,
|
|
327
|
+
};
|
|
328
|
+
return JSON.stringify(json, null, 2) + '\n';
|
|
329
|
+
}
|
|
330
|
+
function escapeCSV(value) {
|
|
331
|
+
if (value.includes(',') || value.includes('"') || value.includes('\n')) {
|
|
332
|
+
return `"${value.replace(/"/g, '""')}"`;
|
|
333
|
+
}
|
|
334
|
+
return value;
|
|
335
|
+
}
|
|
336
|
+
function ensureReportsDirectory(provider, baseDir) {
|
|
337
|
+
const root = baseDir ?? process.cwd();
|
|
338
|
+
const dir = provider === 'claude' ? 'claude' : 'openai';
|
|
339
|
+
const reportsDir = path.join(root, 'reports', dir);
|
|
340
|
+
if (!fs.existsSync(reportsDir)) {
|
|
341
|
+
fs.mkdirSync(reportsDir, { recursive: true });
|
|
342
|
+
}
|
|
343
|
+
return reportsDir;
|
|
344
|
+
}
|
|
345
|
+
export function writeReports(aggregated, orgId, provider, baseDir) {
|
|
346
|
+
const reportsDir = ensureReportsDirectory(provider, baseDir);
|
|
347
|
+
const baseFilename = `usage-${aggregated.startDate}-to-${aggregated.endDate}`;
|
|
348
|
+
const mdPath = path.join(reportsDir, `${baseFilename}.md`);
|
|
349
|
+
const csvPath = path.join(reportsDir, `${baseFilename}.csv`);
|
|
350
|
+
const jsonPath = path.join(reportsDir, `${baseFilename}.json`);
|
|
351
|
+
const markdown = generateMarkdownReport(aggregated, orgId, provider);
|
|
352
|
+
const csv = generateCSVReport(aggregated);
|
|
353
|
+
const json = generateJSONReport(aggregated, orgId, provider);
|
|
354
|
+
fs.writeFileSync(mdPath, markdown, 'utf8');
|
|
355
|
+
fs.writeFileSync(csvPath, csv, 'utf8');
|
|
356
|
+
fs.writeFileSync(jsonPath, json, 'utf8');
|
|
357
|
+
return { mdPath, csvPath, jsonPath };
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=usage-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-report.js","sourceRoot":"","sources":["../src/usage-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-report.test.d.ts","sourceRoot":"","sources":["../src/usage-report.test.ts"],"names":[],"mappings":""}
|