Fix image generation: escape JSON in prompt template + GlobalIntegrationSettings fallback

ROOT CAUSES IDENTIFIED:
1. GlobalAIPrompt template had unescaped JSON braces that broke Python's .format()
   - Python treats {...} as placeholders, causing KeyError when rendering
   - Escaped JSON braces to {{...}} while preserving {title}, {content}, {max_images}

2. Image functions hardcoded aws-admin IntegrationSettings which didn't exist
   - Functions failed when aws-admin account had no IntegrationSettings
   - Added GlobalIntegrationSettings fallback for all missing values

CHANGES:
- Fixed GlobalAIPrompt.image_prompt_extraction template in database (escaped JSON)
- Updated generate_image_prompts._get_max_in_article_images() with fallback
- Updated generate_images.prepare_data() with fallback for all image settings
- Updated tasks.process_image_generation_queue() with fallback for config + API keys

TESTED: Template rendering now works, GlobalIntegrationSettings.max_in_article_images=4
This commit is contained in:
IGNY8 VPS (Salman)
2025-12-25 02:09:29 +00:00
parent 5299fd82eb
commit 504d0174f7
3 changed files with 91 additions and 51 deletions

View File

@@ -218,27 +218,35 @@ class GenerateImagePromptsFunction(BaseAIFunction):
# Helper methods
def _get_max_in_article_images(self, account) -> int:
"""Get max_in_article_images from AWS account IntegrationSettings only"""
"""
Get max_in_article_images from settings.
Tries aws-admin IntegrationSettings first, falls back to GlobalIntegrationSettings.
"""
from igny8_core.modules.system.models import IntegrationSettings
from igny8_core.modules.system.global_settings_models import GlobalIntegrationSettings
from igny8_core.auth.models import Account
# Only use system account (aws-admin) settings
system_account = Account.objects.get(slug='aws-admin')
settings = IntegrationSettings.objects.get(
account=system_account,
integration_type='image_generation',
is_active=True
)
max_images = settings.config.get('max_in_article_images')
if max_images is None:
raise ValueError(
"max_in_article_images not configured in aws-admin image_generation settings. "
"Please set this value in the Integration Settings page."
# Try aws-admin IntegrationSettings first (legacy pattern)
try:
system_account = Account.objects.get(slug='aws-admin')
settings = IntegrationSettings.objects.get(
account=system_account,
integration_type='image_generation',
is_active=True
)
max_images = settings.config.get('max_in_article_images')
if max_images is not None:
max_images = int(max_images)
logger.info(f"Using max_in_article_images={max_images} from aws-admin IntegrationSettings")
return max_images
except (Account.DoesNotExist, IntegrationSettings.DoesNotExist):
logger.debug("aws-admin IntegrationSettings not found, falling back to GlobalIntegrationSettings")
max_images = int(max_images)
logger.info(f"Using max_in_article_images={max_images} from aws-admin account")
# Fall back to GlobalIntegrationSettings
global_settings = GlobalIntegrationSettings.get_instance()
max_images = global_settings.max_in_article_images
logger.info(f"Using max_in_article_images={max_images} from GlobalIntegrationSettings")
return max_images
def _extract_content_elements(self, content: Content, max_images: int) -> Dict:

View File

@@ -67,32 +67,42 @@ class GenerateImagesFunction(BaseAIFunction):
if not tasks:
raise ValueError("No tasks found")
# Get image generation settings from aws-admin account only (global settings)
# Get image generation settings
# Try aws-admin IntegrationSettings first (legacy), fall back to GlobalIntegrationSettings
from igny8_core.modules.system.models import IntegrationSettings
from igny8_core.modules.system.global_settings_models import GlobalIntegrationSettings
from igny8_core.auth.models import Account
system_account = Account.objects.get(slug='aws-admin')
integration = IntegrationSettings.objects.get(
account=system_account,
integration_type='image_generation',
is_active=True
)
image_settings = integration.config or {}
image_settings = {}
try:
system_account = Account.objects.get(slug='aws-admin')
integration = IntegrationSettings.objects.get(
account=system_account,
integration_type='image_generation',
is_active=True
)
image_settings = integration.config or {}
logger.info("Using image settings from aws-admin IntegrationSettings")
except (Account.DoesNotExist, IntegrationSettings.DoesNotExist):
logger.info("aws-admin IntegrationSettings not found, using GlobalIntegrationSettings")
# Extract settings with defaults
provider = image_settings.get('provider') or image_settings.get('service', 'openai')
# Fall back to GlobalIntegrationSettings for missing values
global_settings = GlobalIntegrationSettings.get_instance()
# Extract settings with defaults from global settings
provider = image_settings.get('provider') or image_settings.get('service') or global_settings.default_image_service
if provider == 'runware':
model = image_settings.get('model') or image_settings.get('runwareModel', 'runware:97@1')
model = image_settings.get('model') or image_settings.get('runwareModel') or global_settings.runware_model
else:
model = image_settings.get('model', 'dall-e-3')
model = image_settings.get('model') or global_settings.dalle_model
return {
'tasks': tasks,
'account': account,
'provider': provider,
'model': model,
'image_type': image_settings.get('image_type', 'realistic'),
'max_in_article_images': int(image_settings.get('max_in_article_images')),
'image_type': image_settings.get('image_type') or global_settings.image_style,
'max_in_article_images': int(image_settings.get('max_in_article_images') or global_settings.max_in_article_images),
'desktop_enabled': image_settings.get('desktop_enabled', True),
'mobile_enabled': image_settings.get('mobile_enabled', True),
}