BugFinder / app.py
Shokat's picture
Upload 5 files
5a61f72 verified
Raw
History Blame Contribute Delete
3.52 kB
import gradio as gr
import asyncio
import os
from tester import BugHunterEngine
from datetime import datetime
# --- CUSTOM CSS FOR EMBEDDING & LIGHT THEME REPORT ---
CSS = """
body { background-color: #0d1117; color: #c9d1d9; }
.report-container {
background-color: #ffffff !important;
color: #1a1a1a !important;
border-radius: 12px;
padding: 30px;
border: 1px solid #d0d7de;
box-shadow: inset 0 0 10px rgba(0,0,0,0.05);
max-height: 800px;
overflow-y: auto;
}
.report-container h1, .report-container h2, .report-container h3 { color: #0969da !important; }
.report-container p, .report-container li { color: #24292f !important; }
.glass-card {
background: rgba(255, 255, 255, 0.05) !important;
backdrop-filter: blur(10px);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 20px;
}
.download-btn {
background-color: #238636 !important;
color: white !important;
}
"""
def save_report(md_content):
if not md_content or "appearing here" in md_content:
return None
filename = f"report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.md"
with open(filename, "w", encoding="utf-8") as f:
f.write(md_content)
return filename
def start_audit(url, provider, api_key, progress=gr.Progress()):
if not url or not api_key:
return "## ⚠️ Error\nPlease provide URL and API Key.", None, None
engine = BugHunterEngine(api_key=api_key, provider=provider)
# Run loop
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
report, screenshots = loop.run_until_complete(engine.run_test(url, progress=progress))
finally:
loop.close()
report_file = save_report(report)
return report, screenshots, report_file
with gr.Blocks(css=CSS, theme=gr.themes.Default()) as demo:
gr.HTML("<div style='text-align: center;'><h1>🕷️ BugHunter AI</h1><p>Autonomous Quality Engineering Engine</p></div>")
with gr.Row(elem_classes="glass-card"):
with gr.Column(scale=2):
url_box = gr.Textbox(label="Website URL", value="https://automotive.panasonic.com/en/newsroom/20251216-02")
with gr.Row():
provider_box = gr.Radio(["Gemini", "Groq"], label="AI Provider", value="Gemini")
api_box = gr.Textbox(label="API Key", type="password")
run_btn = gr.Button("🔍 Run Deep Audit", variant="primary")
with gr.Column(scale=1):
gr.Markdown("### 📥 Download Results")
download_file = gr.File(label="Generated Report (.md)")
with gr.Tabs():
with gr.Tab("📋 Audit Report"):
# Light Background Container for Report
report_display = gr.Markdown(
"The AI report will appear here. It is optimized for high-contrast reading.",
elem_classes="report-container"
)
with gr.Tab("🖼️ Evidence"):
evidence_gallery = gr.Gallery(label="Screenshots", columns=2)
run_btn.click(
fn=start_audit,
inputs=[url_box, provider_box, api_box],
outputs=[report_display, evidence_gallery, download_file]
)
gr.HTML("<p style='text-align: center; color: #8b949e; font-size: 0.8em;'>Powered by Advanced QA Agent Skill (v2.0) • SBTM Methodology • Gemini-3.1-Pro</p>")
if __name__ == "__main__":
# Launch for Hugging Face on port 7860
demo.launch(server_name="0.0.0.0", server_port=7860)