import requests from langchain_openai import ChatOpenAI from langchain_huggingface import HuggingFaceEmbeddings from pydantic import BaseModel import os from langchain import hub from pydantic import BaseModel from langchain.agents import AgentExecutor, create_react_agent, tool embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/distiluse-base-multilingual-cased", encode_kwargs={"normalize_embeddings": True}, ) class ConsultaAPI(BaseModel): query: str @tool def check_system_time(format: str = "%Y-%m-%d %H:%M:%S") -> str: """ Devuelve la hora actual del sistema en el formato especificado. Sirve para saber la fecha y hora actual Parámetros: - format (str): El formato de la hora a devolver. Por defecto es "%Y-%m-%d %H:%M:%S", puedes cambiarlo según tus necesidades. Retorna: - str: La hora actual del sistema en el formato especificado. """ from datetime import datetime current_time = datetime.now().strftime(format) formatted_time = datetime.strptime(current_time, format) return formatted_time @tool def consultar_db_via_api(query: str): """ Consulta la DB SQLite con una consulta puntual. Máximo puedes solicitar hasta 20 registros. NO USES COMILLAS DOBLES AL INICIO Y AL FINAL DE LA CONSULTA. Parámetros: - query (str): La consulta SQL a ejecutar en la base de datos. Retorna: - dict: Los resultados de la consulta en formato JSON. """ try: query = query.strip('"') if query.endswith(";"): query = query[:-1] query = query.replace("'", "\\'") format_query_json = {"query": query} response = requests.post( url="https://jairodanielmt-arduino-data-post.hf.space/execute", json=format_query_json, headers={"Content-Type": "application/json"}, ) response.raise_for_status() data = response.json() return data except requests.exceptions.RequestException as e: print(f"Error al consultar la API: {e}") if e.response is not None: print(e.response.text) return None prompt = hub.pull("hwchase17/react") tools = [consultar_db_via_api,check_system_time] llm = ChatOpenAI( model="deepseek-chat", base_url="https://api.deepseek.com", temperature=0.3, api_key=os.getenv("DEEPSEEK_API_KEY"), ) agent = create_react_agent(llm=llm, tools=tools, prompt=prompt) agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, handle_parsing_errors=True, max_iterations=20, ) def ask_agent(consulta) -> str: d = "Eres un asistente, tienes acceso a herramientas tools como para saber la fecha y hora y tienes permitido ejecutar sentencias SQLite, la unica tabla existente es: la unica tabla tiene la siguiente estructura nombre de la tabla: sensor_data columnas (id INTEGER PK AUTOINCREMENT, timestamp TEXT,humedad_suelo INTEGER, luz INTEGER, turbidez INTEGER, voltaje REAL, estado TEXT) piensa bien antes de generar la consulta SQL:" query = f"{d} {consulta}" output = agent_executor.invoke({"input": query}) return output["output"] import streamlit as st # configurar la página st.set_page_config( page_title="Chatbot - ESP32 🤖", page_icon="🤖", layout="centered", initial_sidebar_state="collapsed", ) st.title("Chatbot monitoreo de sensores y ESP32 🤖") if "history" not in st.session_state: st.session_state["history"] = [] pregunta = st.chat_input("Escribe tu consulta...") if pregunta: st.session_state["history"].append({"role": "user", "content": pregunta}) respuesta = ask_agent(pregunta) st.session_state["history"].append({"role": "ai", "content": respuesta}) for message in st.session_state["history"]: if message["role"] == "user": with st.chat_message(name="user", avatar="👩‍💻"): st.write(message["content"]) else: with st.chat_message(name="ai", avatar="🍦"): st.write(message["content"])