import gradio as gr from adapters.cia import search_cia from adapters.fbi import search_fbi from adapters.dod import search_dod from adapters.nsa import search_nsa from adapters.dhs import search_dhs from adapters.doj import search_doj from adapters.dea import search_dea from adapters.ice import search_ice from adapters.dia import search_dia from adapters.nia import search_nia AGENCY_MAP = { "CIA": search_cia, "FBI": search_fbi, "DoD": search_dod, "NSA": search_nsa, "DHS": search_dhs, "DOJ": search_doj, "DEA": search_dea, "ICE": search_ice, "DIA": search_dia, "NIA": search_nia, } def federated_search(query, agencies): results = [] for agency in agencies: try: results.extend(AGENCY_MAP[agency](query)) except Exception: continue return results with gr.Blocks(theme=gr.themes.Soft()) as app: gr.Markdown("# 📁 FOIA Declassified Document Search") gr.Markdown("⚠️ Demo Mode — Public FOIA sources only") query = gr.Textbox(label="Search query") agencies = gr.CheckboxGroup( list(AGENCY_MAP.keys()), label="Filter by agency", value=["CIA", "FBI"] ) search_btn = gr.Button("Search") results = gr.Dataframe( headers=["title", "agency", "date", "snippet", "url"], interactive=False ) search_btn.click( lambda q, a: [ [r[k] for k in ["title","agency","date","snippet","url"]] for r in federated_search(q, a) ], inputs=[query, agencies], outputs=results ) gr.Markdown(""" **Dataset Provenance** - Sources: Official government FOIA reading rooms - Status: Previously released, unclassified - Scope: Federated search only - Verification: No claims beyond source text """) app.launch()