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("
Autonomous Quality Engineering Engine
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)