diff --git a/backend/app.py b/backend/app.py index 5f636a09..adb01952 100644 --- a/backend/app.py +++ b/backend/app.py @@ -48,6 +48,9 @@ load_dotenv(backend_dir / '.env') # backend/.env load_dotenv(project_root / '.env') # root .env (fallback) load_dotenv() # CWD .env (fallback) +# Feature flags (read early so app wiring can rely on a single source of truth) +PODCAST_ONLY_DEMO_MODE = os.getenv("PODCAST_ONLY_DEMO_MODE", "false").lower() == "true" + # Set up clean logging for end users from logging_config import setup_clean_logging setup_clean_logging() @@ -405,48 +408,62 @@ async def analyze_urls_ai_endpoint(request: AnalyzeURLsRequest, current_user: di """Run AI-powered SEO analysis on selected URLs.""" return await analyze_urls_ai(request, current_user) -# Include platform analytics router -from routers.platform_analytics import router as platform_analytics_router -app.include_router(platform_analytics_router) -# Include Bing Analytics Storage router to expose storage-backed endpoints -from routers.bing_analytics_storage import router as bing_analytics_storage_router -app.include_router(bing_analytics_storage_router) -app.include_router(images_router) -app.include_router(image_studio_router) -app.include_router(product_marketing_router) -app.include_router(campaign_creator_router) +# Centralized mode helpers for router wiring. +# Keep all mode decisions in this section to avoid scattered env checks. +def is_podcast_only_demo_mode() -> bool: + return PODCAST_ONLY_DEMO_MODE -# Include content assets router -from api.content_assets.router import router as content_assets_router -app.include_router(content_assets_router) -# Include Podcast Maker router +def should_include_non_podcast_routers() -> bool: + return not is_podcast_only_demo_mode() + + +# Include Podcast Maker router (available in all modes) from api.podcast.router import router as podcast_router app.include_router(podcast_router) -# Include YouTube Creator Studio router -from api.youtube.router import router as youtube_router -app.include_router(youtube_router, prefix="/api") +if should_include_non_podcast_routers(): + # Include platform analytics router + from routers.platform_analytics import router as platform_analytics_router + app.include_router(platform_analytics_router) -# Include research configuration router -app.include_router(research_config_router, prefix="/api/research", tags=["research"]) + # Include Bing Analytics Storage router to expose storage-backed endpoints + from routers.bing_analytics_storage import router as bing_analytics_storage_router + app.include_router(bing_analytics_storage_router) + app.include_router(images_router) + app.include_router(image_studio_router) + app.include_router(product_marketing_router) + app.include_router(campaign_creator_router) -# Include Research Engine router (standalone AI research module) -from api.research.router import router as research_engine_router -app.include_router(research_engine_router, tags=["Research Engine"]) + # Include content assets router + from api.content_assets.router import router as content_assets_router + app.include_router(content_assets_router) -# Scheduler dashboard routes -from api.scheduler_dashboard import router as scheduler_dashboard_router -app.include_router(scheduler_dashboard_router) -app.include_router(oauth_token_monitoring_router) + # Include YouTube Creator Studio router + from api.youtube.router import router as youtube_router + app.include_router(youtube_router, prefix="/api") -# Autonomous Agents API routes (Phase 3A) -from api.agents_api import router as agents_router -app.include_router(agents_router) + # Include research configuration router + app.include_router(research_config_router, prefix="/api/research", tags=["research"]) -# Today workflow routes -from api.today_workflow import router as today_workflow_router -app.include_router(today_workflow_router) + # Include Research Engine router (standalone AI research module) + from api.research.router import router as research_engine_router + app.include_router(research_engine_router, tags=["Research Engine"]) + + # Scheduler dashboard routes + from api.scheduler_dashboard import router as scheduler_dashboard_router + app.include_router(scheduler_dashboard_router) + app.include_router(oauth_token_monitoring_router) + + # Autonomous Agents API routes (Phase 3A) + from api.agents_api import router as agents_router + app.include_router(agents_router) + + # Today workflow routes + from api.today_workflow import router as today_workflow_router + app.include_router(today_workflow_router) +else: + logger.info("PODCAST_ONLY_DEMO_MODE is enabled: non-podcast routers are not registered.") # Setup frontend serving using modular utilities frontend_serving.setup_frontend_serving() diff --git a/backend/start_alwrity_backend.py b/backend/start_alwrity_backend.py index 58286dd6..260c667a 100644 --- a/backend/start_alwrity_backend.py +++ b/backend/start_alwrity_backend.py @@ -298,6 +298,11 @@ def main(): parser.add_argument("--dev", action="store_true", help="Enable development mode (auto-reload)") parser.add_argument("--production", action="store_true", help="Enable production mode (optimized for deployment)") parser.add_argument("--verbose", action="store_true", help="Enable verbose logging for debugging") + parser.add_argument( + "--podcast-only-demo", + action="store_true", + help="Enable podcast-only demo mode (sets PODCAST_ONLY_DEMO_MODE=true before app startup)", + ) args = parser.parse_args() # Determine mode @@ -307,6 +312,8 @@ def main(): # Set global verbose flag for utilities os.environ["ALWRITY_VERBOSE"] = "true" if verbose_mode else "false" + if args.podcast_only_demo: + os.environ["PODCAST_ONLY_DEMO_MODE"] = "true" print("[*] ALwrity Backend Server") print("=" * 40) @@ -314,6 +321,8 @@ def main(): print(f"Auto-reload: {'ENABLED' if enable_reload else 'DISABLED'}") if verbose_mode: print("Verbose logging: ENABLED") + if args.podcast_only_demo: + print("Podcast-only demo mode: ENABLED") print("=" * 40) # Check if we're in the right directory @@ -401,4 +410,4 @@ def main(): if __name__ == "__main__": success = main() if not success: - sys.exit(1) \ No newline at end of file + sys.exit(1)