File size: 3,330 Bytes
d8e0712
6763be4
d8e0712
 
5c7cdbe
996bb04
5c7cdbe
6763be4
 
5c7cdbe
 
6eb737d
5c7cdbe
 
6763be4
6eb737d
 
6763be4
5c7cdbe
996bb04
6763be4
5c7cdbe
6763be4
6eb737d
 
996bb04
6eb737d
 
6763be4
6eb737d
6763be4
6eb737d
 
 
d8e0712
6eb737d
5c7cdbe
6eb737d
996bb04
6763be4
6eb737d
 
 
 
 
 
 
 
996bb04
 
 
 
6eb737d
 
 
 
 
 
996bb04
6eb737d
 
 
 
 
 
 
 
 
 
 
996bb04
6eb737d
 
 
 
 
 
996bb04
 
 
6eb737d
 
 
 
 
 
 
 
996bb04
6763be4
6eb737d
5c7cdbe
6eb737d
996bb04
 
6eb737d
 
 
 
 
996bb04
d8e0712
 
 
 
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
98
99
100
101
102
103
104
105
import gradio as gr
import time
from src.pipeline import generate_report

# ------------------------------------------------------------------
# 1. Pre-load models
# ------------------------------------------------------------------
from src.tools_loader import get_tools
_ = get_tools()

# ------------------------------------------------------------------
# 2. Helper: streaming generator with progress
# ------------------------------------------------------------------
def process_upload(image_path: str):
    """
    Streamed generator: yields loading states then final report.
    Gradio shows spinner automatically during execution.
    """
    if image_path is None:
        yield "**Please upload a chest X-ray image to begin analysis.**"
        return

    start = time.time()
    
    # Show loading state immediately
    yield "**Analyzing X-ray image...**\n\nThis will take a few seconds..."
    
    # Generate the actual report
    report = generate_report(image_path)
    
    elapsed = time.time() - start
    
    # Return final formatted report
    yield f"""### Radiology Report

{report}

---
*Report generated in {elapsed:.1f} seconds*"""

# ------------------------------------------------------------------
# 3. Gradio UI - Vertical Layout
# ------------------------------------------------------------------
with gr.Blocks(
    theme=gr.themes.Soft(),
    title="Multi-Agent Radiology Assistant",
    css="""
    .image-container { max-width: 600px; margin: 0 auto; }
    .report-container { margin-top: 40px; padding-top: 20px; }
    .generate-btn { margin: 30px auto; display: block; }
    .progress-bar { z-index: 1000 !important; position: relative; }
    .gradio-container .wrap { z-index: auto; }
    """
) as demo:
    
    # Header
    gr.Markdown(
        "# Multi-Agent Radiology Assistant\n"
        "Upload a chest X-ray image to receive an AI-powered radiology report"
    )
    
    # Image upload section (centered, top)
    with gr.Column():
        input_image = gr.Image(
            type="filepath",
            label="Upload Chest X-ray Image",
            height=400,
            elem_classes=["image-container"]
        )
        
        # Generate button (centered with more spacing)
        generate_btn = gr.Button(
            "Generate Report",
            variant="primary",
            size="lg",
            elem_classes=["generate-btn"]
        )
        
        # Add some spacing to prevent overlap
        gr.HTML("<div style='height: 20px;'></div>")
    
    # Report output section (bottom)
    with gr.Column(elem_classes=["report-container"]):
        output_report = gr.Markdown(
            value="**Ready to analyze**\n\nUpload an X-ray image above and click 'Generate Report' to begin.",
            label="Analysis Results"
        )
    
    # Event handler with progress settings
    generate_btn.click(
        fn=process_upload,
        inputs=input_image,
        outputs=output_report,
        show_progress="full",  # Shows Gradio's built-in progress bar
        concurrency_limit=1   # Prevent multiple simultaneous requests
    )
    
    # Footer with example hint
    gr.Markdown(
        "### Need an example?\n"
        "Use any frontal chest X-ray PNG/JPG file and click **Generate Report**."
    )

if __name__ == "__main__":
    demo.launch()