import logging import sys import traceback import os # Configure basic logging for the orchestration script logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') def run_step(step_func, step_name): """Runs a step and logs its success or failure.""" logging.info(f"--- Starting step: {step_name} ---") try: step_func() logging.info(f"--- Finished step: {step_name} successfully ---") return True except Exception as e: logging.error(f"--- Step failed: {step_name} ---") logging.error(f"Error: {e}") # Log the full traceback for detailed debugging logging.error(traceback.format_exc()) return False def main(): """Runs the daily update sequence.""" # --- Add script directory to Python path --- script_dir = os.path.dirname(os.path.abspath(__file__)) if script_dir not in sys.path: sys.path.append(script_dir) logging.info(f"Added {script_dir} to sys.path for local imports.") # --- logging.info("=== Starting Daily Model Update Process ===") all_steps_succeeded = True # --- Step 1: Fetch new/updated model descriptions --- try: # Import the script's main function dynamically from huggingface_model_descriptions import main as fetch_models_main if not run_step(fetch_models_main, "Fetch Hugging Face Models"): all_steps_succeeded = False # Decide if we should continue if fetching fails (maybe index can still be built?) # For now, let's stop if the first step fails. logging.error("Stopping update process for this cycle due to failure in fetching models.") return # Exit the main function for this cycle except ImportError: logging.error("Failed to import huggingface_model_descriptions.py. Ensure it's in the same directory or Python path.") all_steps_succeeded = False return # Exit the main function for this cycle except Exception as e: # Catch any unexpected error during import/setup logging.error(f"Unexpected error setting up model fetching step: {e}") logging.error(traceback.format_exc()) all_steps_succeeded = False return # Exit the main function for this cycle # --- Step 2: Add explanations using Gemini --- # Only proceed if the previous step was successful if all_steps_succeeded: try: from add_model_explanations import main as add_explanations_main # Check for API key *before* running the step if not os.getenv("GEMINI_API_KEY"): logging.warning("GEMINI_API_KEY environment variable not set. Explanation step will fail or do nothing.") # Optionally, you could skip this step entirely if the key is missing: # logging.warning("Skipping explanation generation step.") # pass # Move to the next step if not run_step(add_explanations_main, "Generate Model Explanations (Gemini)"): all_steps_succeeded = False # Decide if index building should proceed if explanations fail logging.warning("Explanation generation failed. Index will be built with potentially missing explanations.") # We will continue to the next step in this case except ImportError: logging.error("Failed to import add_model_explanations.py. Ensure it's in the same directory or Python path.") all_steps_succeeded = False # Stop if explanation script is missing return # Exit the main function for this cycle except Exception as e: # Catch any unexpected error during import/setup logging.error(f"Unexpected error setting up explanation generation step: {e}") logging.error(traceback.format_exc()) all_steps_succeeded = False return # Exit the main function for this cycle # --- Step 3: Rebuild the search index --- # Only proceed if fetching models (Step 1) succeeded. Allow proceeding if Step 2 failed. if 'fetch_models_main' in locals() or 'fetch_models_main' in globals(): # Check if Step 1 setup occurred try: from build_index import main as build_index_main if not run_step(build_index_main, "Build Search Index (FAISS)"): all_steps_succeeded = False logging.error("Index building failed. The search index may be outdated or corrupted.") # Stop if index building fails return # Exit the main function for this cycle except ImportError: logging.error("Failed to import build_index.py. Ensure it's in the same directory or Python path.") all_steps_succeeded = False return # Exit the main function for this cycle except Exception as e: # Catch any unexpected error during import/setup logging.error(f"Unexpected error setting up index building step: {e}") logging.error(traceback.format_exc()) all_steps_succeeded = False return # Exit the main function for this cycle logging.info("===========================================") if all_steps_succeeded: logging.info("=== Daily Model Update Process Completed Successfully ===") else: logging.error("=== Daily Model Update Process Completed with Errors ===") if __name__ == "__main__": main()