diff --git a/backend/igny8_core/ai/base.py b/backend/igny8_core/ai/base.py index 0ac5ca32..20f79613 100644 --- a/backend/igny8_core/ai/base.py +++ b/backend/igny8_core/ai/base.py @@ -34,16 +34,14 @@ class BaseAIFunction(ABC): def validate(self, payload: dict, account=None) -> Dict[str, Any]: """ Validate input payload. - Default: checks for 'ids' array, max_items limit. + Default: checks for 'ids' array. Override for custom validation. """ ids = payload.get('ids', []) if not ids: return {'valid': False, 'error': 'No IDs provided'} - max_items = self.get_max_items() - if max_items and len(ids) > max_items: - return {'valid': False, 'error': f'Maximum {max_items} items allowed'} + # Removed max_items limit check - no limits enforced return {'valid': True} diff --git a/backend/igny8_core/ai/functions/auto_cluster.py b/backend/igny8_core/ai/functions/auto_cluster.py index 012c90f7..46b2b861 100644 --- a/backend/igny8_core/ai/functions/auto_cluster.py +++ b/backend/igny8_core/ai/functions/auto_cluster.py @@ -34,14 +34,15 @@ class AutoClusterFunction(BaseAIFunction): } def get_max_items(self) -> int: - return 20 + # No limit - return None + return None def validate(self, payload: dict, account=None) -> Dict: - """Custom validation for clustering with plan limit checks""" - from igny8_core.ai.validators import validate_ids, validate_keywords_exist, validate_cluster_limits + """Custom validation for clustering""" + from igny8_core.ai.validators import validate_ids, validate_keywords_exist - # Base validation - result = validate_ids(payload, max_items=self.get_max_items()) + # Base validation (no max_items limit) + result = validate_ids(payload, max_items=None) if not result['valid']: return result @@ -51,10 +52,7 @@ class AutoClusterFunction(BaseAIFunction): if not keywords_result['valid']: return keywords_result - # Check plan limits - limit_result = validate_cluster_limits(account, operation_type='cluster') - if not limit_result['valid']: - return limit_result + # Removed plan limits check return {'valid': True} diff --git a/backend/igny8_core/ai/functions/generate_content.py b/backend/igny8_core/ai/functions/generate_content.py index 4cbc92b3..1d0f3db9 100644 --- a/backend/igny8_core/ai/functions/generate_content.py +++ b/backend/igny8_core/ai/functions/generate_content.py @@ -37,7 +37,8 @@ class GenerateContentFunction(BaseAIFunction): } def get_max_items(self) -> int: - return 50 # Max tasks per batch + # No limit - return None + return None def validate(self, payload: dict, account=None) -> Dict: """Validate task IDs""" diff --git a/backend/igny8_core/ai/functions/generate_ideas.py b/backend/igny8_core/ai/functions/generate_ideas.py index a56cf976..e973d6e0 100644 --- a/backend/igny8_core/ai/functions/generate_ideas.py +++ b/backend/igny8_core/ai/functions/generate_ideas.py @@ -9,7 +9,7 @@ from django.db import transaction from igny8_core.ai.base import BaseAIFunction from igny8_core.modules.planner.models import Clusters, ContentIdeas from igny8_core.ai.ai_core import AICore -from igny8_core.ai.validators import validate_cluster_exists, validate_cluster_limits +from igny8_core.ai.validators import validate_cluster_exists from igny8_core.ai.tracker import ConsoleStepTracker from igny8_core.ai.prompts import PromptRegistry from igny8_core.ai.settings import get_model_config @@ -38,10 +38,11 @@ class GenerateIdeasFunction(BaseAIFunction): } def get_max_items(self) -> int: - return 10 # Max clusters per idea generation + # No limit - return None + return None def validate(self, payload: dict, account=None) -> Dict: - """Validate cluster IDs and plan limits""" + """Validate cluster IDs""" result = super().validate(payload, account) if not result['valid']: return result @@ -54,10 +55,7 @@ class GenerateIdeasFunction(BaseAIFunction): if not cluster_result['valid']: return cluster_result - # Check plan limits - limit_result = validate_cluster_limits(account, operation_type='idea') - if not limit_result['valid']: - return limit_result + # Removed plan limits check return {'valid': True} diff --git a/backend/igny8_core/ai/functions/generate_images.py b/backend/igny8_core/ai/functions/generate_images.py index 5849a083..5c394e2e 100644 --- a/backend/igny8_core/ai/functions/generate_images.py +++ b/backend/igny8_core/ai/functions/generate_images.py @@ -36,7 +36,8 @@ class GenerateImagesFunction(BaseAIFunction): } def get_max_items(self) -> int: - return 20 # Max tasks per batch + # No limit - return None + return None def validate(self, payload: dict, account=None) -> Dict: """Validate task IDs""" diff --git a/backend/igny8_core/ai/validators.py b/backend/igny8_core/ai/validators.py index 8b64680a..d04f7b6d 100644 --- a/backend/igny8_core/ai/validators.py +++ b/backend/igny8_core/ai/validators.py @@ -10,11 +10,11 @@ logger = logging.getLogger(__name__) def validate_ids(payload: dict, max_items: Optional[int] = None) -> Dict[str, Any]: """ - Base validation: checks for 'ids' array and max_items limit. + Base validation: checks for 'ids' array. Args: payload: Request payload containing 'ids' array - max_items: Maximum number of items allowed (None = no limit) + max_items: Maximum number of items allowed (deprecated - no longer enforced) Returns: Dict with 'valid' (bool) and optional 'error' (str) @@ -23,8 +23,7 @@ def validate_ids(payload: dict, max_items: Optional[int] = None) -> Dict[str, An if not ids: return {'valid': False, 'error': 'No IDs provided'} - if max_items and len(ids) > max_items: - return {'valid': False, 'error': f'Maximum {max_items} items allowed'} + # Removed max_items limit check - no limits enforced return {'valid': True} @@ -55,46 +54,16 @@ def validate_keywords_exist(ids: list, account=None) -> Dict[str, Any]: def validate_cluster_limits(account, operation_type: str = 'cluster') -> Dict[str, Any]: """ Validate plan limits for cluster operations. + DISABLED: All limits have been removed. Args: account: Account object operation_type: Type of operation ('cluster', 'idea', etc.) Returns: - Dict with 'valid' (bool) and optional 'error' (str) + Dict with 'valid' (bool) - always returns valid """ - if not account: - return {'valid': False, 'error': 'Account is required'} - - plan = getattr(account, 'plan', None) - if not plan: - return {'valid': False, 'error': 'Account does not have an active plan'} - - if operation_type == 'cluster': - from igny8_core.modules.planner.models import Clusters - - # Check daily cluster limit - now = timezone.now() - start_of_day = now.replace(hour=0, minute=0, second=0, microsecond=0) - clusters_today = Clusters.objects.filter( - account=account, - created_at__gte=start_of_day - ).count() - - if plan.daily_cluster_limit and clusters_today >= plan.daily_cluster_limit: - return { - 'valid': False, - 'error': f'Daily cluster limit reached ({plan.daily_cluster_limit} clusters per day). Please try again tomorrow.' - } - - # Check max clusters limit - total_clusters = Clusters.objects.filter(account=account).count() - if plan.max_clusters and total_clusters >= plan.max_clusters: - return { - 'valid': False, - 'error': f'Maximum cluster limit reached ({plan.max_clusters} clusters). Please upgrade your plan or delete existing clusters.' - } - + # All limits removed - always return valid return {'valid': True}