From d71a044a3c78e191f55d9ceccac4c011d7faea9a Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Mon, 23 Mar 2026 15:33:54 +0000 Subject: [PATCH] Fix model config alignment and improve error messaging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace sys.exit(1) with ValueError in _validate_models() — prevents killing the worker process on invalid model keys - ModelConfiguration now reads defaults from core.config instead of hardcoding model keys - Fix .env: google-gemini20 → google-gemini31 (align with MODEL_MAPPINGS) - Improve "No data extracted" error message to explain the document must be a marketing brief Co-Authored-By: Claude Sonnet 4.6 --- backend/core/process_brief_enhanced.py | 10 ++++------ backend/server/jobs/models.py | 20 ++++++++++++++++---- backend/server/runners/job_runner.py | 9 ++++++++- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/backend/core/process_brief_enhanced.py b/backend/core/process_brief_enhanced.py index 80e5f9c..f249709 100755 --- a/backend/core/process_brief_enhanced.py +++ b/backend/core/process_brief_enhanced.py @@ -439,13 +439,11 @@ class DocumentAnalyzer: # Validate primary models for model in self.primary_models: if model not in valid_models: - logging.error(f"Invalid primary model: {model}. Available: {valid_models}") - sys.exit(1) - - # Validate consolidation model + raise ValueError(f"Invalid primary model: {model}. Available: {valid_models}") + + # Validate consolidation model if self.consolidation_model not in valid_models: - logging.error(f"Invalid consolidation model: {self.consolidation_model}. Available: {valid_models}") - sys.exit(1) + raise ValueError(f"Invalid consolidation model: {self.consolidation_model}. Available: {valid_models}") # Validate API keys api_key_status = config.validate_api_keys() diff --git a/backend/server/jobs/models.py b/backend/server/jobs/models.py index f2bc3d0..98a2b56 100755 --- a/backend/server/jobs/models.py +++ b/backend/server/jobs/models.py @@ -8,6 +8,20 @@ from enum import Enum from typing import Dict, List, Optional, Any import uuid +def _default_primary_models() -> List[str]: + try: + from core.config import config + return config.get_default_primary_models() + except Exception: + return ['anthropic-sonnet45', 'google-gemini31'] + +def _default_consolidation_model() -> str: + try: + from core.config import config + return config.DEFAULT_CONSOLIDATION_MODEL + except Exception: + return 'anthropic-sonnet45' + class JobPhase(Enum): """Processing phases for a job""" QUEUED = "QUEUED" @@ -116,10 +130,8 @@ class ModelInfo: @dataclass class ModelConfiguration: """Model selection configuration for a job""" - primary_models: List[str] = field(default_factory=lambda: [ - 'openai-gpt51', 'anthropic-sonnet45', 'google-gemini31' - ]) - consolidation_model: str = 'openai-gpt51' + primary_models: List[str] = field(default_factory=_default_primary_models) + consolidation_model: str = field(default_factory=_default_consolidation_model) minimum_success_threshold: int = 1 def to_dict(self) -> Dict[str, Any]: diff --git a/backend/server/runners/job_runner.py b/backend/server/runners/job_runner.py index d2afef7..02ccc2a 100755 --- a/backend/server/runners/job_runner.py +++ b/backend/server/runners/job_runner.py @@ -58,7 +58,14 @@ async def run_job(job: Job, ws_manager: WebSocketManager) -> bool: result = await analyzer.process_document_multi_model(job.upload_path, progress) if not result.raw_data: - error_msg = "No data extracted from document" + notes = "; ".join(result.processing_notes) if result.processing_notes else "" + error_msg = ( + "No marketing deliverables found in this document. " + "Please ensure you upload a marketing brief (PDF, PPTX, DOCX, or XLSX) " + "containing campaign assets or deliverables." + ) + if notes: + error_msg += f" (Details: {notes})" await progress.emit_failure(error_msg) return False