mirror of
https://github.com/hanzo-apps/hanzo.ai.git
synced 2026-10-29 07:20:43 +00:00
A buyer asking "Enso vs OpenRouter" found nothing to answer it. The winning artifact in every category we lose is the vendor-level comparison page, and we had none — /comparison is build-vs-buy, a different axis. Two rules hold the page honest. A row is either measured or reported, never both: mixing a number we produced with one a vendor published, under one heading, is how a comparison lies without any single cell being false. The page opens on measured and puts reported behind a toggle. And rows we lose stay in — Enso reaches 600+ models against LiteLLM's 1,800+, and that is on the page. Reading the vendors' own pages also killed a claim we would otherwise have made: all three already serve a native Anthropic /v1/messages, so dual endpoint compatibility is table stakes, not a differentiator. What none of them publish is a cost quoted before the call runs — all three only cap after the fact, two of them at enterprise tier. Co-Authored-By: Claude Code <[email protected]>
53 lines
2.2 KiB
TypeScript
53 lines
2.2 KiB
TypeScript
import { Cta, Page, PageHero, Prose, Section } from '@/components/marketing/page-kit'
|
|
import { CompareTable } from './CompareTable'
|
|
import type { Comparison } from '@/lib/compare'
|
|
|
|
export function ComparisonPage({ comparison }: { comparison: Comparison }) {
|
|
const measured = comparison.rows.filter((r) => r.source === 'measured').length
|
|
const names = comparison.rivals.map((r) => r.name).join(', ')
|
|
|
|
return (
|
|
<Page>
|
|
<PageHero
|
|
eyebrow={comparison.category}
|
|
title={comparison.question}
|
|
lede={comparison.framing}
|
|
/>
|
|
<Section
|
|
title="Side by side"
|
|
lede={
|
|
measured
|
|
? `Opens on the ${measured} ${measured === 1 ? 'row' : 'rows'} we ran ourselves. Reported rows — what each vendor says about itself — are one click away.`
|
|
: 'Nothing in this category has been measured by us yet, so it opens on what each vendor publishes. Those are their claims, not ours.'
|
|
}
|
|
>
|
|
<CompareTable comparison={comparison} />
|
|
</Section>
|
|
<Section title="Reading this honestly">
|
|
<Prose>
|
|
<p>
|
|
A row marked <em>we ran this</em> is a number produced by our own harness, and the link goes
|
|
to the run. A row marked <em>they published this</em> is each vendor’s own claim, taken
|
|
from the page linked and dated the day it was read — we relay those, we did not verify them,
|
|
and they are their numbers and not ours. Where a vendor has not published something the cell
|
|
says <em>not published</em> rather than being left blank, because a blank reads as zero.
|
|
</p>
|
|
<p>
|
|
This page is not arranged to make Hanzo look best. Where {names} are ahead, that is on the
|
|
page. The bet is that a comparison you can check is worth more than one that only says good
|
|
things about itself.
|
|
</p>
|
|
</Prose>
|
|
</Section>
|
|
<Section title="Go deeper">
|
|
<Cta href={comparison.subject.href}>Hanzo {comparison.subject.name}</Cta>{' '}
|
|
{comparison.rivals.map((r) => (
|
|
<Cta key={r.id} href={r.href}>
|
|
{r.name}
|
|
</Cta>
|
|
))}
|
|
</Section>
|
|
</Page>
|
|
)
|
|
}
|