Ahnj-Stability commited on
Commit
155d4e6
Β·
1 Parent(s): b1aa440

fix: dropbox, layout(ko)

Browse files
banner_wide.png ADDED

Git LFS Details

  • SHA256: 66fa5541384dde4eac497d3aa9fbcfeccbb44cc7aa1e251acb200adbddf914a1
  • Pointer size: 131 Bytes
  • Size of remote file: 347 kB
tabs/leaderboard_v1_en.py CHANGED
@@ -791,9 +791,9 @@ def create_leaderboard_v2_tab():
791
  }
792
 
793
  #hero-banner {
794
- max-width: 960px;
795
- margin: 0 auto 20px auto;
796
- border-radius: 16px;
797
  overflow: hidden;
798
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.25);
799
  }
@@ -1093,7 +1093,7 @@ def create_leaderboard_v2_tab():
1093
  """)
1094
 
1095
  gr.Image(
1096
- value="banner.png",
1097
  show_label=False,
1098
  interactive=False,
1099
  type="filepath",
 
791
  }
792
 
793
  #hero-banner {
794
+ width: 100%;
795
+ margin: 0 0 20px 0;
796
+ border-radius: 0;
797
  overflow: hidden;
798
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.25);
799
  }
 
1093
  """)
1094
 
1095
  gr.Image(
1096
+ value="banner_wide.png",
1097
  show_label=False,
1098
  interactive=False,
1099
  type="filepath",
tabs/leaderboard_v1_kr.py CHANGED
@@ -791,17 +791,24 @@ def create_leaderboard_v2_tab():
791
  }
792
 
793
  #hero-banner {
794
- max-width: 960px;
795
- margin: 0 auto 20px auto;
796
- border-radius: 16px;
797
- overflow: hidden;
798
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.25);
 
 
 
 
 
 
799
  }
800
 
801
  #hero-banner img {
802
  width: 100%;
803
  height: auto;
804
  display: block;
 
805
  }
806
 
807
  .hero-title {
@@ -1093,7 +1100,7 @@ def create_leaderboard_v2_tab():
1093
  """)
1094
 
1095
  gr.Image(
1096
- value="banner.png",
1097
  show_label=False,
1098
  interactive=False,
1099
  type="filepath",
@@ -1188,8 +1195,9 @@ def create_leaderboard_v2_tab():
1188
  <div class="scenario-body">
1189
  <p>넀이버, 지도, 카카였, μ›Ήμ‚¬μ΄νŠΈ λ“± ν•œκ΅­ μ‹€μ‚¬μš© ν™˜κ²½ 기반의 APIλ₯Ό 기반으둜<br> κ΅­λ‚΄ μ‚¬μš©μžμ˜ 일상과 λ°€μ ‘ν•œ '약속 μ˜ˆμ•½', 'λΈ”λ‘œκ·Έ ν›„κΈ° 검색'κ³Ό 같은 ν˜„μ‹€μ μΈ 문제 ν•΄κ²° μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.</p>
1190
  </div>
1191
- <div class="section-flow">βŒ„</div>
1192
  </div>
 
1193
  """)
1194
 
1195
  # Section 3: 핡심 평가 κΈ°μ€€
@@ -1947,67 +1955,128 @@ def create_leaderboard_v2_tab():
1947
  padding: 12px 20px !important;
1948
  font-size: 0.95rem !important;
1949
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1950
  </style>
1951
 
1952
  """)
1953
 
1954
  level_options = list(level_details.keys())
1955
 
1956
- with gr.Column(elem_classes=["domain-selector-container"], elem_id="task-level-selector"):
1957
- gr.HTML("""
1958
- <div class="domain-header">
1959
- <h2 class="domain-title" style="color: white;">🧠 νƒœμŠ€ν¬ 레벨 선택</h2>
1960
- <p class="domain-subtitle" style="color: white;">Ko-AgentBench의 ALL Β· λͺ¨λΈλ³„ μ—μ΄μ „νŠΈ μˆ˜ν–‰ λŠ₯λ ₯을 λ‹¨κ³„λ³„λ‘œ μΈ‘μ •ν•΄λ³΄μ„Έμš”.</p>
1961
- </div>
1962
- """)
1963
- domain_filter = gr.Radio(
1964
- choices=level_options,
1965
- value=default_level,
1966
- label="",
1967
- interactive=True,
1968
- container=False,
1969
- elem_classes=["domain-radio"]
1970
- )
1971
 
1972
- # Filter controls with domain styling
1973
- with gr.Column(elem_classes=["domain-selector-container", "filters-sorting-container"], elem_id="filters-sorting-container"):
1974
- gr.HTML("""
1975
- <div class="domain-header">
1976
- <h2 class="domain-title" style="color: white;">πŸ” ν•„ν„° 및 μ •λ ¬</h2>
1977
- <p class="domain-subtitle" style="color: white;">λͺ¨λΈ μ ‘κ·Ό 방식과 μ •λ ¬ μˆœμ„œλ₯Ό 선택해 맞좀 λ·°λ₯Ό κ΅¬μ„±ν•˜μ„Έμš”.</p>
1978
- </div>
1979
- """)
1980
- with gr.Row(elem_classes=["filters-sorting-row"]):
1981
- with gr.Column(scale=1, elem_classes=["filter-group"]):
1982
- with gr.Row(elem_classes=["filter-group-row"]):
1983
- gr.HTML("<span class='filter-group-label' style='color: white;'>λͺ¨λΈ μ ‘κ·Ό</span>")
1984
- model_type_filter = gr.Radio(
1985
- choices=["All", "OSS", "API"],
1986
- value="All",
1987
- label="",
1988
- elem_classes=["domain-radio"],
1989
- container=False
1990
- )
1991
- with gr.Column(scale=1, elem_classes=["filter-group"]):
1992
- with gr.Row(elem_classes=["filter-group-row"]):
1993
- gr.HTML("<span class='filter-group-label' style='color: white;'>μ •λ ¬ μˆœμ„œ</span>")
1994
- sort_order = gr.Radio(
1995
- choices=["Descending", "Ascending"],
1996
- value="Descending",
1997
- label="",
1998
- elem_classes=["domain-radio"],
1999
- container=False
2000
- )
2001
 
2002
- # Main leaderboard table with dynamic title
2003
- leaderboard_title = gr.HTML(update_leaderboard_title(default_level))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2004
 
2005
  leaderboard_table = gr.HTML(initial_table)
2006
 
2007
- gr.HTML("""
2008
- </div>
2009
- </div>""")
2010
-
2011
  # Radar Chart Section
2012
  gr.HTML("""
