import type { ReactNode } from "react"; import { formatCurrencyAccurate } from "~/utils/numberFormatter"; import { Header3 } from "~/components/primitives/Headers"; import { TextLink } from "~/components/primitives/TextLink"; import { useEnvironment } from "~/hooks/useEnvironment"; import { useOrganization } from "~/hooks/useOrganizations"; import { useProject } from "~/hooks/useProject"; import { v3PromptPath } from "~/utils/pathBuilder"; import { TruncatedCopyableValue } from "~/components/primitives/TruncatedCopyableValue"; import type { AISpanData } from "./types"; export function AITagsRow({ aiData }: { aiData: AISpanData }) { const organization = useOrganization(); const project = useProject(); const environment = useEnvironment(); const promptLink = aiData.promptSlug && organization && project && environment ? v3PromptPath(organization, project, environment, aiData.promptSlug, aiData.promptVersion) : undefined; return (
{aiData.responseId && ( } /> )} {aiData.provider !== "unknown" && } {aiData.resolvedProvider && ( )} {aiData.promptSlug && ( {aiData.promptSlug} {aiData.promptVersion ? ` v${aiData.promptVersion}` : ""} ) : ( `${aiData.promptSlug}${aiData.promptVersion ? ` v${aiData.promptVersion}` : ""}` ) } /> )} {aiData.finishReason && } {aiData.serviceTier && } {aiData.toolChoice && } {aiData.toolCount != null && aiData.toolCount > 0 && ( )} {aiData.messageCount != null && ( )} {aiData.telemetryMetadata && Object.entries(aiData.telemetryMetadata) .filter(([key]) => key !== "prompt") .map(([key, value]) => )}
); } export function AIStatsSummary({ aiData }: { aiData: AISpanData }) { return (
Stats
{aiData.cachedTokens != null && aiData.cachedTokens > 0 && ( )} {aiData.cacheCreationTokens != null && aiData.cacheCreationTokens > 0 && ( )} {aiData.reasoningTokens != null && aiData.reasoningTokens > 0 && ( )} {aiData.totalCost != null && ( )} {aiData.msToFirstChunk != null && ( )} {aiData.tokensPerSecond != null && ( )}
); } function MetricRow({ label, value, unit, bold, }: { label: string; value: ReactNode; unit?: string; bold?: boolean; }) { return (
{label} {value} {unit && {unit}}
); } function formatTtfc(ms: number): string { if (ms >= 10_000) { return `${(ms / 1000).toFixed(1)}s`; } return `${Math.round(ms)}ms`; }