import streamlit as st from dotenv import load_dotenv import os from agents import create_research_crew from utils import process_crew_output, display_report from report_generator import generate_direct_report, create_pdf_report # Add this import load_dotenv() st.set_page_config( page_title="Market Research Generator", page_icon="📊", layout="wide" ) def init_session_state(): if 'report' not in st.session_state: st.session_state.report = None if 'generating' not in st.session_state: st.session_state.generating = False if 'logs' not in st.session_state: st.session_state.logs = [] if 'direct_report' not in st.session_state: st.session_state.direct_report = None def get_api_keys(): try: openai_key = st.secrets["OPENAI_API_KEY"] serper_key = st.secrets["SERPER_API_KEY"] return openai_key, serper_key except Exception as e: st.error(f"Error loading API keys: {str(e)}") return None, None def main(): init_session_state() st.title("🤖 AI Market Research Generator") openai_key, serper_key = get_api_keys() if not openai_key or not serper_key: st.error("API keys not found in secrets.") return os.environ["OPENAI_API_KEY"] = openai_key os.environ["SERPER_API_KEY"] = serper_key tab1, tab2, tab3, tab4 = st.tabs([ "Generate Report", "View Report", "Direct Research", "Agent Interaction" ]) with tab1: st.subheader("Research Requirements") col1, col2 = st.columns([2, 1]) with col1: topic = st.text_input( "Research Topic", placeholder="e.g., Electric Vehicles Market" ) questions = st.text_area( "Key Research Questions (one per line)", placeholder="1. What is the market size?\n2. Who are the key competitors?\n3. What are the main trends?", height=150 ) if st.button("Generate Report", type="primary", disabled=st.session_state.generating): if not topic or not questions: st.error("Please enter both topic and questions") return st.session_state.generating = True st.session_state.logs = [] try: progress = st.progress(0) status = st.empty() # Initialize research status.text("🚀 Initializing research...") st.session_state.logs.append("🚀 Starting market research...") crew = create_research_crew(topic, questions.split('\n')) progress.progress(25) # Research phase status.text("🔍 Gathering market data...") st.session_state.logs.append("👨‍🔬 Researcher collecting data...") results = crew.kickoff() progress.progress(50) # Analysis and report generation status.text("📊 Processing insights...") st.session_state.logs.append("📊 Analyzing market data...") enhanced_report = process_crew_output(results, topic) progress.progress(75) # Create PDF status.text("📄 Generating PDF report...") pdf_content = create_pdf_report(enhanced_report['content'], topic) enhanced_report['pdf_content'] = pdf_content progress.progress(100) # Completion status.text("✅ Report ready!") st.session_state.logs.append("✅ Report generation complete!") st.session_state.report = enhanced_report st.success("Report generated successfully! View in Report tab") except Exception as e: st.error(f"Error: {str(e)}") st.session_state.logs.append(f"❌ Error: {str(e)}") finally: st.session_state.generating = False with col2: st.subheader("Progress") for log in st.session_state.logs[-5:]: st.markdown(log) with tab2: if st.session_state.report: st.warning("⚠️ AI-generated report. Please verify critical information.") display_report(st.session_state.report) # Download buttons with styling st.markdown('
', unsafe_allow_html=True) col1, col2 = st.columns(2) with col1: st.download_button( "📥 Download Markdown Report", st.session_state.report['raw'], "market_research_report.md", "text/markdown" ) with col2: st.download_button( "📥 Download PDF Report", st.session_state.report['pdf_content'], f"market_research_{topic.lower().replace(' ', '_')}.pdf", "application/pdf" ) st.markdown('
', unsafe_allow_html=True) else: st.info("Generate a report to view results") with tab3: st.subheader("Direct Research Report") if topic: try: with st.spinner("Generating direct research report..."): # Automatically generate direct report when topic is available if 'direct_report' not in st.session_state or st.session_state.direct_report is None: direct_report = generate_direct_report(topic, questions) st.session_state.direct_report = direct_report # Display the report st.markdown("## 📊 Market Research Report") st.markdown(st.session_state.direct_report['final_report']) # Create and offer PDF download pdf_content = create_pdf_report(st.session_state.direct_report['final_report'], topic) st.download_button( "📥 Download PDF Report", pdf_content, f"direct_research_{topic.lower().replace(' ', '_')}.pdf", "application/pdf" ) except Exception as e: st.error(f"Error generating direct report: {str(e)}") else: st.info("Enter a topic in the 'Generate Report' tab to view direct research") with tab4: if st.session_state.report and 'agent_outputs' in st.session_state.report: st.subheader("🤖 Behind the Scenes: Agent Interactions") st.markdown(""" ### Research & Analysis Process Watch how our AI agents work together to create your market research report: """) # Timeline visualization for idx, (agent, data) in enumerate(st.session_state.report['agent_outputs'].items()): with st.container(): col1, col2 = st.columns([1, 3]) with col1: st.markdown(f"**Step {idx+1}**") st.markdown(f"**{agent.title()}**") st.markdown(f"*{data['timestamp']}*") with col2: st.markdown(f"**Task:** {data['analysis_type']}") with st.expander("View Detailed Analysis"): st.markdown("#### Key Findings") st.markdown(data['raw_output']) if 'processed_data' in data: st.markdown("#### Processed Data") st.json(data['processed_data']) # Add connector line except for last item if idx < len(st.session_state.report['agent_outputs']) - 1: st.markdown("↓") else: st.info("Generate a report to view agent interactions") with tab5: if st.session_state.report: st.subheader("📽️ Presentation View") # Initialize slide index in session state if not present if 'current_slide' not in st.session_state: st.session_state.current_slide = 0 # Create slides from report data slides = create_presentation_slides(st.session_state.report) # Navigation buttons callbacks def next_slide(): if st.session_state.current_slide < len(slides) - 1: st.session_state.current_slide += 1 def prev_slide(): if st.session_state.current_slide > 0: st.session_state.current_slide -= 1 # Display current slide with st.container(): st.markdown("---") display_presentation_slide( slides[st.session_state.current_slide], st.session_state.current_slide, len(slides) ) st.markdown("---") # Add download presentation button if st.button("📥 Download Presentation"): presentation_pdf = create_presentation_pdf(slides) st.download_button( "Download PDF", presentation_pdf, f"market_research_presentation_{topic.lower().replace(' ', '_')}.pdf", "application/pdf" ) else: st.info("Generate a report first to view the presentation") if __name__ == "__main__": main()