import "./TaskCostTab.css"; import { useTranslation } from "react-i18next"; import type { TaskDetail } from "@fusion/core"; import type { ModelPricingOverrides } from "../../../core/src/model-pricing"; import { ProviderIcon } from "./ProviderIcon"; import { inferProviderIconKey } from "../utils/providerIconKey"; import { buildTokenCostRows, formatCost, formatCount, totalCostForRows } from "../utils/taskTokenCost"; interface TaskCostTabProps { task: TaskDetail; pricingOverrides?: ModelPricingOverrides; } export function TaskCostTab({ task, pricingOverrides }: TaskCostTabProps) { const { t } = useTranslation("app"); if (!task.tokenUsage) { return (

{t("taskDetail.costTab.heading", "Model cost")}

{t("taskDetail.costTab.empty", "No model token usage has been recorded for this task yet.")}

); } const rows = buildTokenCostRows(task, t("taskDetail.costTab.unknownModel", "(unknown)"), pricingOverrides); const totalCost = totalCostForRows(rows); return (

{t("taskDetail.costTab.heading", "Model cost")}

{t("taskDetail.costTab.totalCostLabel", "Total")}: {formatCost(totalCost.usd, totalCost.unavailable)}

{t("taskDetail.costTab.description", "Derived from recorded input, output, cached, and cache-write tokens. Unpriced rows use — instead of a guessed value.")}

{rows.map((row) => ( ))}
{t("taskDetail.costTab.model", "Model")} {t("taskDetail.costTab.inputTokens", "Input")} {t("taskDetail.costTab.outputTokens", "Output")} {t("taskDetail.costTab.cachedTokens", "Cached")} {t("taskDetail.costTab.cacheWriteTokens", "Cache write")} {t("taskDetail.costTab.totalTokens", "Total tokens")} {t("taskDetail.costTab.cost", "Derived USD")}
{row.label} {formatCount(row.inputTokens)} {formatCount(row.outputTokens)} {formatCount(row.cachedTokens)} {formatCount(row.cacheWriteTokens)} {formatCount(row.totalTokens)} {row.cost.unavailable || row.cost.usd === null ? ( — ) : ( formatCost(row.cost.usd, row.cost.unavailable) )}
{t("taskDetail.costTab.totalCost", "Total cost")} {formatCost(totalCost.usd, totalCost.unavailable)}
); } export default TaskCostTab;