2013
  <div class="domain-selector-container domain-performance-container">
@@ -2017,22 +2086,16 @@ def create_leaderboard_v2_tab():
2017
  </div>
2018
  """)
2019
 
2020
- with gr.Column(elem_classes=["domain-selector-container", "model-selector-container"], elem_id="radar-model-selector"):
2021
- gr.HTML("""
2022
- <div class="domain-header">
2023
- <h2 class="domain-title" style="color: white;">🎯 비ꡐ할 λͺ¨λΈ 선택</h2>
2024
- <p class="domain-subtitle" style="color: white;">μ—­λŸ‰ λ ˆμ΄λ”μ— ν‘œμ‹œν•  λͺ¨λΈμ„ μ΅œλŒ€ 5κ°œκΉŒμ§€ μ„ νƒν•˜μ„Έμš”.</p>
2025
- </div>
2026
- """)
2027
- model_selector = gr.Dropdown(
2028
- choices=initial_df['Model'].tolist()[:10],
2029
- value=initial_df['Model'].tolist()[:5],
2030
- multiselect=True,
2031
- label="",
2032
- info=None,
2033
- container=False,
2034
- # elem_classes=["model-dropdown"]
2035
- )
2036
 
2037
  # Radar chart plot - wrapped in centered container
2038
  gr.HTML('<div class="chart-container radar-chart-container">')
@@ -2048,309 +2111,46 @@ def create_leaderboard_v2_tab():
2048
 
2049
  gr.HTML("</div>")
2050
 
2051
- # Level metric breakdown section
2052
- gr.HTML("""
2053
- <div class="domain-selector-container domain-performance-container level-metrics-wrapper">
2054
- <div class="domain-header">
2055
- <h2 class="domain-title" style="color: white;">λ ˆλ²¨λ³„ 상세 μ§€ν‘œ</h2>
2056
- <p class="domain-subtitle" style="color: white;">각 Ko-AgentBench 단계별 고유 평가 μ§€ν‘œλ₯Ό 톡해 λͺ¨λΈ 점수λ₯Ό λΉ„κ΅ν•˜κ³  더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μ„Έμš”.</p>
2057
- </div>
2058
- """)
2059
-
2060
- with gr.Column(elem_classes=["domain-selector-container", "level-selector-container"], elem_id="level-selector-box"):
2061
- gr.HTML("""
2062
- <div class="domain-header">
2063
- <h2 class="domain-title" style="color: white;">🧭 νƒœμŠ€ν¬ 레벨 및 λͺ¨λΈ 선택</h2>
2064
- <p class="domain-subtitle" style="color: white;">레벨과 λͺ¨λΈ(μ΅œλŒ€ 5개)을 μ„ νƒν•˜μ—¬ 상세 SR(성곡λ₯ ) 기반 μ§€ν‘œλ₯Ό νƒμƒ‰ν•˜μ„Έμš”.</p>
2065
- </div>
2066
- """)
2067
- level_metric_selector = gr.Dropdown(
2068
- choices=level_ids,
2069
- value=level_ids[0] if level_ids else None,
2070
- multiselect=False,
2071
- label="",
2072
- info=None,
2073
- container=False,
2074
- elem_classes=["level-dropdown"]
2075
- )
2076
- level_model_selector = gr.Dropdown(
2077
- choices=initial_level_model_choices,
2078
- value=initial_level_model_values,
2079
- multiselect=True,
2080
- label="",
2081
- info=None,
2082
- container=False,
2083
- elem_classes=["model-dropdown", "level-model-dropdown"]
2084
- )
2085
-
2086
- gr.HTML('<div class="chart-container level-metric-chart-container">')
2087
- level_metric_chart = gr.Plot(
2088
- label="",
2089
- value=initial_level_metric_chart,
2090
- elem_classes=["level-metric-plot", "plot-container"]
2091
- )
2092
- gr.HTML("""
2093
- </div>
2094
- </div>
2095
- """)
2096
-
2097
- # Heatmap section
2098
- gr.HTML("""
2099
- <div class="domain-selector-container domain-performance-container heatmap-wrapper">
2100
- <div class="domain-header">
2101
- <h2 class="domain-title" style="color: white;">μ’…ν•© μ„±λŠ₯ 히트맡</h2>
2102
- <p class="domain-subtitle" style="color: white;">각 λͺ¨λΈμ˜ L1~L7 Ko-AgentBench SR(성곡λ₯ ) 점수λ₯Ό ν•œλˆˆμ— λ³΄μ„Έμš”.</p>
2103
- </div>
2104
- <div class="chart-container heatmap-chart-container">
2105
- """)
2106
- heatmap_chart = gr.Plot(
2107
- label="",
2108
- value=initial_heatmap,
2109
- elem_classes=["heatmap-plot", "plot-container"]
2110
- )
2111
- gr.HTML("""
2112
- </div>
2113
- </div>
2114
- """)
2115
-
2116
- # Update functions
2117
- def get_optimal_sort_order(sort_by_value):
2118
- """Return the optimal sort order for a given metric"""
2119
- # Metrics where higher is better (descending)
2120
- descending_metrics = ["Overall Success"] + [sr_column_map[level] for level in level_ids]
2121
-
2122
- # Metrics where lower is better (ascending)
2123
- ascending_metrics = []
2124
 
2125
- if sort_by_value in descending_metrics:
2126
- return "Descending"
2127
- elif sort_by_value in ascending_metrics:
2128
- return "Ascending"
2129
- else:
2130
- return "Descending" # Default fallback
2131
-
2132
- def update_table(level_filter, model_type_filter, sort_order):
2133
- title_html = update_leaderboard_title(level_filter)
2134
- sort_metric = "Overall Success" if level_filter == "ALL" else sr_column_map.get(resolve_level(level_filter), "Overall Success")
2135
- table_html = filter_and_sort_data(level_filter, model_type_filter, sort_metric, sort_order)
2136
- return title_html, table_html
2137
-
2138
- def update_radar_chart(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2139
- # Get filtered dataframe
2140
  df = load_leaderboard_data()
2141
- sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2142
- filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2143
 
2144
- # Update model selector choices based on filtered data
2145
- available_models_all = filtered_df['Model'].tolist()
2146
- available_models = available_models_all[:15] # Top 15 from filtered results
 
2147
 
2148
- # If selected models are not in available models, reset to top 5
2149
- if selected_models:
2150
- valid_selected = [m for m in selected_models if m in available_models]
2151
- if not valid_selected:
2152
- valid_selected = available_models[:5]
2153
- else:
2154
- valid_selected = available_models[:5]
2155
 
2156
- # Create radar chart
2157
- chart = create_domain_radar_chart(filtered_df, valid_selected)
 
 
 
 
 
 
 
2158
 
2159
- # Prepare heatmap order prioritizing selected models
2160
- heatmap_order = []
2161
- for model in valid_selected:
2162
- if model not in heatmap_order:
2163
- heatmap_order.append(model)
2164
- for model in available_models_all:
2165
- if model not in heatmap_order:
2166
- heatmap_order.append(model)
2167
- heatmap_order = heatmap_order[:12]
2168
- heatmap_fig = create_performance_heatmap(filtered_df, heatmap_order)
2169
 
2170
- # Level metric chart
2171
- effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2172
- available_level_models = available_models_all
2173
- if level_selected_models:
2174
- valid_level_models = [m for m in level_selected_models if m in available_level_models][:5]
2175
- if not valid_level_models:
2176
- valid_level_models = available_level_models[:5]
2177
- else:
2178
- valid_level_models = available_level_models[:5]
2179
- level_metric_fig = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2180
-
2181
- return (
2182
- gr.Dropdown(
2183
- choices=available_models,
2184
- value=valid_selected,
2185
- multiselect=True,
2186
- label="",
2187
- info=None,
2188
- container=False,
2189
- # elem_classes=["model-dropdown"]
2190
- ),
2191
- chart,
2192
- heatmap_fig,
2193
- gr.Dropdown(
2194
- choices=available_level_models,
2195
- value=valid_level_models,
2196
- multiselect=True,
2197
- label="",
2198
- info=None,
2199
- container=False,
2200
- elem_classes=["model-dropdown", "level-model-dropdown"]
2201
- ),
2202
- level_metric_fig,
2203
- )
2204
-
2205
- def update_radar_only(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2206
- # Get filtered dataframe
2207
- df = load_leaderboard_data()
2208
- sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2209
- filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2210
-
2211
- available_models_all = filtered_df['Model'].tolist()
2212
- if selected_models:
2213
- valid_selected = [m for m in selected_models if m in available_models_all]
2214
- if not valid_selected:
2215
- valid_selected = available_models_all[:5]
2216
- else:
2217
- valid_selected = available_models_all[:5]
2218
-
2219
- heatmap_order = []
2220
- for model in valid_selected:
2221
- if model not in heatmap_order:
2222
- heatmap_order.append(model)
2223
- for model in available_models_all:
2224
- if model not in heatmap_order:
2225
- heatmap_order.append(model)
2226
- heatmap_order = heatmap_order[:12]
2227
-
2228
- effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2229
- available_level_models = available_models_all
2230
- if level_selected_models:
2231
- valid_level_models = [m for m in level_selected_models if m in available_level_models][:5]
2232
- if not valid_level_models:
2233
- valid_level_models = available_level_models[:5]
2234
- else:
2235
- valid_level_models = available_level_models[:5]
2236
- level_metric_fig = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2237
-
2238
- return (
2239
- create_domain_radar_chart(filtered_df, valid_selected),
2240
- create_performance_heatmap(filtered_df, heatmap_order),
2241
- gr.Dropdown(
2242
- choices=available_level_models,
2243
- value=valid_level_models,
2244
- multiselect=True,
2245
- label="",
2246
- info=None,
2247
- container=False,
2248
- elem_classes=["model-dropdown", "level-model-dropdown"]
2249
- ),
2250
- level_metric_fig,
2251
- )
2252
-
2253
- def update_level_metric_only(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2254
- df = load_leaderboard_data()
2255
- sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2256
- filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2257
- available_models = filtered_df['Model'].tolist()
2258
- if level_selected_models:
2259
- valid_level_models = [m for m in level_selected_models if m in available_models][:5]
2260
- if not valid_level_models:
2261
- valid_level_models = available_models[:5]
2262
- else:
2263
- valid_level_models = available_models[:5]
2264
- effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2265
- level_chart = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2266
- return (
2267
- gr.Dropdown(
2268
- choices=available_models,
2269
- value=valid_level_models,
2270
- multiselect=True,
2271
- label="",
2272
- info=None,
2273
- container=False,
2274
- elem_classes=["model-dropdown", "level-model-dropdown"]
2275
- ),
2276
- level_chart,
2277
- )
2278
-
2279
- # Update table when filters change
2280
- filter_inputs = [domain_filter, model_type_filter, sort_order]
2281
-
2282
- for input_component in filter_inputs:
2283
- input_component.change(
2284
- fn=update_table,
2285
- inputs=filter_inputs,
2286
- outputs=[leaderboard_title, leaderboard_table]
2287
- )
2288
-
2289
- # Also update radar chart when filters change
2290
- input_component.change(
2291
- fn=update_radar_chart,
2292
- inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2293
- outputs=[model_selector, radar_chart, heatmap_chart, level_model_selector, level_metric_chart]
2294
- )
2295
-
2296
- # Update radar chart when model selection changes
2297
- model_selector.change(
2298
- fn=update_radar_only,
2299
- inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2300
- outputs=[radar_chart, heatmap_chart, level_model_selector, level_metric_chart]
2301
- )
2302
-
2303
- level_metric_selector.change(
2304
- fn=update_level_metric_only,
2305
- inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2306
- outputs=[level_model_selector, level_metric_chart]
2307
- )
2308
-
2309
- level_model_selector.change(
2310
- fn=update_level_metric_only,
2311
- inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2312
- outputs=[level_model_selector, level_metric_chart]
2313
- )
2314
-
2315
- # Define generate_performance_card function before using it
2316
- def generate_performance_card(model_name):
2317
- """Generate HTML for the model performance card"""
2318
- if not model_name:
2319
- return """<div style="text-align: center; color: var(--text-secondary); padding: 40px;">
2320
- Please select a model to generate its performance card
2321
- </div>"""
2322
-
2323
- # Get model data
2324
- df = load_leaderboard_data()
2325
- model_data = df[df['Model'] == model_name]
2326
-
2327
- if model_data.empty:
2328
- return """<div style="text-align: center; color: var(--text-secondary); padding: 40px;">
2329
- Model not found in the database
2330
- </div>"""
2331
-
2332
- row = model_data.iloc[0]
2333
-
2334
- # Get overall rank based on overall success
2335
- df_with_success = df.copy()
2336
- df_with_success['Overall Success'] = pd.to_numeric(df_with_success.get('Overall Success', pd.Series()), errors='coerce')
2337
- df_with_success = df_with_success[df_with_success['Overall Success'].notna()]
2338
- df_sorted = df_with_success.sort_values('Overall Success', ascending=False).reset_index(drop=True)
2339
- try:
2340
- rank = df_sorted[df_sorted['Model'] == model_name].index[0] + 1
2341
- except:
2342
- rank = 'N/A'
2343
-
2344
- # Format values
2345
- def format_value(val, decimals=3, prefix='', suffix=''):
2346
- if pd.isna(val) or val == '':
2347
- return 'N/A'
2348
- return f"{prefix}{float(val):.{decimals}f}{suffix}"
2349
-
2350
- def format_score(value):
2351
- if pd.isna(value) or value == '':
2352
- return 'N/A'
2353
- return f"{float(value):.3f}"
2354
 
2355
  radar_metrics = [
2356
  ("기초 μˆ˜ν–‰λ ₯", row.get('Execution Accuracy')),
@@ -2478,7 +2278,7 @@ def create_leaderboard_v2_tab():
2478
  with gr.Column(elem_classes=["domain-selector-container", "model-selector-container"], elem_id="model-selector-box"):
2479
  gr.HTML("""
