Add CWE/model sidebar selectors + scan logs/ subdirs
Browse files
app.py
CHANGED
|
@@ -14,10 +14,10 @@ from pathlib import Path
|
|
| 14 |
|
| 15 |
import streamlit as st
|
| 16 |
|
| 17 |
-
# Local: scripts/trajectory_viewer.py β repo_root/logs
|
| 18 |
-
# Space: /app/app.py β /app/logs
|
| 19 |
-
_local_logs = Path(__file__).parent.parent / "logs"
|
| 20 |
-
_space_logs = Path(__file__).parent / "logs"
|
| 21 |
LOGS_DIR = _space_logs if _space_logs.exists() else _local_logs
|
| 22 |
|
| 23 |
# ββ Colours & labels ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -707,6 +707,29 @@ def render_steps(steps: list) -> None:
|
|
| 707 |
)
|
| 708 |
|
| 709 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 710 |
# ββ Main app ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 711 |
|
| 712 |
|
|
@@ -735,12 +758,17 @@ def main() -> None:
|
|
| 735 |
if uploaded is not None:
|
| 736 |
eval_source = uploaded
|
| 737 |
else:
|
| 738 |
-
|
| 739 |
-
if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 740 |
selected_path = st.selectbox(
|
| 741 |
-
"
|
| 742 |
-
|
| 743 |
-
format_func=lambda p: Path(p).stem[:
|
| 744 |
)
|
| 745 |
eval_source = selected_path
|
| 746 |
|
|
|
|
| 14 |
|
| 15 |
import streamlit as st
|
| 16 |
|
| 17 |
+
# Local: scripts/trajectory_viewer.py β repo_root/logs
|
| 18 |
+
# Space: /app/app.py β /app/logs
|
| 19 |
+
_local_logs = Path(__file__).parent.parent / "logs"
|
| 20 |
+
_space_logs = Path(__file__).parent / "logs"
|
| 21 |
LOGS_DIR = _space_logs if _space_logs.exists() else _local_logs
|
| 22 |
|
| 23 |
# ββ Colours & labels ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 707 |
)
|
| 708 |
|
| 709 |
|
| 710 |
+
# ββ Log index βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 711 |
+
|
| 712 |
+
|
| 713 |
+
@st.cache_data(show_spinner=False)
|
| 714 |
+
def _log_index(logs_dir: str) -> dict[str, dict[str, list[str]]]:
|
| 715 |
+
"""Scan logs_dir recursively; return {cwe: {model: [path, ...]}} newest-first."""
|
| 716 |
+
index: dict[str, dict[str, list[str]]] = {}
|
| 717 |
+
for p in sorted(Path(logs_dir).rglob("*.eval"), reverse=True):
|
| 718 |
+
cwe = p.parent.name # directory name used as CWE/task label
|
| 719 |
+
model = "unknown"
|
| 720 |
+
try:
|
| 721 |
+
with zipfile.ZipFile(str(p)) as z:
|
| 722 |
+
if "header.json" in z.namelist():
|
| 723 |
+
h = json.loads(z.read("header.json"))
|
| 724 |
+
usage = h.get("stats", {}).get("model_usage", {})
|
| 725 |
+
if usage:
|
| 726 |
+
model = next(iter(usage))
|
| 727 |
+
except Exception:
|
| 728 |
+
pass
|
| 729 |
+
index.setdefault(cwe, {}).setdefault(model, []).append(str(p))
|
| 730 |
+
return index
|
| 731 |
+
|
| 732 |
+
|
| 733 |
# ββ Main app ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 734 |
|
| 735 |
|
|
|
|
| 758 |
if uploaded is not None:
|
| 759 |
eval_source = uploaded
|
| 760 |
else:
|
| 761 |
+
index = _log_index(str(LOGS_DIR))
|
| 762 |
+
if index:
|
| 763 |
+
cwe_options = sorted(index.keys())
|
| 764 |
+
selected_cwe = st.selectbox("CWE / Task", cwe_options)
|
| 765 |
+
model_options = sorted(index[selected_cwe].keys())
|
| 766 |
+
selected_model = st.selectbox("Model", model_options)
|
| 767 |
+
file_list = index[selected_cwe][selected_model]
|
| 768 |
selected_path = st.selectbox(
|
| 769 |
+
"Run",
|
| 770 |
+
file_list,
|
| 771 |
+
format_func=lambda p: Path(p).stem[:60],
|
| 772 |
)
|
| 773 |
eval_source = selected_path
|
| 774 |
|