You were experiencing HTTP 429 "Too Many Requests" errors from OpenAI's API in production, indicating that your application was hitting OpenAI's rate limits.
File: src/rate_limiter.py
Created a comprehensive rate limiting utility with:
- Exponential backoff with jitter to prevent thundering herd effects
- Smart retry logic that distinguishes between rate limits and quota errors
- Production-optimized delays with configurable parameters
- Automatic error handling for quota exceeded scenarios
- Built-in logging for monitoring and debugging
Key Features:
APIRateLimiterclass for centralized rate limit management- Convenience functions like
make_openai_chat_completion()andmake_openai_vision_request() - Decorator
@rate_limitedfor easy function wrapping - Global rate limiter instance for consistent behavior
File: src/config.py
Added production-specific rate limiting configuration:
# Production settings (conservative for 429 prevention)
API_MAX_RETRIES = 5 # More retries for production
API_BASE_DELAY = 2.0 # Start with 2 second delay
API_MAX_DELAY = 60.0 # Max 60 seconds between retries
API_EXPONENTIAL_BASE = 2.5 # Aggressive backoff
API_JITTER_RANGE = 1.0 # Add up to 1 second jitter
API_REQUEST_DELAY = 0.5 # Delay between requests in parallelFiles: src/file_processors/*.py
Replaced all direct OpenAI API calls with rate-limited versions:
- All Vision API calls now use
make_openai_vision_request() - Text processing calls use
make_openai_chat_completion() - Resume generation calls are rate-limited
- Vision API calls for image analysis use centralized rate limiting
- Automatic fallback to Gemini on quota errors
- Replaced custom retry logic with centralized system
- Simplified error handling while maintaining robustness
Files: src/pdf_chunker.py, src/file_processors/openai_processor.py
- Added staggered delays between parallel chunk processing
- Progressive delays: chunk 0 = no delay, chunk 1 = 0.5s, chunk 2 = 1.0s, etc.
- Production mode uses sequential processing (max_workers = 1) for maximum stability
- Reduced parallel workers to prevent overwhelming the API
The system now distinguishes between:
- Rate limits (429): Retryable with exponential backoff
- Quota exceeded: Non-retryable, requires manual intervention
- Clear error messages with troubleshooting steps
- Success/retry attempt logging
- Production-friendly log levels
delay = base_delay * (exponential_base ^ attempt) + jitter
Production example:
- Attempt 1: 2.0s + jitter
- Attempt 2: 5.0s + jitter
- Attempt 3: 12.5s + jitter
- Attempt 4: 31.25s + jitter
- Attempt 5: 60s (capped at max_delay)
- Sequential processing in production (max_workers = 1)
- Staggered delays between concurrent requests
- Conservative timeouts for Vision API calls
The solution automatically detects production environment using existing ENVIRONMENT=production variable.
You can fine-tune rate limiting by setting these environment variables:
# Optional: Override default production settings
API_MAX_RETRIES=5
API_BASE_DELAY=2.0
API_MAX_DELAY=60.0
API_EXPONENTIAL_BASE=2.5
API_JITTER_RANGE=1.0
API_REQUEST_DELAY=0.5The system provides comprehensive logging. Monitor for:
⚠️ OpenAI rate limit error- Normal retries happening✅ API call succeeded on attempt X- Successful retries❌ OpenAI Quota Error- Requires billing/quota attention
- Eliminates 429 errors through intelligent retry logic
- Maintains throughput while respecting rate limits
- Automatic recovery from temporary rate limit issues
- Conservative settings prevent overwhelming the API
- Sequential processing in production for maximum reliability
- Graceful degradation with meaningful error messages
- Clear logging for tracking API usage patterns
- Quota error detection with troubleshooting guidance
- Retry attempt tracking for performance optimization
Test the system with multiple concurrent requests to verify rate limiting works correctly.
Use OpenAI's dashboard to monitor your API usage patterns after deployment.
Monitor application logs for rate limiting patterns and adjust configuration if needed.
- Increase base delay: Set
API_BASE_DELAY=3.0or higher - Reduce parallel processing: The system already uses sequential processing in production
- Check quota limits: Monitor OpenAI billing dashboard
- Verify environment detection: Ensure
ENVIRONMENT=productionis set correctly - Adjust retry settings: Reduce
API_MAX_RETRIESif needed - Monitor actual delays: Check logs for retry patterns
The system will log specific troubleshooting steps:
- Check billing at OpenAI dashboard
- Verify monthly usage limits
- Ensure payment method is valid
- Consider regenerating API key
- NEW:
src/rate_limiter.py- Centralized rate limiting system - UPDATED:
src/config.py- Added rate limiting configuration - UPDATED:
src/file_processors/openai_processor.py- Applied rate limiting to all API calls - UPDATED:
src/file_processors/image_processor.py- Applied rate limiting to Vision API - UPDATED:
src/file_processors/translation_processor.py- Replaced custom retry logic - UPDATED:
src/pdf_chunker.py- Added parallel processing delays
This comprehensive rate limiting solution addresses your 429 errors by:
- Implementing industry-standard exponential backoff with jitter
- Using production-optimized conservative settings
- Providing centralized, consistent rate limiting across all OpenAI API calls
- Maintaining application performance while respecting API limits
- Adding comprehensive monitoring and debugging capabilities
The solution is ready for immediate deployment with no additional configuration required.