|
import streamlit as st |
|
import requests |
|
import subprocess |
|
import time |
|
from datetime import datetime |
|
import os |
|
import signal |
|
|
|
|
|
@st.cache_resource |
|
def launch_api(): |
|
process = subprocess.Popen( |
|
["uvicorn", "api.app:app", "--host", "127.0.0.1", "--port", "8000"], |
|
stdout=subprocess.PIPE, |
|
stderr=subprocess.PIPE, |
|
) |
|
time.sleep(2) |
|
return process |
|
|
|
api_process = launch_api() |
|
|
|
API_URL = "http://127.0.0.1:8000/moderate" |
|
st.set_page_config(page_title="LLMGuard", layout="wide") |
|
st.title(" LLMGuard – Prompt Injection Detection") |
|
|
|
if "history" not in st.session_state: |
|
st.session_state.history = [] |
|
|
|
|
|
with st.sidebar: |
|
st.subheader(" Moderation History") |
|
if st.session_state.history: |
|
for item in reversed(st.session_state.history): |
|
st.markdown(f"**Prompt:** {item['prompt']}") |
|
st.markdown(f"- Label: `{item['label']}`") |
|
st.markdown(f"- Confidence: `{item['confidence']}`") |
|
st.markdown(f"- Time: {item['timestamp']}") |
|
st.markdown("---") |
|
if st.button("🧹 Clear History"): |
|
st.session_state.history.clear() |
|
else: |
|
st.info("No prompts moderated yet.") |
|
|
|
prompt = st.text_area(" Enter a prompt to check:", height=150) |
|
|
|
if st.button(" Moderate Prompt"): |
|
if not prompt.strip(): |
|
st.warning("Please enter a prompt.") |
|
else: |
|
with st.spinner("Classifying..."): |
|
try: |
|
response = requests.post(API_URL, json={"prompt": prompt}) |
|
result = response.json() |
|
label = result["label"] |
|
confidence = result["confidence"] |
|
|
|
st.success(f" **Prediction:** {label} ({confidence*100:.1f}% confidence)") |
|
|
|
st.session_state.history.append({ |
|
"prompt": prompt, |
|
"label": label, |
|
"confidence": round(confidence, 3), |
|
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
}) |
|
except Exception as e: |
|
st.error(f"Error: {e}") |
|
|