"use client"; import { Check, Copy, FilePlus2, Trophy } from "lucide-react"; import { Markdown } from "@/components/markdown"; import { Badge, Spinner } from "@/components/ui/primitives"; import { cn } from "@/lib/utils"; import { ms, providerTone, usd, type ModelRow } from "@/components/ai/models/format"; import { uniqueSentences } from "./diff"; export interface CompareResult { model: string; provider?: string; text?: string; usage?: { inputTokens: number; outputTokens: number; cachedTokens?: number; reasoningTokens?: number }; costUsd?: number | null; latencyMs?: number; ttftMs?: number | null; refusal?: string | null; error?: string; pending?: boolean } export function ResultColumn({ r, meta, others, diff, best, canVote, onCopy, onSave, onBest }: { r: CompareResult; meta: ModelRow | undefined; others: string[]; diff: boolean; best: boolean; canVote: boolean; onCopy: () => void; onSave: () => void; onBest: () => void }) { const provider = r.provider ?? meta?.provider ?? ""; return (
{r.model}
{provider}{meta?.benchmark?.pass_rate != null && ` · ${Math.round(meta.benchmark.pass_rate * 100)}% pass`}{meta?.inputPrice != null && ` · $${meta.inputPrice}/$${meta.outputPrice} per M`}
{best && best}{r.pending && }
{r.error ?
{r.error}
: r.pending ?
Waiting for {r.model}…
: diff ?
{uniqueSentences(r.text ?? "", others).map((s, i) => {s.s} )}
: } {r.refusal &&
Refusal detected: {r.refusal}
}
{!r.pending && !r.error &&
{ms(r.latencyMs)}TTFT {ms(r.ttftMs)}{r.usage?.inputTokens ?? 0} → {r.usage?.outputTokens ?? 0}{r.usage?.reasoningTokens ? ` (+${r.usage.reasoningTokens} think)` : ""}{usd(r.costUsd)}
}
); }