arduino_data / app.py
JairoDanielMT's picture
Update app.py
d81335a verified
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"])