| 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() |