|
1 | 1 | import os |
| 2 | +import re |
| 3 | +import hashlib |
2 | 4 | import mesop as me |
3 | 5 | import pandas as pd |
4 | 6 | import yaml |
5 | 7 | import logging |
6 | 8 | import json |
7 | 9 | import subprocess |
| 10 | +from functools import lru_cache |
8 | 11 | import precompute_trends |
9 | 12 | import dataset_quality |
10 | 13 | from summarizer import summarize_eval_scoring |
@@ -310,6 +313,39 @@ def on_load(e: me.LoadEvent): |
310 | 313 | state.ai_comparison = compare_evals(eval1, eval2) |
311 | 314 |
|
312 | 315 |
|
| 316 | +def _handler_name(prefix, *parts): |
| 317 | + # Mesop identifies a handler by __name__ plus source, and every handler built by |
| 318 | + # one factory shares its source, so the name has to carry the values. The digest |
| 319 | + # keeps values that sanitize alike ("a.b" and "a-b") from sharing an identity. |
| 320 | + raw = "\x00".join(str(p) for p in parts) |
| 321 | + slug = re.sub(r"\W+", "_", raw.replace("\x00", "_")) |
| 322 | + return f"{prefix}_{slug}_{hashlib.sha1(raw.encode()).hexdigest()[:8]}" |
| 323 | + |
| 324 | + |
| 325 | +# Mesop memoizes on the handler object itself, so a fresh closure per render grows |
| 326 | +# its table forever. Returning the same object per value keeps that table bounded. |
| 327 | +@lru_cache(maxsize=4096) |
| 328 | +def _set_filter_handler(field, value): |
| 329 | + def handler(e: me.ClickEvent): |
| 330 | + st = me.state(State) |
| 331 | + setattr(st, field, value) |
| 332 | + st.open_dropdown = "" |
| 333 | + |
| 334 | + handler.__name__ = _handler_name("set", field, value) |
| 335 | + return handler |
| 336 | + |
| 337 | + |
| 338 | +@lru_cache(maxsize=4096) |
| 339 | +def _status_row_handler(product, dataset): |
| 340 | + def handler(e: me.ClickEvent): |
| 341 | + st = me.state(State) |
| 342 | + st.selected_main_tab = "List" |
| 343 | + st.product_filter = product |
| 344 | + st.dataset_filter = dataset |
| 345 | + st.list_agent_tab = st.status_agent_tab |
| 346 | + |
| 347 | + handler.__name__ = _handler_name("click_status_row", product, dataset) |
| 348 | + return handler |
313 | 349 |
|
314 | 350 |
|
315 | 351 |
|
@@ -526,22 +562,7 @@ def render_cell(text, color="#334155", cell_bg=None, on_click=None): |
526 | 562 | product_val = str(row['Product']) |
527 | 563 | dataset_val = str(row['Dataset']) |
528 | 564 |
|
529 | | - def make_click_handler(p_val, d_val, g_val): |
530 | | - def handler(e: me.ClickEvent): |
531 | | - st = me.state(State) |
532 | | - st.selected_main_tab = "List" |
533 | | - st.product_filter = p_val |
534 | | - st.dataset_filter = d_val |
535 | | - st.list_agent_tab = st.status_agent_tab |
536 | | - |
537 | | - safe_p = str(p_val).replace(" ", "_").replace(".", "_").replace("-", "_") |
538 | | - safe_d = str(d_val).replace(" ", "_").replace(".", "_").replace("-", "_") |
539 | | - handler_name = f"click_status_row_{safe_p}_{safe_d}" |
540 | | - handler.__name__ = handler_name |
541 | | - globals()[handler_name] = handler |
542 | | - return handler |
543 | | - |
544 | | - click_handler = make_click_handler(product_val, dataset_val, row.get('model_config.generator')) |
| 565 | + click_handler = _status_row_handler(product_val, dataset_val) |
545 | 566 | render_cell(product_val, color="#2563eb", on_click=click_handler) |
546 | 567 | render_cell("N/A" if is_na else dataset_val, color="#2563eb", on_click=None if is_na else click_handler) |
547 | 568 |
|
@@ -904,15 +925,7 @@ def toggle_eval_id_dropdown(e: me.ClickEvent): |
904 | 925 | st.open_dropdown = "eval_id" |
905 | 926 |
|
906 | 927 | def make_eval_id_handler(val): |
907 | | - def handler(e: me.ClickEvent): |
908 | | - st = me.state(State) |
909 | | - st.eval_id_filter = val |
910 | | - st.open_dropdown = "" |
911 | | - |
912 | | - handler_name = f"click_eval_id_{val}" |
913 | | - handler.__name__ = handler_name |
914 | | - globals()[handler_name] = handler |
915 | | - return handler |
| 928 | + return _set_filter_handler("eval_id_filter", val) |
916 | 929 |
|
917 | 930 | with me.box( |
918 | 931 | style=me.Style( |
@@ -1005,17 +1018,7 @@ def toggle_product_dropdown(e: me.ClickEvent): |
1005 | 1018 | st.open_dropdown = "product" |
1006 | 1019 |
|
1007 | 1020 | def make_prod_dropdown_handler(val): |
1008 | | - def handler(e: me.ClickEvent): |
1009 | | - st = me.state(State) |
1010 | | - st.product_filter = val |
1011 | | - st.open_dropdown = "" |
1012 | | - |
1013 | | - # Sanitize name for Mesop event routing |
1014 | | - safe_val = str(val).replace(" ", "_").replace(".", "_").replace("-", "_") |
1015 | | - handler_name = f"click_prod_dd_{safe_val}" |
1016 | | - handler.__name__ = handler_name |
1017 | | - globals()[handler_name] = handler |
1018 | | - return handler |
| 1021 | + return _set_filter_handler("product_filter", val) |
1019 | 1022 |
|
1020 | 1023 | mk_prod_dd = make_prod_dropdown_handler |
1021 | 1024 |
|
@@ -1110,17 +1113,7 @@ def toggle_requester_dropdown(e: me.ClickEvent): |
1110 | 1113 | st.open_dropdown = "requester" |
1111 | 1114 |
|
1112 | 1115 | def make_req_dropdown_handler(val): |
1113 | | - def handler(e: me.ClickEvent): |
1114 | | - st = me.state(State) |
1115 | | - st.requester_filter = val |
1116 | | - st.open_dropdown = "" |
1117 | | - |
1118 | | - # Sanitize name for Mesop event routing |
1119 | | - safe_val = str(val).replace(" ", "_").replace(".", "_").replace("-", "_") |
1120 | | - handler_name = f"click_req_dd_{safe_val}" |
1121 | | - handler.__name__ = handler_name |
1122 | | - globals()[handler_name] = handler |
1123 | | - return handler |
| 1116 | + return _set_filter_handler("requester_filter", val) |
1124 | 1117 |
|
1125 | 1118 | mk_req_dd = make_req_dropdown_handler |
1126 | 1119 |
|
@@ -1215,17 +1208,7 @@ def toggle_dataset_dropdown(e: me.ClickEvent): |
1215 | 1208 | st.open_dropdown = "dataset" |
1216 | 1209 |
|
1217 | 1210 | def make_dataset_dropdown_handler(val): |
1218 | | - def handler(e: me.ClickEvent): |
1219 | | - st = me.state(State) |
1220 | | - st.dataset_filter = val |
1221 | | - st.open_dropdown = "" |
1222 | | - |
1223 | | - # Sanitize name for Mesop event routing |
1224 | | - safe_val = str(val).replace(" ", "_").replace(".", "_").replace("-", "_") |
1225 | | - handler_name = f"click_dataset_dd_{safe_val}" |
1226 | | - handler.__name__ = handler_name |
1227 | | - globals()[handler_name] = handler |
1228 | | - return handler |
| 1211 | + return _set_filter_handler("dataset_filter", val) |
1229 | 1212 |
|
1230 | 1213 | mk_dataset_dd = make_dataset_dropdown_handler |
1231 | 1214 |
|
@@ -1320,15 +1303,7 @@ def toggle_rows_dropdown(e: me.ClickEvent): |
1320 | 1303 | st.open_dropdown = "rows_to_show" |
1321 | 1304 |
|
1322 | 1305 | def make_rows_handler(val): |
1323 | | - def handler(e: me.ClickEvent): |
1324 | | - st = me.state(State) |
1325 | | - st.rows_to_show = val |
1326 | | - st.open_dropdown = "" |
1327 | | - |
1328 | | - handler_name = f"click_rows_{val}" |
1329 | | - handler.__name__ = handler_name |
1330 | | - globals()[handler_name] = handler |
1331 | | - return handler |
| 1306 | + return _set_filter_handler("rows_to_show", val) |
1332 | 1307 |
|
1333 | 1308 | with me.box( |
1334 | 1309 | style=me.Style( |
|
0 commit comments