"use client"; import { useState } from "react"; interface Row { engine: string; meanSavingsPercent: number; meanRetention: number; totalCompressedTokens: number; } interface VerifyResult { id: string; verdict: string | null; usdCost: number; skippedCapped: boolean; } export interface CompareViewProps { text: string; } async function runFidelityCheck( rows: Row[], text: string, opts: { provider: string; judgeModel: string; capUsd: number } ): Promise<{ verdicts: Record; spent: number; capped: boolean } | null> { const items = await Promise.all( rows.map(async (r) => { const res = await fetch("/api/compression/preview", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages: [{ role: "user", content: text }], engineId: r.engine }), }); const d = await res.json(); return { id: r.engine, original: d.original ?? "", compressed: d.compressed ?? "" }; }) ); const vres = await fetch("/api/compression/compare/verify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ items, provider: opts.provider, judgeModel: opts.judgeModel, costCapUsd: opts.capUsd }), }); const vdata = await vres.json(); if (vres.ok && Array.isArray(vdata.results)) { const map: Record = {}; for (const v of vdata.results) map[v.id] = v; return { verdicts: map, spent: typeof vdata.totalUsd === "number" ? vdata.totalUsd : 0, capped: Boolean(vdata.capped) }; } return null; } interface VerifyControlsProps { provider: string; onProvider: (v: string) => void; judgeModel: string; onJudgeModel: (v: string) => void; capUsd: number; onCapUsd: (v: number) => void; verifying: boolean; onVerify: () => void; spent: number | null; capped: boolean; } function VerifyControls({ provider, onProvider, judgeModel, onJudgeModel, capUsd, onCapUsd, verifying, onVerify, spent, capped }: VerifyControlsProps) { return ( <> {spent !== null && ( gasto ${spent.toFixed(3)} / ${capUsd.toFixed(2)}{capped ? " · cap atingido" : ""} )} ); } export function CompareView({ text }: CompareViewProps) { const [rows, setRows] = useState([]); const [loading, setLoading] = useState(false); const [verdicts, setVerdicts] = useState>({}); const [verifying, setVerifying] = useState(false); const [provider, setProvider] = useState("anthropic"); const [judgeModel, setJudgeModel] = useState(""); const [capUsd, setCapUsd] = useState(0.1); const [spent, setSpent] = useState(null); const [capped, setCapped] = useState(false); const load = async () => { setLoading(true); setVerdicts({}); setSpent(null); try { const res = await fetch("/api/compression/compare", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ messages: [{ role: "user", content: text }] }), }); const data = await res.json(); if (res.ok) setRows(Array.isArray(data.rows) ? data.rows : []); } finally { setLoading(false); } }; const verifyAll = async () => { if (rows.length === 0 || !judgeModel) return; setVerifying(true); try { const out = await runFidelityCheck(rows, text, { provider, judgeModel, capUsd }); if (out) { setVerdicts(out.verdicts); setSpent(out.spent); setCapped(out.capped); } } finally { setVerifying(false); } }; return (
{rows.length > 0 && ( )}
{rows.map((r) => { const v = verdicts[r.engine]; return ( ); })}
EngineSavingsRetençãoOut tokFidelidade
{r.engine} −{r.meanSavingsPercent.toFixed(0)}% {Math.round(r.meanRetention * 100)}% {r.totalCompressedTokens} {v ? (v.skippedCapped ? "—(cap)" : v.verdict ?? "?") : ""}
); }