import streamlit as st import json import zipfile import io import time import requests from agents import TopicAgent, ContentAgent, SlideAgent, CodeAgent, DesignAgent, VoiceoverAgent # Initialize agents topic_agent = TopicAgent() content_agent = ContentAgent() slide_agent = SlideAgent() code_agent = CodeAgent() design_agent = DesignAgent() voiceover_agent = VoiceoverAgent() # ===================== # STREAMLIT APPLICATION # ===================== st.set_page_config( page_title="Workshop in a Box Pro", layout="wide", page_icon="🎓" ) # Custom CSS for permanent visibility st.markdown(""" """, unsafe_allow_html=True) # Header col1, col2 = st.columns([1, 4]) with col1: st.image("https://cdn-icons-png.flaticon.com/512/1995/1995485.png", width=80) with col2: st.title("🤖 Workshop in a Box Pro") st.markdown("Generate Boardroom-Quality Corporate Training PREMIUM", unsafe_allow_html=True) st.caption("Create $10K+ Value Workshops in Minutes") # Initialize session state if 'workshop_topic' not in st.session_state: st.session_state.workshop_topic = "AI-Driven Business Transformation" if 'generated' not in st.session_state: st.session_state.generated = False if 'generating' not in st.session_state: st.session_state.generating = False if 'voiceovers' not in st.session_state: st.session_state.voiceovers = {} if 'selected_voice' not in st.session_state: st.session_state.selected_voice = "21m00Tcm4TlvDq8ikWAM" if 'duration' not in st.session_state: st.session_state.duration = 4.0 if 'difficulty' not in st.session_state: st.session_state.difficulty = "C-Suite" if 'include_code' not in st.session_state: st.session_state.include_code = True if 'include_design' not in st.session_state: st.session_state.include_design = True if 'include_voiceover' not in st.session_state: st.session_state.include_voiceover = True if 'premium_mode' not in st.session_state: st.session_state.premium_mode = True # Sidebar configuration with st.sidebar: st.header("⚙️ Executive Workshop Configuration") st.session_state.workshop_topic = st.text_input( "Workshop Focus", st.session_state.workshop_topic, help="Strategic business topic (e.g., 'AI for Financial Services Transformation')" ) topic_empty = st.session_state.workshop_topic.strip() == "" if topic_empty: st.warning("Please enter a strategic workshop focus to enable configuration") st.session_state.duration = st.slider( "Duration (hours)", 2.0, 8.0, st.session_state.duration, 0.5, help="Full-day or half-day workshop", disabled=topic_empty ) st.session_state.difficulty = st.selectbox( "Audience Level", ["C-Suite", "Executives", "Directors", "Managers"], index=["C-Suite", "Executives", "Directors", "Managers"].index(st.session_state.difficulty), disabled=topic_empty ) st.session_state.include_code = st.checkbox( "Include Technical Implementation", st.session_state.include_code, disabled=topic_empty ) st.session_state.include_design = st.checkbox( "Generate Premium Visuals", st.session_state.include_design, disabled=topic_empty ) st.session_state.include_voiceover = st.checkbox( "Generate Voiceovers", st.session_state.include_voiceover, disabled=topic_empty ) if st.session_state.include_voiceover and not topic_empty: st.subheader("🎙️ Voice Selection") voices = voiceover_agent.get_voices() if voices: selected_voice = st.selectbox( "Choose a voice:", options=[v['voice_id'] for v in voices], format_func=lambda id: next((v['name'] for v in voices if v['voice_id'] == id), "Default"), key="voice_select" ) st.session_state.selected_voice = selected_voice elif voiceover_agent.api_key: st.warning("Couldn't load voices. Using default voice.") else: st.warning("ElevenLabs API key not set. Voiceovers disabled.") st.divider() st.markdown("**Quality Assurance**") st.session_state.premium_mode = st.checkbox( "Enable Premium Mode", st.session_state.premium_mode, help="Generate boardroom-quality content with real-world case studies", disabled=topic_empty ) generate_disabled = topic_empty or st.session_state.generating if st.button( "✨ Generate Premium Workshop", type="primary", use_container_width=True, disabled=generate_disabled ): st.session_state.generating = True st.session_state.voiceovers = {} # Generation pipeline if st.session_state.generating and not topic_empty: with st.spinner(f"🚀 Creating your executive workshop on '{st.session_state.workshop_topic}'..."): start_time = time.time() outline = topic_agent.generate_outline( st.session_state.workshop_topic, st.session_state.duration, st.session_state.difficulty ) content = content_agent.generate_content(outline) slides = slide_agent.generate_slides(content) code_labs = code_agent.generate_code(content) if st.session_state.include_code else None design_url = design_agent.generate_design(slides) if st.session_state.include_design else None voiceovers = {} if st.session_state.include_voiceover and voiceover_agent.api_key: for i, module in enumerate(content.get("modules", [])): intro_text = f"Module {i+1}: {module['title']}. " + \ f"Key concepts: {', '.join(module.get('learning_points', [''])[:3])}" audio_data = voiceover_agent.generate_voiceover( intro_text, st.session_state.selected_voice ) if audio_data: voiceovers[f"module_{i+1}_intro.mp3"] = audio_data zip_buffer = io.BytesIO() with zipfile.ZipFile(zip_buffer, "a", zipfile.ZIP_DEFLATED) as zip_file: zip_file.writestr("executive_summary.json", json.dumps(outline, indent=2)) zip_file.writestr("workshop_content.json", json.dumps(content, indent=2)) zip_file.writestr("boardroom_slides.md", slides) if code_labs: zip_file.writestr("enterprise_solutions.ipynb", code_labs) if design_url: try: img_data = requests.get(design_url).content zip_file.writestr("slide_design.png", img_data) except Exception as e: st.error(f"Design download error: {str(e)}") for filename, audio_data in voiceovers.items(): zip_file.writestr(f"voiceovers/{filename}", audio_data) st.session_state.outline = outline st.session_state.content = content st.session_state.slides = slides st.session_state.code_labs = code_labs st.session_state.design_url = design_url st.session_state.voiceovers = voiceovers st.session_state.zip_buffer = zip_buffer st.session_state.gen_time = round(time.time() - start_time, 2) st.session_state.generated = True st.session_state.generating = False # Results display - PERMANENTLY VISIBLE SECTION if st.session_state.generated and not topic_empty: st.success(f"✅ Executive workshop generated in {st.session_state.gen_time} seconds!") st.download_button( label="📥 Download Executive Package", data=st.session_state.zip_buffer.getvalue(), file_name=f"{st.session_state.workshop_topic.replace(' ', '_')}_workshop.zip", mime="application/zip", use_container_width=True ) # Executive summary - ALWAYS VISIBLE st.markdown("

