import type { Metadata } from 'next'; import Link from 'next/link'; import { Dash, IntelListing, list, str } from '@/components/intelligence/listing-table'; import { Chip, EntityBadge } from '@/components/ui/badges'; import { EntityLink, QualityMark } from '@/components/ui/entity'; import { api, safe } from '@/lib/api'; import { fmtDate } from '@/lib/format'; import { routes, SITE_NAME, SITE_URL } from '@/lib/site'; import type { EntitySummary } from '@/lib/types'; export const metadata: Metadata = { title: 'AI agents — developer, kind, underlying models, platform, licence', description: 'Agents recorded in the atlas: developer, agent kind, the models they run on (relations), platform, repository, licence and release date — from official sources only.', alternates: { canonical: routes.agents() }, openGraph: { title: `AI agents | ${SITE_NAME}`, url: `${SITE_URL}${routes.agents()}`, siteName: SITE_NAME } }; export const revalidate = 300; type Extra = { models: EntitySummary[]; total: number }; const AGENT_KINDS: Record = { coding: 'Coding agent', browser: 'Browser agent', computer_use: 'Computer use', research: 'Research agent', assistant: 'Assistant', workflow: 'Workflow', voice: 'Voice agent', mcp_server: 'MCP server' }; export default async function AgentsPage({ searchParams }: { searchParams: Promise> }) { const sp = await searchParams; return ( title="Agents" eyebrow="Agents & tools" lede={<>Autonomous and semi-autonomous systems built on the models in the atlas: who develops them, what kind they are, which models they run on, where they run. Related software lives under Frameworks; developer tools under Tools.} basePath="/agents" searchParams={sp} fetch={(q) => api.explore('agent', q)} sorts={[ { value: 'updated', label: 'Recently updated' }, { value: 'release', label: 'Release date' }, { value: 'stars', label: 'Stars' }, { value: 'name', label: 'Name' }, ]} filters={sp.org ? [{ kind: 'hidden', name: 'org', value: sp.org }] : []} connectors={['github (agent repositories)', 'official product pages', 'mcp registries']} emptyHint={<>The atlas declares the agent entity type but no connector has produced one yet. Agent frameworks (LangChain, CrewAI, …) are listed under Frameworks.} enrich={async (items) => { const details = await Promise.all(items.map((e) => safe(api.entity(e.slug)))); const m = new Map(); details.forEach((d, i) => { if (!d) return; const rel = (d.relations ?? []).filter((g) => g.direction === 'out' && ['uses', 'runs_on', 'derived_from', 'integrates'].includes(g.predicate)); const models = rel.flatMap((g) => g.items.filter((x) => x.entity_type === 'model')); m.set(items[i]!.slug, { models, total: rel.reduce((n, g) => n + g.total, 0) }); }); return m; }} columns={[ { key: 'name', label: 'Agent', primary: true, render: (e) => ( <> {e.entity_type !== 'agent' && } {e.description && {e.description}} ), }, { key: 'developer', label: 'Developer', className: 'text-ink-2', render: (e) => (e.organization ? {e.organization.name} : str(e.attributes?.developer) ?? ) }, { key: 'kind', label: 'Agent kind', render: (e) => { const k = str(e.attributes?.agent_kind) ?? str(e.attributes?.kind) ?? str(e.attributes?.category); return k ? {AGENT_KINDS[k] ?? k.replace(/_/g, ' ')} : ; } }, { key: 'models', label: 'Underlying models', render: (e, x) => { const fromAttr = list(e.attributes?.models ?? e.attributes?.underlying_models); if (x?.models.length) return {x.models.slice(0, 4).map((m) => )}{x.models.length > 4 && +{x.models.length - 4}}; return fromAttr.length ? {fromAttr.join(', ')} : ; }, }, { key: 'platform', label: 'Platform', className: 'text-ink-2 text-xs', render: (e) => { const p = list(e.attributes?.platforms ?? e.attributes?.platform); return p.length ? p.join(' · ') : ; } }, { key: 'repo', label: 'Repository', className: 'text-xs', render: (e) => { const u = str(e.attributes?.repository_url) ?? str(e.attributes?.official_url); return u ? {u.replace(/^https?:\/\/(www\.)?/, '').replace(/\/$/, '').slice(0, 40)} : ; } }, { key: 'license', label: 'Licence', className: 'max-w-[10rem] truncate text-ink-2', render: (e) => str(e.attributes?.license) ?? }, { key: 'release', label: 'Release', className: 'tnum text-ink-2 whitespace-nowrap', render: (e) => (str(e.attributes?.release_date) ? fmtDate(str(e.attributes.release_date)) : ) }, { key: 'quality', label: 'Quality', num: true, render: (e) => }, ]} note="Underlying models come from graph relations (uses · runs_on · derived_from · integrates) on each agent, else from the agent's stated attributes; a dash means no source has stated it." /> ); }