| | import os |
| | import sys |
| | import re |
| | import logging |
| | from typing import Optional, Tuple |
| |
|
| | try: |
| | from sqlalchemy import text as sa_text |
| | except Exception: |
| | sa_text = None |
| |
|
| | try: |
| | |
| | from langchain_community.agent_toolkits import create_sql_agent |
| | from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit |
| | from langchain_community.utilities import SQLDatabase |
| | from langchain_google_genai import ChatGoogleGenerativeAI |
| | from langchain.agents.agent_types import AgentType |
| | from langchain.memory import ConversationBufferWindowMemory |
| | from langchain_core.messages import AIMessage, HumanMessage, SystemMessage |
| | import pymysql |
| | from dotenv import load_dotenv |
| | |
| | DEPENDENCIES_AVAILABLE = True |
| | except ImportError as e: |
| | logging.warning(f"Some dependencies are not available: {e}") |
| | DEPENDENCIES_AVAILABLE = False |
| |
|
| | |
| | logging.basicConfig(level=logging.INFO) |
| | logger = logging.getLogger(__name__) |
| |
|
| | def check_environment(): |
| | """Verifica si el entorno est谩 configurado correctamente.""" |
| | if not DEPENDENCIES_AVAILABLE: |
| | return False, "Missing required Python packages. Please install them with: pip install -r requirements.txt" |
| | |
| | |
| | required_vars = ["DB_USER", "DB_PASSWORD", "DB_HOST", "DB_NAME", "GOOGLE_API_KEY"] |
| | missing_vars = [var for var in required_vars if not os.getenv(var)] |
| | |
| | if missing_vars: |
| | return False, f"Missing required environment variables: {', '.join(missing_vars)}" |
| | |
| | return True, "Environment is properly configured" |
| |
|
| | def setup_database_connection(): |
| | """Intenta establecer una conexi贸n a la base de datos.""" |
| | if not DEPENDENCIES_AVAILABLE: |
| | return None, "Dependencies not available" |
| | |
| | try: |
| | load_dotenv(override=True) |
| | |
| | db_user = os.getenv("DB_USER") |
| | db_password = os.getenv("DB_PASSWORD") |
| | db_host = os.getenv("DB_HOST") |
| | db_name = os.getenv("DB_NAME") |
| | |
| | if not all([db_user, db_password, db_host, db_name]): |
| | missing = [var for var, val in [ |
| | ("DB_USER", db_user), |
| | ("DB_PASSWORD", "*" if db_password else ""), |
| | ("DB_HOST", db_host), |
| | ("DB_NAME", db_name) |
| | ] if not val] |
| | logger.error(f"Missing required database configuration: {', '.join(missing)}") |
| | return None, f"Missing database configuration: {', '.join(missing)}" |
| | |
| | logger.info(f"Connecting to database: {db_user}@{db_host}/{db_name}") |
| | |
| | |
| | connection = pymysql.connect( |
| | host=db_host, |
| | user=db_user, |
| | password=db_password, |
| | database=db_name, |
| | connect_timeout=5, |
| | cursorclass=pymysql.cursors.DictCursor |
| | ) |
| | connection.close() |
| | |
| | |
| | db_uri = f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}" |
| | logger.info("Database connection successful") |
| | return SQLDatabase.from_uri(db_uri), "" |
| | |
| | except Exception as e: |
| | error_msg = f"Error connecting to database: {str(e)}" |
| | logger.error(error_msg) |
| | return None, error_msg |
| |
|
| | def initialize_llm(): |
| | """Inicializa el modelo de lenguaje.""" |
| | if not DEPENDENCIES_AVAILABLE: |
| | error_msg = "Dependencies not available. Make sure all required packages are installed." |
| | logger.error(error_msg) |
| | return None, error_msg |
| | |
| | google_api_key = os.getenv("GOOGLE_API_KEY") |
| | logger.info(f"GOOGLE_API_KEY found: {'Yes' if google_api_key else 'No'}") |
| | |
| | if not google_api_key: |
| | error_msg = "GOOGLE_API_KEY not found in environment variables. Please check your Hugging Face Space secrets." |
| | logger.error(error_msg) |
| | return None, error_msg |
| | |
| | try: |
| | logger.info("Initializing Google Generative AI...") |
| | llm = ChatGoogleGenerativeAI( |
| | model="gemini-2.0-flash", |
| | temperature=0, |
| | google_api_key=google_api_key, |
| | convert_system_message_to_human=True |
| | ) |
| | |
| | |
| | test_prompt = "Hello, this is a test." |
| | logger.info(f"Testing model with prompt: {test_prompt}") |
| | test_response = llm.invoke(test_prompt) |
| | logger.info(f"Model test response: {str(test_response)[:100]}...") |
| | |
| | logger.info("Google Generative AI initialized successfully") |
| | return llm, "" |
| | |
| | except Exception as e: |
| | error_msg = f"Error initializing Google Generative AI: {str(e)}" |
| | logger.error(error_msg, exc_info=True) |
| | return None, error_msg |
| |
|
| | def create_agent(llm, db_connection): |
| | """Create and return a SQL database agent with conversation memory.""" |
| | if not llm: |
| | error_msg = "Cannot create agent: LLM is not available" |
| | logger.error(error_msg) |
| | return None, error_msg |
| | |
| | if not db_connection: |
| | error_msg = "Cannot create agent: Database connection is not available" |
| | logger.error(error_msg) |
| | return None, error_msg |
| | |
| | try: |
| | logger.info("Creating SQL agent with memory...") |
| | |
| | |
| | memory = ConversationBufferWindowMemory( |
| | memory_key="chat_history", |
| | k=5, |
| | return_messages=True, |
| | output_key="output" |
| | ) |
| | |
| | |
| | toolkit = SQLDatabaseToolkit( |
| | db=db_connection, |
| | llm=llm |
| | ) |
| | |
| | |
| | agent = create_sql_agent( |
| | llm=llm, |
| | toolkit=toolkit, |
| | agent_type=AgentType.OPENAI_FUNCTIONS, |
| | verbose=True, |
| | handle_parsing_errors=True, |
| | max_iterations=10, |
| | early_stopping_method="generate", |
| | memory=memory, |
| | return_intermediate_steps=True |
| | ) |
| | |
| | logger.info("SQL agent created successfully") |
| | return agent, "" |
| | |
| | except Exception as e: |
| | error_msg = f"Error creating SQL agent: {str(e)}" |
| | logger.error(error_msg, exc_info=True) |
| | return None, error_msg |