import { useState, useEffect } from 'react' import { PrimeReactProvider } from 'primereact/api' import 'primereact/resources/themes/lara-light-cyan/theme.css' import ModelTable from './components/ModelTable' import LanguageTable from './components/LanguageTable' import DatasetTable from './components/DatasetTable' import WorldMap from './components/WorldMap' import AutoComplete from './components/AutoComplete' import LanguagePlot from './components/LanguagePlot' import SpeakerPlot from './components/SpeakerPlot' import HistoryPlot from './components/HistoryPlot' import CostPlot from './components/CostPlot' import { Carousel } from 'primereact/carousel' import { Dialog } from 'primereact/dialog' import { Button } from 'primereact/button' function App () { const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [selectedLanguages, setSelectedLanguages] = useState([]) const [machineTranslatedMetrics, setMachineTranslatedMetrics] = useState([]) const [dialogVisible, setDialogVisible] = useState(false) const [aboutVisible, setAboutVisible] = useState(false) const [contributeVisible, setContributeVisible] = useState(false) useEffect(() => { fetch('/api/data', { method: 'POST', body: JSON.stringify({ selectedLanguages }) }) .then(response => { if (!response.ok) { throw new Error('Network response was not ok') } return response.json() }) .then(jsonData => { setData(jsonData) setMachineTranslatedMetrics(jsonData.machine_translated_metrics || []) setLoading(false) }) .catch(err => { setError(err.message) setLoading(false) }) }, [selectedLanguages]) const [windowWidth, setWindowWidth] = useState(window.innerWidth) const [windowHeight, setWindowHeight] = useState(window.innerHeight) useEffect(() => { const handleResize = () => { setWindowWidth(window.innerWidth) setWindowHeight(window.innerHeight) } window.addEventListener('resize', handleResize) return () => window.removeEventListener('resize', handleResize) }, []) return (
Work in Progress: This dashboard is currently under active development. Evaluation results are not yet final. Note that the visualised results currently stem from sampling 20 instances per combination of model, task, and language. We have evaluated 139 languages across 41 models and 7 tasks, totaling over 300,000 individual evaluations. Only the top 150 languages by speaker count are included in the current evaluation scope. More extensive evaluation runs will be released later this year.
GitHub
🌍

AI Language Proficiency Monitor

Comprehensive multilingual evaluation results for AI language models

{data && ( setSelectedLanguages(items)} /> )}
{loading && (
)} {error && (

Error: {error}

)} {data && ( <>
)}
{/* About Dialog */} setAboutVisible(false)} style={{ width: '600px' }} modal header='About this tool' >

The AI Language Proficiency Monitor presents comprehensive multilingual evaluation results of AI language models.

Who is this for?

  • Practitioners can pick the best model for a given language.
  • Policymakers and funders can identify and prioritize neglected languages.
  • Model developers can compete on our{' '} AI Language Proficiency metric.

⚡ Live Updates

Benchmark results automatically refresh every night and include the most popular models from{' '} OpenRouter , plus community-submitted models.

Authors

The AI Language Proficiency Monitor is a collaboration between BMZ's{' '} Data Lab , the BMZ-Initiative{' '} Fair Forward {' '} (implemented by GIZ), and the{' '} E&E group {' '} of DFKI's Multilinguality and Language Technology Lab.

🔗 Links

View source code on GitHub

{/* Contribute Dialog */} setContributeVisible(false)} style={{ width: '600px' }} modal header='Add your model & Contribute' >

🚀 Submit Your Model

Have a custom fine-tuned model you'd like to see on the leaderboard?

→ Submit your model here

🔧 Contribute to Development

Help us expand language coverage and add new evaluation tasks:

→ Contribution guidelines

{/* Full-screen Dialog for Charts */} setDialogVisible(false)} style={{ width: '90vw', height: '90vh' }} maximizable modal header={null} > {data && (
, , , , ]} numScroll={1} numVisible={1} itemTemplate={item => item} circular style={{ width: '100%', height: 'calc(90vh - 120px)' }} />
)}
) } export default App