import streamlit as st from utils.api import get_available_datasets, load_datasets _LABEL_MAP = { "pubmedqa": "PubMedQA", "mental_health": "Mental Health Counseling", "mediqa": "Medical MediQA", "medqa_usmle": "MedQA-USMLE", } def render_dataset_panel() -> None: st.markdown("### Knowledge Base") try: datasets = get_available_datasets() except Exception: st.caption("API offline — start the server to manage datasets.") return if not datasets: st.caption("No datasets available.") return search = st.text_input( "search_kb", placeholder="Search datasets…", label_visibility="collapsed", key="kb_search", ) filtered = [ ds for ds in datasets if not search or search.lower() in ds["name"].lower() or search.lower() in ds["description"].lower() ] if not filtered: st.caption("No datasets match your search.") return st.caption("Select datasets to load into the knowledge base:") selected = [ ds["name"] for ds in filtered if st.checkbox( _LABEL_MAP.get(ds["name"], ds["name"]), key=f"ds_{ds['name']}", help=ds["description"], ) ] max_samples = st.slider( "Max samples per dataset", min_value=100, max_value=2000, value=500, step=100, help="Higher values improve coverage but take longer to embed.", ) if st.button("Load Selected", disabled=not selected, use_container_width=True): with st.spinner(f"Embedding {len(selected)} dataset(s)… this may take a few minutes"): try: response = load_datasets(selected, max_samples) for name, result in response.get("results", {}).items(): label = _LABEL_MAP.get(name, name) if result["status"] == "success": st.success(f"{label}: {result['records_upserted']} records indexed") elif result["status"] == "skipped": st.warning(f"{label}: skipped — {result.get('detail', '')}") else: st.error(f"{label}: {result.get('detail', 'failed')}") except Exception as exc: st.error(f"Failed to load datasets: {exc}")