import React, { useState, useEffect, useMemo } from "react"; import { generateCalendarData } from "../utils/calendar"; import { OpenSourceHeatmapProps, ProviderInfo, ModelData, CalendarData, } from "../types/heatmap"; import Heatmap from "../components/Heatmap"; import { fetchAllProvidersData, fetchAllAuthorsData } from "../utils/authors"; import UserSearchDialog from "../components/UserSearchDialog"; const PROVIDERS: ProviderInfo[] = [ { color: "#ff7000", authors: ["mistralai"] }, { color: "#1877F2", authors: ["meta-llama", "facebook", ] }, { color: "#10A37F", authors: ["openai"] }, { color: "#cc785c", authors: ["Anthropic"] }, { color: "#DB4437", authors: ["google"] }, { color: "#5E35B1", authors: ["allenai"] }, { color: "#0088cc", authors: ["apple"] }, { color: "#FEB800", authors: ["microsoft"] }, { color: "#76B900", authors: ["nvidia"] }, { color: "#0088cc", authors: ["deepseek-ai"] }, { color: "#0088cc", authors: ["Qwen"] }, { color: "#4C6EE6", authors: ["CohereForAI"] }, { color: "#4C6EE6", authors: ["ibm-granite"] }, { color: "#A020F0", authors: ["stabilityai"] }, ]; export async function getStaticProps() { try { const allAuthors = PROVIDERS.flatMap(({ authors }) => authors); const uniqueAuthors = Array.from(new Set(allAuthors)); const flatData: ModelData[] = await fetchAllAuthorsData(uniqueAuthors); const updatedProviders = await fetchAllProvidersData(PROVIDERS); const calendarData = generateCalendarData(flatData, updatedProviders); return { props: { calendarData, providers: updatedProviders, }, revalidate: 3600, // regenerate every hour }; } catch (error) { console.error("Error fetching data:", error); return { props: { calendarData: {}, providers: PROVIDERS, }, revalidate: 60, // retry after 1 minute if there was an error }; } } const ProviderHeatmap = React.memo(({ provider, calendarData }: { provider: ProviderInfo, calendarData: CalendarData }) => { const providerName = provider.fullName || provider.authors[0]; return (
); }); const OpenSourceHeatmap: React.FC = ({ calendarData, providers, }) => { const [isLoading, setIsLoading] = useState(true); useEffect(() => { if (calendarData && Object.keys(calendarData).length > 0) { setIsLoading(false); } }, [calendarData]); const sortedProviders = useMemo(() => providers.sort((a, b) => calendarData[b.fullName || b.authors[0]].reduce( (sum, day) => sum + day.count, 0 ) - calendarData[a.fullName || a.authors[0]].reduce( (sum, day) => sum + day.count, 0 ) ), [providers, calendarData] ); return (

Hugging Face Heatmap 🤗

Models, Datasets, and Spaces from the top AI labs.

{isLoading ? (

Loading...

) : (
{sortedProviders.map((provider) => ( ))}
)}
); }; export default React.memo(OpenSourceHeatmap);