File size: 4,063 Bytes
5084ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d818da4
5084ab3
 
 
 
 
 
 
 
 
d81335a
5084ab3
 
 
 
 
d81335a
5084ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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"])