feat(podcast): add pre-estimate endpoint, enhance cost estimator with multi-model support, cleanup alpha pricing seeding

- Add POST /podcast/pre-estimate endpoint for cost estimation before analysis
- Enhance cost_estimator.py with multi-model support (gemini, audio, voice clone, image, video)
- Add detailed cost breakdown (llm, audio, media costs + per-phase breakdown)
- Remove redundant pricing seeding from init_alpha_subscription_tiers.py
- Add SSOT pricing via PricingService.initialize_default_pricing()
- Update TopicUrlInput tooltip to show estimate details
- Add debug logging for pricing seeding and pre-estimate
- Clean up verbose podcast mode debug logs in app.py
This commit is contained in:
ajaysi
2026-05-06 15:29:12 +05:30
parent a7d2ef1c09
commit 3f984e8d0c
31 changed files with 4926 additions and 1011 deletions

View File

@@ -4,6 +4,7 @@ Handles fetching user data from the onboarding database.
"""
from typing import Optional, List, Dict, Any
from datetime import datetime
from sqlalchemy.orm import Session
from loguru import logger
@@ -92,5 +93,88 @@ class UserDataService:
return integrated_data.get('website_analysis')
except Exception as e:
logger.error(f"Error getting user website analysis: {str(e)}")
logger.error(f"Error getting user website analysis: {e}")
return None
def save_website_extraction(self, user_id: str, extraction_data: Dict[str, Any]) -> bool:
"""
Save website extraction data for future use.
Args:
user_id: The user ID
extraction_data: Website extraction data (title, summary, highlights, url, subpages)
Returns:
True if saved successfully
"""
try:
# Clean data - remove images/favicon
clean_data = {
k: v for k, v in extraction_data.items()
if k not in ('image', 'favicon')
}
clean_data['saved_at'] = datetime.now().isoformat()
# Find or create user session for storing
onboarding = self.db.query(OnboardingSession).filter(
OnboardingSession.user_id == user_id
).first()
if not onboarding:
# Create new session if not exists
onboarding = OnboardingSession(user_id=user_id)
self.db.add(onboarding)
# Try to update website_analysis field
# The field might be JSON in the model
try:
existing = onboarding.website_analysis
if isinstance(existing, dict):
existing.update(clean_data)
onboarding.website_analysis = existing
else:
onboarding.website_analysis = clean_data
except Exception as ex:
logger.warning(f"Could not update website_analysis: {ex}")
onboarding.website_analysis = clean_data
self.db.commit()
logger.info(f"Saved website extraction for user {user_id}")
return True
except Exception as e:
logger.error(f"Error saving website extraction: {str(e)}")
self.db.rollback()
return False
def get_website_extraction(self, user_id: str) -> Optional[Dict[str, Any]]:
"""
Get saved website extraction data.
Args:
user_id: The user ID
Returns:
Website extraction data or None
"""
try:
onboarding = self.db.query(OnboardingSession).filter(
OnboardingSession.user_id == user_id
).first()
if not onboarding:
return None
extraction = onboarding.website_analysis
if isinstance(extraction, dict):
# Return clean data without internal fields
return {
k: v for k, v in extraction.items()
if k not in ('saved_at', 'full_analysis', 'analysis_status')
}
return None
except Exception as e:
logger.error(f"Error getting website extraction: {str(e)}")
return None