petter2025's picture
Update app.py
7f3d172 verified
raw
history blame
16.7 kB
"""
🚀 ARF Ultimate Investor Demo v3.6.0 - Main Application
Enhanced with best practices, Pythonic code, and investor-grade UX
"""
import logging
from typing import Dict, Any, List, Optional
import gradio as gr
# Import modules
from core.data_models import IncidentDatabase, IncidentScenario, DemoMode
from core.visualizations import EnhancedVisualizationEngine
from core.calculators import EnhancedROICalculator
from demo.orchestrator import DemoOrchestrator
from ui.components import (
create_metric_card,
create_business_impact_section,
create_approval_workflow,
create_roi_comparison_table
)
from ui.styles import CUSTOM_CSS, THEME
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# ===========================================
# APPLICATION STATE
# ===========================================
class ARFDemoState:
"""Maintain application state"""
def __init__(self):
self.scenario_db = IncidentDatabase()
self.viz_engine = EnhancedVisualizationEngine()
self.roi_calculator = EnhancedROICalculator()
self.demo_orchestrator = DemoOrchestrator(DemoMode.INVESTOR)
self.current_scenario = None
self.approval_required = True
def get_scenario(self, name: str) -> Optional[IncidentScenario]:
"""Get scenario by name"""
scenarios = self.scenario_db.get_scenarios()
return scenarios.get(name)
def get_scenario_names(self) -> List[str]:
"""Get all scenario names"""
scenarios = self.scenario_db.get_scenarios()
return list(scenarios.keys())
# ===========================================
# EVENT HANDLERS
# ===========================================
class EventHandlers:
"""Handle all application events"""
def __init__(self, state: ARFDemoState):
self.state = state
def handle_scenario_change(self, scenario_name: str, viz_type: str) -> tuple:
"""Handle scenario change"""
scenario = self.state.get_scenario(scenario_name)
if not scenario:
return {}, {}, self.state.viz_engine.create_interactive_timeline(None)
self.state.current_scenario = scenario
# Create visualization
if viz_type == "Interactive Timeline":
viz = self.state.viz_engine.create_interactive_timeline(scenario)
else:
viz = self.state.viz_engine.create_executive_dashboard()
return scenario.metrics, scenario.impact, viz
def handle_oss_analysis(self, scenario_name: str) -> Dict:
"""Handle OSS analysis"""
scenario = self.state.get_scenario(scenario_name)
if not scenario or not scenario.oss_analysis:
return {"status": "❌ No analysis available"}
return scenario.oss_analysis.to_dict()
def handle_enterprise_execution(self, scenario_name: str,
approval_required: bool) -> tuple:
"""Handle enterprise execution"""
self.state.approval_required = approval_required
scenario = self.state.get_scenario(scenario_name)
if not scenario or not scenario.enterprise_results:
# Default results
results = {
"actions_completed": ["✅ Auto-scaled resources", "✅ Optimized configuration"],
"metrics_improvement": {"Recovery": "Complete"},
"business_impact": {"Cost Saved": "$5,000"}
}
else:
results = scenario.enterprise_results.to_dict()
# Update approval in results
if approval_required:
results["status"] = "✅ Approved and Executed"
else:
results["status"] = "✅ Auto-Executed"
# Create approval workflow display
approval_display = create_approval_workflow(approval_required)
# Configuration
config = {"approval_required": approval_required, "compliance_mode": "strict"}
return approval_display, config, results
def handle_roi_calculation(self, monthly_incidents: int,
avg_impact: int, team_size: int) -> Dict:
"""Handle ROI calculation"""
try:
return self.state.roi_calculator.calculate_comprehensive_roi(
monthly_incidents, avg_impact, team_size
)
except Exception as e:
logger.error(f"ROI calculation error: {e}")
return {"error": "Calculation failed"}
def handle_next_demo_step(self) -> Dict:
"""Get next demo step guidance"""
return self.state.demo_orchestrator.get_next_guidance()
# ===========================================
# MAIN INTERFACE
# ===========================================
def create_main_interface():
"""Create the main Gradio interface"""
state = ARFDemoState()
handlers = EventHandlers(state)
with gr.Blocks(
title="🚀 ARF Investor Demo v3.6.0",
theme=THEME,
css=CUSTOM_CSS
) as demo:
# ============ HEADER ============
gr.Markdown("""
# 🚀 Agentic Reliability Framework - Investor Demo v3.6.0
## From Cost Center to Profit Engine: 5.2× ROI with Autonomous Reliability
<div style='color: #666; font-size: 16px; margin-top: 10px;'>
Experience the transformation: <b>OSS (Advisory)</b> ↔ <b>Enterprise (Autonomous)</b>
</div>
""")
# ============ PRESENTER GUIDANCE ============
gr.Markdown("### 🎯 Presenter Guidance")
next_step_btn = gr.Button("🎬 Next Demo Step", variant="secondary", size="sm")
guidance_display = gr.HTML(
value="<div class='presenter-guidance'>Click 'Next Demo Step' for guidance</div>"
)
# ============ MAIN TABS ============
with gr.Tabs():
# TAB 1: LIVE INCIDENT DEMO
with gr.TabItem("🔥 Live Incident Demo", id="live-demo"):
with gr.Row():
# Left Panel - Incident Details
with gr.Column(scale=1):
gr.Markdown("### 🎬 Incident Scenario")
scenario_dropdown = gr.Dropdown(
choices=state.get_scenario_names(),
value="Cache Miss Storm",
label="Select critical incident:",
interactive=True
)
gr.Markdown("### 📊 Current Crisis Metrics")
metrics_display = gr.JSON(
value=state.get_scenario("Cache Miss Storm").metrics
)
gr.Markdown("### 💰 Business Impact")
impact_display = gr.JSON(
value=state.get_scenario("Cache Miss Storm").impact
)
# Right Panel - Visualization & Actions
with gr.Column(scale=2):
# Visualization Selector
gr.Markdown("### 📈 Incident Visualization")
viz_radio = gr.Radio(
choices=["Interactive Timeline", "Executive Dashboard"],
value="Interactive Timeline",
label="Choose visualization:"
)
# Visualization Output
timeline_output = gr.Plot(
label="Visualization",
show_label=False
)
# Action Section
with gr.Row():
oss_btn = gr.Button("🆓 Run OSS Analysis", variant="secondary")
enterprise_btn = gr.Button("🚀 Execute Enterprise Healing", variant="primary")
# Approval Controls
with gr.Row():
approval_toggle = gr.Checkbox(
label="🔐 Require Manual Approval",
value=True,
info="Toggle to show approval workflow vs auto-execution"
)
demo_mode_btn = gr.Button("🎯 Auto-Demo Mode", variant="secondary", size="sm")
# Approval Workflow Display
approval_display = gr.HTML()
# Configuration
config_display = gr.JSON(
label="⚙️ Enterprise Configuration",
value={"approval_required": True, "compliance_mode": "strict"}
)
# Results
results_display = gr.JSON(
label="🎯 Execution Results",
value={"status": "Ready for execution..."}
)
# TAB 2: BUSINESS IMPACT & ROI
with gr.TabItem("💰 Business Impact & ROI", id="business-roi"):
with gr.Column():
# Business Dashboard
gr.Markdown("### 📊 Executive Business Dashboard")
dashboard_output = gr.Plot()
# ROI Calculator
gr.Markdown("### 🧮 Interactive ROI Calculator")
with gr.Row():
with gr.Column(scale=1):
monthly_slider = gr.Slider(
1, 100, value=15, step=1,
label="Monthly incidents",
info="Typical range: 10-50 incidents/month"
)
impact_slider = gr.Slider(
1000, 50000, value=8500, step=500,
label="Average incident impact ($)",
info="Includes revenue loss, engineer time, customer impact"
)
team_slider = gr.Slider(
1, 20, value=5, step=1,
label="Reliability team size",
info="SREs, DevOps engineers managing incidents"
)
calculate_btn = gr.Button("Calculate My ROI", variant="primary")
with gr.Column(scale=2):
roi_output = gr.JSON(
label="Your ROI Analysis",
value={"status": "Adjust sliders and click Calculate"}
)
# Capability Comparison
comparison_table = create_roi_comparison_table()
# ============ FOOTER ============
gr.Markdown("---")
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("""
**📞 Contact & Resources**
<div style='margin-top: 10px;'>
📧 <b>Email:</b> enterprise@arf.dev<br>
🌐 <b>Website:</b> <a href='https://arf.dev' target='_blank'>https://arf.dev</a><br>
📚 <b>Documentation:</b> <a href='https://docs.arf.dev' target='_blank'>https://docs.arf.dev</a><br>
💻 <b>GitHub:</b> <a href='https://github.com/petterjuan/agentic-reliability-framework' target='_blank'>petterjuan/agentic-reliability-framework</a>
</div>
""")
with gr.Column(scale=1):
gr.Markdown("""
**🎯 Schedule a Demo**
<div style='margin-top: 10px;'>
<a href='https://arf.dev/demo' target='_blank' style='
display: inline-block;
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 10px 20px;
border-radius: 6px;
text-decoration: none;
font-weight: bold;
'>Schedule 30-min Demo →</a>
</div>
""")
# ============ EVENT HANDLERS ============
# Scenario changes
scenario_dropdown.change(
handlers.handle_scenario_change,
inputs=[scenario_dropdown, viz_radio],
outputs=[metrics_display, impact_display, timeline_output]
)
viz_radio.change(
handlers.handle_scenario_change,
inputs=[scenario_dropdown, viz_radio],
outputs=[metrics_display, impact_display, timeline_output]
)
# OSS Analysis
oss_btn.click(
handlers.handle_oss_analysis,
inputs=[scenario_dropdown],
outputs=[results_display]
)
# Enterprise Execution
enterprise_btn.click(
handlers.handle_enterprise_execution,
inputs=[scenario_dropdown, approval_toggle],
outputs=[approval_display, config_display, results_display]
)
# Approval toggle updates config
approval_toggle.change(
lambda approval: {"approval_required": approval, "compliance_mode": "strict"},
inputs=[approval_toggle],
outputs=[config_display]
)
# ROI Calculation
calculate_btn.click(
handlers.handle_roi_calculation,
inputs=[monthly_slider, impact_slider, team_slider],
outputs=[roi_output]
)
# Next demo step guidance
next_step_btn.click(
handlers.handle_next_demo_step,
outputs=[guidance_display]
)
# Demo mode button
demo_mode_btn.click(
lambda: (
{"approval_required": False, "compliance_mode": "strict"},
create_approval_workflow(False)
),
outputs=[config_display, approval_display]
)
# ============ INITIAL LOAD ============
def load_initial_state():
"""Load initial visualizations and data"""
# Get initial scenario
scenario = state.get_scenario("Cache Miss Storm")
# Create visualizations
timeline_viz = state.viz_engine.create_interactive_timeline(scenario)
dashboard_viz = state.viz_engine.create_executive_dashboard()
# Get initial guidance
guidance = state.demo_orchestrator.get_next_guidance()
return (
scenario.metrics if scenario else {},
scenario.impact if scenario else {},
timeline_viz,
dashboard_viz,
guidance["html"]
)
demo.load(
load_initial_state,
outputs=[
metrics_display,
impact_display,
timeline_output,
dashboard_output,
guidance_display
]
)
# ============ INSTRUCTIONS ============
gr.Markdown("""
<div class='footer'>
🚀 <b>ARF Ultimate Investor Demo v3.6.0</b> | Enhanced with Professional Analytics & Best Practices
<i>Built with ❤️ using Python, Gradio & Plotly | All visualizations guaranteed working</i>
</div>
""")
return demo
# ===========================================
# APPLICATION ENTRY POINT
# ===========================================
def main():
"""Main entry point"""
logger.info("🚀 Launching ARF Investor Demo v3.6.0")
logger.info("✅ Best practices applied")
logger.info("✅ Pythonic code structure")
logger.info("✅ Investor-grade UX")
logger.info("✅ Enhanced visualizations")
demo = create_main_interface()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
debug=False,
show_error=True
)
if __name__ == "__main__":
main()