2480
  <div class="domain-header">
2481
- <h2 class="domain-title" style="color: white;">πŸ€– λͺ¨λΈ 선택</h2>
2482
  <p class="domain-subtitle" style="color: white;">뢄석 μΉ΄λ“œμ— 포함할 λͺ¨λΈμ„ μ„ νƒν•˜μ„Έμš”.</p>
2483
  </div>
2484
  """)
@@ -2510,6 +2310,280 @@ def create_leaderboard_v2_tab():
2510
  </div>
2511
  </div>
2512
  """)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2513
 
2514
  # Add custom CSS for the performance card
2515
  gr.HTML("""
 
791
  }
792
 
793
  #hero-banner {
794
+ width: 100vw !important;
795
+ margin: 0 calc(-50vw + 50%) 20px calc(-50vw + 50%) !important;
796
+ border-radius: 0 !important;
797
+ overflow: hidden !important;
798
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.25) !important;
799
+ position: relative !important;
800
+ left: 50% !important;
801
+ right: 50% !important;
802
+ margin-left: -50vw !important;
803
+ margin-right: -50vw !important;
804
+ max-width: none !important;
805
  }
806
 
807
  #hero-banner img {
808
  width: 100%;
809
  height: auto;
810
  display: block;
811
+ object-fit: cover;
812
  }
813
 
814
  .hero-title {
 
1100
  """)
