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("

🕷️ BugHunter AI

Autonomous Quality Engineering Engine

") 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("

Powered by Advanced QA Agent Skill (v2.0) • SBTM Methodology • Gemini-3.1-Pro

") if __name__ == "__main__": # Launch for Hugging Face on port 7860 demo.launch(server_name="0.0.0.0", server_port=7860)