Spaces:
Sleeping
Sleeping
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 | |
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 | |
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"]) | |