import type { Metadata } from 'next'; import Link from 'next/link'; import { CompareButton } from '@/components/compare/compare-button'; import { CompareTrayBar } from '@/components/compare/compare-tray-bar'; import { fmtMemory, HW_KIND_LABELS, interconnect, precisions, releaseOf } from '@/components/hardware/hardware-bits'; import { BTN_GHOST, CTRL, Field, SortTh } from '@/components/intelligence/bits'; import { TerminalLayout } from '@/components/layout/terminal'; import { Chip } from '@/components/ui/badges'; import { DataTable, EmptyRow, Td, Th } from '@/components/ui/data-table'; import { EntityLink } from '@/components/ui/entity'; import { Pagination, withParams } from '@/components/ui/pagination'; import { Note, PageHeader } from '@/components/ui/section'; import { EmptyState, Unavailable } from '@/components/ui/unavailable'; import { intel, safe } from '@/lib/api'; import { fmtDate, fmtInt, num } from '@/lib/format'; import { routes, SITE_NAME, SITE_URL } from '@/lib/site'; export const revalidate = 600; type SP = Record; const LIMIT = 50; const KEYS = ['q', 'kind', 'manufacturer', 'min_memory', 'sort', 'offset'] as const; const SORTS = [ { value: 'memory', label: 'Memory' }, { value: 'name', label: 'Name' }, { value: 'updated', label: 'Recently updated' }, ]; const TITLE = 'AI hardware — GPUs, accelerators, SoCs and systems: memory, bandwidth, TDP'; const DESC = 'Accelerators and devices for training and inference with the memory, bandwidth, TDP, precision support and interconnect figures published by their manufacturers — and, for each, which models are estimated to fit.'; export async function generateMetadata({ searchParams }: { searchParams: Promise }): Promise { const sp = await searchParams; const filtered = ['q', 'kind', 'manufacturer', 'min_memory', 'offset'].some((k) => sp[k]); return { title: TITLE, description: DESC, alternates: { canonical: routes.hardware() }, openGraph: { title: `${TITLE} | ${SITE_NAME}`, description: DESC, url: `${SITE_URL}${routes.hardware()}`, siteName: SITE_NAME }, robots: filtered ? { index: false, follow: true } : undefined }; } export default async function HardwarePage({ searchParams }: { searchParams: Promise }) { const sp = await searchParams; const cur: Record = {}; for (const k of KEYS) if (sp[k]) cur[k] = sp[k]; const offset = Math.max(0, Number(cur.offset) || 0); const sort = SORTS.some((s) => s.value === cur.sort) ? (cur.sort as string) : 'memory'; const page = await safe(intel.hardware({ q: cur.q, kind: cur.kind, manufacturer: cur.manufacturer, min_memory: num(cur.min_memory) ?? undefined, sort, limit: LIMIT, offset })); const href = (patch: Record) => withParams('/hardware', cur, patch); const kinds = page?.facets?.kinds ?? []; const manufacturers = page?.facets?.manufacturers ?? []; const filterCount = ['q', 'kind', 'manufacturer', 'min_memory'].filter((k) => cur[k]).length; const items = page?.items ?? []; const withTdp = items.filter((e) => num(e.attributes?.tdp_watts) !== null).length; const withPrec = items.filter((e) => precisions(e.attributes ?? {}).length).length; const filters = (
Reset
); const inspector = (

Figures are the manufacturer's published specifications (spec sheets, tier 2 when read from a reseller). A dash means no source has stated the value — TDP, precision support and interconnect are sparse in the current corpus ({fmtInt(withTdp)} / {fmtInt(withPrec)} of the {fmtInt(items.length)} rows shown carry TDP / precision).

Memory listed as a range = several configurations (Apple silicon tiers); fit estimates use the largest unless you pick one.

Run locally · Hardware frontier · estimate method

); return ( {page &&

{fmtInt(page.total)} devices

} Hardware frontier → What fits my machine? → } />
{!page ? ( ) : items.length === 0 && !offset ? ( {filterCount ? 'Remove a filter.' : 'Connectors: manufacturer spec pages.'} ) : ( <> Hardware Kind Memory Bandwidth TDP Precision Interconnect Release Fit {items.length === 0 && } {items.map((e) => { const a = e.attributes ?? {}; const prec = precisions(a); const ic = interconnect(a); const rel = releaseOf(e); return ( {typeof a.manufacturer === 'string' ? a.manufacturer : e.organization?.name ?? '—'} {typeof a.kind === 'string' ? {HW_KIND_LABELS[a.kind] ?? a.kind} : —} {fmtMemory(a.memory_gb)}{typeof a.memory_type === 'string' && {a.memory_type}} {num(a.memory_bandwidth_gbs) === null ? — : `${fmtInt(a.memory_bandwidth_gbs)} GB/s`} {num(a.tdp_watts) === null ? — : `${fmtInt(a.tdp_watts)} W`} {prec.length ? prec.join(' · ') : —} {ic ?? —} {rel ? fmtDate(rel) : —} What can it run? → ); })} href({ offset: o || undefined })} className="mt-4" /> Each device page lists the models estimated to fit its memory per quantization — labelled as estimates, method on /methodology. A dash = not stated by any source (never guessed). )}
); }