Add SEO fields to Tasks model, improve content generation response handling, and enhance progress bar animation
- Added primary_keyword, secondary_keywords, tags, and categories fields to Tasks model - Updated generate_content function to handle full JSON response with all SEO fields - Improved progress bar animation: smooth 1% increments every 300ms - Enhanced step detection for content generation vs clustering vs ideas - Fixed progress modal to show correct messages for each function type - Added comprehensive logging to Keywords and Tasks pages for AI functions - Fixed error handling to show meaningful error messages instead of generic failures
This commit is contained in:
@@ -59,29 +59,37 @@ def run_ai_task(self, function_name: str, payload: dict, account_id: int = None)
|
||||
logger.error(f" - Error: {result.get('error')}")
|
||||
logger.info("=" * 80)
|
||||
|
||||
# If execution failed, raise exception so Celery marks it as FAILURE
|
||||
# If execution failed, update state and return error (don't raise to avoid serialization issues)
|
||||
if not result.get('success'):
|
||||
error_msg = result.get('error', 'Task execution failed')
|
||||
error_type = result.get('error_type', 'ExecutionError')
|
||||
# Update task state before raising
|
||||
# Update task state with error details
|
||||
error_meta = {
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
'function_name': function_name,
|
||||
'phase': result.get('phase', 'ERROR'),
|
||||
'percentage': 0,
|
||||
'message': f'Error: {error_msg}',
|
||||
'request_steps': result.get('request_steps', []),
|
||||
'response_steps': result.get('response_steps', [])
|
||||
}
|
||||
try:
|
||||
self.update_state(
|
||||
state='FAILURE',
|
||||
meta={
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
'function_name': function_name,
|
||||
'phase': result.get('phase', 'ERROR'),
|
||||
'percentage': 0,
|
||||
'message': f'Error: {error_msg}',
|
||||
'request_steps': result.get('request_steps', []),
|
||||
'response_steps': result.get('response_steps', [])
|
||||
}
|
||||
meta=error_meta
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
# Raise exception so Celery properly tracks failure
|
||||
raise Exception(f"{error_type}: {error_msg}")
|
||||
except Exception as update_err:
|
||||
logger.warning(f"Failed to update task state: {update_err}")
|
||||
|
||||
# Return error result - Celery will mark as FAILURE based on state
|
||||
# Don't raise exception to avoid serialization issues
|
||||
return {
|
||||
'success': False,
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
**error_meta
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
@@ -94,26 +102,29 @@ def run_ai_task(self, function_name: str, payload: dict, account_id: int = None)
|
||||
logger.error(f" - Error: {error_type}: {error_msg}")
|
||||
logger.error("=" * 80, exc_info=True)
|
||||
|
||||
# Update task state with error details
|
||||
# Update task state with error details (don't raise to avoid serialization issues)
|
||||
error_meta = {
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
'function_name': function_name,
|
||||
'phase': 'ERROR',
|
||||
'percentage': 0,
|
||||
'message': f'Error: {error_msg}'
|
||||
}
|
||||
try:
|
||||
self.update_state(
|
||||
state='FAILURE',
|
||||
meta={
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
'function_name': function_name,
|
||||
'phase': 'ERROR',
|
||||
'percentage': 0,
|
||||
'message': f'Error: {error_msg}'
|
||||
}
|
||||
meta=error_meta
|
||||
)
|
||||
except Exception:
|
||||
pass # Don't fail if state update fails
|
||||
except Exception as update_err:
|
||||
logger.warning(f"Failed to update task state: {update_err}")
|
||||
|
||||
# Return error result - don't raise to avoid Celery serialization issues
|
||||
return {
|
||||
'success': False,
|
||||
'error': error_msg,
|
||||
'error_type': error_type,
|
||||
'function_name': function_name
|
||||
'function_name': function_name,
|
||||
**error_meta
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user