| import gradio as gr |
| import asyncio |
| import os |
| from tester import BugHunterEngine |
| from datetime import datetime |
|
|
| |
| 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) |
| |
| |
| 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"): |
| |
| 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__": |
| |
| demo.launch(server_name="0.0.0.0", server_port=7860) |
|
|