# FILE: config.py # (Corrected and complete version with all constants) import os import dspy import logging from dotenv import load_dotenv from dspy_llm_wrapper import SyncCustomGeminiDspyLM # Load environment variables from a .env file load_dotenv() # Setup basic logging logging.basicConfig(level=logging.INFO, format='{levelname} {asctime} {name}: {message}', style='{') logger = logging.getLogger(__name__) API_KEY = os.environ.get("GOOGLE_API_KEY") def initialize_dspy(): """Configures and returns the DSPy Language Model instance.""" if not API_KEY: logger.error("FATAL: GOOGLE_API_KEY not found. Cannot initialize DSPy.") return None try: LITELLM_MODEL_STRING = "gemini/gemini-2.5-flash-preview-04-17" custom_lm = SyncCustomGeminiDspyLM( model=LITELLM_MODEL_STRING, api_key=API_KEY, temperature=0.7, ) dspy.settings.configure(lm=custom_lm) logger.info(f"DSPy configured globally with model: {LITELLM_MODEL_STRING}") return custom_lm except Exception as e: logger.error(f"Fatal error configuring DSPy: {e}") return None # --- Application Constants --- # State Keys for managing the conversation state STATE_STAGE = "stage" STATE_HISTORY = "conversation_history" STATE_FINAL_SYLLABUS = "final_syllabus_xml" STATE_EXPLAINER_PROMPT = "explainer_system_prompt" STATE_EXPLANATION_START_INDEX = "explanation_start_index" STATE_CURRENT_TITLE = "current_title" # <-- ADDED STATE_GENERATED_TITLE = "generated_title" # <-- ADDED STATE_RESOURCE_SUMMARY_OVERVIEW = "resource_summary_overview_for_manager" STATE_RESOURCE_TYPE_FOR_SYLLABUS = "resource_type_for_syllabus_gen" STATE_RESOURCE_CONTENT_JSON_FOR_SYLLABUS = "resource_content_json_for_syllabus_gen" # Flag Keys for UI updates STATE_DISPLAY_SYLLABUS_FLAG = "display_syllabus_flag" STATE_TRANSITION_EXPLAINER_FLAG = "transition_to_explainer_flag" # Stage Names STAGE_START = "START" STAGE_NEGOTIATING = "NEGOTIATING" STAGE_EXPLAINING = "EXPLAINING" STAGE_ERROR = "ERROR" STATE_UPLOADED_FILENAMES = "uploaded_filenames_list" # Chat Logic Constants DEFAULT_CHAT_TITLE = "New Chat" # <-- ADDED TITLE_GENERATION_THRESHOLD = 4 # <-- ADDED TITLE_MAX_HISTORY_SNIPPET_FOR_TITLE = 6 # <-- ADDED