feat: Add NaliiaBot API

This commit is contained in:
2026-02-09 15:59:54 -05:00
parent 69b0dad14d
commit adda2a3e5e
11 changed files with 1087 additions and 182 deletions

1007
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -13,7 +13,8 @@ dependencies = [
"langgraph[standard] (>=1.0.6,<2.0.0)",
"langchain-anthropic (>=1.3.1,<2.0.0)",
"langchain-deepseek (>=1.0.1,<2.0.0)",
"dotenv (>=0.9.9,<0.10.0)"
"dotenv (>=0.9.9,<0.10.0)",
"fastapi[standard] (>=0.128.5,<0.129.0)"
]
[tool.poetry]

0
src/__init__.py Normal file
View File

View File

View File

@@ -0,0 +1,16 @@
import os
from src.naliiabot.bot.agent.agent import Agent
from src.naliiabot.bot.factories.llm_factory import LLMFactory
MODEL_NAME = os.getenv("LLM_MODEL", "anthropic")
def get_agent():
"""
Dependency function to get an instance of the Agent class.
Returns:
Agent: An instance of the Agent class.
"""
model = LLMFactory(MODEL_NAME).get_model()
return Agent(model=model)

View File

View File

@@ -0,0 +1,22 @@
from fastapi import APIRouter, Depends
from ...dependencies import get_agent
from langchain_core.messages import HumanMessage
router = APIRouter()
@router.post("/chat")
def chat(messages: dict, agent = Depends(get_agent)):
"""
Simulate a chat response based on the input message.
Args:
message (str): The input message from the user.
Returns:
dict: A dictionary containing the response message.
"""
messages = [HumanMessage(content=messages["messages"])]
response_message = agent.invoke({"messages": messages})
return {"response": response_message}

18
src/naliiabotapi/main.py Normal file
View File

@@ -0,0 +1,18 @@
from fastapi import FastAPI
from src.naliiabotapi.api.v1.endpoints.chat import router as chat_router
app = FastAPI(
title="NaliiaBot API",
description="API for NaliiaBot, a chatbot that provides customer service and related topics.",
version="1.0.0"
)
app.include_router(chat_router)
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/health")
def health_check():
return {"status": "ok"}

27
tests/test_api.py Normal file
View File

@@ -0,0 +1,27 @@
import pytest
from fastapi.testclient import TestClient
from src.naliiabotapi.main import app
from langchain_core.messages import HumanMessage
@pytest.fixture
def client():
client = TestClient(app)
return client
def test_root(client):
response = client.get("/")
assert response.status_code == 200
def test_health(client):
response = client.get("/health")
assert response.status_code == 200
def test_chat(client):
response = client.post("/chat", json={"messages": "Hello, how are you?"})
assert response.status_code == 200
assert response.json() is not None

View File

@@ -1,176 +0,0 @@
import streamlit as st
from datetime import datetime
# Configurar página
st.set_page_config(
page_title="NaliiaBot Chat",
page_icon="💬",
layout="wide",
initial_sidebar_state="expanded"
)
# Estilos personalizados
st.markdown("""
<style>
.main {
padding: 2rem;
}
.chat-message {
padding: 1rem;
margin: 0.5rem 0;
border-radius: 0.5rem;
}
.user-message {
background-color: #d1e7dd;
text-color: black;
text-align: right;
}
.bot-message {
background-color: #f5f5f5;
text-color: black;
text-align: left;
}
.timestamp {
font-size: 0.8rem;
color: #666;
}
</style>
""", unsafe_allow_html=True)
def initialize_session_state():
"""Inicializar estado de sesión"""
if "messages" not in st.session_state:
st.session_state.messages = []
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
def display_messages():
"""Mostrar todos los mensajes del chat"""
for message in st.session_state.messages:
with st.container():
if message["role"] == "user":
st.markdown(
f"""
<div class="chat-message user-message">
<p><strong>Tú:</strong> {message['content']}</p>
<p class="timestamp">{message['timestamp']}</p>
</div>
""",
unsafe_allow_html=True
)
else:
st.markdown(
f"""
<div class="chat-message bot-message">
<p><strong>NaliiaBot:</strong> {message['content']}</p>
<p class="timestamp">{message['timestamp']}</p>
</div>
""",
unsafe_allow_html=True
)
def get_bot_response(user_message):
"""Generar respuesta del bot (placeholder)"""
# TODO: Integrar con tu modelo de IA/LLM
responses = {
"hola": "¡Hola! Bienvenido a NaliiaBot. ¿Cómo puedo ayudarte hoy?",
"ayuda": "Puedo ayudarte con: información, responder preguntas, y más. ¿En qué te puedo asistir?",
"default": f"Entiendo que dijiste: '{user_message}'. ¿Podrías darme más detalles?"
}
user_lower = user_message.lower().strip()
for key, response in responses.items():
if key in user_lower:
return response
return responses["default"]
def main():
# Inicializar estado
initialize_session_state()
# Header
st.markdown("# NaliiaBot Chat")
st.markdown("---")
# Sidebar
with st.sidebar:
st.markdown("### ⚙️ Configuración")
# Modo de display
display_mode = st.radio(
"Modo de visualización:",
("Completo", "Compacto"),
help="Selecciona cómo mostrar el chat"
)
# Opciones
st.markdown("### 📋 Opciones")
if st.button("🗑️ Limpiar chat", use_container_width=True):
st.session_state.messages = []
st.session_state.chat_history = []
st.rerun()
if st.button("💾 Guardar conversación", use_container_width=True):
st.success("Conversación guardada (función a implementar)")
# Información
st.markdown("---")
st.markdown("### Información")
st.markdown(f"**Total de mensajes:** {len(st.session_state.messages)}")
st.markdown("**Versión:** 1.0.0")
st.markdown("**Estado:** En desarrollo")
# Área principal de chat
col1, col2 = st.columns([4, 1])
with col1:
st.markdown("### Conversación")
# Mostrar mensajes
message_container = st.container()
with message_container:
display_messages()
# Input del usuario
st.markdown("---")
with st.form(key="message_form", clear_on_submit=True):
col1, col2 = st.columns([5, 1])
with col1:
user_input = st.text_input(
"Escribe tu mensaje:",
placeholder="Escribe aquí y presiona Enter...",
label_visibility="collapsed"
)
with col2:
send_button = st.form_submit_button("📤 Enviar", use_container_width=True)
# Procesar entrada del usuario
if send_button and user_input.strip():
# Agregar mensaje del usuario
timestamp = datetime.now().strftime("%H:%M:%S")
st.session_state.messages.append({
"role": "user",
"content": user_input,
"timestamp": timestamp
})
# Obtener respuesta del bot
bot_response = get_bot_response(user_input)
st.session_state.messages.append({
"role": "bot",
"content": bot_response,
"timestamp": datetime.now().strftime("%H:%M:%S")
})
# Guardar en historial
st.session_state.chat_history.append({
"user": user_input,
"bot": bot_response,
"timestamp": timestamp
})
if __name__ == "__main__":
main()