📊 Executive Overview

", unsafe_allow_html=True) st.markdown(f"
", unsafe_allow_html=True) st.subheader(st.session_state.outline.get("title", "Strategic Workshop")) st.caption(f"Duration: {st.session_state.outline.get('duration', '4 hours')} | Level: {st.session_state.outline.get('difficulty', 'Executive')}") st.markdown("**Business Value Proposition**") if "learning_goals" in st.session_state.outline: for goal in st.session_state.outline["learning_goals"]: st.markdown(f"- {goal}") st.markdown("**Key Deliverables**") st.markdown("- Boardroom-ready presentation\n" "- Implementation toolkit\n" "- ROI calculation framework\n" "- Enterprise integration guide") st.markdown("
", unsafe_allow_html=True) # Workshop content - ALWAYS VISIBLE st.markdown("

📝 Strategic Content Framework

", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) if "modules" in st.session_state.content: for module in st.session_state.content["modules"]: st.subheader(module.get("title", "Business Module")) st.markdown(module.get("script", "")) st.markdown("**Executive Discussion Points**") if "discussion_questions" in module: for q in module["discussion_questions"]: st.markdown(f"- **{q.get('question', '')}**") st.caption(q.get("response", "")) st.divider() st.markdown("
", unsafe_allow_html=True) # Slide preview - ALWAYS VISIBLE st.markdown("

🖥️ Boardroom Presentation Preview

", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) st.markdown(st.session_state.slides[:2000]) st.markdown("
", unsafe_allow_html=True) # Technical implementation - ALWAYS VISIBLE if st.session_state.code_labs: st.markdown("

💻 Enterprise Implementation Toolkit

", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) st.code(st.session_state.code_labs) st.markdown("
", unsafe_allow_html=True) # Design preview - ALWAYS VISIBLE if st.session_state.design_url: st.markdown("

🎨 Premium Visual Design

", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) try: st.image(st.session_state.design_url, caption="Corporate Slide Design") except: st.warning("Design preview unavailable") st.markdown("
", unsafe_allow_html=True) # Voiceover player - ALWAYS VISIBLE if st.session_state.voiceovers: st.markdown("

🔊 Voiceover Previews

", unsafe_allow_html=True) st.markdown("
", unsafe_allow_html=True) for i, (filename, audio_bytes) in enumerate(st.session_state.voiceovers.items()): module_num = filename.split("_")[1] st.subheader(f"Module {module_num} Introduction") st.audio(audio_bytes, format="audio/mp3") st.markdown("
", unsafe_allow_html=True) # Pricing section - ALWAYS VISIBLE st.markdown("

🚀 Premium Corporate Offering

", unsafe_allow_html=True) st.markdown(f""" ### {st.session_state.workshop_topic} Executive Program

Live Workshop

$15,000

Full-day session with Q&A

On-Demand Course

$7,500

Enterprise-wide access

Implementation Package

$12,500

Technical integration support

**Premium Features:** - Customized to your industry vertical - ROI guarantee - 12-month support agreement - Executive briefing package """, unsafe_allow_html=True) # Testimonials - ALWAYS VISIBLE st.markdown("

💼 Executive Testimonials

", unsafe_allow_html=True) st.markdown("""

"This platform helped us create a $50K training program in one afternoon. The ROI was immediate."

— Sarah Johnson, CLO at FinTech Global

"The boardroom-quality materials impressed our clients and justified our premium pricing."

— Michael Chen, Partner at McKinsey & Company

""", unsafe_allow_html=True) # CTA - ALWAYS VISIBLE st.markdown("

Get Started

", unsafe_allow_html=True) col1, col2 = st.columns(2) with col1: st.link_button("📅 Book Strategy Session", "https://calendly.com/your-link", use_container_width=True) with col2: st.link_button("💼 Enterprise Solutions", "https://your-company.com/enterprise", use_container_width=True) # Footer - ALWAYS VISIBLE st.markdown("""
Workshop in a Box Pro® | Enterprise-Grade AI Training Solutions | © 2025
""", unsafe_allow_html=True) # Debug info - ALWAYS VISIBLE with st.sidebar: st.divider() if hasattr(topic_agent, 'openai_client') and topic_agent.openai_client: st.success("OpenAI API Connected") else: st.warning("OpenAI API not set - using enhanced mock data") if voiceover_agent.api_key: st.success("ElevenLabs API Key Found") elif st.session_state.include_voiceover: st.warning("ElevenLabs API key not set") st.info(f""" **Current Workshop:** {st.session_state.workshop_topic} **Premium Features:** - AI-generated voiceovers - Professional slide designs - Real-world case studies - Practical code labs """)