/** Site constants, routes per entity type, labels and colours shared by pages and components. */
export const SITE_NAME = 'AI Atlas';
export const SITE_URL = (process.env.NEXT_PUBLIC_SITE_URL ?? 'https://www.ai-atlas.co').replace(/\/$/, '');
export const TAGLINE = 'The temporal knowledge graph of the AI ecosystem';
export const DESCRIPTION =
'AI Atlas is a continuously reconstructed, source-attributed, historical map of the global AI ecosystem: models, organizations, research, providers and pricing, benchmarks, hardware, frameworks, datasets and tools — every number answers who said it, when, where, and how it was extracted.';
export const CONTACT_EMAIL = 'contact@spboucher.ai';
export const AUTHOR_NAME = 'Simon-Pierre Boucher';
/** Theme tokens mirrored from globals.css (`--canvas`) for the manifest and `` — they cannot read CSS variables. */
export const THEME_LIGHT = '#f6f6f3';
export const THEME_DARK = '#0b0d11';
export const HOST_NAME = 'MacLustr';
export const HOST_URL = 'https://www.maclustr.io';
export const PUBLIC_API_BASE = 'https://www.ai-atlas.co/api/v1';
export const BOT_UA = 'AIAtlasBot';
/** Entity type → URL path segment (plural). Types not listed fall back to /explore// → generic entity page. */
export const TYPE_PATH: Record = {
model: 'models',
company: 'companies',
organization: 'companies',
lab: 'companies',
university: 'companies',
paper: 'papers',
provider: 'providers',
benchmark: 'benchmarks',
hardware: 'hardware',
framework: 'frameworks',
library: 'frameworks',
runtime: 'frameworks',
dataset: 'datasets',
tool: 'tools',
agent: 'tools',
mcp_server: 'tools',
product: 'tools',
repository: 'repositories',
model_family: 'families',
artifact: 'artifacts',
license: 'licenses',
};
/** URL path segment → API mount + canonical entity types accepted there. */
export const PATH_TYPES: Record = {
models: { label: 'Models', singular: 'Model', types: ['model', 'quantization'], api: 'models' },
companies: { label: 'Companies', singular: 'Company', types: ['company', 'organization', 'lab', 'university'], api: 'companies' },
papers: { label: 'Research', singular: 'Paper', types: ['paper'], api: 'papers' },
providers: { label: 'Providers', singular: 'Provider', types: ['provider'], api: 'providers' },
benchmarks: { label: 'Benchmarks', singular: 'Benchmark', types: ['benchmark'], api: 'benchmarks' },
hardware: { label: 'Hardware', singular: 'Hardware', types: ['hardware'], api: 'hardware' },
frameworks: { label: 'Frameworks', singular: 'Framework', types: ['framework', 'library', 'runtime'], api: 'frameworks' },
datasets: { label: 'Datasets', singular: 'Dataset', types: ['dataset'], api: 'datasets' },
tools: { label: 'Tools', singular: 'Tool', types: ['tool', 'agent', 'mcp_server', 'product'], api: 'tools' },
repositories: { label: 'Repositories', singular: 'Repository', types: ['repository'], api: 'entities' },
families: { label: 'Families', singular: 'Family', types: ['model_family'], api: 'families' },
artifacts: { label: 'Artifacts', singular: 'Artifact', types: ['artifact'], api: 'models' },
licenses: { label: 'Licenses', singular: 'License', types: ['license'], api: 'entities' },
};
export const TYPE_LABELS: Record = {
model: 'Model',
company: 'Company',
organization: 'Organization',
lab: 'Lab',
university: 'University',
researcher: 'Researcher',
paper: 'Paper',
dataset: 'Dataset',
benchmark: 'Benchmark',
provider: 'Provider',
framework: 'Framework',
library: 'Library',
runtime: 'Runtime',
repository: 'Repository',
tool: 'Tool',
agent: 'Agent',
mcp_server: 'MCP server',
product: 'Product',
hardware: 'Hardware',
quantization: 'Quantization',
license: 'License',
regulation: 'Regulation',
incident: 'Incident',
release: 'Release',
conference: 'Conference',
country: 'Country',
robot: 'Robot',
data_center: 'Data center',
standard: 'Standard',
funding_round: 'Funding round',
acquisition: 'Acquisition',
course: 'Course',
job: 'Job',
model_family: 'Family',
artifact: 'Artifact',
};
export const TYPE_LABELS_PLURAL: Record = {
model: 'Models',
company: 'Companies',
organization: 'Organizations',
lab: 'Labs',
university: 'Universities',
researcher: 'Researchers',
paper: 'Papers',
dataset: 'Datasets',
benchmark: 'Benchmarks',
provider: 'Providers',
framework: 'Frameworks',
library: 'Libraries',
runtime: 'Runtimes',
repository: 'Repositories',
tool: 'Tools',
agent: 'Agents',
mcp_server: 'MCP servers',
product: 'Products',
hardware: 'Hardware',
quantization: 'Quantizations',
license: 'Licenses',
regulation: 'Regulations',
incident: 'Incidents',
release: 'Releases',
conference: 'Conferences',
country: 'Countries',
robot: 'Robots',
data_center: 'Data centers',
standard: 'Standards',
funding_round: 'Funding rounds',
acquisition: 'Acquisitions',
course: 'Courses',
job: 'Jobs',
model_family: 'Families',
artifact: 'Artifacts',
};
export function typeLabel(t: string, pluralForm = false): string {
return (pluralForm ? TYPE_LABELS_PLURAL[t] : TYPE_LABELS[t]) ?? t.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
}
/** Badge colour family per entity type (CSS variables `--type-` in globals.css). */
export const TYPE_COLOR_KEY: Record = {
model: 'model',
quantization: 'model',
model_family: 'model',
artifact: 'model',
license: 'tool',
company: 'company',
organization: 'company',
lab: 'company',
university: 'company',
researcher: 'company',
paper: 'paper',
provider: 'provider',
benchmark: 'benchmark',
hardware: 'hardware',
robot: 'hardware',
data_center: 'hardware',
framework: 'framework',
library: 'framework',
runtime: 'framework',
repository: 'framework',
dataset: 'dataset',
tool: 'tool',
agent: 'tool',
mcp_server: 'tool',
product: 'tool',
};
export const routes = {
home: () => '/',
search: (q: string, type?: string) => `/search?q=${encodeURIComponent(q)}${type ? `&type=${encodeURIComponent(type)}` : ''}`,
models: () => '/models',
companies: () => '/companies',
papers: () => '/papers',
providers: () => '/providers',
benchmarks: () => '/benchmarks',
hardware: () => '/hardware',
frameworks: () => '/frameworks',
datasets: () => '/datasets',
tools: () => '/tools',
changes: () => '/changes',
changesDay: (date: string) => `/changes/${date}`,
timeline: (q?: { entity?: string; year?: string; category?: string }) => {
const p = new URLSearchParams();
if (q?.entity) p.set('entity', q.entity);
if (q?.year) p.set('year', q.year);
if (q?.category) p.set('category', q.category);
const s = p.toString();
return s ? `/timeline?${s}` : '/timeline';
},
compare: (ids?: string[]) => (ids?.length ? `/compare?ids=${ids.map(encodeURIComponent).join(',')}` : '/compare'),
prices: () => '/prices',
hardwareFit: (q?: { memory_gb?: number | string; quant?: string; context?: number | string }) => {
const p = new URLSearchParams();
if (q?.memory_gb !== undefined && q.memory_gb !== '') p.set('memory_gb', String(q.memory_gb));
if (q?.quant) p.set('quant', q.quant);
if (q?.context !== undefined && q.context !== '') p.set('context', String(q.context));
const s = p.toString();
return s ? `/hardware/fit?${s}` : '/hardware/fit';
},
benchmark: (slug: string, q?: { config?: string; model?: string }) => {
const p = new URLSearchParams();
if (q?.config) p.set('config', q.config);
if (q?.model) p.set('model', q.model);
const s = p.toString();
return `/benchmarks/${encodeURIComponent(slug)}${s ? `?${s}` : ''}`;
},
diff: (q?: { a?: string; b?: string; scope?: string }) => {
const p = new URLSearchParams();
if (q?.a) p.set('a', q.a);
if (q?.b) p.set('b', q.b);
if (q?.scope && q.scope !== 'all') p.set('scope', q.scope);
const s = p.toString();
return s ? `/diff?${s}` : '/diff';
},
graph: (slug?: string, depth?: 1 | 2) => (slug ? `/graph/${encodeURIComponent(slug)}${depth === 2 ? '?depth=2' : ''}` : '/graph'),
/** Entity page "as of" view (History tab). */
entityAsOf: (e: { entity_type: string; slug: string }, date: string) => `${routes.entity(e)}?tab=history&asof=${encodeURIComponent(date)}`,
/** Entity page History tab, optionally filtered to one property (deep link from the evidence drawer). */
entityHistory: (e: { entity_type: string; slug: string }, property?: string) => `${routes.entity(e)}?tab=history${property ? `&property=${encodeURIComponent(property)}` : ''}`,
// ---- 1.1 routes (pages built by the D1–D3 streams; the shell links to them from here)
frontier: () => '/frontier',
pulse: () => '/pulse',
open: () => '/open',
families: () => '/families',
family: (slug: string) => `/families/${encodeURIComponent(slug)}`,
timeMachine: (date?: string) => (date ? `/time-machine?date=${encodeURIComponent(date)}` : '/time-machine'),
calculator: () => '/calculator',
runLocally: () => '/run-locally',
findAModel: () => '/find-a-model',
artifact: (slug: string) => `/artifacts/${encodeURIComponent(slug)}`,
agents: () => '/agents',
licenses: () => '/licenses',
claim: (id: string) => `/claims/${encodeURIComponent(id)}`,
watchlist: () => '/watchlist',
benchmarkMatrix: () => '/benchmarks?view=matrix',
admin: (section?: string) => (section ? `/admin/${section}` : '/admin'),
explore: () => '/explore',
exploreType: (t: string) => `/explore/${encodeURIComponent(t)}`,
methodology: () => '/methodology',
sources: () => '/sources',
about: () => '/about',
developers: () => '/developers',
bot: () => '/bot',
listing: (type: string) => {
const p = TYPE_PATH[type];
return p ? `/${p}` : `/explore/${encodeURIComponent(type)}`;
},
/** Canonical URL of any entity: /models/, /companies/, … or /explore//. */
entity: (e: { entity_type: string; slug: string }) => {
const p = TYPE_PATH[e.entity_type];
return p ? `/${p}/${encodeURIComponent(e.slug)}` : `/explore/${encodeURIComponent(e.entity_type)}/${encodeURIComponent(e.slug)}`;
},
};
export const exploreNav = [
{ href: '/models', label: 'Models', type: 'model' },
{ href: '/companies', label: 'Companies', type: 'company' },
{ href: '/papers', label: 'Research', type: 'paper' },
{ href: '/providers', label: 'Providers & Pricing', type: 'provider' },
{ href: '/benchmarks', label: 'Benchmarks', type: 'benchmark' },
{ href: '/hardware', label: 'Hardware', type: 'hardware' },
{ href: '/frameworks', label: 'Frameworks', type: 'framework' },
{ href: '/datasets', label: 'Datasets', type: 'dataset' },
{ href: '/tools', label: 'Tools', type: 'tool' },
];
/** Desktop header: `AI Atlas | Models · Frontier · Benchmarks · Prices · Research · Graph · Changes · More ▾`. */
export const primaryNav = [
{ href: '/models', label: 'Models' },
{ href: '/frontier', label: 'Frontier' },
{ href: '/benchmarks', label: 'Benchmarks' },
{ href: '/prices', label: 'Prices' },
{ href: '/papers', label: 'Research' },
{ href: '/graph', label: 'Graph' },
{ href: '/changes', label: 'Changes' },
];
export type NavItem = { href: string; label: string; hint?: string; type?: string };
export type NavGroup = { label: string; items: NavItem[] };
/** "More ▾" panel (desktop) and the mobile "More" sheet: the full site, grouped. */
export const moreGroups: NavGroup[] = [
{
label: 'Explore',
items: [
{ href: '/companies', label: 'Organizations', type: 'company' },
{ href: '/providers', label: 'Providers', type: 'provider' },
{ href: '/hardware', label: 'Hardware', type: 'hardware' },
{ href: '/datasets', label: 'Datasets', type: 'dataset' },
{ href: '/frameworks', label: 'Frameworks', type: 'framework' },
{ href: '/agents', label: 'Agents & Tools', type: 'tool' },
{ href: '/open', label: 'Open Models', type: 'model' },
{ href: '/families', label: 'Families', type: 'model' },
],
},
{
label: 'Intelligence',
items: [
{ href: '/compare', label: 'Compare' },
{ href: '/calculator', label: 'Calculator', hint: 'Cost of a workload across providers' },
{ href: '/run-locally', label: 'Run locally', hint: 'Which models fit your hardware' },
{ href: '/find-a-model', label: 'Find a model' },
{ href: '/pulse', label: 'Pulse' },
{ href: '/watchlist', label: 'Watchlist' },
],
},
{
label: 'Temporal',
items: [
{ href: '/timeline', label: 'Timeline' },
{ href: '/time-machine', label: 'Time Machine', hint: 'The atlas as of any date' },
{ href: '/diff', label: 'Diff', hint: 'What changed between two dates' },
],
},
{
label: 'About',
items: [
{ href: '/sources', label: 'Sources' },
{ href: '/methodology', label: 'Methodology' },
{ href: '/developers', label: 'API' },
{ href: '/about', label: 'About' },
],
},
];
/** Flat "More" list in the order required by the spec (desktop panel columns are built from `moreGroups`). */
export const moreNav: NavItem[] = moreGroups.flatMap((g) => g.items);
/** Mobile bottom tab bar: Home · Models · Changes · Search · More. */
export const mobileTabs = [
{ href: '/', label: 'Home' },
{ href: '/models', label: 'Models' },
{ href: '/changes', label: 'Changes' },
];
/** Footer columns. */
export const footerGroups: NavGroup[] = [
{ label: 'Explore', items: [...exploreNav.map((n) => ({ href: n.href, label: n.label })), { href: '/open', label: 'Open models' }, { href: '/families', label: 'Families' }] },
{ label: 'Intelligence', items: [{ href: '/frontier', label: 'Frontier' }, { href: '/compare', label: 'Compare' }, { href: '/prices', label: 'Prices' }, { href: '/calculator', label: 'Calculator' }, { href: '/run-locally', label: 'Run locally' }, { href: '/find-a-model', label: 'Find a model' }, { href: '/graph', label: 'Knowledge graph' }, { href: '/pulse', label: 'Pulse' }] },
{ label: 'Temporal', items: [{ href: '/changes', label: 'Changes' }, { href: '/timeline', label: 'Timeline' }, { href: '/time-machine', label: 'Time machine' }, { href: '/diff', label: 'Diff two dates' }, { href: '/watchlist', label: 'Watchlist' }] },
{ label: 'About', items: [{ href: '/about', label: 'About' }, { href: '/methodology', label: 'Methodology' }, { href: '/sources', label: 'Sources' }, { href: '/developers', label: 'API / Developers' }, { href: '/bot', label: 'AIAtlasBot' }] },
];
/** "Signature products" strip on the homepage. */
export const signatureProducts: NavItem[] = [
{ href: '/frontier', label: 'Frontier', hint: 'Who leads, on what, since when' },
{ href: '/graph', label: 'Knowledge graph', hint: 'Every entity, every relation' },
{ href: '/graph', label: 'Lineage', hint: 'Base → fine-tune → quantization' },
{ href: '/time-machine', label: 'Time machine', hint: 'The atlas as of any date' },
{ href: '/diff', label: 'Diff the AI world', hint: 'Two dates, every change' },
{ href: '/prices', label: 'Price intelligence', hint: 'USD per 1M tokens, over time' },
{ href: '/calculator', label: 'Cost vs performance', hint: 'Pareto view of models' },
{ href: '/benchmarks?view=matrix', label: 'Benchmark matrix', hint: 'Models × benchmarks' },
{ href: '/open', label: 'Open model frontier', hint: 'Best open weights, tracked' },
{ href: '/run-locally', label: 'Local model finder', hint: 'What fits your machine' },
{ href: '/methodology', label: 'Field-level provenance', hint: 'Who said it, when, where' },
{ href: '/changes', label: 'Change history', hint: 'Nothing is overwritten' },
];
/** Type prefixes understood by the command palette (`m:claude`). */
export const PALETTE_PREFIXES: Record = {
m: { types: ['model', 'quantization', 'artifact'], label: 'Models' },
b: { types: ['benchmark'], label: 'Benchmarks' },
o: { types: ['company', 'organization', 'lab', 'university'], label: 'Organizations' },
p: { types: ['provider'], label: 'Providers' },
h: { types: ['hardware'], label: 'Hardware' },
};
/** Change-event vocabulary (sdk/facts.py MATERIAL_PROPERTIES + writer): label, colour family. */
export const EVENT_TYPE_LABELS: Record = {
NEW_MODEL: 'New model',
NEW_COMPANY: 'New company',
NEW_PROVIDER: 'New provider',
NEW_PAPER: 'New paper',
NEW_DATASET: 'New dataset',
NEW_BENCHMARK: 'New benchmark',
NEW_FRAMEWORK: 'New framework',
NEW_HARDWARE: 'New hardware',
NEW_TOOL: 'New tool',
NEW_REPOSITORY: 'New repository',
NEW_ORGANIZATION: 'New organization',
NEW_ENTITY: 'New entity',
MODEL_UPDATED: 'Model updated',
PRICE_CHANGED: 'Price changed',
PROVIDER_LISTED: 'Listed by provider',
CONTEXT_CHANGED: 'Context window changed',
MAX_OUTPUT_CHANGED: 'Max output changed',
STATUS_CHANGED: 'Status changed',
LICENSE_CHANGED: 'License changed',
OPENNESS_CHANGED: 'Openness changed',
PARAMETERS_CHANGED: 'Parameters changed',
RELEASE_DATE_CHANGED: 'Release date changed',
KNOWLEDGE_CUTOFF_CHANGED: 'Knowledge cutoff changed',
CAPABILITIES_CHANGED: 'Capabilities changed',
RATE_LIMIT_CHANGED: 'Rate limit changed',
SPEC_CHANGED: 'Spec changed',
DEPRECATION_ANNOUNCED: 'Deprecation announced',
RETIREMENT_ANNOUNCED: 'Retirement announced',
BENCHMARK_RESULT: 'Benchmark result',
BENCHMARK_UPDATED: 'Benchmark updated',
ANNOUNCEMENT: 'Announcement',
RELEASE: 'Release',
VERSION_RELEASED: 'Version released',
PROPERTY_CHANGED: 'Property changed',
DOCUMENT_CHANGED: 'Document changed',
};
export function eventLabel(t: string): string {
return EVENT_TYPE_LABELS[t] ?? t.toLowerCase().replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
}
/** Colour family for an event type: accent-2 (amber) for money, positive for new, warning/danger for deprecations. */
export function eventTone(t: string): 'new' | 'price' | 'warn' | 'danger' | 'bench' | 'neutral' {
if (t.startsWith('NEW_') || t === 'RELEASE' || t === 'VERSION_RELEASED') return 'new';
if (t === 'PRICE_CHANGED' || t === 'PROVIDER_LISTED') return 'price';
if (t === 'DEPRECATION_ANNOUNCED') return 'warn';
if (t === 'RETIREMENT_ANNOUNCED') return 'danger';
if (t.startsWith('BENCHMARK')) return 'bench';
return 'neutral';
}
export const CATEGORY_LABELS: Record = {
model: 'Models',
company: 'Companies',
paper: 'Research',
dataset: 'Datasets',
benchmark: 'Benchmarks',
provider: 'Providers & pricing',
price: 'Pricing',
framework: 'Frameworks',
repository: 'Repositories',
tool: 'Tools',
hardware: 'Hardware',
regulation: 'Regulation',
incident: 'Incidents',
release: 'Releases',
document: 'Documents',
announcement: 'Announcements',
};
export function categoryLabel(c: string): string {
return CATEGORY_LABELS[c] ?? c.replace(/_/g, ' ').replace(/^\w/, (x) => x.toUpperCase());
}
export const IMPORTANCE_LABELS: Record = { 0: 'Minor', 1: 'Notable', 2: 'Important', 3: 'Major' };
/** Human labels for attribute keys (docs/CONNECTORS.md property vocabulary). */
export const PROPERTY_LABELS: Record = {
family: 'Family',
version: 'Version',
release_date: 'Release date',
status: 'Status',
openness: 'Openness',
license: 'License',
architecture: 'Architecture',
parameter_count: 'Parameters',
active_parameter_count: 'Active parameters',
is_moe: 'Mixture of experts',
modalities: 'Modalities',
modalities_input: 'Input modalities',
modalities_output: 'Output modalities',
context_length: 'Context window',
max_output_tokens: 'Max output',
knowledge_cutoff: 'Knowledge cutoff',
training_data_cutoff: 'Training data cutoff',
languages: 'Languages',
tool_calling: 'Tool calling',
structured_output: 'Structured output',
reasoning: 'Reasoning',
vision: 'Vision',
audio: 'Audio',
fine_tuning_available: 'Fine-tuning available',
tokenizer: 'Tokenizer',
api_model_id: 'API model id',
api_alias: 'API alias',
official_url: 'Official page',
model_card_url: 'Model card',
paper_url: 'Paper',
repository_url: 'Repository',
hf_repo: 'Hugging Face repo',
pipeline_tag: 'Pipeline tag',
base_model: 'Base model',
quantization: 'Quantization',
quant_format: 'Quantization format',
file_size_gb: 'File size',
deprecation_date: 'Deprecation date',
retirement_date: 'Retirement date',
retirement_tentative: 'Retirement tentative',
'metric.downloads': 'Downloads',
'metric.likes': 'Likes',
'metric.stars': 'Stars',
'metric.forks': 'Forks',
country: 'Country',
headquarters: 'Headquarters',
founded: 'Founded',
website: 'Website',
domains: 'Domains',
hf_org: 'Hugging Face org',
github_org: 'GitHub org',
org_kind: 'Kind',
legal_name: 'Legal name',
founders: 'Founders',
leadership: 'Leadership',
employee_count: 'Employees',
pricing_url: 'Pricing page',
docs_url: 'Documentation',
regions: 'Regions',
features: 'Features',
authors: 'Authors',
published_at: 'Published',
updated_at: 'Updated',
abstract: 'Abstract',
arxiv_id: 'arXiv id',
doi: 'DOI',
categories: 'Categories',
primary_category: 'Primary category',
pdf_url: 'PDF',
code_url: 'Code',
venue: 'Venue',
category: 'Category',
task: 'Task',
metric: 'Metric',
unit: 'Unit',
creator: 'Creator',
paper: 'Paper',
known_limitations: 'Known limitations',
methodology: 'Methodology',
kind: 'Kind',
memory_gb: 'Memory',
memory_type: 'Memory type',
memory_bandwidth_gbs: 'Memory bandwidth',
tdp_watts: 'TDP',
runtimes: 'Runtimes',
manufacturer: 'Manufacturer',
spec_url: 'Spec sheet',
price_usd: 'Price (USD)',
compute_fp16_tflops: 'FP16 compute',
latest_version: 'Latest version',
latest_release_at: 'Latest release',
language: 'Language',
topics: 'Topics',
pypi: 'PyPI',
modality: 'Modality',
size: 'Size',
publisher: 'Publisher',
description: 'Description',
};
export function propertyLabel(k: string): string {
return PROPERTY_LABELS[k] ?? k.replace(/^metric\./, '').replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
}
/** Attribute keys that are URLs (rendered as links). */
export const URL_KEYS = new Set(['official_url', 'model_card_url', 'paper_url', 'repository_url', 'website', 'pricing_url', 'docs_url', 'pdf_url', 'code_url', 'spec_url']);
/** Soft / long text properties rendered as prose, not in the spec table. */
export const PROSE_KEYS = new Set(['description', 'abstract', 'summary', 'tagline', 'availability_note', 'notes', 'training_data_notes', 'safety_notes', 'hardware_requirements', 'known_limitations', 'methodology']);
export const PREDICATE_LABELS: Record = {
develops: { out: 'Develops', in: 'Developed by' },
owns: { out: 'Owns', in: 'Owned by' },
operates: { out: 'Operates', in: 'Operated by' },
available_through: { out: 'Available through', in: 'Serves' },
evaluated_on: { out: 'Evaluated on', in: 'Evaluated models' },
described_by: { out: 'Described by', in: 'Describes' },
derived_from: { out: 'Derived from', in: 'Derivatives' },
fine_tuned_from: { out: 'Fine-tuned from', in: 'Fine-tunes' },
quantized_from: { out: 'Quantized from', in: 'Quantizations' },
distilled_from: { out: 'Distilled from', in: 'Distillations' },
merged_from: { out: 'Merged from', in: 'Merged into' },
superseded_by: { out: 'Superseded by', in: 'Supersedes' },
runs_on: { out: 'Runs on', in: 'Runs' },
uses: { out: 'Uses', in: 'Used by' },
manufactures: { out: 'Manufactures', in: 'Manufactured by' },
funded_by: { out: 'Funded by', in: 'Funds' },
acquired: { out: 'Acquired', in: 'Acquired by' },
authored: { out: 'Authored', in: 'Authors' },
works_at: { out: 'Works at', in: 'People' },
uses_dataset: { out: 'Trained on', in: 'Used to train' },
evaluates_on: { out: 'Evaluates on', in: 'Evaluated by' },
integrates: { out: 'Integrates', in: 'Integrated by' },
published_by: { out: 'Published by', in: 'Publications' },
};
export function predicateLabel(p: string, direction: 'out' | 'in'): string {
return PREDICATE_LABELS[p]?.[direction] ?? p.replace(/_/g, ' ').replace(/^\w/, (c) => c.toUpperCase());
}
export const OPENNESS_LABELS: Record = { 'open-weights': 'Open weights', 'open-source': 'Open source', proprietary: 'Proprietary', restricted: 'Restricted' };
export const STATUS_LABELS: Record = {
active: 'Active',
preview: 'Preview',
deprecated: 'Deprecated',
retired: 'Retired',
announced: 'Announced',
'limited-availability': 'Limited availability',
unknown: 'Unknown',
};
export const TIER_LABELS: Record = { 1: 'Official', 2: 'Quality secondary', 3: 'Community', 4: 'Unverified' };
export const EXAMPLE_QUERIES = [
'open models with more than 100B parameters',
'cheapest model with 1M context',
'models released in 2026',
'Anthropic',
'GPQA leaderboard',
'MoE models with 128k context',
];