Issue #543 — Validate Estimated Cost Accuracy (UI vs Backend) Backend: - cost_estimator.py uses pricing catalog (APIProviderPricing) as single source of truth - All 7 cost components: analysis, research (search+LLM), script, TTS, voice clone, avatar, video - initialize_default_pricing() runs on every app startup for auto-sync Frontend cost estimation fixes: - Added missing analysisCost, scriptCost, voiceCloneCost to PodcastEstimate type - toPodcastEstimate() now extracts all 7 backend fields (was dropping 3) - headerCostEst maps analysisCost->Analyze, scriptCost->Write, voiceCloneCost->Produce - EstimateCard shows 5 chips: Analysis, Research, Script, Voice(TTS+clone), Visuals(avatar+video) - Chip sum now equals backend total for all configurations Subscription & plan fixes: - Removed Stripe re-verification from checkSubscription() (downgrade regression fix #539) - Added verifyCheckoutRef pattern for reliable mount-time checkout polling - One-time Stripe sync effect with pending_subscription_change flag for Customer Portal returns - Free plan limits: stability_calls 3->10, audio_calls 5->10 (supports 2 podcasts) - Image enforcement uses actual provider (GPT_PROVIDER), not hardcoded Stability - Billing/pricing pages bypass onboarding check in ProtectedRoute - Gradient buttons + loading spinner on plan chip in UserBadge - Added metadata-based Stripe lookup fallback (Issue #538) Documentation: - TESTING_GUIDE.md: comprehensive testing instructions for non-technical testers - Free plan limits, usage tracking, cost estimation formulas - 10 test cases for UI verification - Troubleshooting guide - Quick-reference cost formulas with all default rates Cleanup: removed legacy ToBeMigrated directory (70+ files, ~22K LOC) GSC Brainstorm: service, hook, modal, and UI components for blog topic brainstorming
86 lines
1.3 KiB
Plaintext
86 lines
1.3 KiB
Plaintext
# Core dependencies - needed for all modes
|
|
fastapi>=0.115.14
|
|
starlette>=0.40.0,<0.47.0
|
|
sse-starlette<3.0.0
|
|
uvicorn>=0.24.0
|
|
uvicorn[standard]>=0.24.0
|
|
gunicorn>=21.0.0
|
|
python-multipart>=0.0.6
|
|
python-dotenv>=1.0.0
|
|
loguru>=0.7.2
|
|
tenacity>=8.2.3
|
|
pydantic>=2.5.2,<3.0.0
|
|
typing-extensions>=4.8.0
|
|
|
|
# Auth
|
|
PyJWT>=2.8.0
|
|
cryptography>=41.0.0
|
|
fastapi-clerk-auth>=0.0.7
|
|
|
|
# Database
|
|
sqlalchemy>=2.0.25
|
|
|
|
# Payment
|
|
stripe>=8.0.0
|
|
|
|
# HTTP clients
|
|
httpx>=0.28.1
|
|
aiohttp>=3.9.0
|
|
requests>=2.31.0
|
|
|
|
# AI - needed for podcast
|
|
openai>=1.3.0
|
|
google-genai>=1.0.0
|
|
exa-py==1.9.1
|
|
|
|
# ML - semantic similarity for GSC keyword enrichment
|
|
sentence-transformers>=3.0.0
|
|
tf-keras>=2.0.0
|
|
|
|
# Text processing
|
|
markdown>=3.5.0
|
|
beautifulsoup4>=4.12.0
|
|
lxml>=4.9.0
|
|
advertools>=0.14.0
|
|
|
|
# Data processing
|
|
pandas>=2.0.0
|
|
numpy>=1.24.0
|
|
|
|
# Image/media for podcast
|
|
Pillow>=10.0.0
|
|
matplotlib>=3.8.0
|
|
huggingface_hub>=1.1.4
|
|
|
|
# TTS for podcast
|
|
gtts>=2.4.0
|
|
pyttsx3>=2.90
|
|
|
|
# Video composition
|
|
moviepy==2.1.2
|
|
imageio>=2.31.0
|
|
imageio-ffmpeg>=0.4.9
|
|
|
|
# Testing
|
|
pytest>=7.4.0
|
|
pytest-asyncio>=0.21.0
|
|
|
|
# Task scheduling
|
|
apscheduler>=3.10.0
|
|
|
|
# Utilities
|
|
redis>=5.0.0
|
|
schedule>=1.2.0
|
|
aiofiles>=23.2.0
|
|
psutil>=5.9.0
|
|
|
|
# Google APIs
|
|
google-api-python-client>=2.100.0
|
|
google-auth>=2.23.0
|
|
google-auth-oauthlib>=1.0.0
|
|
|
|
# Other utilities
|
|
python-dateutil>=2.8.0
|
|
jinja2>=3.1.0
|
|
pydantic-settings>=2.0.0
|