import DocPopup from "@/src/components/layouts/doc-popup";
import { RightAlignedCell } from "@/src/features/dashboard/components/RightAlignedCell";
import { LeftAlignedCell } from "@/src/features/dashboard/components/LeftAlignedCell";
import { DashboardCard } from "@/src/features/dashboard/components/cards/DashboardCard";
import { DashboardTable } from "@/src/features/dashboard/components/cards/DashboardTable";
import { type FilterState, getGenerationLikeTypes } from "@langfuse/shared";
import { api } from "@/src/utils/api";
import { compactNumberFormatter } from "@/src/utils/numbers";
import { TotalMetric } from "./TotalMetric";
import { totalCostDashboardFormatted } from "@/src/features/dashboard/lib/dashboard-utils";
import { truncate } from "@/src/utils/string";
import {
type QueryType,
mapLegacyUiTableFilterToView,
} from "@/src/features/query";
export const ModelCostTable = ({
className,
projectId,
globalFilterState,
fromTimestamp,
toTimestamp,
isLoading = false,
}: {
className: string;
projectId: string;
globalFilterState: FilterState;
fromTimestamp: Date;
toTimestamp: Date;
isLoading?: boolean;
}) => {
const modelCostQuery: QueryType = {
view: "observations",
dimensions: [{ field: "providedModelName" }],
metrics: [
{ measure: "totalCost", aggregation: "sum" },
{ measure: "totalTokens", aggregation: "sum" },
],
filters: [
...mapLegacyUiTableFilterToView("observations", globalFilterState),
{
column: "type",
operator: "any of",
value: getGenerationLikeTypes(),
type: "stringOptions",
},
],
timeDimension: null,
fromTimestamp: fromTimestamp.toISOString(),
toTimestamp: toTimestamp.toISOString(),
orderBy: null,
};
const metrics = api.dashboard.executeQuery.useQuery(
{
projectId,
query: modelCostQuery,
},
{
trpc: {
context: {
skipBatch: true,
},
},
enabled: !isLoading,
},
);
const totalTokenCost = metrics.data?.reduce(
(acc, curr) =>
acc + (curr.sum_totalCost ? (curr.sum_totalCost as number) : 0),
0,
);
const metricsData = metrics.data
? metrics.data
.filter((item) => item.providedModelName !== null)
.map((item, i) => [
{truncate(item.providedModelName as string, 30)}
,
{item.sum_totalTokens
? compactNumberFormatter(item.sum_totalTokens as number)
: "0"}
,
{item.sum_totalCost
? totalCostDashboardFormatted(item.sum_totalCost as number)
: "$0"}
,
])
: [];
return (
Tokens,
USD,
]}
rows={metricsData}
isLoading={isLoading || metrics.isLoading}
collapse={{ collapsed: 5, expanded: 20 }}
>
);
};