fix(backend): lazy-load PersonaAnalysisService in podcast mode, preserve PORT from Render

This commit is contained in:
ajaysi
2026-04-05 15:28:49 +05:30
parent bba56a1940
commit aa2317c359
4 changed files with 56 additions and 13 deletions

View File

@@ -39,9 +39,10 @@ class ProductionOptimizer:
def _set_production_env_vars(self) -> None: def _set_production_env_vars(self) -> None:
"""Set production-specific environment variables.""" """Set production-specific environment variables."""
production_vars = { production_vars = {
# Note: PORT is NOT set here - it's provided by the deployment platform (e.g., Render)
# Don't override PORT as it must come from the environment
# Note: HOST is not set here - it's auto-detected by start_backend() # Note: HOST is not set here - it's auto-detected by start_backend()
# Based on deployment environment (cloud vs local) # Based on deployment environment (cloud vs local)
'PORT': '8000',
'RELOAD': 'false', 'RELOAD': 'false',
'LOG_LEVEL': 'INFO', 'LOG_LEVEL': 'INFO',
'DEBUG': 'false', 'DEBUG': 'false',

View File

@@ -14,9 +14,12 @@ from pathlib import Path
from dotenv import load_dotenv from dotenv import load_dotenv
backend_dir = Path(__file__).parent backend_dir = Path(__file__).parent
project_root = backend_dir.parent project_root = backend_dir.parent
load_dotenv(backend_dir / '.env')
load_dotenv(project_root / '.env') # Load .env but DON'T override existing environment variables (especially PORT from Render)
load_dotenv() # Use override=False to preserve Render-provided PORT
load_dotenv(backend_dir / '.env', override=False)
load_dotenv(project_root / '.env', override=False)
load_dotenv(override=False)
# Set LOG_LEVEL early to WARNING to suppress DEBUG persona logs in podcast mode # Set LOG_LEVEL early to WARNING to suppress DEBUG persona logs in podcast mode
import os import os

View File

@@ -18,9 +18,12 @@ import json
from services.database import get_db_session from services.database import get_db_session
from models.onboarding import OnboardingSession, WebsiteAnalysis, ResearchPreferences from models.onboarding import OnboardingSession, WebsiteAnalysis, ResearchPreferences
from models.persona_models import WritingPersona, PlatformPersona, PersonaAnalysisResult from models.persona_models import WritingPersona, PlatformPersona, PersonaAnalysisResult
from services.persona.core_persona import CorePersonaService, OnboardingDataCollector
from services.persona.linkedin.linkedin_persona_service import LinkedInPersonaService def _get_podcast_mode():
from services.persona.facebook.facebook_persona_service import FacebookPersonaService """Check if running in podcast-only mode to skip heavy initialization."""
import os
env_val = os.getenv("ALWRITY_ENABLED_FEATURES", "").strip().lower()
return env_val == "podcast"
class PersonaAnalysisService: class PersonaAnalysisService:
"""Service for analyzing onboarding data and generating writing personas using Gemini AI.""" """Service for analyzing onboarding data and generating writing personas using Gemini AI."""
@@ -37,12 +40,40 @@ class PersonaAnalysisService:
def __init__(self): def __init__(self):
"""Initialize the persona analysis service (only once).""" """Initialize the persona analysis service (only once)."""
if not self._initialized: if not self._initialized:
# Skip heavy initialization in podcast-only mode
if _get_podcast_mode():
logger.debug("PersonaAnalysisService: Skipping heavy init in podcast mode")
self._initialized = True
return
# Only initialize heavy services when needed (not at import time)
self._heavy_init_done = False
def _ensure_heavy_init(self):
"""Lazily initialize heavy services only when first used."""
if self._heavy_init_done:
return
# Check again in case mode changed
if _get_podcast_mode():
logger.debug("PersonaAnalysisService: Skipping heavy init in podcast mode")
self._heavy_init_done = True
return
try:
from services.persona.core_persona import CorePersonaService, OnboardingDataCollector
from services.persona.linkedin.linkedin_persona_service import LinkedInPersonaService
from services.persona.facebook.facebook_persona_service import FacebookPersonaService
self.core_persona_service = CorePersonaService() self.core_persona_service = CorePersonaService()
self.data_collector = OnboardingDataCollector() self.data_collector = OnboardingDataCollector()
self.linkedin_service = LinkedInPersonaService() self.linkedin_service = LinkedInPersonaService()
self.facebook_service = FacebookPersonaService() self.facebook_service = FacebookPersonaService()
logger.debug("PersonaAnalysisService initialized") self._heavy_init_done = True
self._initialized = True logger.debug("PersonaAnalysisService initialized (lazy)")
except Exception as e:
logger.warning(f"PersonaAnalysisService: Failed to initialize heavy services: {e}")
self._heavy_init_done = True
def generate_persona_from_onboarding(self, user_id: str, onboarding_session_id: int = None) -> Dict[str, Any]: def generate_persona_from_onboarding(self, user_id: str, onboarding_session_id: int = None) -> Dict[str, Any]:
""" """
@@ -55,6 +86,13 @@ class PersonaAnalysisService:
Returns: Returns:
Generated persona data with platform adaptations Generated persona data with platform adaptations
""" """
# Ensure heavy services are initialized
self._ensure_heavy_init()
# Check if heavy init failed (podcast mode)
if not getattr(self, '_heavy_init_done', False):
return {"error": "Persona service unavailable in podcast-only mode"}
try: try:
logger.info(f"Generating persona for user {user_id}") logger.info(f"Generating persona for user {user_id}")

View File

@@ -225,11 +225,12 @@ from pathlib import Path
backend_dir = Path(__file__).parent backend_dir = Path(__file__).parent
load_dotenv(backend_dir / '.env') load_dotenv(backend_dir / '.env')
# Debug: Print what PORT is set to # Debug: Print what PORT is set to - IMMEDIATELY at startup
import os import os
print(f"[DEBUG] PORT env: {os.getenv('PORT')}") print(f"[STARTUP] PORT env: {os.getenv('PORT')}", flush=True)
print(f"[DEBUG] RENDER env: {os.getenv('RENDER')}") print(f"[STARTUP] RENDER env: {os.getenv('RENDER')}", flush=True)
print(f"[DEBUG] ALWRITY_ENABLED_FEATURES: {os.getenv('ALWRITY_ENABLED_FEATURES')}") print(f"[STARTUP] ALWRITY_ENABLED_FEATURES: {os.getenv('ALWRITY_ENABLED_FEATURES')}", flush=True)
print(f"[STARTUP] HOST env: {os.getenv('HOST')}", flush=True)
if __name__ == "__main__": if __name__ == "__main__":
enabled_features = get_enabled_features() enabled_features = get_enabled_features()