GodsDevProject commited on
Commit
de18c20
·
verified ·
1 Parent(s): f29eee6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -84
app.py CHANGED
@@ -1,35 +1,24 @@
1
  import asyncio
2
  import gradio as gr
3
- from typing import List, Dict
4
 
5
- from ingest.cia_reading_room import CIAAdapter
6
- from ingest.fbi_vault import FBIAdapter
7
 
8
- from ingest.cia_extended import CIAExtendedAdapter
9
- from ingest.nsa_extended import NSAExtendedAdapter
10
- from ingest.nro_extended import NROExtendedAdapter
11
- from ingest.dod_special_extended import (
12
- AATIPExtendedAdapter,
13
- SAPExtendedAdapter,
14
- TENCAPExtendedAdapter,
15
- SpecialActivitiesExtendedAdapter
16
- )
17
 
18
- import saved_searches
19
 
20
- BASE_ADAPTERS = [CIAAdapter(), FBIAdapter()]
21
- EXTENDED_ADAPTERS = [
22
- CIAExtendedAdapter(),
23
- NSAExtendedAdapter(),
24
- NROExtendedAdapter(),
25
- AATIPExtendedAdapter(),
26
- SAPExtendedAdapter(),
27
- TENCAPExtendedAdapter(),
28
- SpecialActivitiesExtendedAdapter()
29
- ]
30
 
31
- async def federated_search_async(query: str, extended: bool):
32
- adapters = BASE_ADAPTERS + (EXTENDED_ADAPTERS if extended else [])
 
 
 
 
 
 
 
 
33
  tasks = [a.search(query) for a in adapters]
34
  results = await asyncio.gather(*tasks, return_exceptions=True)
35
 
@@ -39,27 +28,17 @@ async def federated_search_async(query: str, extended: bool):
39
  flat.extend(r)
40
  return flat
41
 
42
- def badge(r):
43
- h = r.get("health", {})
44
- latency = f"{h.get('latency_ms','?')}ms"
45
- status = "🟢" if h.get("ok") else "🔴"
46
- if r.get("extended"):
47
- return f"🟣 EXT · {status} {latency}"
48
- return "🟢 LIVE" if r.get("live") else "⚪ STUB"
49
-
50
- def render(r):
51
- return f"""
52
- ### {r['title']}
53
- **{badge(r)} · {r['source']}**
54
 
55
- {r['snippet']}
 
56
 
57
- 🔗 {r['url']}
58
- """
 
59
 
60
- def run_search(query, hide_stubs, extended):
61
- loop = asyncio.get_event_loop()
62
- results = loop.run_until_complete(federated_search_async(query, extended))
63
 
64
  saved_searches.save(query, extended)
65
 
@@ -69,44 +48,4 @@ def run_search(query, hide_stubs, extended):
69
  if not results:
70
  return "No results found."
71
 
72
- return "\n\n---\n\n".join(render(r) for r in results)
73
-
74
- def show_saved():
75
- rows = saved_searches.list_saved()
76
- if not rows:
77
- return "No saved searches yet."
78
- return "\n".join(
79
- f"- **{r['query']}** (extended={r['extended']})"
80
- for r in rows
81
- )
82
-
83
- with gr.Blocks(css="""
84
- .gradio-container { max-width: 1100px }
85
- """) as demo:
86
- gr.Markdown("# 📜 FOIA Federated Search")
87
- gr.Markdown(
88
- "Transparent federated search across public FOIA reading rooms.\n\n"
89
- "**Badges**: ⚪ Stub · 🟢 Live · 🟣 Extended · 🔴 Unhealthy"
90
- )
91
-
92
- with gr.Row():
93
- query = gr.Textbox(label="Search term", scale=3)
94
- hide_stubs = gr.Checkbox(label="Hide stub sources", value=False)
95
- extended = gr.Checkbox(
96
- label="Enable Extended Features",
97
- value=False,
98
- info="Advanced public sources. Disabled by default."
99
- )
100
-
101
- output = gr.Markdown()
102
- saved = gr.Markdown()
103
-
104
- with gr.Row():
105
- gr.Button("Search").click(
106
- run_search,
107
- inputs=[query, hide_stubs, extended],
108
- outputs=output
109
- )
110
- gr.Button("Saved Searches").click(show_saved, outputs=saved)
111
-
112
- demo.launch()
 
1
  import asyncio
2
  import gradio as gr
3
+ from typing import Dict, List
4
 
5
+ from ingest.registry import get_all_adapters, BASE_AGENCIES, EXTENDED_AGENCIES
6
+ import saved_searches
7
 
 
 
 
 
 
 
 
 
 
8
 
9
+ ALL_ADAPTERS = get_all_adapters()
10
 
 
 
 
 
 
 
 
 
 
 
11
 
12
+ async def federated_search_async(
13
+ query: str,
14
+ enabled_agencies: List[str],
15
+ ):
16
+ adapters = [
17
+ ALL_ADAPTERS[k]
18
+ for k in enabled_agencies
19
+ if k in ALL_ADAPTERS
20
+ ]
21
+
22
  tasks = [a.search(query) for a in adapters]
23
  results = await asyncio.gather(*tasks, return_exceptions=True)
24
 
 
28
  flat.extend(r)
29
  return flat
30
 
 
 
 
 
 
 
 
 
 
 
 
 
31
 
32
+ def run_search(query, hide_stubs, extended, enabled_agencies):
33
+ loop = asyncio.get_event_loop()
34
 
35
+ agencies = list(BASE_AGENCIES)
36
+ if extended:
37
+ agencies.extend([a for a in enabled_agencies if a in EXTENDED_AGENCIES])
38
 
39
+ results = loop.run_until_complete(
40
+ federated_search_async(query, agencies)
41
+ )
42
 
43
  saved_searches.save(query, extended)
44
 
 
48
  if not results:
49
  return "No results found."
50
 
51
+ return "\n\n---\n\n".join(render(r) for r in results)