@frogbotai/plugin-usage-reports 0.29.0 → 0.30.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/dist/client/UsageReports.d.ts.map +1 -1
- package/dist/client/UsageReports.js +244 -47
- package/dist/client/UsageReports.js.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/index.js +110 -63
- package/dist/index.js.map +1 -1
- package/package.json +7 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsageReports.d.ts","sourceRoot":"","sources":["../../src/client/UsageReports.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"UsageReports.d.ts","sourceRoot":"","sources":["../../src/client/UsageReports.tsx"],"names":[],"mappings":"AAEA,OAAO,cAAc,CAAC;AAqDtB,wBAAgB,YAAY,4CAkM3B"}
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import './styles.css';
|
|
4
|
+
import { formatCostUSD } from '@frogbotai/next/client';
|
|
4
5
|
import { useConfig } from '@payloadcms/ui';
|
|
5
6
|
import { useEffect, useState } from 'react';
|
|
6
7
|
const presets = [
|
|
7
|
-
{
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
{
|
|
9
|
+
label: 'Last 7 days',
|
|
10
|
+
days: 7
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
label: 'Last 30 days',
|
|
14
|
+
days: 30
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
label: 'Last 90 days',
|
|
18
|
+
days: 90
|
|
19
|
+
}
|
|
10
20
|
];
|
|
11
21
|
function rangeForDays(days, label) {
|
|
12
22
|
const to = new Date();
|
|
13
23
|
const from = new Date(to);
|
|
14
24
|
from.setUTCDate(from.getUTCDate() - days);
|
|
15
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
from: from.toISOString(),
|
|
27
|
+
to: to.toISOString(),
|
|
28
|
+
label
|
|
29
|
+
};
|
|
16
30
|
}
|
|
17
31
|
function dateInput(value) {
|
|
18
32
|
return value.slice(0, 10);
|
|
@@ -21,22 +35,19 @@ function customRange(from, to) {
|
|
|
21
35
|
return {
|
|
22
36
|
from: new Date(`${from}T00:00:00.000Z`).toISOString(),
|
|
23
37
|
to: new Date(`${to}T23:59:59.999Z`).toISOString(),
|
|
24
|
-
label: `${from} - ${to}
|
|
38
|
+
label: `${from} - ${to}`
|
|
25
39
|
};
|
|
26
40
|
}
|
|
27
41
|
function formatTokens(value) {
|
|
28
|
-
if (value >= 1_000_000_000)
|
|
29
|
-
|
|
30
|
-
if (value >=
|
|
31
|
-
return `${(value / 1_000_000).toFixed(1)}M`;
|
|
32
|
-
if (value >= 1_000)
|
|
33
|
-
return `${(value / 1_000).toFixed(1)}K`;
|
|
42
|
+
if (value >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;
|
|
43
|
+
if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;
|
|
44
|
+
if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`;
|
|
34
45
|
return value.toLocaleString();
|
|
35
46
|
}
|
|
36
47
|
export function UsageReports() {
|
|
37
48
|
const { config } = useConfig();
|
|
38
49
|
const [groupBy, setGroupBy] = useState('model');
|
|
39
|
-
const [range, setRange] = useState(()
|
|
50
|
+
const [range, setRange] = useState(()=>rangeForDays(30, 'Last 30 days'));
|
|
40
51
|
const [showCustom, setShowCustom] = useState(false);
|
|
41
52
|
const [customFrom, setCustomFrom] = useState(dateInput(range.from));
|
|
42
53
|
const [customTo, setCustomTo] = useState(dateInput(range.to));
|
|
@@ -45,70 +56,256 @@ export function UsageReports() {
|
|
|
45
56
|
const [loading, setLoading] = useState(true);
|
|
46
57
|
const [sortField, setSortField] = useState(groupBy === 'model' ? 'totalTokens' : 'costUSD');
|
|
47
58
|
const [ascending, setAscending] = useState(false);
|
|
48
|
-
useEffect(()
|
|
59
|
+
useEffect(()=>{
|
|
49
60
|
const controller = new AbortController();
|
|
50
|
-
const params = new URLSearchParams({
|
|
61
|
+
const params = new URLSearchParams({
|
|
62
|
+
groupBy,
|
|
63
|
+
from: range.from,
|
|
64
|
+
to: range.to
|
|
65
|
+
});
|
|
51
66
|
setLoading(true);
|
|
52
67
|
setError(undefined);
|
|
53
|
-
fetch(`${config.routes.api}/usage/report?${params}`, {
|
|
54
|
-
.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
setReport(
|
|
58
|
-
})
|
|
59
|
-
.catch((reason) => {
|
|
68
|
+
fetch(`${config.routes.api}/usage/report?${params}`, {
|
|
69
|
+
signal: controller.signal
|
|
70
|
+
}).then(async (response)=>{
|
|
71
|
+
if (!response.ok) throw new Error(`${response.status} ${response.statusText}`);
|
|
72
|
+
setReport(await response.json());
|
|
73
|
+
}).catch((reason)=>{
|
|
60
74
|
if (!controller.signal.aborted) {
|
|
61
75
|
setError(reason instanceof Error ? reason.message : 'Failed to load usage report');
|
|
62
76
|
}
|
|
63
|
-
})
|
|
64
|
-
.
|
|
65
|
-
if (!controller.signal.aborted)
|
|
66
|
-
setLoading(false);
|
|
77
|
+
}).finally(()=>{
|
|
78
|
+
if (!controller.signal.aborted) setLoading(false);
|
|
67
79
|
});
|
|
68
|
-
return ()
|
|
69
|
-
}, [
|
|
70
|
-
|
|
80
|
+
return ()=>controller.abort();
|
|
81
|
+
}, [
|
|
82
|
+
config.routes.api,
|
|
83
|
+
groupBy,
|
|
84
|
+
range
|
|
85
|
+
]);
|
|
86
|
+
const rows = [
|
|
87
|
+
...report?.rows ?? []
|
|
88
|
+
].sort((a, b)=>{
|
|
71
89
|
const left = a[sortField];
|
|
72
90
|
const right = b[sortField];
|
|
73
91
|
const result = typeof left === 'string' ? left.localeCompare(String(right)) : left - Number(right);
|
|
74
92
|
return ascending ? result : -result;
|
|
75
93
|
});
|
|
76
94
|
const columns = [
|
|
77
|
-
{
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
95
|
+
{
|
|
96
|
+
field: 'label',
|
|
97
|
+
label: groupBy === 'model' ? 'Model' : 'User',
|
|
98
|
+
value: (row)=>row.label
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
field: 'requestCount',
|
|
102
|
+
label: 'Requests',
|
|
103
|
+
value: (row)=>row.requestCount.toLocaleString()
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
field: 'totalTokens',
|
|
107
|
+
label: 'Total Tokens',
|
|
108
|
+
value: (row)=>formatTokens(row.totalTokens)
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
field: 'inputTokens',
|
|
112
|
+
label: 'Input',
|
|
113
|
+
value: (row)=>formatTokens(row.inputTokens)
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
field: 'outputTokens',
|
|
117
|
+
label: 'Output',
|
|
118
|
+
value: (row)=>formatTokens(row.outputTokens)
|
|
119
|
+
},
|
|
82
120
|
{
|
|
83
121
|
field: 'cachedInputTokens',
|
|
84
122
|
label: 'Cached',
|
|
85
|
-
value: (row)
|
|
123
|
+
value: (row)=>formatTokens(row.cachedInputTokens)
|
|
86
124
|
},
|
|
87
125
|
{
|
|
88
126
|
field: 'reasoningTokens',
|
|
89
127
|
label: 'Reasoning',
|
|
90
|
-
value: (row)
|
|
128
|
+
value: (row)=>formatTokens(row.reasoningTokens)
|
|
91
129
|
},
|
|
92
|
-
{
|
|
130
|
+
{
|
|
131
|
+
field: 'costUSD',
|
|
132
|
+
label: 'Cost',
|
|
133
|
+
value: (row)=>formatCostUSD(row.costUSD)
|
|
134
|
+
}
|
|
93
135
|
];
|
|
94
136
|
function sort(field) {
|
|
95
|
-
if (sortField === field)
|
|
96
|
-
setAscending(!ascending);
|
|
137
|
+
if (sortField === field) setAscending(!ascending);
|
|
97
138
|
else {
|
|
98
139
|
setSortField(field);
|
|
99
140
|
setAscending(false);
|
|
100
141
|
}
|
|
101
142
|
}
|
|
102
|
-
return
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
143
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
144
|
+
className: "usage-reports",
|
|
145
|
+
children: [
|
|
146
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
147
|
+
className: "usage-reports__header",
|
|
148
|
+
children: [
|
|
149
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
150
|
+
children: [
|
|
151
|
+
/*#__PURE__*/ _jsx("h1", {
|
|
152
|
+
children: "Usage Analytics"
|
|
153
|
+
}),
|
|
154
|
+
/*#__PURE__*/ _jsx("p", {
|
|
155
|
+
children: range.label
|
|
156
|
+
})
|
|
157
|
+
]
|
|
158
|
+
}),
|
|
159
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
160
|
+
className: "usage-reports__ranges",
|
|
161
|
+
children: [
|
|
162
|
+
presets.map((preset)=>/*#__PURE__*/ _jsx("button", {
|
|
163
|
+
type: "button",
|
|
164
|
+
onClick: ()=>{
|
|
165
|
+
setShowCustom(false);
|
|
166
|
+
setRange(rangeForDays(preset.days, preset.label));
|
|
167
|
+
},
|
|
168
|
+
children: preset.label
|
|
169
|
+
}, preset.days)),
|
|
170
|
+
/*#__PURE__*/ _jsx("button", {
|
|
171
|
+
type: "button",
|
|
172
|
+
onClick: ()=>setShowCustom(!showCustom),
|
|
173
|
+
children: "Custom"
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
})
|
|
177
|
+
]
|
|
178
|
+
}),
|
|
179
|
+
showCustom && /*#__PURE__*/ _jsxs("div", {
|
|
180
|
+
className: "usage-reports__custom",
|
|
181
|
+
children: [
|
|
182
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
183
|
+
children: [
|
|
184
|
+
"From",
|
|
185
|
+
/*#__PURE__*/ _jsx("input", {
|
|
186
|
+
type: "date",
|
|
187
|
+
value: customFrom,
|
|
188
|
+
onChange: (event)=>setCustomFrom(event.target.value)
|
|
189
|
+
})
|
|
190
|
+
]
|
|
191
|
+
}),
|
|
192
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
193
|
+
children: [
|
|
194
|
+
"To",
|
|
195
|
+
/*#__PURE__*/ _jsx("input", {
|
|
196
|
+
type: "date",
|
|
197
|
+
value: customTo,
|
|
198
|
+
onChange: (event)=>setCustomTo(event.target.value)
|
|
199
|
+
})
|
|
200
|
+
]
|
|
201
|
+
}),
|
|
202
|
+
/*#__PURE__*/ _jsx("button", {
|
|
203
|
+
type: "button",
|
|
204
|
+
disabled: !customFrom || !customTo || customFrom > customTo,
|
|
205
|
+
onClick: ()=>{
|
|
106
206
|
setRange(customRange(customFrom, customTo));
|
|
107
207
|
setShowCustom(false);
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
208
|
+
},
|
|
209
|
+
children: "Apply"
|
|
210
|
+
})
|
|
211
|
+
]
|
|
212
|
+
}),
|
|
213
|
+
/*#__PURE__*/ _jsx("nav", {
|
|
214
|
+
className: "usage-reports__tabs",
|
|
215
|
+
"aria-label": "Usage report",
|
|
216
|
+
children: [
|
|
217
|
+
'model',
|
|
218
|
+
'user'
|
|
219
|
+
].map((group)=>/*#__PURE__*/ _jsx("button", {
|
|
220
|
+
className: groupBy === group ? 'active' : '',
|
|
221
|
+
type: "button",
|
|
222
|
+
onClick: ()=>{
|
|
223
|
+
setGroupBy(group);
|
|
224
|
+
setSortField(group === 'model' ? 'totalTokens' : 'costUSD');
|
|
225
|
+
setAscending(false);
|
|
226
|
+
},
|
|
227
|
+
children: group === 'model' ? 'Models' : 'Users'
|
|
228
|
+
}, group))
|
|
229
|
+
}),
|
|
230
|
+
/*#__PURE__*/ _jsxs("section", {
|
|
231
|
+
className: "usage-reports__card",
|
|
232
|
+
children: [
|
|
233
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
234
|
+
className: "usage-reports__totals",
|
|
235
|
+
children: [
|
|
236
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
237
|
+
children: [
|
|
238
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
239
|
+
children: report?.totals.requestCount.toLocaleString() ?? '0'
|
|
240
|
+
}),
|
|
241
|
+
" requests"
|
|
242
|
+
]
|
|
243
|
+
}),
|
|
244
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
245
|
+
children: [
|
|
246
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
247
|
+
children: formatTokens(report?.totals.totalTokens ?? 0)
|
|
248
|
+
}),
|
|
249
|
+
" tokens"
|
|
250
|
+
]
|
|
251
|
+
}),
|
|
252
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
253
|
+
children: [
|
|
254
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
255
|
+
children: formatCostUSD(report?.totals.costUSD)
|
|
256
|
+
}),
|
|
257
|
+
" cost"
|
|
258
|
+
]
|
|
259
|
+
})
|
|
260
|
+
]
|
|
261
|
+
}),
|
|
262
|
+
loading && /*#__PURE__*/ _jsx("p", {
|
|
263
|
+
className: "usage-reports__state",
|
|
264
|
+
children: "Loading usage..."
|
|
265
|
+
}),
|
|
266
|
+
error && /*#__PURE__*/ _jsxs("p", {
|
|
267
|
+
className: "usage-reports__state usage-reports__error",
|
|
268
|
+
children: [
|
|
269
|
+
"Failed to load: ",
|
|
270
|
+
error
|
|
271
|
+
]
|
|
272
|
+
}),
|
|
273
|
+
!loading && !error && rows.length === 0 && /*#__PURE__*/ _jsx("p", {
|
|
274
|
+
className: "usage-reports__state",
|
|
275
|
+
children: "No usage in this date range."
|
|
276
|
+
}),
|
|
277
|
+
!loading && !error && rows.length > 0 && /*#__PURE__*/ _jsx("div", {
|
|
278
|
+
className: "usage-reports__table-wrap",
|
|
279
|
+
children: /*#__PURE__*/ _jsxs("table", {
|
|
280
|
+
children: [
|
|
281
|
+
/*#__PURE__*/ _jsx("thead", {
|
|
282
|
+
children: /*#__PURE__*/ _jsx("tr", {
|
|
283
|
+
children: columns.map((column)=>/*#__PURE__*/ _jsx("th", {
|
|
284
|
+
children: /*#__PURE__*/ _jsxs("button", {
|
|
285
|
+
type: "button",
|
|
286
|
+
onClick: ()=>sort(column.field),
|
|
287
|
+
children: [
|
|
288
|
+
column.label,
|
|
289
|
+
sortField === column.field ? ascending ? ' ▲' : ' ▼' : ''
|
|
290
|
+
]
|
|
291
|
+
})
|
|
292
|
+
}, column.field))
|
|
293
|
+
})
|
|
294
|
+
}),
|
|
295
|
+
/*#__PURE__*/ _jsx("tbody", {
|
|
296
|
+
children: rows.map((row)=>/*#__PURE__*/ _jsx("tr", {
|
|
297
|
+
children: columns.map((column)=>/*#__PURE__*/ _jsx("td", {
|
|
298
|
+
children: column.value(row)
|
|
299
|
+
}, column.field))
|
|
300
|
+
}, row.key))
|
|
301
|
+
})
|
|
302
|
+
]
|
|
303
|
+
})
|
|
304
|
+
})
|
|
305
|
+
]
|
|
306
|
+
})
|
|
307
|
+
]
|
|
308
|
+
});
|
|
113
309
|
}
|
|
310
|
+
|
|
114
311
|
//# sourceMappingURL=UsageReports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/client/UsageReports.tsx"],"names":["formatCostUSD","useConfig","useEffect","useState","presets","label","days","rangeForDays","to","Date","from","setUTCDate","getUTCDate","toISOString","dateInput","value","slice","customRange","formatTokens","toFixed","toLocaleString","UsageReports","config","groupBy","setGroupBy","range","setRange","showCustom","setShowCustom","customFrom","setCustomFrom","customTo","setCustomTo","report","setReport","error","setError","loading","setLoading","sortField","setSortField","ascending","setAscending","controller","AbortController","params","URLSearchParams","undefined","fetch","routes","api","signal","then","response","ok","Error","status","statusText","json","catch","reason","aborted","message","finally","abort","rows","sort","a","b","left","right","result","localeCompare","String","Number","columns","field","row","requestCount","totalTokens","inputTokens","outputTokens","cachedInputTokens","reasoningTokens","costUSD","div","className","header","h1","p","map","preset","button","type","onClick","input","onChange","event","target","disabled","nav","aria-label","group","section","span","strong","totals","length","table","thead","tr","column","th","tbody","td","key"],"mappings":"AAAA;;AAEA,OAAO,eAAe;AAEtB,SAASA,aAAa,QAAQ,yBAAyB;AACvD,SAASC,SAAS,QAAQ,iBAAiB;AAC3C,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAiB5C,MAAMC,UAAU;IACd;QAAEC,OAAO;QAAeC,MAAM;IAAE;IAChC;QAAED,OAAO;QAAgBC,MAAM;IAAG;IAClC;QAAED,OAAO;QAAgBC,MAAM;IAAG;CACnC;AAED,SAASC,aAAaD,IAAY,EAAED,KAAa;IAC/C,MAAMG,KAAK,IAAIC;IACf,MAAMC,OAAO,IAAID,KAAKD;IACtBE,KAAKC,UAAU,CAACD,KAAKE,UAAU,KAAKN;IACpC,OAAO;QAAEI,MAAMA,KAAKG,WAAW;QAAIL,IAAIA,GAAGK,WAAW;QAAIR;IAAM;AACjE;AAEA,SAASS,UAAUC,KAAa;IAC9B,OAAOA,MAAMC,KAAK,CAAC,GAAG;AACxB;AAEA,SAASC,YAAYP,IAAY,EAAEF,EAAU;IAC3C,OAAO;QACLE,MAAM,IAAID,KAAK,GAAGC,KAAK,cAAc,CAAC,EAAEG,WAAW;QACnDL,IAAI,IAAIC,KAAK,GAAGD,GAAG,cAAc,CAAC,EAAEK,WAAW;QAC/CR,OAAO,GAAGK,KAAK,GAAG,EAAEF,IAAI;IAC1B;AACF;AAEA,SAASU,aAAaH,KAAa;IACjC,IAAIA,SAAS,eAAe,OAAO,GAAG,AAACA,CAAAA,QAAQ,aAAY,EAAGI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3E,IAAIJ,SAAS,WAAW,OAAO,GAAG,AAACA,CAAAA,QAAQ,SAAQ,EAAGI,OAAO,CAAC,GAAG,CAAC,CAAC;IACnE,IAAIJ,SAAS,OAAO,OAAO,GAAG,AAACA,CAAAA,QAAQ,KAAI,EAAGI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAOJ,MAAMK,cAAc;AAC7B;AAEA,OAAO,SAASC;IACd,MAAM,EAAEC,MAAM,EAAE,GAAGrB;IACnB,MAAM,CAACsB,SAASC,WAAW,GAAGrB,SAAsD;IACpF,MAAM,CAACsB,OAAOC,SAAS,GAAGvB,SAAoB,IAAMI,aAAa,IAAI;IACrE,MAAM,CAACoB,YAAYC,cAAc,GAAGzB,SAAS;IAC7C,MAAM,CAAC0B,YAAYC,cAAc,GAAG3B,SAASW,UAAUW,MAAMf,IAAI;IACjE,MAAM,CAACqB,UAAUC,YAAY,GAAG7B,SAASW,UAAUW,MAAMjB,EAAE;IAC3D,MAAM,CAACyB,QAAQC,UAAU,GAAG/B;IAC5B,MAAM,CAACgC,OAAOC,SAAS,GAAGjC;IAC1B,MAAM,CAACkC,SAASC,WAAW,GAAGnC,SAAS;IACvC,MAAM,CAACoC,WAAWC,aAAa,GAAGrC,SAChCoB,YAAY,UAAU,gBAAgB;IAExC,MAAM,CAACkB,WAAWC,aAAa,GAAGvC,SAAS;IAE3CD,UAAU;QACR,MAAMyC,aAAa,IAAIC;QACvB,MAAMC,SAAS,IAAIC,gBAAgB;YAAEvB;YAASb,MAAMe,MAAMf,IAAI;YAAEF,IAAIiB,MAAMjB,EAAE;QAAC;QAC7E8B,WAAW;QACXF,SAASW;QACTC,MAAM,GAAG1B,OAAO2B,MAAM,CAACC,GAAG,CAAC,cAAc,EAAEL,QAAQ,EAAE;YAAEM,QAAQR,WAAWQ,MAAM;QAAC,GAC9EC,IAAI,CAAC,OAAOC;YACX,IAAI,CAACA,SAASC,EAAE,EAAE,MAAM,IAAIC,MAAM,GAAGF,SAASG,MAAM,CAAC,CAAC,EAAEH,SAASI,UAAU,EAAE;YAC7EvB,UAAW,MAAMmB,SAASK,IAAI;QAChC,GACCC,KAAK,CAAC,CAACC;YACN,IAAI,CAACjB,WAAWQ,MAAM,CAACU,OAAO,EAAE;gBAC9BzB,SAASwB,kBAAkBL,QAAQK,OAAOE,OAAO,GAAG;YACtD;QACF,GACCC,OAAO,CAAC;YACP,IAAI,CAACpB,WAAWQ,MAAM,CAACU,OAAO,EAAEvB,WAAW;QAC7C;QACF,OAAO,IAAMK,WAAWqB,KAAK;IAC/B,GAAG;QAAC1C,OAAO2B,MAAM,CAACC,GAAG;QAAE3B;QAASE;KAAM;IAEtC,MAAMwC,OAAO;WAAKhC,QAAQgC,QAAQ,EAAE;KAAE,CAACC,IAAI,CAAC,CAACC,GAAGC;QAC9C,MAAMC,OAAOF,CAAC,CAAC5B,UAAU;QACzB,MAAM+B,QAAQF,CAAC,CAAC7B,UAAU;QAC1B,MAAMgC,SACJ,OAAOF,SAAS,WAAWA,KAAKG,aAAa,CAACC,OAAOH,UAAUD,OAAOK,OAAOJ;QAC/E,OAAO7B,YAAY8B,SAAS,CAACA;IAC/B;IACA,MAAMI,UAID;QACH;YAAEC,OAAO;YAASvE,OAAOkB,YAAY,UAAU,UAAU;YAAQR,OAAO,CAAC8D,MAAQA,IAAIxE,KAAK;QAAC;QAC3F;YAAEuE,OAAO;YAAgBvE,OAAO;YAAYU,OAAO,CAAC8D,MAAQA,IAAIC,YAAY,CAAC1D,cAAc;QAAG;QAC9F;YAAEwD,OAAO;YAAevE,OAAO;YAAgBU,OAAO,CAAC8D,MAAQ3D,aAAa2D,IAAIE,WAAW;QAAE;QAC7F;YAAEH,OAAO;YAAevE,OAAO;YAASU,OAAO,CAAC8D,MAAQ3D,aAAa2D,IAAIG,WAAW;QAAE;QACtF;YAAEJ,OAAO;YAAgBvE,OAAO;YAAUU,OAAO,CAAC8D,MAAQ3D,aAAa2D,IAAII,YAAY;QAAE;QACzF;YACEL,OAAO;YACPvE,OAAO;YACPU,OAAO,CAAC8D,MAAQ3D,aAAa2D,IAAIK,iBAAiB;QACpD;QACA;YACEN,OAAO;YACPvE,OAAO;YACPU,OAAO,CAAC8D,MAAQ3D,aAAa2D,IAAIM,eAAe;QAClD;QACA;YAAEP,OAAO;YAAWvE,OAAO;YAAQU,OAAO,CAAC8D,MAAQ7E,cAAc6E,IAAIO,OAAO;QAAE;KAC/E;IAED,SAASlB,KAAKU,KAAgB;QAC5B,IAAIrC,cAAcqC,OAAOlC,aAAa,CAACD;aAClC;YACHD,aAAaoC;YACblC,aAAa;QACf;IACF;IAEA,qBACE,MAAC2C;QAAIC,WAAU;;0BACb,MAACC;gBAAOD,WAAU;;kCAChB,MAACD;;0CACC,KAACG;0CAAG;;0CACJ,KAACC;0CAAGhE,MAAMpB,KAAK;;;;kCAEjB,MAACgF;wBAAIC,WAAU;;4BACZlF,QAAQsF,GAAG,CAAC,CAACC,uBACZ,KAACC;oCAECC,MAAK;oCACLC,SAAS;wCACPlE,cAAc;wCACdF,SAASnB,aAAaoF,OAAOrF,IAAI,EAAEqF,OAAOtF,KAAK;oCACjD;8CAECsF,OAAOtF,KAAK;mCAPRsF,OAAOrF,IAAI;0CAUpB,KAACsF;gCAAOC,MAAK;gCAASC,SAAS,IAAMlE,cAAc,CAACD;0CAAa;;;;;;YAKpEA,4BACC,MAAC0D;gBAAIC,WAAU;;kCACb,MAACjF;;4BAAM;0CAEL,KAAC0F;gCACCF,MAAK;gCACL9E,OAAOc;gCACPmE,UAAU,CAACC,QAAUnE,cAAcmE,MAAMC,MAAM,CAACnF,KAAK;;;;kCAGzD,MAACV;;4BAAM;0CAEL,KAAC0F;gCACCF,MAAK;gCACL9E,OAAOgB;gCACPiE,UAAU,CAACC,QAAUjE,YAAYiE,MAAMC,MAAM,CAACnF,KAAK;;;;kCAGvD,KAAC6E;wBACCC,MAAK;wBACLM,UAAU,CAACtE,cAAc,CAACE,YAAYF,aAAaE;wBACnD+D,SAAS;4BACPpE,SAAST,YAAYY,YAAYE;4BACjCH,cAAc;wBAChB;kCACD;;;;0BAKL,KAACwE;gBAAId,WAAU;gBAAsBe,cAAW;0BAC7C,AAAC;oBAAC;oBAAS;iBAAO,CAAWX,GAAG,CAAC,CAACY,sBACjC,KAACV;wBACCN,WAAW/D,YAAY+E,QAAQ,WAAW;wBAE1CT,MAAK;wBACLC,SAAS;4BACPtE,WAAW8E;4BACX9D,aAAa8D,UAAU,UAAU,gBAAgB;4BACjD5D,aAAa;wBACf;kCAEC4D,UAAU,UAAU,WAAW;uBAR3BA;;0BAYX,MAACC;gBAAQjB,WAAU;;kCACjB,MAACD;wBAAIC,WAAU;;0CACb,MAACkB;;kDACC,KAACC;kDAAQxE,QAAQyE,OAAO5B,aAAa1D,oBAAoB;;oCAAa;;;0CAExE,MAACoF;;kDACC,KAACC;kDAAQvF,aAAae,QAAQyE,OAAO3B,eAAe;;oCAAY;;;0CAElE,MAACyB;;kDACC,KAACC;kDAAQzG,cAAciC,QAAQyE,OAAOtB;;oCAAkB;;;;;oBAG3D/C,yBAAW,KAACoD;wBAAEH,WAAU;kCAAuB;;oBAC/CnD,uBACC,MAACsD;wBAAEH,WAAU;;4BAA4C;4BAAiBnD;;;oBAE3E,CAACE,WAAW,CAACF,SAAS8B,KAAK0C,MAAM,KAAK,mBACrC,KAAClB;wBAAEH,WAAU;kCAAuB;;oBAErC,CAACjD,WAAW,CAACF,SAAS8B,KAAK0C,MAAM,GAAG,mBACnC,KAACtB;wBAAIC,WAAU;kCACb,cAAA,MAACsB;;8CACC,KAACC;8CACC,cAAA,KAACC;kDACEnC,QAAQe,GAAG,CAAC,CAACqB,uBACZ,KAACC;0DACC,cAAA,MAACpB;oDAAOC,MAAK;oDAASC,SAAS,IAAM5B,KAAK6C,OAAOnC,KAAK;;wDACnDmC,OAAO1G,KAAK;wDACZkC,cAAcwE,OAAOnC,KAAK,GAAInC,YAAY,OAAO,OAAQ;;;+CAHrDsE,OAAOnC,KAAK;;;8CAS3B,KAACqC;8CACEhD,KAAKyB,GAAG,CAAC,CAACb,oBACT,KAACiC;sDACEnC,QAAQe,GAAG,CAAC,CAACqB,uBACZ,KAACG;8DAAuBH,OAAOhG,KAAK,CAAC8D;mDAA5BkC,OAAOnC,KAAK;2CAFhBC,IAAIsC,GAAG;;;;;;;;;AAalC","file":"UsageReports.js"}
|
package/dist/client.js
CHANGED
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/client.ts"],"names":["UsageReports"],"mappings":"AAAA,SAASA,YAAY,QAAQ,2BAA2B","file":"client.js"}
|
package/dist/index.js
CHANGED
|
@@ -1,29 +1,38 @@
|
|
|
1
|
-
const loggedIn = ({ req })
|
|
1
|
+
const loggedIn = ({ req })=>Boolean(req.user);
|
|
2
2
|
function idAndLabel(value) {
|
|
3
3
|
if (typeof value === 'string' || typeof value === 'number') {
|
|
4
4
|
const key = String(value);
|
|
5
|
-
return {
|
|
5
|
+
return {
|
|
6
|
+
key,
|
|
7
|
+
label: key
|
|
8
|
+
};
|
|
6
9
|
}
|
|
7
|
-
if (!value || typeof value !== 'object')
|
|
8
|
-
return;
|
|
10
|
+
if (!value || typeof value !== 'object') return;
|
|
9
11
|
const record = value;
|
|
10
|
-
if (record.id === undefined)
|
|
11
|
-
return;
|
|
12
|
+
if (record.id === undefined) return;
|
|
12
13
|
const key = String(record.id);
|
|
13
14
|
const labelValue = record.name ?? record.email ?? record.title ?? record.id;
|
|
14
|
-
return {
|
|
15
|
+
return {
|
|
16
|
+
key,
|
|
17
|
+
label: String(labelValue)
|
|
18
|
+
};
|
|
15
19
|
}
|
|
16
20
|
function groupValue(doc, groupBy) {
|
|
17
21
|
if (groupBy === 'day') {
|
|
18
22
|
const date = new Date(String(doc.requestedAt));
|
|
19
|
-
if (Number.isNaN(date.getTime()))
|
|
20
|
-
return;
|
|
23
|
+
if (Number.isNaN(date.getTime())) return;
|
|
21
24
|
const key = date.toISOString().slice(0, 10);
|
|
22
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
key,
|
|
27
|
+
label: key
|
|
28
|
+
};
|
|
23
29
|
}
|
|
24
30
|
if (groupBy === 'model') {
|
|
25
31
|
const key = typeof doc.model === 'string' && doc.model ? doc.model : 'unknown';
|
|
26
|
-
return {
|
|
32
|
+
return {
|
|
33
|
+
key,
|
|
34
|
+
label: key
|
|
35
|
+
};
|
|
27
36
|
}
|
|
28
37
|
return idAndLabel(doc[groupBy]);
|
|
29
38
|
}
|
|
@@ -42,7 +51,7 @@ function emptyRow(key, label) {
|
|
|
42
51
|
cacheWriteTokens: 0,
|
|
43
52
|
reasoningTokens: 0,
|
|
44
53
|
totalTokens: 0,
|
|
45
|
-
costUSD: 0
|
|
54
|
+
costUSD: 0
|
|
46
55
|
};
|
|
47
56
|
}
|
|
48
57
|
function addDoc(row, doc) {
|
|
@@ -60,66 +69,86 @@ function parseRequest(req, groups) {
|
|
|
60
69
|
const groupBy = search.get('groupBy');
|
|
61
70
|
const fromDate = new Date(search.get('from') ?? '');
|
|
62
71
|
const toDate = new Date(search.get('to') ?? '');
|
|
63
|
-
if (!groupBy ||
|
|
64
|
-
!groups.has(groupBy) ||
|
|
65
|
-
Number.isNaN(fromDate.getTime()) ||
|
|
66
|
-
Number.isNaN(toDate.getTime()) ||
|
|
67
|
-
fromDate > toDate) {
|
|
72
|
+
if (!groupBy || !groups.has(groupBy) || Number.isNaN(fromDate.getTime()) || Number.isNaN(toDate.getTime()) || fromDate > toDate) {
|
|
68
73
|
return;
|
|
69
74
|
}
|
|
70
|
-
return {
|
|
75
|
+
return {
|
|
76
|
+
groupBy,
|
|
77
|
+
from: fromDate.toISOString(),
|
|
78
|
+
to: toDate.toISOString()
|
|
79
|
+
};
|
|
71
80
|
}
|
|
72
81
|
function buildReportEndpoint({ slug, pageSize, groups, access }) {
|
|
73
82
|
return {
|
|
74
83
|
method: 'get',
|
|
75
84
|
path: '/usage/report',
|
|
76
|
-
handler: async (req)
|
|
77
|
-
if (!req.user)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const
|
|
85
|
+
handler: async (req)=>{
|
|
86
|
+
if (!req.user) return Response.json({
|
|
87
|
+
error: 'Unauthorized'
|
|
88
|
+
}, {
|
|
89
|
+
status: 401
|
|
90
|
+
});
|
|
91
|
+
const permitted = await access({
|
|
92
|
+
req
|
|
93
|
+
});
|
|
94
|
+
if (permitted === false) return Response.json({
|
|
95
|
+
error: 'Forbidden'
|
|
96
|
+
}, {
|
|
97
|
+
status: 403
|
|
98
|
+
});
|
|
99
|
+
const scope = permitted === true ? [] : [
|
|
100
|
+
permitted
|
|
101
|
+
];
|
|
83
102
|
const query = parseRequest(req, groups);
|
|
84
|
-
if (!query)
|
|
85
|
-
|
|
103
|
+
if (!query) return Response.json({
|
|
104
|
+
error: 'Invalid groupBy or date range'
|
|
105
|
+
}, {
|
|
106
|
+
status: 400
|
|
107
|
+
});
|
|
86
108
|
const rows = new Map();
|
|
87
109
|
let page = 1;
|
|
88
|
-
while
|
|
110
|
+
while(true){
|
|
89
111
|
const result = await req.frogbot.find({
|
|
90
112
|
collection: slug,
|
|
91
113
|
where: {
|
|
92
114
|
and: [
|
|
93
|
-
{
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
115
|
+
{
|
|
116
|
+
requestedAt: {
|
|
117
|
+
greater_than_equal: query.from
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
requestedAt: {
|
|
122
|
+
less_than_equal: query.to
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
...scope
|
|
126
|
+
]
|
|
97
127
|
},
|
|
98
128
|
page,
|
|
99
129
|
limit: pageSize,
|
|
100
130
|
depth: 1,
|
|
101
131
|
sort: 'requestedAt',
|
|
102
132
|
overrideAccess: true,
|
|
103
|
-
req
|
|
133
|
+
req
|
|
104
134
|
});
|
|
105
|
-
for (const value of result.docs)
|
|
135
|
+
for (const value of result.docs){
|
|
106
136
|
const doc = value;
|
|
107
137
|
const group = groupValue(doc, query.groupBy);
|
|
108
|
-
if (!group)
|
|
109
|
-
continue;
|
|
138
|
+
if (!group) continue;
|
|
110
139
|
const row = rows.get(group.key) ?? emptyRow(group.key, group.label);
|
|
111
|
-
if (row.label === row.key && group.label !== group.key)
|
|
112
|
-
row.label = group.label;
|
|
140
|
+
if (row.label === row.key && group.label !== group.key) row.label = group.label;
|
|
113
141
|
addDoc(row, doc);
|
|
114
142
|
rows.set(group.key, row);
|
|
115
143
|
}
|
|
116
|
-
if (!result.hasNextPage)
|
|
117
|
-
break;
|
|
144
|
+
if (!result.hasNextPage) break;
|
|
118
145
|
page = result.nextPage ?? page + 1;
|
|
119
146
|
}
|
|
120
|
-
const reportRows = [
|
|
147
|
+
const reportRows = [
|
|
148
|
+
...rows.values()
|
|
149
|
+
].sort((a, b)=>b.costUSD - a.costUSD || b.totalTokens - a.totalTokens || a.label.localeCompare(b.label));
|
|
121
150
|
const totals = emptyRow('', '');
|
|
122
|
-
for (const row of reportRows)
|
|
151
|
+
for (const row of reportRows){
|
|
123
152
|
totals.requestCount += row.requestCount;
|
|
124
153
|
totals.inputTokens += row.inputTokens;
|
|
125
154
|
totals.outputTokens += row.outputTokens;
|
|
@@ -133,9 +162,9 @@ function buildReportEndpoint({ slug, pageSize, groups, access }) {
|
|
|
133
162
|
return Response.json({
|
|
134
163
|
...query,
|
|
135
164
|
rows: reportRows,
|
|
136
|
-
totals: reportTotals
|
|
165
|
+
totals: reportTotals
|
|
137
166
|
});
|
|
138
|
-
}
|
|
167
|
+
}
|
|
139
168
|
};
|
|
140
169
|
}
|
|
141
170
|
export function usageReportsPlugin(options = {}) {
|
|
@@ -143,41 +172,59 @@ export function usageReportsPlugin(options = {}) {
|
|
|
143
172
|
if (!Number.isInteger(pageSize) || pageSize < 1) {
|
|
144
173
|
throw new Error('[plugin-usage-reports] pageSize must be a positive integer.');
|
|
145
174
|
}
|
|
146
|
-
return async (config)
|
|
147
|
-
if (!config.ai)
|
|
148
|
-
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
175
|
+
return async (config)=>{
|
|
176
|
+
if (!config.ai) throw new Error('[plugin-usage-reports] AI configuration is required.');
|
|
177
|
+
const existing = config.collections.find((collection)=>collection.usageLog === true);
|
|
178
|
+
const usage = existing ?? {
|
|
179
|
+
slug: 'usage-logs',
|
|
180
|
+
usageLog: true,
|
|
181
|
+
fields: []
|
|
182
|
+
};
|
|
183
|
+
const collections = existing ? config.collections.map((collection)=>collection === existing ? {
|
|
184
|
+
...collection,
|
|
185
|
+
admin: {
|
|
186
|
+
...collection.admin,
|
|
187
|
+
groupBy: true
|
|
188
|
+
}
|
|
189
|
+
} : collection) : [
|
|
190
|
+
...config.collections,
|
|
191
|
+
{
|
|
192
|
+
...usage,
|
|
193
|
+
admin: {
|
|
194
|
+
groupBy: true
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
];
|
|
198
|
+
const groups = new Set([
|
|
199
|
+
'day',
|
|
200
|
+
'model',
|
|
201
|
+
'user'
|
|
202
|
+
]);
|
|
203
|
+
if (usage.fields.some((field)=>'name' in field && field.name === 'apiKey')) {
|
|
158
204
|
groups.add('apiKey');
|
|
159
205
|
}
|
|
160
206
|
return {
|
|
161
207
|
...config,
|
|
162
208
|
collections,
|
|
163
209
|
endpoints: [
|
|
164
|
-
...
|
|
210
|
+
...config.endpoints ?? [],
|
|
165
211
|
buildReportEndpoint({
|
|
166
212
|
slug: usage.slug,
|
|
167
213
|
pageSize,
|
|
168
214
|
groups,
|
|
169
|
-
access: options.access ?? loggedIn
|
|
170
|
-
})
|
|
215
|
+
access: options.access ?? loggedIn
|
|
216
|
+
})
|
|
171
217
|
],
|
|
172
218
|
settings: [
|
|
173
|
-
...
|
|
219
|
+
...config.settings ?? [],
|
|
174
220
|
{
|
|
175
221
|
label: 'Usage',
|
|
176
222
|
path: 'usage',
|
|
177
|
-
Component: '@frogbotai/plugin-usage-reports/client#UsageReports'
|
|
178
|
-
}
|
|
179
|
-
]
|
|
223
|
+
Component: '@frogbotai/plugin-usage-reports/client#UsageReports'
|
|
224
|
+
}
|
|
225
|
+
]
|
|
180
226
|
};
|
|
181
227
|
};
|
|
182
228
|
}
|
|
229
|
+
|
|
183
230
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["loggedIn","req","Boolean","user","idAndLabel","value","key","String","label","record","id","undefined","labelValue","name","email","title","groupValue","doc","groupBy","date","Date","requestedAt","Number","isNaN","getTime","toISOString","slice","model","number","field","isFinite","emptyRow","requestCount","inputTokens","outputTokens","cachedInputTokens","cacheWriteTokens","reasoningTokens","totalTokens","costUSD","addDoc","row","parseRequest","groups","search","URL","url","searchParams","get","fromDate","toDate","has","from","to","buildReportEndpoint","slug","pageSize","access","method","path","handler","Response","json","error","status","permitted","scope","query","rows","Map","page","result","frogbot","find","collection","where","and","greater_than_equal","less_than_equal","limit","depth","sort","overrideAccess","docs","group","set","hasNextPage","nextPage","reportRows","values","a","b","localeCompare","totals","_key","_label","reportTotals","usageReportsPlugin","options","isInteger","Error","config","ai","existing","collections","usageLog","usage","fields","map","admin","Set","some","add","endpoints","settings","Component"],"mappings":"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","file":"index.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frogbotai/plugin-usage-reports",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "Usage analytics reports for FrogBot.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Colby Gilbert",
|
|
@@ -38,7 +38,8 @@
|
|
|
38
38
|
"@payloadcms/ui": "3.90.1",
|
|
39
39
|
"react": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
40
40
|
"react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
|
|
41
|
-
"frogbot": "0.
|
|
41
|
+
"frogbot": "0.30.0",
|
|
42
|
+
"@frogbotai/next": "0.30.0"
|
|
42
43
|
},
|
|
43
44
|
"devDependencies": {
|
|
44
45
|
"@payloadcms/ui": "3.90.1",
|
|
@@ -47,14 +48,15 @@
|
|
|
47
48
|
"react": "19.2.6",
|
|
48
49
|
"react-dom": "19.2.6",
|
|
49
50
|
"typescript": "5.6.2",
|
|
50
|
-
"@frogbotai/
|
|
51
|
-
"
|
|
51
|
+
"@frogbotai/next": "0.30.0",
|
|
52
|
+
"@frogbotai/plugin-import-export": "0.30.0",
|
|
53
|
+
"frogbot": "0.30.0"
|
|
52
54
|
},
|
|
53
55
|
"publishConfig": {
|
|
54
56
|
"access": "public"
|
|
55
57
|
},
|
|
56
58
|
"scripts": {
|
|
57
|
-
"build": "
|
|
59
|
+
"build": "node ../../../scripts/build-package.mjs --assets css",
|
|
58
60
|
"clean": "rm -rf dist",
|
|
59
61
|
"typecheck": "tsc --noEmit"
|
|
60
62
|
}
|