{message}
@@ -531,13 +576,20 @@ export function UsagePage() {
- {isPast24Hours ? "Hourly" : "Daily"}{" "}
+ {shownHourly ? "Hourly" : "Daily"}{" "}
{metric === "tokens" ? "processed tokens" : "cost"}
Totals
{model.model}
-
+
{isModelCostUnknown(model) ? (
Unpriced
) : (
formatUsd(model.costUsd)
)}
-
+
{share === null ? "" : formatPercent(share)}
- {formatTokens(model.totalTokens)}
+
+ {formatTokens(model.totalTokens)}
+
);
})
@@ -813,7 +913,7 @@ export function UsagePage() {
-
@@ -865,7 +978,7 @@ export function UsagePage() {
)}
- >
+
)}
@@ -878,9 +991,9 @@ export function UsagePage() {
chartWindow={{
days,
hours,
- resolution: isPast24Hours ? "hour" : "day",
- timeZone: window.timeZone,
- referenceTime: window.untilTime,
+ resolution: shownHourly ? "hour" : "day",
+ timeZone: shownWindow.timeZone,
+ referenceTime: shownWindow.untilTime,
}}
onSetPrice={() => {
setSelectedModelKey(null);
@@ -1052,11 +1165,28 @@ function ProviderMark({
);
}
-function Metric({ label, value }: { readonly label: string; readonly value: string }) {
+/** Mutes a figure that is still coming in. The delay keeps a quick answer from flashing. */
+function figureClass(loading: boolean) {
+ return cn("transition-opacity", loading && "opacity-40 delay-150");
+}
+
+function Metric({
+ label,
+ value,
+ loading,
+}: {
+ readonly label: string;
+ readonly value: string;
+ readonly loading: boolean;
+}) {
return (
{isPast24Hours ? "Hour" : "Day"}
+ {shownHourly ? "Hour" : "Day"}
{activeProviders.map((provider) => (
{PROVIDER_PRESENTATION[provider].label}
@@ -841,21 +941,34 @@ export function UsagePage() {
>
{"hourStart" in period
- ? formatHourShort(period.hourStart, window.timeZone)
+ ? formatHourShort(period.hourStart, shownWindow.timeZone)
: formatDayShort(period.day)}
{activeProviders.map((provider) => (
{formatUsd(period.byProvider.get(provider)?.costUsd ?? 0)}
))}
-
+
{formatUsd(period.costUsd)}
-
+
{formatTokens(period.totalTokens)}