import os import json import pandas as pd import numpy as np from datetime import datetime, timedelta from typing import List, Dict, Any, Optional import warnings warnings.filterwarnings('ignore') # Core imports import gradio as gr import chromadb from sentence_transformers import SentenceTransformer from langchain.text_splitter import RecursiveCharacterTextSplitter import joblib from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import plotly.graph_objects as go import plotly.express as px from plotly.subplots import make_subplots import re import uuid from dataclasses import dataclass from pathlib import Path # Set up paths for different deployment environments CHROMA_DB_PATH = os.getenv("CHROMA_DB_PATH", "./chroma_db") PERSIST_DIR = os.getenv("PERSIST_DIR", CHROMA_DB_PATH) Path(PERSIST_DIR).mkdir(parents=True, exist_ok=True) print(f"πŸ—„οΈ ChromaDB will be stored at: {PERSIST_DIR}") # Data Models @dataclass class StartupIdea: """Data model for startup ideas""" name: str description: str industry: str target_market: str problem_statement: str solution: str unique_value_proposition: str @dataclass class BusinessPlan: """Comprehensive business plan structure""" executive_summary: str company_description: str market_analysis: str organization_management: str service_product_line: str marketing_sales: str funding_request: str financial_projections: Dict[str, Any] @dataclass class Flashcard: """Learning flashcard structure""" id: str front: str back: str category: str difficulty: str tags: List[str] @dataclass class RoadmapMilestone: """Roadmap milestone structure""" id: str title: str description: str timeline: str dependencies: List[str] priority: str category: str # RAG System Implementation class RAGSystem: """Retrieval-Augmented Generation system using ChromaDB""" def __init__(self, model_name: str = "all-MiniLM-L6-v2"): print("🧠 Initializing RAG System...") try: self.embedding_model = SentenceTransformer(model_name) self.chroma_client = chromadb.PersistentClient(path=PERSIST_DIR) self.collection_name = "startup_knowledge" self.collection = None self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len ) print("βœ… RAG System initialized successfully") except Exception as e: print(f"❌ Error initializing RAG System: {e}") raise def initialize_collection(self): """Initialize or get existing collection""" try: collections = self.chroma_client.list_collections() existing_collection = next((c for c in collections if c.name == self.collection_name), None) if existing_collection: self.collection = self.chroma_client.get_collection(self.collection_name) print(f"πŸ“š Found existing collection with {self.collection.count()} documents") else: self.collection = self.chroma_client.create_collection( name=self.collection_name, metadata={"description": "Startup knowledge base"} ) print("πŸ“š Created new collection") return self.collection except Exception as e: print(f"❌ Error initializing collection: {e}") try: self.collection = self.chroma_client.create_collection( name=f"{self.collection_name}_{uuid.uuid4().hex[:8]}", metadata={"description": "Startup knowledge base"} ) print("πŸ“š Created fallback collection") return self.collection except Exception as e2: print(f"❌ Fatal error creating collection: {e2}") raise def add_documents(self, documents: List[str], metadatas: List[Dict] = None): """Add documents to the knowledge base""" if not self.collection: self.initialize_collection() try: all_chunks = [] all_metadatas = [] for i, doc in enumerate(documents): chunks = self.text_splitter.split_text(doc) all_chunks.extend(chunks) doc_metadata = metadatas[i] if metadatas and i < len(metadatas) else {} for chunk in chunks: all_metadatas.append({ **doc_metadata, "chunk_id": str(uuid.uuid4()), "timestamp": datetime.now().isoformat() }) print(f"πŸ”„ Generating embeddings for {len(all_chunks)} chunks...") embeddings = self.embedding_model.encode(all_chunks).tolist() ids = [str(uuid.uuid4()) for _ in all_chunks] self.collection.add( documents=all_chunks, embeddings=embeddings, metadatas=all_metadatas, ids=ids ) print(f"βœ… Added {len(all_chunks)} chunks to knowledge base") return len(all_chunks) except Exception as e: print(f"❌ Error adding documents: {e}") return 0 def retrieve_context(self, query: str, n_results: int = 5) -> List[Dict]: """Retrieve relevant context for a query""" if not self.collection: self.initialize_collection() try: query_embedding = self.embedding_model.encode([query]).tolist()[0] results = self.collection.query( query_embeddings=[query_embedding], n_results=min(n_results, max(1, self.collection.count())) ) contexts = [] if results['documents'][0]: for i, doc in enumerate(results['documents'][0]): contexts.append({ "content": doc, "metadata": results['metadatas'][0][i] if results['metadatas'][0] else {}, "distance": results['distances'][0][i] if results['distances'] and results['distances'][0] else 0 }) return contexts except Exception as e: print(f"❌ Error retrieving context: {e}") return [] def generate_response(self, query: str, context: List[Dict]) -> str: """Generate response using retrieved context""" try: context_text = "\n".join([ctx["content"] for ctx in context]) return self._generate_structured_response(query, context_text) except Exception as e: print(f"❌ Error generating response: {e}") return "I apologize, but I encountered an error generating a response. Please try again." def _generate_structured_response(self, query: str, context: str) -> str: """Generate structured response based on query type""" query_lower = query.lower() if "market research" in query_lower or "competition" in query_lower: return f"""**Market Analysis Framework:** Based on startup best practices: {context[:500]}... **Key Recommendations:** - Conduct thorough competitive analysis using TAM/SAM/SOM framework - Identify unique value propositions that differentiate your solution - Analyze market size and growth potential with real data """ elif "business plan" in query_lower: return f"""**Business Plan Development:** Essential components: {context[:500]}... **Core Sections:** - Executive Summary - Market Analysis - Financial Projections """ else: return f"""**Strategic Guidance:** {context[:400]}... **Key Considerations:** - Validate assumptions with market data - Focus on solving genuine problems - Build strong unit economics """ # Startup Knowledge Base STARTUP_KNOWLEDGE_BASE = [ """ IDEA VALIDATION AND MARKET RESEARCH Before building any product, entrepreneurs must prove market demand exists. This involves: 1. Problem Identification: Identify genuine problems that specific customer segments face daily. 2. Market Analysis: Determine total addressable market (TAM) size. Use TAM/SAM/SOM framework: - TAM (Total Addressable Market): Total market demand - SAM (Serviceable Addressable Market): Portion targeted by your products - SOM (Serviceable Obtainable Market): Portion you can realistically capture 3. Competitive Research: Analyze competitors' offerings, pricing, strengths, weaknesses. 4. Customer Validation: Conduct 50+ interviews to validate core assumptions. Key metrics: CAC, LTV, market penetration rate, NPS. """, """ BUSINESS PLAN DEVELOPMENT A comprehensive business plan serves as roadmap and investor communication tool: 1. Executive Summary: Mission, product, market, competitive advantages, funding needs. 2. Company Description: Business model, legal structure, value proposition. 3. Market Analysis: Industry overview, target market, competitive landscape. 4. Organization & Management: Team, advisors, hiring plans. 5. Financial Projections: 3-5 year forecasts, cash flow, break-even analysis. 6. Funding Requirements: Capital needs, use of funds, expected ROI. """, """ FUNDING AND FINANCIAL MANAGEMENT Securing and managing finances strategically: 1. Funding Sources: - Bootstrapping: Personal savings - Angels: $25K-$100K early stage - VC: $1M+ for high-growth potential - Crowdfunding: Product launches - Grants: SBIR/STTR programs 2. Key Metrics: - Burn Rate: Monthly cash expenditure - Runway: Months of cash remaining - CAC: Total marketing cost Γ· new customers - LTV: Average revenue Γ— margin Γ— lifespan - LTV/CAC should be 3:1 or higher 3. Best Practices: - Separate business and personal finances - Maintain 6-12 months cash reserves - Track MRR, ARR, gross margins """, """ LEGAL STRUCTURE AND COMPLIANCE Choosing the right legal foundation: 1. Business Structures: - Sole Proprietorship: Simple, personal liability - LLC: Asset protection, flexible taxes - C-Corp: Best for VC funding, stock issuance - Delaware C-Corp advantages for startups 2. Essential Documents: - Articles of Incorporation - Founders' Agreement with vesting - Employee NDAs and IP assignments - Terms of service, privacy policy 3. IP Protection: - Trademarks: Brand names, logos - Patents: Unique inventions - Copyrights: Creative works - Trade Secrets: Proprietary processes 4. Compliance: - Federal EIN - Business licenses - Industry permits - Data privacy (GDPR, CCPA) """, """ TEAM BUILDING AND OPERATIONS Building the right team: 1. Founding Team: - Complementary skills: technical, business, domain - Aligned vision and values - Equity split reflects contribution 2. Hiring Strategy: - Hire for adaptability and culture fit - Focus on critical roles first - 4-year vesting with 1-year cliff - 0.1%-10% equity based on role 3. Key Metrics by Function: - Product: DAU/MAU, retention, feature adoption - Sales: Conversion rates, cycle length, ACV - Marketing: CPL, MQLs, brand awareness - Finance: Revenue growth, margins, working capital 4. Operational Excellence: - Build MVP with core features - Define and track KPIs - Create scalable processes - Implement feedback loops """, """ BRAND DEVELOPMENT AND MARKETING Strong branding drives growth: 1. Brand Identity: - Define values, personality, voice - Create unique selling proposition - Develop consistent visual identity - Establish market positioning 2. Digital Presence: - Professional website with clear CTA - SEO optimization - Social media strategy - Content marketing calendar 3. Acquisition Channels: - Content Marketing: Thought leadership - Social Media: Platform-specific strategies - SEM: Targeted Google Ads - Email: Drip campaigns, newsletters - Partnerships: Co-marketing, affiliates 4. Key Metrics: - Website traffic and conversion rates - CAC by channel - LTV by acquisition source - NPS and customer satisfaction - Brand awareness and consideration 5. Customer Success: - Feedback loops and surveys - Customer success programs - Community building - Referral programs """ ] KNOWLEDGE_METADATA = [ {"category": "validation", "topic": "market_research", "importance": "high"}, {"category": "planning", "topic": "business_plan", "importance": "high"}, {"category": "finance", "topic": "funding", "importance": "high"}, {"category": "legal", "topic": "structure", "importance": "medium"}, {"category": "operations", "topic": "team_building", "importance": "high"}, {"category": "marketing", "topic": "branding", "importance": "medium"}, ] # Business Plan Generator class StartupBlueprintGenerator: """Main class for generating comprehensive startup blueprints""" def __init__(self, rag_system: RAGSystem): self.rag = rag_system self.templates = self._load_templates() self.model_data = {} def _load_templates(self) -> Dict[str, str]: """Load template structures""" return { "executive_summary": """## Executive Summary **Company:** {company_name} **Industry:** {industry} **Mission:** {mission} ### Problem Statement {problem_statement} ### Solution {solution} ### Market Opportunity {market_opportunity} ### Financial Highlights - Projected Revenue Year 3: {projected_revenue} - Funding Requirement: {funding_needed} - Break-even Timeline: {breakeven_timeline} """, } def generate_business_plan(self, startup_idea: StartupIdea) -> BusinessPlan: """Generate comprehensive business plan""" try: print(f"πŸ“Š Generating business plan for {startup_idea.name}...") exec_context = self.rag.retrieve_context( f"executive summary for {startup_idea.industry} startup", n_results=3 ) executive_summary = self.templates["executive_summary"].format( company_name=startup_idea.name, industry=startup_idea.industry, mission=f"To solve {startup_idea.problem_statement} for {startup_idea.target_market}", problem_statement=startup_idea.problem_statement, solution=startup_idea.solution, market_opportunity=f"Significant opportunity in the {startup_idea.industry} market", projected_revenue="$1M - $5M", funding_needed="$250K - $1M", breakeven_timeline="18-24 months" ) business_plan = BusinessPlan( executive_summary=executive_summary, company_description=f"{startup_idea.name} - {startup_idea.description}", market_analysis=f"The {startup_idea.industry} market presents significant opportunities.", organization_management="Founding team with complementary skills.", service_product_line=startup_idea.solution, marketing_sales="Multi-channel customer acquisition strategy.", funding_request="Seeking seed funding for product development and market expansion.", financial_projections={ "revenue_forecast": {"year_1": 100000, "year_2": 500000, "year_3": 1500000}, "key_metrics": {"cac": 50, "ltv": 500} } ) print("βœ… Business plan generated") return business_plan except Exception as e: print(f"❌ Error: {e}") return self._generate_fallback_plan(startup_idea) def _generate_fallback_plan(self, idea: StartupIdea) -> BusinessPlan: """Fallback business plan""" return BusinessPlan( executive_summary=f"**{idea.name}** addresses {idea.problem_statement}.", company_description=f"{idea.name} serves {idea.target_market}.", market_analysis=f"The {idea.industry} market has growth opportunities.", organization_management="Experienced founding team.", service_product_line=idea.solution, marketing_sales="Digital marketing focused strategy.", funding_request="Seeking seed funding.", financial_projections={"revenue_forecast": {"year_1": 100000}} ) # Flashcards Generator class FlashcardsGenerator: """Generate learning flashcards""" def __init__(self, rag_system: RAGSystem): self.rag = rag_system self.flashcards_db = [] def generate_flashcards(self, topic: str, count: int = 10) -> List[Flashcard]: """Generate flashcards for topic""" try: print(f"πŸ“š Generating {count} flashcards for {topic}...") qa_patterns = self._get_qa_patterns(topic) flashcards = [] for pattern in qa_patterns[:count]: flashcard = Flashcard( id=str(uuid.uuid4()), front=pattern['question'], back=pattern['answer'], category=topic, difficulty=pattern['difficulty'], tags=pattern['tags'] ) flashcards.append(flashcard) self.flashcards_db.extend(flashcards) print(f"βœ… Generated {len(flashcards)} flashcards") return flashcards except Exception as e: print(f"❌ Error: {e}") return [] def _get_qa_patterns(self, topic: str) -> List[Dict]: """Get Q&A patterns""" patterns = { 'SaaS': [ { 'question': 'What are key SaaS metrics?', 'answer': 'MRR, ARR, CAC, LTV, Churn Rate, NPS', 'difficulty': 'Medium', 'tags': ['saas', 'metrics'] }, ], 'Market Research': [ { 'question': 'What is TAM/SAM/SOM?', 'answer': 'Total Addressable Market, Serviceable Addressable Market, Serviceable Obtainable Market', 'difficulty': 'Medium', 'tags': ['market-sizing'] }, ] } default = [ { 'question': 'What are startup funding stages?', 'answer': 'Pre-seed, Seed, Series A, Series B, Series C+', 'difficulty': 'Easy', 'tags': ['funding'] } ] return patterns.get(topic, default) + default[:5] # Roadmap Generator class RoadmapGenerator: """Generate startup roadmaps""" def __init__(self, rag_system: RAGSystem): self.rag = rag_system self.roadmap_templates = self._load_templates() def _load_templates(self) -> Dict[str, List[Dict]]: """Load roadmap templates""" return { 'pre_launch': [ { 'phase': 'Ideation & Validation', 'duration': '1-2 months', 'milestones': [ 'Problem identification', 'Market research', 'Customer interviews', 'MVP wireframes' ] }, ], 'launch': [ { 'phase': 'Go-to-Market', 'duration': '2-3 months', 'milestones': [ 'Brand development', 'Marketing strategy', 'Sales process', 'Launch campaign' ] }, ], } def generate_roadmap(self, startup_idea: StartupIdea, phases: List[str] = None) -> Dict[str, Any]: """Generate roadmap""" try: print(f"πŸ—ΊοΈ Generating roadmap for {startup_idea.name}...") if phases is None: phases = ['pre_launch', 'launch'] roadmap = { 'startup_name': startup_idea.name, 'industry': startup_idea.industry, 'phases': [], 'total_timeline': '6-12 months', 'key_metrics': ['CAC', 'LTV', 'MRR'] } current_month = 0 for phase_name in phases: if phase_name in self.roadmap_templates: for phase in self.roadmap_templates[phase_name]: phase['start_month'] = current_month phase['end_month'] = current_month + 2 current_month = phase['end_month'] roadmap['phases'].append(phase) print("βœ… Roadmap generated") return roadmap except Exception as e: print(f"❌ Error: {e}") return self._generate_fallback(startup_idea) def _generate_fallback(self, idea: StartupIdea) -> Dict[str, Any]: """Fallback roadmap""" return { 'startup_name': idea.name, 'industry': idea.industry, 'phases': [ { 'phase': 'Planning', 'duration': '1-2 months', 'milestones': ['Research', 'Planning'], 'start_month': 0, 'end_month': 2 } ], 'total_timeline': '3-6 months', 'key_metrics': ['Revenue', 'Customers'] } def export_roadmap(self, roadmap_data: Dict[str, Any], format: str = 'markdown') -> str: """Export roadmap""" if format == 'markdown': md = f"# πŸ—ΊοΈ {roadmap_data['startup_name']} Roadmap\n\n" md += f"**Industry:** {roadmap_data['industry']}\n\n" for phase in roadmap_data['phases']: md += f"## {phase['phase']}\n" md += f"**Duration:** {phase['duration']}\n\n" md += "**Milestones:**\n" for milestone in phase['milestones']: md += f"- {milestone}\n" md += "\n" return md return json.dumps(roadmap_data, indent=2) # Initialize Global Systems print("πŸš€ Starting AI Startup Roadmap Generator...") try: rag_system = RAGSystem() rag_system.initialize_collection() if rag_system.collection and rag_system.collection.count() == 0: print("πŸ“š Populating knowledge base...") chunks_added = rag_system.add_documents(STARTUP_KNOWLEDGE_BASE, KNOWLEDGE_METADATA) print(f"βœ… Added {chunks_added} chunks") else: count = rag_system.collection.count() if rag_system.collection else 0 print(f"πŸ“š Using existing knowledge base with {count} documents") except Exception as e: print(f"❌ Error initializing RAG: {e}") rag_system = None try: blueprint_generator = StartupBlueprintGenerator(rag_system) if rag_system else None flashcards_gen = FlashcardsGenerator(rag_system) if rag_system else None roadmap_gen = RoadmapGenerator(rag_system) if rag_system else None print("βœ… Generators initialized") except Exception as e: print(f"❌ Error initializing generators: {e}") # Gradio Interface Functions def generate_startup_blueprint(name, industry, target_market, problem, solution, value_prop): """Main blueprint generation function""" if not all([name, industry, problem, solution]): return ( "❌ **Error:** Please fill in all required fields.", "", "", "" ) try: idea = StartupIdea( name=name, description=f"{name} - {solution}", industry=industry, target_market=target_market or f"{industry} customers", problem_statement=problem, solution=solution, unique_value_proposition=value_prop or "Innovative solution" ) print(f"πŸš€ Processing {name}") if blueprint_generator: business_plan = blueprint_generator.generate_business_plan(idea) business_plan_text = business_plan.executive_summary else: business_plan_text = f"**{name}** addresses {problem} through {solution}." if flashcards_gen: flashcards = flashcards_gen.generate_flashcards(industry, 5) flashcards_text = "\n\n".join([ f"**Q:** {fc.front}\n**A:** {fc.back}" for fc in flashcards ]) else: flashcards_text = "**Sample Flashcard**\n\n**Q:** What is product-market fit?\n**A:** When product satisfies strong market demand." if roadmap_gen: roadmap = roadmap_gen.generate_roadmap(idea) roadmap_text = roadmap_gen.export_roadmap(roadmap, 'markdown') else: roadmap_text = f"# Roadmap for {name}\n\n## Phase 1: Planning\n- Market research\n- Business plan" summary = f"""# πŸš€ Blueprint Generated! **Startup:** {name} **Industry:** {industry} **Target:** {target_market or f"{industry} customers"} ## πŸ“Š Assessment: 85/100 ### βœ… Strengths: - Clear problem identification - Well-defined solution - Strong market positioning ### πŸ’‘ Next Steps: 1. Validate with 50+ customer interviews 2. Build MVP with core features 3. Track CAC and LTV metrics 4. Prepare for seed funding *Generated: {datetime.now().strftime("%B %d, %Y")}* """ print(f"βœ… Blueprint complete for {name}") return summary, business_plan_text, flashcards_text, roadmap_text except Exception as e: error_msg = f"❌ **Error:** {str(e)}\n\nPlease try again." print(f"❌ Error: {e}") return error_msg, "", "", "" def generate_flashcards_only(category): """Generate flashcards only""" try: if flashcards_gen: flashcards = flashcards_gen.generate_flashcards(category, 8) return "\n\n".join([ f"**Q:** {fc.front}\n**A:** {fc.back}\n*Difficulty: {fc.difficulty}*" for fc in flashcards ]) else: return f"**{category} Flashcards**\n\n**Q:** Sample question\n**A:** Sample answer" except Exception as e: return f"❌ Error: {str(e)}" def generate_roadmap_only(startup_name, industry_type): """Generate roadmap only""" try: idea = StartupIdea( name=startup_name or "Sample Startup", description="Sample", industry=industry_type, target_market="General", problem_statement="Problem", solution="Solution", unique_value_proposition="Value" ) if roadmap_gen: roadmap = roadmap_gen.generate_roadmap(idea) return roadmap_gen.export_roadmap(roadmap, 'markdown') else: return f"# {startup_name} Roadmap\n\n## Planning Phase\n- Research\n- Development" except Exception as e: return f"❌ Error: {str(e)}" # Create Gradio Interface print("🎨 Creating interface...") custom_css = """ .gradio-container { max-width: 1200px !important; } """ with gr.Blocks(title="πŸš€ AI Startup Roadmap Generator", theme=gr.themes.Soft(), css=custom_css) as demo: gr.Markdown(""" # πŸš€ AI Startup Roadmap Generator ### Transform Your Startup Ideas into Comprehensive Business Plans **Powered by RAG Technology & ChromaDB** """) with gr.Tabs(): with gr.TabItem("🏒 Complete Blueprint"): gr.Markdown("### πŸ“ Enter Startup Information") with gr.Row(): with gr.Column(): startup_name = gr.Textbox( label="Startup Name *", placeholder="e.g., EcoTrack" ) industry = gr.Dropdown( choices=["SaaS", "E-commerce", "FinTech", "HealthTech", "EdTech", "Other"], label="Industry *", value="SaaS" ) target_market = gr.Textbox( label="Target Market", placeholder="e.g., Small businesses", lines=2 ) with gr.Column(): problem_statement = gr.Textbox( label="Problem Statement *", placeholder="What problem do you solve?", lines=3 ) solution = gr.Textbox( label="Solution *", placeholder="How do you solve it?", lines=3 ) value_proposition = gr.Textbox( label="Unique Value Proposition", placeholder="What makes you different?", lines=2 ) generate_btn = gr.Button("πŸš€ Generate Blueprint", variant="primary", size="lg") gr.Markdown("### πŸ“Š Generated Blueprint") with gr.Row(): with gr.Column(): summary_output = gr.Markdown(label="Summary") with gr.Column(): business_plan_output = gr.Markdown(label="Business Plan") with gr.Row(): with gr.Column(): flashcards_output = gr.Markdown(label="Flashcards") with gr.Column(): roadmap_output = gr.Markdown(label="Roadmap") generate_btn.click( fn=generate_startup_blueprint, inputs=[startup_name, industry, target_market, problem_statement, solution, value_proposition], outputs=[summary_output, business_plan_output, flashcards_output, roadmap_output] ) with gr.TabItem("πŸ“š Flashcards"): gr.Markdown("### πŸ“š Learning Flashcards") flashcard_category = gr.Dropdown( choices=['Market Research', 'Business Planning', 'Financial Management', 'SaaS'], label="Category", value="Market Research" ) flashcard_btn = gr.Button("πŸ“š Generate", variant="primary") flashcard_only_output = gr.Markdown() flashcard_btn.click( fn=generate_flashcards_only, inputs=[flashcard_category], outputs=[flashcard_only_output] ) with gr.TabItem("πŸ—ΊοΈ Roadmap"): gr.Markdown("### πŸ—ΊοΈ Startup Roadmap") with gr.Row(): roadmap_startup_name = gr.Textbox(label="Startup Name", value="My Startup") roadmap_industry = gr.Dropdown( choices=["SaaS", "E-commerce", "FinTech"], label="Industry", value="SaaS" ) roadmap_btn = gr.Button("πŸ—ΊοΈ Generate", variant="primary") roadmap_only_output = gr.Markdown() roadmap_btn.click( fn=generate_roadmap_only, inputs=[roadmap_startup_name, roadmap_industry], outputs=[roadmap_only_output] ) gr.Markdown(""" --- **Disclaimer:** Educational guidance based on startup best practices. Consult professionals for specific advice. """) # Launch Application if __name__ == "__main__": port = int(os.getenv("PORT", 7860)) print(f""" πŸŽ‰ AI Startup Roadmap Generator Ready! 🌐 Port: {port} πŸ“Š RAG: {"βœ… Active" if rag_system else "❌ Fallback"} πŸš€ Launching... """) demo.launch( server_name="0.0.0.0", server_port=port, share=False, show_error=True )