Spaces:
Running
Running
David Pomerenke
commited on
Commit
·
a3e21c6
1
Parent(s):
eb1696c
AutoComplete improvements and examples
Browse files
frontend/src/App.js
CHANGED
|
@@ -8,13 +8,11 @@ import WorldMap from './components/WorldMap'
|
|
| 8 |
import AutoComplete from './components/AutoComplete'
|
| 9 |
import LanguagePlot from './components/LanguagePlot'
|
| 10 |
import { Carousel } from 'primereact/carousel'
|
| 11 |
-
import { FilterMatchMode } from 'primereact/api'
|
| 12 |
|
| 13 |
function App () {
|
| 14 |
const [data, setData] = useState(null)
|
| 15 |
const [loading, setLoading] = useState(true)
|
| 16 |
const [error, setError] = useState(null)
|
| 17 |
-
const [allSuggestions, setAllSuggestions] = useState([])
|
| 18 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
| 19 |
useEffect(() => {
|
| 20 |
fetch('/api/data', {
|
|
@@ -37,38 +35,6 @@ function App () {
|
|
| 37 |
})
|
| 38 |
}, [selectedLanguages])
|
| 39 |
|
| 40 |
-
useEffect(() => {
|
| 41 |
-
if (data) {
|
| 42 |
-
const models = data.model_table.map(item => ({
|
| 43 |
-
type: 'Model',
|
| 44 |
-
value: item.model,
|
| 45 |
-
detail: item.provider,
|
| 46 |
-
searchText: item.model.toLowerCase()
|
| 47 |
-
}))
|
| 48 |
-
const languages = data.language_table.map(item => ({
|
| 49 |
-
type: 'Language',
|
| 50 |
-
value: item.autonym,
|
| 51 |
-
detail: item.language_name,
|
| 52 |
-
searchText:
|
| 53 |
-
item.language_name.toLowerCase() + ' ' + item.autonym.toLowerCase(),
|
| 54 |
-
bcp_47: item.bcp_47
|
| 55 |
-
}))
|
| 56 |
-
const datasets = data.dataset_table.map(item => ({
|
| 57 |
-
type: 'Dataset',
|
| 58 |
-
value: item.name,
|
| 59 |
-
detail: item.tasks,
|
| 60 |
-
searchText:
|
| 61 |
-
item.author.toLowerCase() +
|
| 62 |
-
' ' +
|
| 63 |
-
item.name.toLowerCase() +
|
| 64 |
-
' ' +
|
| 65 |
-
item.tasks.map(task => task.toLowerCase()).join(' ')
|
| 66 |
-
}))
|
| 67 |
-
const allSuggestions = [...models, ...languages, ...datasets]
|
| 68 |
-
setAllSuggestions(allSuggestions)
|
| 69 |
-
}
|
| 70 |
-
}, [data])
|
| 71 |
-
|
| 72 |
return (
|
| 73 |
<PrimeReactProvider>
|
| 74 |
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
|
@@ -91,18 +57,15 @@ function App () {
|
|
| 91 |
</span>
|
| 92 |
</div>
|
| 93 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
| 94 |
-
Global AI
|
| 95 |
</h1>
|
| 96 |
<p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
|
| 97 |
Tracking language proficiency of AI models for every language
|
| 98 |
</p>
|
| 99 |
<AutoComplete
|
| 100 |
-
|
| 101 |
-
onComplete={
|
| 102 |
-
if (item.type === 'Language') setSelectedLanguages(() => [item])
|
| 103 |
-
}}
|
| 104 |
/>
|
| 105 |
-
<pre>{JSON.stringify(selectedLanguages, null, 2)}</pre>
|
| 106 |
</header>
|
| 107 |
<main
|
| 108 |
style={{
|
|
@@ -169,6 +132,7 @@ function App () {
|
|
| 169 |
numVisible={1}
|
| 170 |
itemTemplate={item => item}
|
| 171 |
circular
|
|
|
|
| 172 |
/>
|
| 173 |
</div>
|
| 174 |
</>
|
|
|
|
| 8 |
import AutoComplete from './components/AutoComplete'
|
| 9 |
import LanguagePlot from './components/LanguagePlot'
|
| 10 |
import { Carousel } from 'primereact/carousel'
|
|
|
|
| 11 |
|
| 12 |
function App () {
|
| 13 |
const [data, setData] = useState(null)
|
| 14 |
const [loading, setLoading] = useState(true)
|
| 15 |
const [error, setError] = useState(null)
|
|
|
|
| 16 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
| 17 |
useEffect(() => {
|
| 18 |
fetch('/api/data', {
|
|
|
|
| 35 |
})
|
| 36 |
}, [selectedLanguages])
|
| 37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
return (
|
| 39 |
<PrimeReactProvider>
|
| 40 |
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
|
|
|
| 57 |
</span>
|
| 58 |
</div>
|
| 59 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
| 60 |
+
Global AI Monitor
|
| 61 |
</h1>
|
| 62 |
<p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
|
| 63 |
Tracking language proficiency of AI models for every language
|
| 64 |
</p>
|
| 65 |
<AutoComplete
|
| 66 |
+
languages={data?.language_table}
|
| 67 |
+
onComplete={items => setSelectedLanguages(items)}
|
|
|
|
|
|
|
| 68 |
/>
|
|
|
|
| 69 |
</header>
|
| 70 |
<main
|
| 71 |
style={{
|
|
|
|
| 132 |
numVisible={1}
|
| 133 |
itemTemplate={item => item}
|
| 134 |
circular
|
| 135 |
+
style={{ width: '800px', minHeight: '650px' }}
|
| 136 |
/>
|
| 137 |
</div>
|
| 138 |
</>
|
frontend/src/components/AutoComplete.js
CHANGED
|
@@ -1,58 +1,100 @@
|
|
| 1 |
import { AutoComplete as PrimeAutoComplete } from 'primereact/autocomplete'
|
| 2 |
import { useState } from 'react'
|
| 3 |
-
const AutoComplete = ({
|
| 4 |
const [autoComplete, setAutoComplete] = useState('')
|
| 5 |
const [suggestions, setSuggestions] = useState([])
|
| 6 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
const search = e => {
|
| 8 |
-
const matches =
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
setSuggestions(matches)
|
| 12 |
}
|
| 13 |
|
| 14 |
-
const itemTemplate = item =>
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</span>
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
style={{
|
| 28 |
display: 'flex',
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
}}
|
| 32 |
>
|
| 33 |
-
<span>
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
autoFocus
|
| 54 |
-
itemTemplate={itemTemplate}
|
| 55 |
-
/>
|
| 56 |
)
|
| 57 |
}
|
| 58 |
|
|
|
|
| 1 |
import { AutoComplete as PrimeAutoComplete } from 'primereact/autocomplete'
|
| 2 |
import { useState } from 'react'
|
| 3 |
+
const AutoComplete = ({ languages, onComplete }) => {
|
| 4 |
const [autoComplete, setAutoComplete] = useState('')
|
| 5 |
const [suggestions, setSuggestions] = useState([])
|
| 6 |
|
| 7 |
+
const exampleCodes = ['de', 'fr', 'ar', 'hi', 'sw', 'fa']
|
| 8 |
+
const exampleLanguages = languages?.filter(item =>
|
| 9 |
+
exampleCodes.includes(item.bcp_47)
|
| 10 |
+
)
|
| 11 |
+
|
| 12 |
const search = e => {
|
| 13 |
+
const matches = languages.filter(language => {
|
| 14 |
+
const query = e.query.toLowerCase()
|
| 15 |
+
return (
|
| 16 |
+
language.language_name.toLowerCase().includes(query) ||
|
| 17 |
+
language.autonym.toLowerCase().includes(query) ||
|
| 18 |
+
language.bcp_47.toLowerCase().includes(query)
|
| 19 |
+
)
|
| 20 |
+
})
|
| 21 |
setSuggestions(matches)
|
| 22 |
}
|
| 23 |
|
| 24 |
+
const itemTemplate = item => (
|
| 25 |
+
<div
|
| 26 |
+
style={{
|
| 27 |
+
display: 'flex',
|
| 28 |
+
flexDirection: 'row',
|
| 29 |
+
justifyContent: 'space-between'
|
| 30 |
+
}}
|
| 31 |
+
>
|
| 32 |
+
<span>
|
| 33 |
+
{item.autonym}
|
| 34 |
+
<span style={{ color: 'gray', marginLeft: '1rem' }}>
|
| 35 |
+
{item.language_name}
|
| 36 |
</span>
|
| 37 |
+
</span>
|
| 38 |
+
<span style={{ color: 'gray' }}>{item.bcp_47}</span>
|
| 39 |
+
</div>
|
| 40 |
+
)
|
| 41 |
+
|
| 42 |
+
return (
|
| 43 |
+
<>
|
| 44 |
+
<PrimeAutoComplete
|
| 45 |
+
placeholder='Search for language-specific leaderboards...'
|
| 46 |
+
value={autoComplete}
|
| 47 |
+
onChange={e => setAutoComplete(e.value)}
|
| 48 |
+
onClick={() => {
|
| 49 |
+
setAutoComplete('')
|
| 50 |
+
setSuggestions(languages)
|
| 51 |
+
}}
|
| 52 |
+
onSelect={e => {
|
| 53 |
+
setAutoComplete(e.value.language_name)
|
| 54 |
+
onComplete([e.value])
|
| 55 |
+
}}
|
| 56 |
+
suggestions={suggestions}
|
| 57 |
+
completeMethod={search}
|
| 58 |
+
virtualScrollerOptions={{ itemSize: 50 }} // smaller values give layout problems
|
| 59 |
+
delay={500}
|
| 60 |
+
autoHighlight
|
| 61 |
+
autoFocus
|
| 62 |
+
itemTemplate={itemTemplate}
|
| 63 |
+
field='language_name'
|
| 64 |
+
minLength={0}
|
| 65 |
+
/>
|
| 66 |
+
<span
|
| 67 |
style={{
|
| 68 |
display: 'flex',
|
| 69 |
+
flexWrap: 'wrap',
|
| 70 |
+
gap: '1rem',
|
| 71 |
+
rowGap: '0.3rem',
|
| 72 |
+
marginTop: '1rem',
|
| 73 |
+
maxWidth: '600px',
|
| 74 |
+
justifyContent: 'center',
|
| 75 |
+
color: '#555'
|
| 76 |
}}
|
| 77 |
>
|
| 78 |
+
<span>Examples:</span>
|
| 79 |
+
{exampleLanguages?.map(language => (
|
| 80 |
+
<a
|
| 81 |
+
onClick={() => {
|
| 82 |
+
onComplete([language])
|
| 83 |
+
setAutoComplete(language.language_name)
|
| 84 |
+
}}
|
| 85 |
+
style={{ textDecoration: 'underline', cursor: 'pointer' }}
|
| 86 |
+
>
|
| 87 |
+
{language.language_name} Leaderboard
|
| 88 |
+
</a>
|
| 89 |
+
))}
|
| 90 |
+
{/* <li>African Leaderboard</li>
|
| 91 |
+
<li>Indic Leaderboard</li>
|
| 92 |
+
<li>Transcription Leaderboard</li>
|
| 93 |
+
<li>Dataset Availability for African Languages</li>
|
| 94 |
+
<li>GPT 4.5 Evaluation</li>
|
| 95 |
+
<li>MMLU Evaluation of Open Models</li> */}
|
| 96 |
+
</span>
|
| 97 |
+
</>
|
|
|
|
|
|
|
|
|
|
| 98 |
)
|
| 99 |
}
|
| 100 |
|
frontend/src/components/DatasetTable.js
CHANGED
|
@@ -78,6 +78,7 @@ const DatasetTable = ({ data }) => {
|
|
| 78 |
scrollable
|
| 79 |
scrollHeight='600px'
|
| 80 |
id='dataset-table'
|
|
|
|
| 81 |
>
|
| 82 |
<Column
|
| 83 |
field='implemented'
|
|
|
|
| 78 |
scrollable
|
| 79 |
scrollHeight='600px'
|
| 80 |
id='dataset-table'
|
| 81 |
+
style={{ width: '800px', minHeight: '650px' }}
|
| 82 |
>
|
| 83 |
<Column
|
| 84 |
field='implemented'
|
frontend/src/components/LanguageTable.js
CHANGED
|
@@ -138,7 +138,7 @@ const LanguageTable = ({ data, selectedLanguages, setSelectedLanguages }) => {
|
|
| 138 |
scrollable
|
| 139 |
scrollHeight='600px'
|
| 140 |
id='language-table'
|
| 141 |
-
style={{ width: '800px' }}
|
| 142 |
>
|
| 143 |
<Column selectionMode="multiple" headerStyle={{ width: '3rem' }} />
|
| 144 |
<Column
|
|
|
|
| 138 |
scrollable
|
| 139 |
scrollHeight='600px'
|
| 140 |
id='language-table'
|
| 141 |
+
style={{ width: '800px', minHeight: '650px' }}
|
| 142 |
>
|
| 143 |
<Column selectionMode="multiple" headerStyle={{ width: '3rem' }} />
|
| 144 |
<Column
|
frontend/src/components/ModelTable.js
CHANGED
|
@@ -145,6 +145,7 @@ const ModelTable = ({ data }) => {
|
|
| 145 |
scrollable
|
| 146 |
scrollHeight='600px'
|
| 147 |
id='model-table'
|
|
|
|
| 148 |
>
|
| 149 |
<Column field='rank' body={rankBodyTemplate} />
|
| 150 |
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} body={providerBodyTemplate} />
|
|
|
|
| 145 |
scrollable
|
| 146 |
scrollHeight='600px'
|
| 147 |
id='model-table'
|
| 148 |
+
style={{ width: '800px', minHeight: '650px' }}
|
| 149 |
>
|
| 150 |
<Column field='rank' body={rankBodyTemplate} />
|
| 151 |
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} body={providerBodyTemplate} />
|
frontend/src/components/ScoreField.js
CHANGED
|
@@ -34,7 +34,8 @@ const ScoreField = (score, minScore, maxScore) => {
|
|
| 34 |
height: '100%',
|
| 35 |
width: `${percentage}%`,
|
| 36 |
backgroundColor: barColor,
|
| 37 |
-
zIndex: 0
|
|
|
|
| 38 |
}}
|
| 39 |
/>
|
| 40 |
|
|
|
|
| 34 |
height: '100%',
|
| 35 |
width: `${percentage}%`,
|
| 36 |
backgroundColor: barColor,
|
| 37 |
+
zIndex: 0,
|
| 38 |
+
transition: 'width 0.3s, background-color 0.3s'
|
| 39 |
}}
|
| 40 |
/>
|
| 41 |
|