Upload from GitHub Actions: Merge remote changes with local frontend updates
Browse files
frontend/src/App.js
CHANGED
@@ -19,6 +19,8 @@ function App () {
|
|
19 |
const [error, setError] = useState(null)
|
20 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
21 |
const [dialogVisible, setDialogVisible] = useState(false)
|
|
|
|
|
22 |
|
23 |
useEffect(() => {
|
24 |
fetch('/api/data', {
|
@@ -54,9 +56,22 @@ function App () {
|
|
54 |
|
55 |
return (
|
56 |
<PrimeReactProvider>
|
57 |
-
<div style={{
|
58 |
<div style={{backgroundColor: '#fff3cd', color: '#856404', padding: '0.75rem 1.25rem', marginBottom: '1rem', border: '1px solid #ffeeba', borderRadius: '0.25rem', textAlign: 'center'}}>
|
59 |
<strong>Work in Progress:</strong> This dashboard is currently under active development. Evaluation results are not yet final.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
</div>
|
61 |
<header
|
62 |
style={{
|
@@ -64,14 +79,17 @@ function App () {
|
|
64 |
flexDirection: 'column',
|
65 |
alignItems: 'center',
|
66 |
justifyContent: 'center',
|
67 |
-
padding: '5vh
|
|
|
|
|
|
|
68 |
}}
|
69 |
>
|
70 |
<div>
|
71 |
<span
|
72 |
role='img'
|
73 |
aria-label='Globe Emoji'
|
74 |
-
style={{ fontSize: '
|
75 |
>
|
76 |
π
|
77 |
</span>
|
@@ -79,85 +97,79 @@ function App () {
|
|
79 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
80 |
AI Language Proficiency Monitor
|
81 |
</h1>
|
82 |
-
<p style={{ fontSize: '1.
|
83 |
-
|
84 |
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
{data && (
|
86 |
<AutoComplete
|
87 |
languages={data?.language_table}
|
88 |
onComplete={items => setSelectedLanguages(items)}
|
89 |
/>
|
90 |
)}
|
91 |
-
<div style={{maxWidth: '600px', textAlign: 'center', marginTop: '2rem'}}>
|
92 |
-
<p>The <i>AI Language Proficiency Monitor</i> presents comprehensive multilingual evaluation results of AI language models.</p>
|
93 |
-
<ul style={{textAlign: 'left'}}>
|
94 |
-
<li><b>Practitioners</b> can pick the best model for a given language.</li>
|
95 |
-
<li><b>Policymakers and funders</b> can identify and prioritize neglected languages.</li>
|
96 |
-
<li><b>Model developers</b> can compete on our <i>AI Language Proficiency</i> metric.</li>
|
97 |
-
</ul>
|
98 |
-
<p>We invite the community to <a href="https://forms.gle/ckvY9pS7XLcHYnaV8" target="_blank" rel="noopener noreferrer">submit</a> their custom finetuned models, and to <a href="https://github.com/datenlabor-bmz/ai-language-monitor/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer">integrate</a> benchmarks for more languages and tasks.</p>
|
99 |
-
<p>Benchmark results automatically refresh every night and include the most popular models on <a href="https://openrouter.ai" target="_blank" rel="noopener noreferrer">OpenRouter</a>, plus community-listed models.</p>
|
100 |
-
{/* <p>For a detailed methodlogy, see <a href="#">XXX</a>.</p> */}
|
101 |
-
<p>The AI Language Proficiency Monitor is a collaboration between BMZ's <a href="https://www.bmz-digital.global/en/overview-of-initiatives/the-bmz-data-lab/" target="_blank" rel="noopener noreferrer">Data Lab</a>, the BMZ-Initiative <a href="https://www.bmz-digital.global/en/overview-of-initiatives/fair-forward/" target="_blank" rel="noopener noreferrer">Fair Forward</a> (implemented by GIZ), and the <a href="https://www.dfki.de/en/web/research/research-departments/multilinguality-and-language-technology/ee-team" target="_blank" rel="noopener noreferrer">E&E group</a> of DFKI's Multilinguality and Language Technology Lab.</p>
|
102 |
-
</div>
|
103 |
-
<a href="https://github.com/datenlabor-bmz/ai-language-monitor" target="_blank" rel="noopener noreferrer" style={{ textDecoration: 'none', color: 'inherit', marginTop: '2rem' }}>
|
104 |
-
<i className="pi pi-github" style={{ fontSize: '1.5rem' }} />
|
105 |
-
</a>
|
106 |
</header>
|
107 |
<main
|
108 |
style={{
|
109 |
display: 'flex',
|
110 |
-
flexDirection: '
|
111 |
-
|
112 |
-
gap: '2rem',
|
113 |
-
alignItems: 'center',
|
114 |
width: '100%',
|
115 |
-
|
116 |
-
|
117 |
-
paddingBottom: '5vh'
|
118 |
}}
|
119 |
>
|
120 |
{loading && (
|
121 |
-
<
|
|
|
|
|
122 |
)}
|
123 |
-
{error && <p>Error: {error}</p>}
|
124 |
{data && (
|
125 |
<>
|
126 |
-
<div
|
127 |
-
style={{
|
128 |
-
flex: '60vw 100vw 40vw',
|
129 |
-
maxWidth: 'min(100vw, 800px)'
|
130 |
-
}}
|
131 |
-
>
|
132 |
<ModelTable data={data.model_table} />
|
133 |
</div>
|
134 |
-
<div
|
135 |
-
style={{
|
136 |
-
flex: '60vw 100vw 40vw',
|
137 |
-
maxWidth: 'min(100vw, 800px)'
|
138 |
-
}}
|
139 |
-
>
|
140 |
<LanguageTable
|
141 |
data={data.language_table}
|
142 |
selectedLanguages={selectedLanguages}
|
143 |
setSelectedLanguages={setSelectedLanguages}
|
144 |
/>
|
145 |
</div>
|
146 |
-
<div
|
147 |
-
style={{
|
148 |
-
flex: '60vw 100vw 40vw',
|
149 |
-
maxWidth: 'min(100vw, 800px)'
|
150 |
-
}}
|
151 |
-
>
|
152 |
<DatasetTable data={data} />
|
153 |
</div>
|
154 |
<div
|
155 |
id='figure'
|
156 |
style={{
|
157 |
-
flex: '100vw 100vw 100vw',
|
158 |
-
maxWidth: 'min(100vw, 800px)',
|
159 |
-
alignItems: 'center',
|
160 |
-
justifyContent: 'center',
|
161 |
width: '100%',
|
162 |
position: 'relative'
|
163 |
}}
|
@@ -193,13 +205,74 @@ function App () {
|
|
193 |
)}
|
194 |
</main>
|
195 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
<Dialog
|
197 |
visible={dialogVisible}
|
198 |
onHide={() => setDialogVisible(false)}
|
199 |
style={{ width: '90vw', height: '90vh' }}
|
200 |
maximizable
|
201 |
modal
|
202 |
-
header="
|
203 |
>
|
204 |
{data && (
|
205 |
<div style={{ width: '100%', height: '100%' }}>
|
|
|
19 |
const [error, setError] = useState(null)
|
20 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
21 |
const [dialogVisible, setDialogVisible] = useState(false)
|
22 |
+
const [aboutVisible, setAboutVisible] = useState(false)
|
23 |
+
const [contributeVisible, setContributeVisible] = useState(false)
|
24 |
|
25 |
useEffect(() => {
|
26 |
fetch('/api/data', {
|
|
|
56 |
|
57 |
return (
|
58 |
<PrimeReactProvider>
|
59 |
+
<div style={{ minHeight: '100vh', display: 'flex', flexDirection: 'column', width: '100vw' }}>
|
60 |
<div style={{backgroundColor: '#fff3cd', color: '#856404', padding: '0.75rem 1.25rem', marginBottom: '1rem', border: '1px solid #ffeeba', borderRadius: '0.25rem', textAlign: 'center'}}>
|
61 |
<strong>Work in Progress:</strong> This dashboard is currently under active development. Evaluation results are not yet final.
|
62 |
+
<a href="https://github.com/datenlabor-bmz/ai-language-monitor" target="_blank" rel="noopener noreferrer" style={{
|
63 |
+
textDecoration: 'none',
|
64 |
+
color: '#856404',
|
65 |
+
float: 'right',
|
66 |
+
fontSize: '1.2rem',
|
67 |
+
fontWeight: 'bold',
|
68 |
+
padding: '0 0.5rem',
|
69 |
+
borderRadius: '3px',
|
70 |
+
backgroundColor: 'rgba(255,255,255,0.3)'
|
71 |
+
}}>
|
72 |
+
<i className="pi pi-github" title="View on GitHub" style={{ marginRight: '0.3rem' }} />
|
73 |
+
GitHub
|
74 |
+
</a>
|
75 |
</div>
|
76 |
<header
|
77 |
style={{
|
|
|
79 |
flexDirection: 'column',
|
80 |
alignItems: 'center',
|
81 |
justifyContent: 'center',
|
82 |
+
padding: '5vh 5vw',
|
83 |
+
width: '100%',
|
84 |
+
maxWidth: '1400px',
|
85 |
+
margin: '0 auto'
|
86 |
}}
|
87 |
>
|
88 |
<div>
|
89 |
<span
|
90 |
role='img'
|
91 |
aria-label='Globe Emoji'
|
92 |
+
style={{ fontSize: '40px' }}
|
93 |
>
|
94 |
π
|
95 |
</span>
|
|
|
97 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
98 |
AI Language Proficiency Monitor
|
99 |
</h1>
|
100 |
+
<p style={{ fontSize: '1.10rem', color: '#555', marginTop: '0', marginBottom: '2rem' }}>
|
101 |
+
Comprehensive multilingual evaluation results for AI language models
|
102 |
</p>
|
103 |
+
|
104 |
+
<div style={{ display: 'flex', gap: '1rem', marginBottom: '1.5rem', flexWrap: 'wrap', justifyContent: 'center' }}>
|
105 |
+
<Button
|
106 |
+
label="π About this tool"
|
107 |
+
className="p-button-text"
|
108 |
+
onClick={() => setAboutVisible(true)}
|
109 |
+
style={{
|
110 |
+
color: '#666',
|
111 |
+
border: '1px solid #ddd',
|
112 |
+
padding: '0.5rem 1rem',
|
113 |
+
borderRadius: '4px',
|
114 |
+
fontSize: '0.9rem'
|
115 |
+
}}
|
116 |
+
/>
|
117 |
+
|
118 |
+
<Button
|
119 |
+
label="π Add your model"
|
120 |
+
className="p-button-text"
|
121 |
+
onClick={() => setContributeVisible(true)}
|
122 |
+
style={{
|
123 |
+
color: '#666',
|
124 |
+
border: '1px solid #ddd',
|
125 |
+
padding: '0.5rem 1rem',
|
126 |
+
borderRadius: '4px',
|
127 |
+
fontSize: '0.9rem'
|
128 |
+
}}
|
129 |
+
/>
|
130 |
+
</div>
|
131 |
+
|
132 |
{data && (
|
133 |
<AutoComplete
|
134 |
languages={data?.language_table}
|
135 |
onComplete={items => setSelectedLanguages(items)}
|
136 |
/>
|
137 |
)}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
</header>
|
139 |
<main
|
140 |
style={{
|
141 |
display: 'flex',
|
142 |
+
flexDirection: 'column',
|
143 |
+
gap: '3rem',
|
|
|
|
|
144 |
width: '100%',
|
145 |
+
paddingBottom: '5vh',
|
146 |
+
padding: '1rem 15vw 5vh 15vw'
|
|
|
147 |
}}
|
148 |
>
|
149 |
{loading && (
|
150 |
+
<div style={{ width: '100%', textAlign: 'center' }}>
|
151 |
+
<i className='pi pi-spinner pi-spin' style={{ fontSize: '4rem' }} />
|
152 |
+
</div>
|
153 |
)}
|
154 |
+
{error && <div style={{ width: '100%', textAlign: 'center' }}><p>Error: {error}</p></div>}
|
155 |
{data && (
|
156 |
<>
|
157 |
+
<div style={{ width: '100%' }}>
|
|
|
|
|
|
|
|
|
|
|
158 |
<ModelTable data={data.model_table} />
|
159 |
</div>
|
160 |
+
<div style={{ width: '100%' }}>
|
|
|
|
|
|
|
|
|
|
|
161 |
<LanguageTable
|
162 |
data={data.language_table}
|
163 |
selectedLanguages={selectedLanguages}
|
164 |
setSelectedLanguages={setSelectedLanguages}
|
165 |
/>
|
166 |
</div>
|
167 |
+
<div style={{ width: '100%' }}>
|
|
|
|
|
|
|
|
|
|
|
168 |
<DatasetTable data={data} />
|
169 |
</div>
|
170 |
<div
|
171 |
id='figure'
|
172 |
style={{
|
|
|
|
|
|
|
|
|
173 |
width: '100%',
|
174 |
position: 'relative'
|
175 |
}}
|
|
|
205 |
)}
|
206 |
</main>
|
207 |
|
208 |
+
{/* About Dialog */}
|
209 |
+
<Dialog
|
210 |
+
visible={aboutVisible}
|
211 |
+
onHide={() => setAboutVisible(false)}
|
212 |
+
style={{ width: '600px' }}
|
213 |
+
modal
|
214 |
+
header="About this tool"
|
215 |
+
>
|
216 |
+
<div>
|
217 |
+
<p>The <i>AI Language Proficiency Monitor</i> presents comprehensive multilingual evaluation results of AI language models.</p>
|
218 |
+
<h4>Who is this for?</h4>
|
219 |
+
<ul>
|
220 |
+
<li><b>Practitioners</b> can pick the best model for a given language.</li>
|
221 |
+
<li><b>Policymakers and funders</b> can identify and prioritize neglected languages.</li>
|
222 |
+
<li><b>Model developers</b> can compete on our <i>AI Language Proficiency</i> metric.</li>
|
223 |
+
</ul>
|
224 |
+
<h4>β‘ Live Updates</h4>
|
225 |
+
<p>Benchmark results automatically refresh every night and include the most popular models from <a href="https://openrouter.ai" target="_blank" rel="noopener noreferrer">OpenRouter</a>, plus community-submitted models.</p>
|
226 |
+
<h4>Authors</h4>
|
227 |
+
<p>The AI Language Proficiency Monitor is a collaboration between BMZ's <a href="https://www.bmz-digital.global/en/overview-of-initiatives/the-bmz-data-lab/" target="_blank" rel="noopener noreferrer">Data Lab</a>, the BMZ-Initiative <a href="https://www.bmz-digital.global/en/overview-of-initiatives/fair-forward/" target="_blank" rel="noopener noreferrer">Fair Forward</a> (implemented by GIZ), and the <a href="https://www.dfki.de/en/web/research/research-departments/multilinguality-and-language-technology/ee-team" target="_blank" rel="noopener noreferrer">E&E group</a> of DFKI's Multilinguality and Language Technology Lab.</p>
|
228 |
+
<h4>π Links</h4>
|
229 |
+
<p>
|
230 |
+
<a
|
231 |
+
href="https://github.com/datenlabor-bmz/ai-language-monitor"
|
232 |
+
target="_blank"
|
233 |
+
rel="noopener noreferrer"
|
234 |
+
style={{
|
235 |
+
color: '#666',
|
236 |
+
textDecoration: 'none',
|
237 |
+
display: 'inline-flex',
|
238 |
+
alignItems: 'center',
|
239 |
+
gap: '0.5rem'
|
240 |
+
}}
|
241 |
+
>
|
242 |
+
<i className="pi pi-github" style={{ fontSize: '1.2rem' }} />
|
243 |
+
View source code on GitHub
|
244 |
+
</a>
|
245 |
+
</p>
|
246 |
+
</div>
|
247 |
+
</Dialog>
|
248 |
+
|
249 |
+
{/* Contribute Dialog */}
|
250 |
+
<Dialog
|
251 |
+
visible={contributeVisible}
|
252 |
+
onHide={() => setContributeVisible(false)}
|
253 |
+
style={{ width: '600px' }}
|
254 |
+
modal
|
255 |
+
header="Add your model & Contribute"
|
256 |
+
>
|
257 |
+
<div>
|
258 |
+
<h4>π Submit Your Model</h4>
|
259 |
+
<p>Have a custom fine-tuned model you'd like to see on the leaderboard?</p>
|
260 |
+
<p><a href="https://forms.gle/ckvY9pS7XLcHYnaV8" target="_blank" rel="noopener noreferrer" style={{ color: '#28a745', fontWeight: 'bold' }}>β Submit your model here</a></p>
|
261 |
+
|
262 |
+
<h4>π§ Contribute to Development</h4>
|
263 |
+
<p>Help us expand language coverage and add new evaluation tasks:</p>
|
264 |
+
<p><a href="https://github.com/datenlabor-bmz/ai-language-monitor/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" style={{ color: '#007bff', fontWeight: 'bold' }}>β Contribution guidelines</a></p>
|
265 |
+
</div>
|
266 |
+
</Dialog>
|
267 |
+
|
268 |
+
{/* Full-screen Dialog for Charts */}
|
269 |
<Dialog
|
270 |
visible={dialogVisible}
|
271 |
onHide={() => setDialogVisible(false)}
|
272 |
style={{ width: '90vw', height: '90vh' }}
|
273 |
maximizable
|
274 |
modal
|
275 |
+
header="Interactive Visualizations"
|
276 |
>
|
277 |
{data && (
|
278 |
<div style={{ width: '100%', height: '100%' }}>
|
frontend/src/components/AutoComplete.js
CHANGED
@@ -4,7 +4,8 @@ const AutoComplete = ({ languages, onComplete }) => {
|
|
4 |
const [autoComplete, setAutoComplete] = useState('')
|
5 |
const [suggestions, setSuggestions] = useState([])
|
6 |
|
7 |
-
const exampleCodes = ['
|
|
|
8 |
const exampleLanguages = exampleCodes.map(code =>
|
9 |
languages?.find(item => item.bcp_47 === code)
|
10 |
)
|
|
|
4 |
const [autoComplete, setAutoComplete] = useState('')
|
5 |
const [suggestions, setSuggestions] = useState([])
|
6 |
|
7 |
+
const exampleCodes = ['sw','ar', 'hi', 'en']
|
8 |
+
// const exampleCodes = ['ar', 'hi', 'sw', 'fa']
|
9 |
const exampleLanguages = exampleCodes.map(code =>
|
10 |
languages?.find(item => item.bcp_47 === code)
|
11 |
)
|
frontend/src/components/DatasetTable.js
CHANGED
@@ -111,7 +111,7 @@ const DatasetTable = ({ data }) => {
|
|
111 |
scrollable
|
112 |
scrollHeight='600px'
|
113 |
id='dataset-table'
|
114 |
-
style={{ width: '
|
115 |
>
|
116 |
<Column
|
117 |
field='implemented'
|
|
|
111 |
scrollable
|
112 |
scrollHeight='600px'
|
113 |
id='dataset-table'
|
114 |
+
style={{ width: '100%', minHeight: '650px' }}
|
115 |
>
|
116 |
<Column
|
117 |
field='implemented'
|
frontend/src/components/LanguageTable.js
CHANGED
@@ -135,7 +135,7 @@ const LanguageTable = ({ data, selectedLanguages, setSelectedLanguages }) => {
|
|
135 |
scrollable
|
136 |
scrollHeight='600px'
|
137 |
id='language-table'
|
138 |
-
style={{ width: '
|
139 |
>
|
140 |
<Column selectionMode='multiple' headerStyle={{ width: '3rem' }} />
|
141 |
<Column
|
|
|
135 |
scrollable
|
136 |
scrollHeight='600px'
|
137 |
id='language-table'
|
138 |
+
style={{ width: '100%', minHeight: '650px' }}
|
139 |
>
|
140 |
<Column selectionMode='multiple' headerStyle={{ width: '3rem' }} />
|
141 |
<Column
|
frontend/src/components/ModelTable.js
CHANGED
@@ -161,7 +161,7 @@ const ModelTable = ({ data }) => {
|
|
161 |
scrollable
|
162 |
scrollHeight='600px'
|
163 |
id='model-table'
|
164 |
-
style={{ width: '
|
165 |
emptyMessage='No models have been evaluated for the selected languages.'
|
166 |
>
|
167 |
<Column field='rank' body={rankBodyTemplate} headerTooltip='Rank' />
|
|
|
161 |
scrollable
|
162 |
scrollHeight='600px'
|
163 |
id='model-table'
|
164 |
+
style={{ width: '100%', minHeight: '650px' }}
|
165 |
emptyMessage='No models have been evaluated for the selected languages.'
|
166 |
>
|
167 |
<Column field='rank' body={rankBodyTemplate} headerTooltip='Rank' />
|