1101
 
1102
  gr.Image(
1103
+ value="banner_wide.png",
1104
  show_label=False,
1105
  interactive=False,
1106
  type="filepath",
 
1195
  <div class="scenario-body">
1196
  <p>넀이버, 지도, 카카였, μ›Ήμ‚¬μ΄νŠΈ λ“± ν•œκ΅­ μ‹€μ‚¬μš© ν™˜κ²½ 기반의 APIλ₯Ό 기반으둜<br> κ΅­λ‚΄ μ‚¬μš©μžμ˜ 일상과 λ°€μ ‘ν•œ '약속 μ˜ˆμ•½', 'λΈ”λ‘œκ·Έ ν›„κΈ° 검색'κ³Ό 같은 ν˜„μ‹€μ μΈ 문제 ν•΄κ²° μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.</p>
1197
  </div>
1198
+
1199
  </div>
1200
+ <div class="section-flow">βŒ„</div>
1201
  """)
1202
 
1203
  # Section 3: 핡심 평가 κΈ°μ€€
 
1955
  padding: 12px 20px !important;
1956
  font-size: 0.95rem !important;
1957
  }
1958
+
1959
+ /* Leaderboard controls row styling */
1960
+ .leaderboard-controls-row {
1961
+ margin: 20px 0 !important;
1962
+ padding: 20px !important;
1963
+ background: transparent !important;
1964
+ border: none !important;
1965
+ gap: 40px !important;
1966
+ }
1967
+
1968
+ .leaderboard-controls-row .gr-column,
1969
+ .leaderboard-controls-row .gr-row,
1970
+ .leaderboard-controls-row .gr-box,
1971
+ .leaderboard-controls-row .gradio-column,
1972
+ .leaderboard-controls-row .gradio-row,
1973
+ .leaderboard-controls-row .gradio-group {
1974
+ background: transparent !important;
1975
+ border: none !important;
1976
+ box-shadow: none !important;
1977
+ padding: 0 !important;
1978
+ }
1979
+
1980
+ /* Remove all container backgrounds for leaderboard controls */
1981
+ .leaderboard-controls-row * {
1982
+ background-color: transparent !important;
1983
+ background-image: none !important;
1984
+ border: none !important;
1985
+ box-shadow: none !important;
1986
+ }
1987
+
1988
+ .leaderboard-controls-row .inline-radio,
1989
+ .leaderboard-controls-row .domain-radio {
1990
+ background: transparent !important;
1991
+ border: none !important;
1992
+ box-shadow: none !important;
1993
+ }
1994
+
1995
+ /* Inline radio styling for integrated controls */
1996
+ .inline-radio {
1997
+ background: transparent !important;
1998
+ border: none !important;
1999
+ box-shadow: none !important;
2000
+ padding: 0 !important;
2001
+ }
2002
+
2003
+ .inline-radio .wrap {
2004
+ display: flex !important;
2005
+ gap: 8px !important;
2006
+ flex-wrap: wrap !important;
2007
+ justify-content: flex-start !important;
2008
+ background: transparent !important;
2009
+ border: none !important;
2010
+ box-shadow: none !important;
2011
+ padding: 0 !important;
2012
+ }
2013
+
2014
+ .inline-radio label {
2015
+ padding: 8px 16px !important;
2016
+ background: rgba(245, 246, 247, 0.06) !important;
2017
+ border: 1px solid var(--border-subtle) !important;
2018
+ border-radius: 20px !important;
2019
+ font-size: 0.85rem !important;
2020
+ color: var(--text-primary) !important;
2021
+ transition: all 0.2s ease !important;
2022
+ cursor: pointer !important;
2023
+ }
2024
+
2025
+ .inline-radio label:hover {
2026
+ background: rgba(255, 210, 30, 0.12) !important;
2027
+ border-color: var(--accent-primary) !important;
2028
+ }
2029
+
2030
+ .inline-radio input[type="radio"]:checked + label,
2031
+ .inline-radio label[aria-checked="true"] {
2032
+ background: rgba(255, 210, 30, 0.2) !important;
2033
+ border-color: var(--accent-primary) !important;
2034
+ color: white !important;
2035
+ font-weight: 600 !important;
2036
+ }
2037
  </style>
2038
 
2039
  """)
