petter2025's picture
Update ui/components.py
b37ab2f verified
raw
history blame
16.4 kB
"""
UI components for the 5-tab demo - FIXED VERSION
"""
import gradio as gr
from typing import Dict, List, Any, Optional, Tuple
import plotly.graph_objects as go
def create_header(oss_version: str, oss_available: bool) -> gr.Markdown:
"""Create the demo header - FIXED VERSION"""
status_badge = "✅ Connected" if oss_available else "⚠️ Mock Mode"
return gr.Markdown(f"""
<div style="text-align: center; padding: 30px 20px 20px 20px; background: linear-gradient(135deg, #f8fafc 0%, #ffffff 100%); border-radius: 0 0 20px 20px; margin-bottom: 30px; border-bottom: 3px solid #4ECDC4;">
<h1 style="margin-bottom: 10px;">🚀 Agentic Reliability Framework</h1>
<h2 style="color: #4a5568; font-weight: 600; margin-bottom: 20px;">Investor Demo v3.8.0</h2>
<div style="display: flex; justify-content: center; gap: 20px; flex-wrap: wrap; margin-bottom: 20px;">
<div style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 8px 16px; border-radius: 20px; font-weight: 700; font-size: 0.85rem;">
🏢 Enterprise Edition
</div>
<div style="background: linear-gradient(135deg, #4299e1 0%, #38b2ac 100%); color: white; padding: 8px 16px; border-radius: 20px; font-weight: 700; font-size: 0.85rem;">
🆓 OSS v{oss_version}
</div>
<div style="background: #e8f5e8; color: #2d3748; padding: 8px 16px; border-radius: 20px; font-weight: 600; font-size: 0.85rem;">
📈 5.2× ROI
</div>
<div style="background: #fff3cd; color: #856404; padding: 8px 16px; border-radius: 20px; font-weight: 600; font-size: 0.85rem;">
⚡ 85% MTTR Reduction
</div>
</div>
<div style="color: #718096; font-size: 16px; max-width: 800px; margin: 0 auto; line-height: 1.6;">
From <span style="font-weight: 700; color: #4299e1;">OSS Advisory</span>
to <span style="font-weight: 700; color: #764ba2;">Enterprise Autonomous Healing</span>.
</div>
<div style="margin-top: 15px; font-size: 0.9rem; color: #4ECDC4; font-weight: 600;">
{status_badge}
</div>
</div>
""")
def create_status_bar() -> gr.HTML:
"""Create system status bar - FIXED VERSION"""
return gr.HTML("""
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; margin-bottom: 25px;">
<div style="background: white; padding: 20px; border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border-left: 4px solid #4ECDC4;">
<div style="font-size: 0.9rem; color: #718096; margin-bottom: 5px;">System Status</div>
<div style="display: flex; align-items: center; gap: 8px;">
<div style="width: 10px; height: 10px; background: #4ECDC4; border-radius: 50%;"></div>
<div style="font-weight: 700; color: #2d3748;">Operational</div>
</div>
</div>
<div style="background: white; padding: 20px; border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border-left: 4px solid #FFA726;">
<div style="font-size: 0.9rem; color: #718096; margin-bottom: 5px;">Performance</div>
<div style="font-weight: 700; color: #2d3748; font-size: 1.1rem;">8.2 min avg resolution</div>
</div>
<div style="background: white; padding: 20px; border-radius: 12px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border-left: 4px solid #42A5F5;">
<div style="font-size: 0.9rem; color: #718096; margin-bottom: 5px;">Learning Engine</div>
<div style="font-weight: 700; color: #2d3748; font-size: 1.1rem;">6 patterns detected</div>
</div>
</div>
""")
def create_tab1_incident_demo(scenarios: Dict, default_scenario: str = "Cache Miss Storm") -> Tuple:
"""Create Tab 1: Live Incident Demo - FIXED WORKING VERSION"""
with gr.Row():
# Left Panel
with gr.Column(scale=1):
gr.Markdown("### 🎬 Select Incident Scenario")
scenario_dropdown = gr.Dropdown(
choices=list(scenarios.keys()),
value=default_scenario,
label="Choose an incident to analyze:",
interactive=True
)
scenario_description = gr.Markdown(
value=scenarios[default_scenario]["description"]
)
gr.Markdown("### 📊 Current Metrics")
metrics_display = gr.JSON(
value=scenarios[default_scenario].get("metrics", {}),
label="",
show_label=False
)
gr.Markdown("### 💰 Business Impact")
impact_display = gr.JSON(
value=scenarios[default_scenario].get("business_impact", {}),
label="",
show_label=False
)
# Right Panel
with gr.Column(scale=2):
gr.Markdown("### 📈 Incident Timeline")
timeline_output = gr.Plot(label="", show_label=False)
gr.Markdown("### ⚡ Take Action")
with gr.Row():
oss_btn = gr.Button(
"🆓 Run OSS Analysis",
variant="secondary",
size="lg",
elem_id="oss_btn"
)
enterprise_btn = gr.Button(
"🚀 Execute Enterprise Healing",
variant="primary",
size="lg",
elem_id="enterprise_btn"
)
with gr.Row():
approval_toggle = gr.Checkbox(
label="🔐 Require Manual Approval",
value=True,
interactive=True
)
demo_btn = gr.Button(
"⚡ Quick Demo",
variant="secondary",
size="sm"
)
approval_display = gr.HTML(
value="<div style='padding: 15px; background: #f8f9fa; border-radius: 8px; color: #6c757d;'>"
"Approval workflow will appear here after execution"
"</div>"
)
with gr.Row():
with gr.Column():
gr.Markdown("### 📋 OSS Results")
oss_results_display = gr.JSON(label="", value={})
with gr.Column():
gr.Markdown("### 🎯 Enterprise Results")
enterprise_results_display = gr.JSON(label="", value={})
return (scenario_dropdown, scenario_description, metrics_display, impact_display,
timeline_output, oss_btn, enterprise_btn, approval_toggle, demo_btn,
approval_display, oss_results_display, enterprise_results_display)
def create_tab2_business_roi() -> Tuple:
"""Create Tab 2: Business Impact & ROI - FIXED VERSION"""
with gr.Column():
gr.Markdown("### 📊 Executive Dashboard")
dashboard_output = gr.Plot(label="", show_label=False)
gr.Markdown("### 🧮 ROI Calculator")
with gr.Row():
with gr.Column(scale=1):
# Scenario selector
roi_scenario_dropdown = gr.Dropdown(
choices=[],
value="",
label="Select scenario for ROI calculation:",
interactive=True
)
monthly_slider = gr.Slider(
1, 100, value=15, step=1,
label="Monthly similar incidents",
interactive=True
)
team_slider = gr.Slider(
1, 20, value=5, step=1,
label="Reliability team size",
interactive=True
)
calculate_btn = gr.Button(
"Calculate ROI",
variant="primary",
size="lg"
)
with gr.Column(scale=2):
roi_output = gr.JSON(
label="ROI Analysis Results",
value={}
)
roi_chart = gr.Plot(label="Cost Comparison", show_label=False)
return (dashboard_output, roi_scenario_dropdown, monthly_slider, team_slider,
calculate_btn, roi_output, roi_chart)
def create_tab3_enterprise_features() -> Tuple:
"""Create Tab 3: Enterprise Features"""
with gr.Row():
# Left Column
with gr.Column(scale=1):
gr.Markdown("### 🔐 License Management")
license_display = gr.JSON(
value={
"status": "Active",
"tier": "Enterprise",
"expires": "2024-12-31",
"features": ["autonomous_healing", "compliance", "audit_trail"]
},
label="Current License"
)
with gr.Row():
validate_btn = gr.Button("🔍 Validate", variant="secondary")
trial_btn = gr.Button("🆓 Start Trial", variant="primary")
upgrade_btn = gr.Button("🚀 Upgrade", variant="secondary")
gr.Markdown("### ⚡ MCP Execution Modes")
mcp_mode = gr.Radio(
choices=["advisory", "approval", "autonomous"],
value="advisory",
label="Execution Mode",
interactive=True,
info="advisory = OSS only, approval = human review, autonomous = AI-driven"
)
mcp_mode_info = gr.JSON(
value={
"current_mode": "advisory",
"description": "OSS Edition - Analysis only, no execution",
"features": ["Incident analysis", "RAG similarity", "HealingIntent creation"]
},
label="Mode Details"
)
# Right Column
with gr.Column(scale=1):
gr.Markdown("### 📋 Feature Comparison")
features_table = gr.Dataframe(
headers=["Feature", "OSS", "Enterprise"],
value=[
["Autonomous Healing", "❌", "✅"],
["Compliance Automation", "❌", "✅"],
["Predictive Analytics", "❌", "✅"],
["Multi-Cloud Support", "❌", "✅"],
["Audit Trail", "Basic", "Comprehensive"],
["Role-Based Access", "❌", "✅"],
],
label="",
interactive=False
)
gr.Markdown("### 🔗 Integrations")
integrations_table = gr.Dataframe(
headers=["Platform", "Status"],
value=[
["AWS", "✅ Connected"],
["Azure", "✅ Connected"],
["GCP", "✅ Connected"],
["Datadog", "✅ Connected"],
["PagerDuty", "✅ Connected"],
["ServiceNow", "✅ Connected"],
],
label="",
interactive=False
)
return (license_display, validate_btn, trial_btn, upgrade_btn,
mcp_mode, mcp_mode_info, features_table, integrations_table)
def create_tab4_audit_trail() -> Tuple:
"""Create Tab 4: Audit Trail & History"""
with gr.Row():
# Left Column
with gr.Column(scale=1):
gr.Markdown("### 📋 Execution History")
with gr.Row():
refresh_btn = gr.Button("🔄 Refresh", variant="secondary", size="sm")
clear_btn = gr.Button("🗑️ Clear", variant="stop", size="sm")
export_btn = gr.Button("📥 Export", variant="secondary", size="sm")
execution_table = gr.Dataframe(
headers=["Time", "Scenario", "Mode", "Status", "Savings", "Details"],
value=[],
label="",
interactive=False
)
# Right Column
with gr.Column(scale=1):
gr.Markdown("### 📊 Incident History")
incident_table = gr.Dataframe(
headers=["Time", "Component", "Scenario", "Severity", "Status"],
value=[],
label="",
interactive=False
)
gr.Markdown("### 📤 Export")
export_text = gr.Textbox(
label="Audit Trail (JSON)",
lines=6,
interactive=False
)
return (refresh_btn, clear_btn, export_btn, execution_table,
incident_table, export_text)
def create_tab5_learning_engine() -> Tuple:
"""Create Tab 5: Learning Engine"""
with gr.Row():
# Left Column
with gr.Column(scale=2):
gr.Markdown("### 🧠 Incident Memory Graph")
learning_graph = gr.Plot(label="", show_label=False)
with gr.Row():
graph_type = gr.Radio(
choices=["Force", "Hierarchical", "Circular"],
value="Force",
label="Layout",
interactive=True
)
show_labels = gr.Checkbox(label="Show Labels", value=True, interactive=True)
gr.Markdown("### 🔍 Similarity Search")
search_query = gr.Textbox(
label="Describe incident or paste metrics",
placeholder="e.g., 'Redis cache miss causing database overload'",
lines=2,
interactive=True
)
with gr.Row():
search_btn = gr.Button("🔍 Search", variant="primary")
clear_btn = gr.Button("Clear", variant="secondary")
search_results = gr.Dataframe(
headers=["Incident", "Similarity", "Resolution", "Actions"],
value=[],
label="",
interactive=False
)
# Right Column
with gr.Column(scale=1):
gr.Markdown("### 📊 Learning Stats")
stats_display = gr.JSON(
value={
"total_incidents": 0,
"patterns_detected": 0,
"similarity_searches": 0,
"confidence_threshold": 0.85
},
label="Statistics"
)
gr.Markdown("### 🎯 Pattern Detection")
patterns_display = gr.JSON(
value={},
label="Detected Patterns"
)
gr.Markdown("### 📈 Performance")
performance_display = gr.JSON(
value={
"avg_resolution_time": "0 min",
"success_rate": "0%",
"auto_heal_rate": "0%"
},
label="Performance Metrics"
)
return (learning_graph, graph_type, show_labels, search_query, search_btn,
clear_btn, search_results, stats_display, patterns_display, performance_display)
def create_footer() -> gr.Markdown:
"""Create the demo footer - SIMPLIFIED VERSION"""
return gr.Markdown("""
<div style="margin-top: 40px; padding: 30px; background: linear-gradient(135deg, #1a365d 0%, #2d3748 100%); border-radius: 20px; color: white;">
<div style="border-top: 1px solid #4a5568; padding-top: 20px; text-align: center; color: #a0aec0; font-size: 0.9rem;">
<p style="margin: 0;">© 2024 Agentic Reliability Framework. Demo v3.8.0 Enterprise Edition.</p>
<p style="margin: 10px 0 0 0; font-size: 0.8rem;">This demonstration showcases capabilities. Actual results may vary.</p>
</div>
</div>
""")