fixes for image gen
This commit is contained in:
@@ -169,8 +169,41 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
images_failed = 0
|
||||
errors = []
|
||||
|
||||
# Initialize image queue in meta for frontend
|
||||
image_queue = []
|
||||
for idx, img in enumerate(images, 1):
|
||||
content_obj = img.content
|
||||
if not content_obj:
|
||||
if img.task:
|
||||
content_title = img.task.title
|
||||
else:
|
||||
content_title = "Content"
|
||||
else:
|
||||
content_title = content_obj.title or content_obj.meta_title or "Content"
|
||||
|
||||
image_queue.append({
|
||||
'image_id': img.id,
|
||||
'index': idx,
|
||||
'label': f"{img.image_type.replace('_', ' ').title()} Image",
|
||||
'content_title': content_title,
|
||||
'status': 'pending',
|
||||
'progress': 0,
|
||||
'image_url': None,
|
||||
'error': None
|
||||
})
|
||||
|
||||
# Send initial queue to frontend
|
||||
if progress_tracker:
|
||||
initial_meta = step_tracker.get_meta() if step_tracker else {}
|
||||
initial_meta['image_queue'] = image_queue
|
||||
progress_tracker.update("PREP", 10, f"Preparing to generate {total_images} image{'s' if total_images != 1 else ''}", meta=initial_meta)
|
||||
|
||||
# Process each image sequentially
|
||||
for index, image in enumerate(images, 1):
|
||||
queue_item = image_queue[index - 1]
|
||||
queue_item['status'] = 'processing'
|
||||
queue_item['progress'] = 0
|
||||
|
||||
try:
|
||||
# Get content title
|
||||
content = image.content
|
||||
@@ -202,16 +235,32 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
if progress_tracker and step_tracker:
|
||||
prep_msg = f"Generating image {index} of {total_images}: {image.image_type}"
|
||||
step_tracker.add_request_step("PREP", "success", prep_msg)
|
||||
queue_item['progress'] = 10
|
||||
# Update queue in meta
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 10 + int((index - 1) / total_images * 15) # 10-25% for PREP
|
||||
progress_tracker.update("PREP", progress_pct, prep_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("PREP", progress_pct, prep_msg, meta=meta)
|
||||
|
||||
# Generate image
|
||||
# Generate image - update progress incrementally
|
||||
if progress_tracker and step_tracker:
|
||||
ai_msg = f"Generating {image.image_type} image {index} of {total_images} with AI"
|
||||
step_tracker.add_response_step("AI_CALL", "success", ai_msg)
|
||||
queue_item['progress'] = 25
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 25 + int((index - 1) / total_images * 45) # 25-70% for AI_CALL
|
||||
progress_tracker.update("AI_CALL", progress_pct, ai_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("AI_CALL", progress_pct, ai_msg, meta=meta)
|
||||
|
||||
# Update progress to 50% (simulating API call start)
|
||||
queue_item['progress'] = 50
|
||||
if progress_tracker and step_tracker:
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_tracker.update("AI_CALL", progress_pct, ai_msg, meta=meta)
|
||||
|
||||
# Generate image (this is the actual API call)
|
||||
# Frontend will simulate smooth progress from 50% to 95% while waiting
|
||||
result = ai_core.generate_image(
|
||||
prompt=formatted_prompt,
|
||||
provider=provider,
|
||||
@@ -221,8 +270,18 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
function_name='generate_images_from_prompts'
|
||||
)
|
||||
|
||||
# Update progress to 90% (API call completed, processing response)
|
||||
queue_item['progress'] = 90
|
||||
if progress_tracker and step_tracker:
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_tracker.update("AI_CALL", progress_pct, ai_msg, meta=meta)
|
||||
|
||||
if result.get('error'):
|
||||
# Mark as failed
|
||||
queue_item['status'] = 'failed'
|
||||
queue_item['progress'] = 100
|
||||
queue_item['error'] = result['error']
|
||||
with transaction.atomic():
|
||||
image.status = 'failed'
|
||||
image.save(update_fields=['status', 'updated_at'])
|
||||
@@ -235,14 +294,19 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
if progress_tracker and step_tracker:
|
||||
parse_msg = f"Image {index} failed: {result['error']}"
|
||||
step_tracker.add_response_step("PARSE", "error", parse_msg)
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 70 + int((index - 1) / total_images * 15) # 70-85% for PARSE
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=meta)
|
||||
|
||||
continue
|
||||
|
||||
image_url = result.get('url')
|
||||
if not image_url:
|
||||
# Mark as failed
|
||||
queue_item['status'] = 'failed'
|
||||
queue_item['progress'] = 100
|
||||
queue_item['error'] = 'No URL returned'
|
||||
with transaction.atomic():
|
||||
image.status = 'failed'
|
||||
image.save(update_fields=['status', 'updated_at'])
|
||||
@@ -255,17 +319,22 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
if progress_tracker and step_tracker:
|
||||
parse_msg = f"Image {index} failed: No URL returned"
|
||||
step_tracker.add_response_step("PARSE", "error", parse_msg)
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 70 + int((index - 1) / total_images * 15)
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=meta)
|
||||
|
||||
continue
|
||||
|
||||
# Update progress: PARSE phase
|
||||
# Update progress: PARSE phase (90%)
|
||||
queue_item['progress'] = 90
|
||||
if progress_tracker and step_tracker:
|
||||
parse_msg = f"Image {index} of {total_images} generated successfully"
|
||||
step_tracker.add_response_step("PARSE", "success", parse_msg)
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 70 + int((index - 1) / total_images * 15) # 70-85% for PARSE
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("PARSE", progress_pct, parse_msg, meta=meta)
|
||||
|
||||
# Update image record
|
||||
with transaction.atomic():
|
||||
@@ -273,6 +342,10 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
image.status = 'generated'
|
||||
image.save(update_fields=['image_url', 'status', 'updated_at'])
|
||||
|
||||
# Mark queue item as completed
|
||||
queue_item['status'] = 'completed'
|
||||
queue_item['progress'] = 100
|
||||
queue_item['image_url'] = image_url
|
||||
images_generated += 1
|
||||
logger.info(f"Image {image.id} ({image.image_type}) generated successfully: {image_url}")
|
||||
|
||||
@@ -280,8 +353,10 @@ class GenerateImagesFromPromptsFunction(BaseAIFunction):
|
||||
if progress_tracker and step_tracker:
|
||||
save_msg = f"Saved image {index} of {total_images}"
|
||||
step_tracker.add_request_step("SAVE", "success", save_msg)
|
||||
meta = step_tracker.get_meta()
|
||||
meta['image_queue'] = image_queue
|
||||
progress_pct = 85 + int((index - 1) / total_images * 13) # 85-98% for SAVE
|
||||
progress_tracker.update("SAVE", progress_pct, save_msg, meta=step_tracker.get_meta())
|
||||
progress_tracker.update("SAVE", progress_pct, save_msg, meta=meta)
|
||||
|
||||
except Exception as e:
|
||||
# Mark as failed
|
||||
|
||||
Reference in New Issue
Block a user