2040
 
2041
  level_options = list(level_details.keys())
2042
 
2043
+ # Main leaderboard table with dynamic title and integrated controls
2044
+ leaderboard_title = gr.HTML(update_leaderboard_title(default_level))
 
 
 
 
 
 
 
 
 
 
 
 
 
2045
 
2046
+ # Integrated controls within leaderboard section - stacked vertically
2047
+ gr.HTML("<h3 style='color: white; margin: 5px 0 5px 0; font-size: 1.1rem;'>🧠 νƒœμŠ€ν¬ 레벨 선택</h3>")
2048
+ domain_filter = gr.Radio(
2049
+ choices=level_options,
2050
+ value=default_level,
2051
+ label="",
2052
+ interactive=True,
2053
+ container=False,
2054
+ elem_classes=["domain-radio", "inline-radio"]
2055
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2056
 
2057
+ gr.HTML("<h3 style='color: white; margin: 5px 0 0px 0; font-size: 1.1rem;'>πŸ” ν•„ν„° 및 μ •λ ¬</h3>")
2058
+ with gr.Row():
2059
+ with gr.Column(scale=1):
2060
+ gr.HTML("<span style='color: white; font-size: 0.9rem; margin-bottom: 5px; display: block;'>λͺ¨λΈ μ ‘κ·Ό</span>")
2061
+ model_type_filter = gr.Radio(
2062
+ choices=["All", "OSS", "API"],
2063
+ value="All",
2064
+ label="",
2065
+ elem_classes=["domain-radio", "inline-radio"],
2066
+ container=False
2067
+ )
2068
+ with gr.Column(scale=1):
2069
+ gr.HTML("<span style='color: white; font-size: 0.9rem; margin-bottom: 5px; display: block;'>μ •λ ¬ μˆœμ„œ</span>")
2070
+ sort_order = gr.Radio(
2071
+ choices=["Descending", "Ascending"],
2072
+ value="Descending",
2073
+ label="",
2074
+ elem_classes=["domain-radio", "inline-radio"],
2075
+ container=False
2076
+ )
2077
 
2078
  leaderboard_table = gr.HTML(initial_table)
2079
 
 
 
 
 
2080
  # Radar Chart Section
2081
  gr.HTML("""
2082
  <div class="domain-selector-container domain-performance-container">
 
2086
  </div>
2087
  """)
2088
 
2089
+ gr.HTML("<h3 style='color: white; margin: 10px 0 0 0; font-size: 1.3rem;'>🎯 비ꡐ할 λͺ¨λΈ 선택</h3>")
2090
+ gr.HTML("<p style='color: #b0b0b0; margin: 0 0 10px 0; font-size: 0.9rem;'>λͺ¨λΈμ€ μ΅œλŒ€ 5κ°œκΉŒμ§€ 선택 κ°€λŠ₯ ν•©λ‹ˆλ‹€.</p>")
2091
+ model_selector = gr.Dropdown(
2092
+ choices=initial_df['Model'].tolist()[:10],
2093
+ value=initial_df['Model'].tolist()[:5],
2094
+ multiselect=True,
2095
+ label="",
2096
+ info=None,
2097
+ container=False,
2098
+ )
 
 
 
 
 
 
2099
 
2100
  # Radar chart plot - wrapped in centered container
2101
  gr.HTML('<div class="chart-container radar-chart-container">')
 
2111
 
2112
  gr.HTML("</div>")
2113
 
2114
+
2115
+ # Define generate_performance_card function before using it
2116
+ def generate_performance_card(model_name):
2117
+ """Generate HTML for the model performance card"""
2118
+ if not model_name:
2119
+ return """<div style="text-align: center; color: var(--text-secondary); padding: 40px;">
2120
+ Please select a model to generate its performance card
2121
+ </div>"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2122
 
2123
+ # Get model data
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2124
  df = load_leaderboard_data()
2125
+ model_data = df[df['Model'] == model_name]
 
2126
 
2127
+ if model_data.empty:
2128
+ return """<div style="text-align: center; color: var(--text-secondary); padding: 40px;">
2129
+ Model not found in the database
2130
+ </div>"""
2131
 
2132
+ row = model_data.iloc[0]
 
 
 
 
 
 
2133
 
2134
+ # Get overall rank based on overall success
2135
+ df_with_success = df.copy()
2136
+ df_with_success['Overall Success'] = pd.to_numeric(df_with_success.get('Overall Success', pd.Series()), errors='coerce')
2137
+ df_with_success = df_with_success[df_with_success['Overall Success'].notna()]
2138
+ df_sorted = df_with_success.sort_values('Overall Success', ascending=False).reset_index(drop=True)
2139
+ try:
2140
+ rank = df_sorted[df_sorted['Model'] == model_name].index[0] + 1
2141
+ except:
2142
+ rank = 'N/A'
2143
 
2144
+ # Format values
2145
+ def format_value(val, decimals=3, prefix='', suffix=''):
2146
+ if pd.isna(val) or val == '':
2147
+ return 'N/A'
2148
+ return f"{prefix}{float(val):.{decimals}f}{suffix}"
 
 
 
 
 
2149
 
2150
+ def format_score(value):
2151
+ if pd.isna(value) or value == '':
2152
+ return 'N/A'
2153
+ return f"{float(value):.3f}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2154
 
2155
  radar_metrics = [
2156
  ("기초 μˆ˜ν–‰λ ₯", row.get('Execution Accuracy')),
 
2278
  with gr.Column(elem_classes=["domain-selector-container", "model-selector-container"], elem_id="model-selector-box"):
2279
  gr.HTML("""
2280
  <div class="domain-header">
2281
+ <h2 class="domain-title" style="color: white;">λͺ¨λΈ 선택</h2>
2282
  <p class="domain-subtitle" style="color: white;">뢄석 μΉ΄λ“œμ— 포함할 λͺ¨λΈμ„ μ„ νƒν•˜μ„Έμš”.</p>
2283
  </div>
2284
  """)
 
2310
  </div>
2311
  </div>
2312
  """)
