File size: 3,521 Bytes
5a61f72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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)