import React, { useState, useEffect } from 'react'; import ActivityCalendar from "react-activity-calendar"; import { Tooltip } from '@mui/material'; interface ProviderInfo { color: string; authors: string[]; } const PROVIDERS_MAP: Record = { "Mistral AI": { color: "#ff7000", authors: ["mistralai"] }, "Meta": { color: "#1877F2", authors: ["facebook", "meta-llama"] }, "OpenAI": { color: "#10A37F", authors: ["openai"] }, "Anthropic": { color: "#cc785c", authors: ["Anthropic"] }, "Google": { color: "#DB4437", authors: ["google"] }, "Allen Institute for AI": { color: "#5E35B1", authors: ["allenai"] }, "Apple": { color: "#0088cc", authors: ["apple"] }, "Microsoft": { color: "#FEB800", authors: ["microsoft"] }, "NVIDIA": { color: "#76B900", authors: ["nvidia"] }, "DeepSeek": { color: "#0088cc", authors: ["deepseek-ai"] }, "Qwen": { color: "#0088cc", authors: ["Qwen"] }, "Cohere For AI": { color: "#4C6EE6", authors: ["CohereForAI"] }, "IBM": { color: "#4C6EE6", authors: ["ibm-granite"] }, }; interface ModelData { createdAt: string; id: string; } interface Activity { date: string; count: number; level: number; } export default function OpenSourceHeatmap() { const [calendarData, setCalendarData] = useState>({}); const [isLoading, setIsLoading] = useState(true); const generateCalendarData = (modelData: ModelData[]) => { const data: Record = Object.fromEntries( Object.keys(PROVIDERS_MAP).map(provider => [provider, []]) ); const today = new Date(); const startDate = new Date(today); startDate.setMonth(today.getMonth() - 11); startDate.setDate(1); // create a map to store counts for each provider and date const countMap: Record> = {}; modelData.forEach(item => { const dateString = item.createdAt.split('T')[0]; Object.entries(PROVIDERS_MAP).forEach(([provider, { authors }]) => { if (authors.some(author => item.id.startsWith(author))) { countMap[provider] = countMap[provider] || {}; countMap[provider][dateString] = (countMap[provider][dateString] || 0) + 1; } }); }); // fill in with 0s for days with no activity for (let d = new Date(startDate); d <= today; d.setDate(d.getDate() + 1)) { const dateString = d.toISOString().split('T')[0]; Object.entries(PROVIDERS_MAP).forEach(([provider]) => { const count = countMap[provider]?.[dateString] || 0; data[provider].push({ date: dateString, count, level: 0 }); }); } // calculate average counts for each provider const avgCounts = Object.fromEntries( Object.entries(data).map(([provider, days]) => [ provider, days.reduce((sum, day) => sum + day.count, 0) / days.length || 0 ]) ); // assign levels based on count relative to average Object.entries(data).forEach(([provider, days]) => { const avgCount = avgCounts[provider]; days.forEach(day => { day.level = day.count === 0 ? 0 : day.count <= avgCount * 0.5 ? 1 : day.count <= avgCount ? 2 : day.count <= avgCount * 1.5 ? 3 : 4; }); }); return data; } const initData = async () => { try { const allAuthors = Object.values(PROVIDERS_MAP).flatMap(({ authors }) => authors); const uniqueAuthors = Array.from(new Set(allAuthors)); const allModelData = await Promise.all( uniqueAuthors.map(async (author) => { const response = await fetch(`https://huggingface.co/api/models?author=${author}&sort=createdAt&direction=-1`); const data = await response.json(); return data.map((item: any) => ({ createdAt: item.createdAt, id: item.id, })); }) ); const flatModelData = allModelData.flat(); const calendarData = generateCalendarData(flatModelData); setCalendarData(calendarData); } catch (error) { console.error("Error fetching data:", error); } finally { setIsLoading(false); } } useEffect(() => { initData(); }, []); return (

Hugging Face Heatmap 🤗

The top AI labs and model releases.

{isLoading ? (

Loading...

) : (
{Object.entries(PROVIDERS_MAP) .sort(([keyA], [keyB]) => calendarData[keyB].reduce((sum, day) => sum + day.count, 0) - calendarData[keyA].reduce((sum, day) => sum + day.count, 0) ) .map(([providerName, { color }]) => (

{providerName}

( {block} )} />
)) }
)}
); }