2313
+
2314
+
2315
+ # Level metric breakdown section
2316
+ gr.HTML("""
2317
+ <div class="domain-selector-container domain-performance-container level-metrics-wrapper">
2318
+ <div class="domain-header">
2319
+ <h2 class="domain-title" style="color: white;">λ ˆλ²¨λ³„ 상세 μ§€ν‘œ</h2>
2320
+ <p class="domain-subtitle" style="color: white;">각 Ko-AgentBench 단계별 고유 평가 μ§€ν‘œλ₯Ό 톡해 λͺ¨λΈ 점수λ₯Ό λΉ„κ΅ν•˜κ³  더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄μ„Έμš”.</p>
2321
+ </div>
2322
+ """)
2323
+
2324
+ gr.HTML("""
2325
+ <h2 style="color: white; text-align: center; margin: 20px 0 10px 0; font-size: 1.8rem;">🧭 νƒœμŠ€ν¬ 레벨 및 λͺ¨λΈ 선택</h2>
2326
+ <p style="color: white; text-align: center; margin: 0 0 20px 0; font-size: 1rem;">레벨과 λͺ¨λΈ(μ΅œλŒ€ 5개)을 μ„ νƒν•˜μ—¬ 상세 SR(성곡λ₯ ) 기반 μ§€ν‘œλ₯Ό νƒμƒ‰ν•˜μ„Έμš”.</p>
2327
+ """)
2328
+
2329
+ with gr.Column(elem_classes=["domain-selector-container", "level-selector-container"], elem_id="level-selector-box"):
2330
+ level_metric_selector = gr.Dropdown(
2331
+ choices=level_ids,
2332
+ value=level_ids[0] if level_ids else None,
2333
+ multiselect=False,
2334
+ label="",
2335
+ info=None,
2336
+ container=False,
2337
+ elem_classes=["level-dropdown"]
2338
+ )
2339
+ level_model_selector = gr.Dropdown(
2340
+ choices=initial_level_model_choices,
2341
+ value=initial_level_model_values,
2342
+ multiselect=True,
2343
+ label="",
2344
+ info=None,
2345
+ container=False,
2346
+ elem_classes=["model-dropdown", "level-model-dropdown"]
2347
+ )
2348
+
2349
+ gr.HTML('<div class="chart-container level-metric-chart-container">')
2350
+ level_metric_chart = gr.Plot(
2351
+ label="",
2352
+ value=initial_level_metric_chart,
2353
+ elem_classes=["level-metric-plot", "plot-container"]
2354
+ )
2355
+ gr.HTML("""
2356
+ </div>
2357
+ </div>
2358
+ """)
2359
+
2360
+ # # Heatmap section
2361
+ # gr.HTML("""
2362
+ # <div class="domain-selector-container domain-performance-container heatmap-wrapper">
2363
+ # <div class="domain-header">
2364
+ # <h2 class="domain-title" style="color: white;">μ’…ν•© μ„±λŠ₯ 히트맡</h2>
2365
+ # <p class="domain-subtitle" style="color: white;">각 λͺ¨λΈμ˜ L1~L7 Ko-AgentBench SR(성곡λ₯ ) 점수λ₯Ό ν•œλˆˆμ— λ³΄μ„Έμš”.</p>
2366
+ # </div>
2367
+ # <div class="chart-container heatmap-chart-container">
2368
+ # """)
2369
+ # heatmap_chart = gr.Plot(
2370
+ # label="",
2371
+ # value=initial_heatmap,
2372
+ # elem_classes=["heatmap-plot", "plot-container"]
2373
+ # )
2374
+ # gr.HTML("""
2375
+ # </div>
2376
+ # </div>
2377
+ # """)
2378
+
2379
+ # Update functions
2380
+ def get_optimal_sort_order(sort_by_value):
2381
+ """Return the optimal sort order for a given metric"""
2382
+ # Metrics where higher is better (descending)
2383
+ descending_metrics = ["Overall Success"] + [sr_column_map[level] for level in level_ids]
2384
+
2385
+ # Metrics where lower is better (ascending)
2386
+ ascending_metrics = []
2387
+
2388
+ if sort_by_value in descending_metrics:
2389
+ return "Descending"
2390
+ elif sort_by_value in ascending_metrics:
2391
+ return "Ascending"
2392
+ else:
2393
+ return "Descending" # Default fallback
2394
+
2395
+
2396
+
2397
+ def update_table(level_filter, model_type_filter, sort_order):
2398
+ title_html = update_leaderboard_title(level_filter)
2399
+ sort_metric = "Overall Success" if level_filter == "ALL" else sr_column_map.get(resolve_level(level_filter), "Overall Success")
2400
+ table_html = filter_and_sort_data(level_filter, model_type_filter, sort_metric, sort_order)
2401
+ return title_html, table_html
2402
+
2403
+ def update_radar_chart(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2404
+ # Get filtered dataframe
2405
+ df = load_leaderboard_data()
2406
+ sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2407
+ filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2408
+
2409
+ # Update model selector choices based on filtered data
2410
+ available_models_all = filtered_df['Model'].tolist()
2411
+ available_models = available_models_all[:15] # Top 15 from filtered results
2412
+
2413
+ # If selected models are not in available models, reset to top 5
2414
+ if selected_models:
2415
+ valid_selected = [m for m in selected_models if m in available_models]
2416
+ # Check if more than 5 models are selected and show alert
2417
+ if len(valid_selected) > 5:
2418
+ gr.Warning("μ΅œλŒ€ 5개 κΉŒμ§€λ§Œ 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€")
2419
+ # Remove the last selected item (6th item) instead of keeping first 5
2420
+ valid_selected = valid_selected[:-1]
2421
+ if not valid_selected:
2422
+ valid_selected = available_models[:5]
2423
+ else:
2424
+ valid_selected = available_models[:5]
2425
+
2426
+ # Create radar chart
2427
+ chart = create_domain_radar_chart(filtered_df, valid_selected)
2428
+
2429
+ # Prepare heatmap order prioritizing selected models
2430
+
2431
+
2432
+ # Level metric chart
2433
+ effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2434
+ available_level_models = available_models_all
2435
+ if level_selected_models:
2436
+ valid_level_models = [m for m in level_selected_models if m in available_level_models][:5]
2437
+ if not valid_level_models:
2438
+ valid_level_models = available_level_models[:5]
2439
+ else:
2440
+ valid_level_models = available_level_models[:5]
2441
+ level_metric_fig = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2442
+
2443
+ return (
2444
+ gr.Dropdown(
2445
+ choices=available_models,
2446
+ value=valid_selected,
2447
+ multiselect=True,
2448
+ label="",
2449
+ info=None,
2450
+ container=False,
2451
+ # elem_classes=["model-dropdown"]
2452
+ ),
2453
+ chart,
2454
+ gr.Dropdown(
2455
+ choices=available_level_models,
2456
+ value=valid_level_models,
2457
+ multiselect=True,
2458
+ label="",
2459
+ info=None,
2460
+ container=False,
2461
+ elem_classes=["model-dropdown", "level-model-dropdown"]
2462
+ ),
2463
+ level_metric_fig,
2464
+ )
2465
+
2466
+ def update_radar_only(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2467
+ # Get filtered dataframe
2468
+ df = load_leaderboard_data()
2469
+ sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2470
+ filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2471
+
2472
+ available_models_all = filtered_df['Model'].tolist()
2473
+ if selected_models:
2474
+ valid_selected = [m for m in selected_models if m in available_models_all]
2475
+ # Check if more than 5 models are selected and show alert
2476
+ if len(valid_selected) > 5:
2477
+ # JavaScript alert for exceeding 5 models
2478
+ gr.Warning("μ΅œλŒ€ 5개 κΉŒμ§€λ§Œ 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€")
2479
+ # Remove the last selected item (6th item) instead of keeping first 5
2480
+ valid_selected = valid_selected[:-1]
2481
+ if not valid_selected:
2482
+ valid_selected = available_models_all[:5]
2483
+ else:
2484
+ valid_selected = available_models_all[:5]
2485
+
2486
+
2487
+
2488
+ effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2489
+ available_level_models = available_models_all
2490
+ if level_selected_models:
2491
+ valid_level_models = [m for m in level_selected_models if m in available_level_models][:5]
2492
+ if not valid_level_models:
2493
+ valid_level_models = available_level_models[:5]
2494
+ else:
2495
+ valid_level_models = available_level_models[:5]
2496
+ level_metric_fig = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2497
+
2498
+ return (
2499
+ gr.Dropdown(
2500
+ choices=available_models_all[:15],
2501
+ value=valid_selected,
2502
+ multiselect=True,
2503
+ label="",
2504
+ info=None,
2505
+ container=False,
2506
+ ),
2507
+ create_domain_radar_chart(filtered_df, valid_selected),
2508
+ gr.Dropdown(
2509
+ choices=available_level_models,
2510
+ value=valid_level_models,
2511
+ multiselect=True,
2512
+ label="",
2513
+ info=None,
2514
+ container=False,
2515
+ elem_classes=["model-dropdown", "level-model-dropdown"]
2516
+ ),
2517
+ level_metric_fig,
2518
+ )
2519
+
2520
+ def update_level_metric_only(domain_filter, model_type_filter, sort_order, selected_models, selected_level, level_selected_models):
2521
+ df = load_leaderboard_data()
2522
+ sort_metric = "Overall Success" if domain_filter == "ALL" else sr_column_map.get(resolve_level(domain_filter), "Overall Success")
2523
+ filtered_df, _, _ = apply_filters(df, domain_filter, model_type_filter, sort_order, sort_metric)
2524
+ available_models = filtered_df['Model'].tolist()
2525
+ if level_selected_models:
2526
+ valid_level_models = [m for m in level_selected_models if m in available_models]
2527
+ # Check if more than 5 models are selected and show alert
2528
+ if len(valid_level_models) > 5:
2529
+ gr.Warning("μ΅œλŒ€ 5개 κΉŒμ§€λ§Œ 선택 κ°€λŠ₯ν•©λ‹ˆλ‹€")
2530
+ # Remove the last selected item (6th item) instead of keeping first 5
2531
+ valid_level_models = valid_level_models[:-1]
2532
+ if not valid_level_models:
2533
+ valid_level_models = available_models[:5]
2534
+ else:
2535
+ valid_level_models = available_models[:5]
2536
+ effective_level = selected_level if selected_level in level_ids else (level_ids[0] if level_ids else None)
2537
+ level_chart = create_level_metric_chart(filtered_df, effective_level, valid_level_models) if effective_level else create_empty_level_metric_chart("Select a level to view its metrics")
2538
+ return (
2539
+ gr.Dropdown(
2540
+ choices=available_models,
2541
+ value=valid_level_models,
2542
+ multiselect=True,
2543
+ label="",
2544
+ info=None,
2545
+ container=False,
2546
+ elem_classes=["model-dropdown", "level-model-dropdown"]
2547
+ ),
2548
+ level_chart,
2549
+ )
2550
+
2551
+ # Update table when filters change
2552
+ filter_inputs = [domain_filter, model_type_filter, sort_order]
2553
+
2554
+ for input_component in filter_inputs:
2555
+ input_component.change(
2556
+ fn=update_table,
2557
+ inputs=filter_inputs,
2558
+ outputs=[leaderboard_title, leaderboard_table]
2559
+ )
2560
+
2561
+ # Also update radar chart when filters change
2562
+ input_component.change(
2563
+ fn=update_radar_chart,
2564
+ inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2565
+ outputs=[model_selector, radar_chart, level_model_selector, level_metric_chart]
2566
+ )
2567
+
2568
+ # Update radar chart when model selection changes
2569
+ model_selector.change(
2570
+ fn=update_radar_only,
2571
+ inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2572
+ outputs=[model_selector, radar_chart, level_model_selector, level_metric_chart]
2573
+ )
2574
+
2575
+ level_metric_selector.change(
2576
+ fn=update_level_metric_only,
2577
+ inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2578
+ outputs=[level_model_selector, level_metric_chart]
2579
+ )
2580
+
2581
+ level_model_selector.change(
2582
+ fn=update_level_metric_only,
2583
+ inputs=filter_inputs + [model_selector, level_metric_selector, level_model_selector],
2584
+ outputs=[level_model_selector, level_metric_chart]
2585
+ )
2586
+
2587
 
2588
  # Add custom CSS for the performance card
2589
  gr.HTML("""