From 82fc0513701e1a9359c958fd6da0c4603f2f8aca Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 11 Jul 2025 22:37:14 +0530 Subject: [PATCH] Fix Weather Reporter network errors for API-based agent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix data format and processing pattern for Weather Reporter: - Change backend from json.loads() to request.POST.dict() for FormData handling - Update frontend URL from window.location.href to /process/ endpoint - Implement immediate response pattern for API-based agent (no polling needed) - Return complete weather data directly in POST response - Weather Reporter uses OpenWeatherMap API directly, unlike webhook agents Key difference: API agents process immediately, webhook agents use async polling 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- .../templates/weather_reporter/detail.html | 25 ++++++------- weather_reporter/views.py | 36 ++++++++++++++----- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/weather_reporter/templates/weather_reporter/detail.html b/weather_reporter/templates/weather_reporter/detail.html index d38b323..a37601c 100644 --- a/weather_reporter/templates/weather_reporter/detail.html +++ b/weather_reporter/templates/weather_reporter/detail.html @@ -634,7 +634,7 @@ // Submit form via AJAX const formData = new FormData(this); - fetch(window.location.href, { + fetch('/agents/weather-reporter/process/', { method: 'POST', body: formData, headers: { @@ -644,20 +644,17 @@ .then(response => response.json()) .then(result => { clearInterval(stepInterval); - if (result.success && result.request_id) { - // Start polling for results - pollForResults(result.request_id); + // Handle immediate response (API-based agent) + document.getElementById('processingStatus').style.display = 'none'; + document.getElementById('processButton').disabled = false; + document.getElementById('processButton').innerHTML = '🌤️ Get Weather Report (2.00 AED)'; + + if (result.error) { + showToast(`❌ ${result.error}`, 'error'); + } else if (result.success) { + displayResults(result); } else { - // Handle immediate response - document.getElementById('processingStatus').style.display = 'none'; - document.getElementById('processButton').disabled = false; - document.getElementById('processButton').innerHTML = '🌤️ Get Weather Report (2.00 AED)'; - - if (result.error) { - showToast(`❌ ${result.error}`, 'error'); - } else { - displayResults(result); - } + showToast('❌ Failed to generate weather report', 'error'); } }) .catch(error => { diff --git a/weather_reporter/views.py b/weather_reporter/views.py index 4aa85fd..5c77b36 100644 --- a/weather_reporter/views.py +++ b/weather_reporter/views.py @@ -41,7 +41,8 @@ class WeatherReporterProcessView(View): return JsonResponse({'error': 'Authentication required'}, status=401) try: - data = json.loads(request.body) + # Handle FormData from frontend + data = request.POST.dict() # Get agent agent = BaseAgent.objects.get(slug='weather-reporter') @@ -60,25 +61,42 @@ class WeatherReporterProcessView(View): ) - # Process request + # Process request immediately (API-based agent) processor = WeatherReporterProcessor() result = processor.process_request( request_obj=agent_request, user_id=request.user.id, location=data.get('location'), report_type=data.get('report_type'), - ) # Refresh user from database to get updated wallet balance request.user.refresh_from_db() - return JsonResponse({ - 'success': True, - 'request_id': str(agent_request.id), - 'message': 'Weather Reporter request processed successfully', - 'wallet_balance': float(request.user.wallet_balance) - }) + # Check if we have a response object + if hasattr(agent_request, 'response'): + response_obj = agent_request.response + return JsonResponse({ + 'success': response_obj.success, + 'status': 'completed', + 'content': response_obj.formatted_report, + 'weather_data': response_obj.weather_data, + 'temperature': response_obj.temperature, + 'description': response_obj.description, + 'humidity': response_obj.humidity, + 'wind_speed': response_obj.wind_speed, + 'formatted_report': response_obj.formatted_report, + 'processing_time': float(response_obj.processing_time) if response_obj.processing_time else None, + 'wallet_balance': float(request.user.wallet_balance) + }) + else: + # Fallback if no response object + return JsonResponse({ + 'success': True, + 'status': 'completed', + 'message': 'Weather report generated successfully', + 'wallet_balance': float(request.user.wallet_balance) + }) except BaseAgent.DoesNotExist: return JsonResponse({'error': 'Weather Reporter agent not found'}, status=404)