From 69d58d8befd0b4e8c9a3d6d4485996c317cd7c74 Mon Sep 17 00:00:00 2001 From: alorig <220087330+alorig@users.noreply.github.com> Date: Sun, 9 Nov 2025 23:10:10 +0500 Subject: [PATCH] 4 --- .../igny8_core/ai/functions/auto_cluster.py | 6 ++++ backend/igny8_core/ai/prompts.py | 30 ++++++++++++------- backend/igny8_core/modules/planner/tasks.py | 24 +++++++++++++-- backend/igny8_core/utils/ai_processor.py | 9 +++++- 4 files changed, 54 insertions(+), 15 deletions(-) diff --git a/backend/igny8_core/ai/functions/auto_cluster.py b/backend/igny8_core/ai/functions/auto_cluster.py index a31618f7..012c90f7 100644 --- a/backend/igny8_core/ai/functions/auto_cluster.py +++ b/backend/igny8_core/ai/functions/auto_cluster.py @@ -121,6 +121,12 @@ class AutoClusterFunction(BaseAIFunction): context=context ) + # Verify placeholder replacement + if '[IGNY8_KEYWORDS]' in prompt: + logger.error(f"[IGNY8_KEYWORDS] placeholder NOT replaced! Prompt length: {len(prompt)}") + else: + logger.info(f"Prompt placeholder replaced successfully. Prompt length: {len(prompt)}, Keywords text length: {len(keywords_text)}") + # IMPORTANT: When using JSON mode, OpenAI requires explicit JSON instruction # The prompt template already includes "Format the output as a JSON object" # but we need to ensure it's explicit for JSON mode compliance diff --git a/backend/igny8_core/ai/prompts.py b/backend/igny8_core/ai/prompts.py index f9981559..e4987068 100644 --- a/backend/igny8_core/ai/prompts.py +++ b/backend/igny8_core/ai/prompts.py @@ -195,6 +195,16 @@ Make sure each prompt is detailed enough for image generation, describing the vi if not context: return prompt_template + rendered = prompt_template + + # Step 1: Replace [IGNY8_*] placeholders first (always do this) + for key, value in context.items(): + placeholder = f'[IGNY8_{key.upper()}]' + if placeholder in rendered: + rendered = rendered.replace(placeholder, str(value)) + logger.debug(f"Replaced placeholder {placeholder} with {len(str(value))} characters") + + # Step 2: Try .format() style for {variable} placeholders (if any remain) # Normalize context keys - convert UPPER to lowercase for .format() normalized_context = {} for key, value in context.items(): @@ -202,17 +212,15 @@ Make sure each prompt is detailed enough for image generation, describing the vi normalized_context[key] = value normalized_context[key.lower()] = value - # Try .format() style first (for {variable} placeholders) - try: - return prompt_template.format(**normalized_context) - except (KeyError, ValueError): - # Fall back to simple string replacement for [IGNY8_*] placeholders - rendered = prompt_template - for key, value in context.items(): - placeholder = f'[IGNY8_{key.upper()}]' - if placeholder in rendered: - rendered = rendered.replace(placeholder, str(value)) - return rendered + # Only try .format() if there are {variable} placeholders + if '{' in rendered and '}' in rendered: + try: + rendered = rendered.format(**normalized_context) + except (KeyError, ValueError) as e: + # If .format() fails, log warning but keep the [IGNY8_*] replacements + logger.warning(f"Failed to format prompt with .format(): {e}. Using [IGNY8_*] replacements only.") + + return rendered @classmethod def get_image_prompt_template(cls, account: Optional[Any] = None) -> str: diff --git a/backend/igny8_core/modules/planner/tasks.py b/backend/igny8_core/modules/planner/tasks.py index 49c4a0c0..9a31aff7 100644 --- a/backend/igny8_core/modules/planner/tasks.py +++ b/backend/igny8_core/modules/planner/tasks.py @@ -25,9 +25,19 @@ except ImportError: return decorator +# ============================================================================ +# DEPRECATED: This function is deprecated. Use the new AI framework instead. +# New path: views.py -> run_ai_task -> AIEngine -> AutoClusterFunction +# This function is kept for backward compatibility but should not be used. +# ============================================================================ def _auto_cluster_keywords_core(keyword_ids: List[int], sector_id: int = None, account_id: int = None, progress_callback=None): """ - Core logic for clustering keywords. Can be called with or without Celery. + [DEPRECATED] Core logic for clustering keywords. Can be called with or without Celery. + + ⚠️ WARNING: This function is deprecated. Use the new AI framework instead: + - New path: views.py -> run_ai_task -> AIEngine -> AutoClusterFunction + - This function uses the old AIProcessor and does not use PromptRegistry + - Console logging may not work correctly in this path Args: keyword_ids: List of keyword IDs to cluster @@ -634,10 +644,18 @@ def _auto_cluster_keywords_core(keyword_ids: List[int], sector_id: int = None, a @shared_task(bind=True, max_retries=3) +# ============================================================================ +# DEPRECATED: This Celery task is deprecated. Use run_ai_task instead. +# New path: views.py -> run_ai_task -> AIEngine -> AutoClusterFunction +# ============================================================================ def auto_cluster_keywords_task(self, keyword_ids: List[int], sector_id: int = None, account_id: int = None): """ - Celery task wrapper for clustering keywords using AI. - Calls the core function with progress callback. + [DEPRECATED] Celery task wrapper for clustering keywords using AI. + + ⚠️ WARNING: This task is deprecated. Use the new AI framework instead: + - New path: views.py -> run_ai_task -> AIEngine -> AutoClusterFunction + - This task uses the old _auto_cluster_keywords_core function + - Console logging may not work correctly in this path Args: keyword_ids: List of keyword IDs to cluster diff --git a/backend/igny8_core/utils/ai_processor.py b/backend/igny8_core/utils/ai_processor.py index 5e53a686..4d01a2f0 100644 --- a/backend/igny8_core/utils/ai_processor.py +++ b/backend/igny8_core/utils/ai_processor.py @@ -1053,7 +1053,13 @@ Make sure each prompt is detailed enough for image generation, describing the vi **kwargs ) -> Dict[str, Any]: """ - Cluster keywords using AI-based semantic similarity. + [DEPRECATED] Cluster keywords using AI-based semantic similarity. + + ⚠️ WARNING: This method is deprecated. Use the new AI framework instead: + - New path: views.py -> run_ai_task -> AIEngine -> AutoClusterFunction + - This method uses the old prompt system and does not use PromptRegistry + - Console logging may not work correctly in this path + Based on reference plugin's clustering prompt. Args: @@ -1064,6 +1070,7 @@ Make sure each prompt is detailed enough for image generation, describing the vi Returns: Dict with 'clusters' (list of cluster dicts with name, description, keywords) """ + logger.warning("AIProcessor.cluster_keywords is deprecated. Use the new AI framework (AutoClusterFunction) instead.") if not keywords: return { 'clusters': [],