GodsDevProject commited on
Commit
122df81
·
verified ·
1 Parent(s): 6795047

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -28
app.py CHANGED
@@ -1,41 +1,90 @@
1
- import asyncio
2
  import gradio as gr
3
- from ingest.registry import get_live_adapters
 
 
 
 
 
 
 
4
 
5
- ADAPTERS = get_live_adapters()
 
 
 
 
 
 
 
 
6
 
7
- async def live_search(query):
8
- tasks = [a.search(query) for a in ADAPTERS]
9
- results = await asyncio.gather(*tasks, return_exceptions=True)
10
 
11
- flat = []
12
- for r in results:
13
- if isinstance(r, list):
14
- flat.extend(r)
15
 
16
- return [
17
- [x["agency"], x["source"], x["title"], x["url"]]
18
- for x in flat
19
  ]
20
 
21
- def run_search(query):
22
- return asyncio.run(live_search(query))
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
- with gr.Blocks() as demo:
25
- gr.Markdown("""
26
- # 🏛️ Federal FOIA Intelligence Search
27
- **Public Electronic Reading Rooms Only**
28
- _Live CIA CREST & FBI Vault_
29
- """)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
- query = gr.Textbox(label="Search FOIA documents")
32
- btn = gr.Button("Live Search")
 
33
 
34
- table = gr.Dataframe(
35
- headers=["Agency", "Source", "Title", "URL"],
36
- interactive=False
 
37
  )
38
 
39
- btn.click(run_search, query, table)
 
 
 
 
 
 
40
 
41
- demo.launch()
 
 
1
  import gradio as gr
2
+ import asyncio
3
+
4
+ from ingest.registry import get_all_adapters
5
+ from ingest.cluster import semantic_clusters
6
+ from ingest.export import export_results_zip
7
+ from ingest.health import check_health
8
+
9
+ ADAPTERS = get_all_adapters()
10
 
11
+ async def federated_search(query: str):
12
+ results = []
13
+ for adapter in ADAPTERS.values():
14
+ try:
15
+ res = await adapter.search(query)
16
+ results.extend(res)
17
+ except Exception:
18
+ continue
19
+ return results
20
 
21
+ def run_search(query):
22
+ if not query.strip():
23
+ return [], []
24
 
25
+ results = asyncio.run(federated_search(query))
 
 
 
26
 
27
+ rows = [
28
+ [r["source"], r["title"], r["url"], r["snippet"]]
29
+ for r in results
30
  ]
31
 
32
+ texts = [r["snippet"] for r in results]
33
+ clusters = semantic_clusters(texts) if texts else []
34
+
35
+ return rows, clusters
36
+
37
+ def export_zip_handler(table):
38
+ results = []
39
+ for row in table:
40
+ results.append({
41
+ "source": row[0],
42
+ "title": row[1],
43
+ "url": row[2],
44
+ "snippet": row[3],
45
+ })
46
+ return export_results_zip(results)
47
 
48
+ with gr.Blocks() as app:
49
+ gr.Markdown(
50
+ "# **Federal FOIA Intelligence Search**\n"
51
+ "### Public Electronic Reading Rooms Only\n\n"
52
+ "Live, robots-compliant search across U.S. government FOIA libraries."
53
+ )
54
+
55
+ query = gr.Textbox(label="Search term", placeholder="e.g. UAP, procurement, surveillance")
56
+ search_btn = gr.Button("Search")
57
+
58
+ results_table = gr.Dataframe(
59
+ headers=["Agency", "Title", "URL", "Snippet"],
60
+ interactive=False,
61
+ wrap=True
62
+ )
63
+
64
+ cluster_output = gr.State()
65
+
66
+ search_btn.click(
67
+ fn=run_search,
68
+ inputs=query,
69
+ outputs=[results_table, cluster_output]
70
+ )
71
 
72
+ gr.Markdown("### Export")
73
+ export_btn = gr.Button("Export Results (ZIP)")
74
+ zip_file = gr.File(label="Download ZIP")
75
 
76
+ export_btn.click(
77
+ fn=export_zip_handler,
78
+ inputs=results_table,
79
+ outputs=zip_file
80
  )
81
 
82
+ gr.Markdown("### Source Health")
83
+ for adapter in ADAPTERS.values():
84
+ health = check_health(adapter)
85
+ gr.Markdown(
86
+ f"- **{health['source']}**: {health['status']} "
87
+ f"({health['latency_ms']} ms)"
88
+ )
89
 
90
+ app.launch()