Spaces:
Sleeping
Sleeping
| import logging | |
| import asyncio | |
| from concurrent.futures import ThreadPoolExecutor | |
| from helpercodes.image_functions import generate_image | |
| from helpercodes.user_data import generate_gpt_prompt, _encode_image_to_base64 | |
| # Configure Logging | |
| logging.basicConfig( | |
| level=logging.INFO, | |
| format="%(asctime)s - %(levelname)s - %(message)s" | |
| ) | |
| def _generate_prompt_and_image(pos: str, neg: str, category: str, story_instruction: str, | |
| sentiment, image_elements, is_text, text_elements, non_compliant, emotion, | |
| aspect_ratio, design): | |
| try: | |
| logging.info(f"Generating GPT prompt for category: {category}, instruction: {story_instruction}") | |
| # Generate the GPT prompt | |
| prompt = generate_gpt_prompt( | |
| pos, | |
| neg, | |
| category, | |
| story_instruction, | |
| sentiment, image_elements, is_text, text_elements, non_compliant, emotion | |
| ) | |
| logging.info(f"Generated GPT prompt: {prompt}") | |
| # Generate the image from the prompt | |
| image = generate_image(prompt, aspect_ratio, design) | |
| if image: | |
| logging.info("Successfully generated image.") | |
| else: | |
| logging.warning("Image generation failed.") | |
| return image | |
| except Exception as e: | |
| logging.error(f"Error in _generate_prompt_and_image: {e}", exc_info=True) | |
| return None | |
| async def process_custom_data(pos, category, neg, sentiment, image_elements, is_text, text_elements, | |
| non_compliant, emotion, aspect_ratio, design): | |
| try: | |
| logging.info("Processing custom data...") | |
| # The two different instructions | |
| instruction_var = ( | |
| "which should have new offers, revised text and graphics but style should remain same" | |
| ) | |
| instruction_same = ( | |
| "which should have new offers and revised text but graphics and style should remain same" | |
| ) | |
| # We'll use asyncio's event loop to run blocking code in a ThreadPoolExecutor | |
| loop = asyncio.get_running_loop() | |
| # Create the thread pool | |
| with ThreadPoolExecutor() as executor: | |
| # Schedule both tasks in parallel | |
| future_var = loop.run_in_executor( | |
| executor, | |
| _generate_prompt_and_image, | |
| pos, | |
| neg, | |
| category, | |
| instruction_var, | |
| sentiment, image_elements, is_text, text_elements, | |
| non_compliant, emotion, aspect_ratio, design | |
| ) | |
| future_same = loop.run_in_executor( | |
| executor, | |
| _generate_prompt_and_image, | |
| pos, | |
| neg, | |
| category, | |
| instruction_same, | |
| sentiment, image_elements, is_text, text_elements, | |
| non_compliant, emotion, aspect_ratio, design | |
| ) | |
| # Wait for both images to finish | |
| image_var, image_same = await asyncio.gather(future_var, future_same) | |
| return image_var, image_same | |
| except Exception as e: | |
| logging.error(f"Unexpected error in process_custom_data: {e}", exc_info=True) | |
| return None, None | |
| def process_user_data_sync(pos, category, neg, sentiment, image_elements, is_text, text_elements, | |
| non_compliant, emotion, aspect_ratio, design): | |
| try: | |
| logging.info("Executing process_user_data_sync...") | |
| return asyncio.run(process_custom_data(pos, category, neg, sentiment, image_elements, is_text, text_elements, | |
| non_compliant, emotion, aspect_ratio, design)) | |
| except RuntimeError as e: | |
| logging.error("RuntimeError in process_user_data_sync: Async event loop issue", exc_info=True) | |
| return None, None | |
| except Exception as e: | |
| logging.error(f"Unexpected error in process_user_data_sync: {e}", exc_info=True) | |
| return None, None |