diff --git a/backend/igny8_core/ai/ai_core.py b/backend/igny8_core/ai/ai_core.py index f8f17e4f..f76f3e6b 100644 --- a/backend/igny8_core/ai/ai_core.py +++ b/backend/igny8_core/ai/ai_core.py @@ -58,8 +58,17 @@ class AICore: if openai_settings and openai_settings.config: self._openai_api_key = openai_settings.config.get('apiKey') model = openai_settings.config.get('model') - if model and model in MODEL_RATES: - self._default_model = model + if model: + if model in MODEL_RATES: + self._default_model = model + logger.info(f"Loaded model '{model}' from IntegrationSettings for account {self.account.id}") + else: + error_msg = f"Model '{model}' from IntegrationSettings is not in supported models list. Supported models: {list(MODEL_RATES.keys())}" + logger.error(f"[AICore] {error_msg}") + logger.error(f"[AICore] Account {self.account.id} has invalid model configuration. Please update Integration Settings.") + # Don't set _default_model, will fall back to Django settings + else: + logger.warning(f"No model configured in IntegrationSettings for account {self.account.id}, will use fallback") # Load Runware settings runware_settings = IntegrationSettings.objects.filter( @@ -148,6 +157,38 @@ class AICore: # Step 2: Determine model active_model = model or self._default_model + + # Validate model is available and supported + if not active_model: + error_msg = 'No AI model configured. Please configure a model in Integration Settings or Django settings.' + logger.error(f"[AICore] {error_msg}") + tracker.error('ConfigurationError', error_msg) + return { + 'content': None, + 'error': error_msg, + 'input_tokens': 0, + 'output_tokens': 0, + 'total_tokens': 0, + 'model': None, + 'cost': 0.0, + 'api_id': None, + } + + if active_model not in MODEL_RATES: + error_msg = f"Model '{active_model}' is not supported. Supported models: {list(MODEL_RATES.keys())}" + logger.error(f"[AICore] {error_msg}") + tracker.error('ConfigurationError', error_msg) + return { + 'content': None, + 'error': error_msg, + 'input_tokens': 0, + 'output_tokens': 0, + 'total_tokens': 0, + 'model': active_model, + 'cost': 0.0, + 'api_id': None, + } + tracker.ai_call(f"Using model: {active_model}") # Step 3: Auto-enable JSON mode for supported models diff --git a/frontend/src/hooks/useProgressModal.ts b/frontend/src/hooks/useProgressModal.ts index 0e7645a7..9f512de1 100644 --- a/frontend/src/hooks/useProgressModal.ts +++ b/frontend/src/hooks/useProgressModal.ts @@ -232,6 +232,57 @@ export function useProgressModal(): UseProgressModalReturn { `/v1/system/settings/task_progress/${taskId}/` ); + // Helper function to start auto-increment progress (1% every 300ms until 80%) + const startAutoIncrement = () => { + // Clear any existing auto-increment interval + if (autoIncrementIntervalRef.current) { + clearInterval(autoIncrementIntervalRef.current); + autoIncrementIntervalRef.current = null; + } + + // Only start if we're below 80% + if (displayedPercentageRef.current < 80) { + autoIncrementIntervalRef.current = setInterval(() => { + setProgress(prev => { + // Check current status - stop if not processing + if (prev.status !== 'processing') { + if (autoIncrementIntervalRef.current) { + clearInterval(autoIncrementIntervalRef.current); + autoIncrementIntervalRef.current = null; + } + return prev; + } + + const current = displayedPercentageRef.current; + if (current < 80) { + const newPercentage = Math.min(current + 1, 80); + displayedPercentageRef.current = newPercentage; + + // Stop if we've reached 80% + if (newPercentage >= 80) { + if (autoIncrementIntervalRef.current) { + clearInterval(autoIncrementIntervalRef.current); + autoIncrementIntervalRef.current = null; + } + } + + return { + ...prev, + percentage: newPercentage, + }; + } else { + // Stop if we've reached 80% + if (autoIncrementIntervalRef.current) { + clearInterval(autoIncrementIntervalRef.current); + autoIncrementIntervalRef.current = null; + } + return prev; + } + }); + }, 300); + } + }; + if (response.state === 'PROGRESS') { const meta = response.meta || {}; @@ -404,57 +455,6 @@ export function useProgressModal(): UseProgressModalReturn { startAutoIncrement(); } - // Helper function to start auto-increment progress (1% every 300ms until 80%) - const startAutoIncrement = () => { - // Clear any existing auto-increment interval - if (autoIncrementIntervalRef.current) { - clearInterval(autoIncrementIntervalRef.current); - autoIncrementIntervalRef.current = null; - } - - // Only start if we're below 80% - if (displayedPercentageRef.current < 80) { - autoIncrementIntervalRef.current = setInterval(() => { - setProgress(prev => { - // Check current status - stop if not processing - if (prev.status !== 'processing') { - if (autoIncrementIntervalRef.current) { - clearInterval(autoIncrementIntervalRef.current); - autoIncrementIntervalRef.current = null; - } - return prev; - } - - const current = displayedPercentageRef.current; - if (current < 80) { - const newPercentage = Math.min(current + 1, 80); - displayedPercentageRef.current = newPercentage; - - // Stop if we've reached 80% - if (newPercentage >= 80) { - if (autoIncrementIntervalRef.current) { - clearInterval(autoIncrementIntervalRef.current); - autoIncrementIntervalRef.current = null; - } - } - - return { - ...prev, - percentage: newPercentage, - }; - } else { - // Stop if we've reached 80% - if (autoIncrementIntervalRef.current) { - clearInterval(autoIncrementIntervalRef.current); - autoIncrementIntervalRef.current = null; - } - return prev; - } - }); - }, 300); - } - }; - // Update step logs if available if (meta.request_steps || meta.response_steps) { // Collect all steps for display in modal