Spaces:
Sleeping
Sleeping
File size: 4,200 Bytes
26215e2 2497eb4 e73e89e 26215e2 e73e89e fc302aa e73e89e 26215e2 2497eb4 e73e89e 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 e73e89e 26215e2 2497eb4 e73e89e 26215e2 2497eb4 e73e89e fc302aa 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 26215e2 e73e89e 2497eb4 e73e89e 26215e2 fc302aa 26215e2 e73e89e 26215e2 fc302aa 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 fc302aa 2497eb4 e73e89e 2497eb4 fc302aa 26215e2 fc302aa 2497eb4 e73e89e fc302aa 2497eb4 e73e89e 2497eb4 26215e2 e73e89e 2497eb4 e73e89e fc302aa 26215e2 e73e89e 2497eb4 e73e89e fc302aa 26215e2 fc302aa e73e89e fc302aa |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
import gradio as gr
import tempfile
from datetime import datetime
# ---------------------------------------------------------------------------
# Mode Handlers (replace with your real intelligence pipelines)
# ---------------------------------------------------------------------------
def handle_threat_intel(message, files):
out = f"[Threat Intel] Processed: {message}"
if files:
out += f" | Files: {[f.name for f in files]}"
return out
def handle_translation(message, files):
out = f"[Translation] Interpreted: {message}"
if files:
out += " | (Files attached for context)"
return out
def handle_marketplace_watch(message, files):
out = f"[Marketplace Watch] Monitoring request: {message}"
return out
def handle_analyst_tools(message, files):
out = f"[Analyst Tools] Action: {message}"
return out
# Router for mode → handler mapping
MODE_ROUTER = {
"Threat Intel": handle_threat_intel,
"Translation": handle_translation,
"Marketplace Watch": handle_marketplace_watch,
"Analyst Tools": handle_analyst_tools,
}
# ---------------------------------------------------------------------------
# Core message processing
# ---------------------------------------------------------------------------
def process_message(message, files, history, mode):
if not message and not files:
return history, history
handler = MODE_ROUTER.get(mode, handle_threat_intel)
response = handler(message or "(no text, files only)", files)
user_label = f"{mode}: {message or '[files only]'}"
history = history + [(user_label, response)]
return history, history
def clear_chat():
return [], []
def download_chat(history):
"""Write chat transcript to temp file and return path."""
if not history:
content = "No conversation yet.\n"
else:
lines = []
for user_msg, bot_msg in history:
lines.append(f"[User]: {user_msg}")
lines.append(f"[System]: {bot_msg}")
lines.append("")
content = "\n".join(lines)
tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".txt")
with open(tmp.name, "w", encoding="utf-8") as f:
f.write(content)
return tmp.name
# ---------------------------------------------------------------------------
# Mobile-first UI
# ---------------------------------------------------------------------------
with gr.Blocks(title="Threat Landscape Intelligence Console") as demo:
gr.Markdown("## 🛰 APJ Threat Intelligence Console")
chat_state = gr.State([])
# Mode selector
mode = gr.Radio(
["Threat Intel", "Translation", "Marketplace Watch", "Analyst Tools"],
value="Threat Intel",
label="Mode",
interactive=True
)
# Chat window (mobile-friendly)
chat = gr.Chatbot(
label="Dialogue",
height=430
)
# Collapsible utility section
with gr.Accordion("Attachments & Utilities", open=False):
file_input = gr.File(label="Upload files", file_count="multiple")
with gr.Row(variant="compact"):
clear_btn = gr.Button("Clear Chat", variant="secondary")
download_btn = gr.Button("Download Transcript", variant="secondary")
download_file = gr.File(label="Transcript File", interactive=False)
# Input bar
with gr.Row(variant="compact"):
user_input = gr.Textbox(
placeholder="Type your message…",
label="",
scale=5
)
send_btn = gr.Button("Send", variant="primary", scale=1)
# Event wiring
send_btn.click(
fn=process_message,
inputs=[user_input, file_input, chat_state, mode],
outputs=[chat, chat_state]
).then(lambda: "", None, user_input)
user_input.submit(
fn=process_message,
inputs=[user_input, file_input, chat_state, mode],
outputs=[chat, chat_state]
).then(lambda: "", None, user_input)
clear_btn.click(fn=clear_chat, outputs=[chat, chat_state])
download_btn.click(fn=download_chat, inputs=chat_state, outputs=download_file)
# Launch for local dev or Spaces
if __name__ == "__main__":
demo.launch() |