# 🤖 Proyecto IA - Asistente Personal "Asistente Pablo"

---

## 🚀 Descripción

Este proyecto implementa un **asistente personal basado en IA** totalmente offline, integrado en una aplicación Spring Boot. Utiliza un modelo de lenguaje local (`llama.cpp` / `llama-java`) para ofrecer respuestas naturales, útiles y personalizadas, con un diseño centrado en la arquitectura limpia y extensible.

El asistente está pensado para entender tus gustos, estilo y necesidades, respondiendo siempre en español con un tono cercano y amigable.

---

## 🧩 Características principales

- 🧠 Modelo LLM local (`openchat-3.5-0106.Q4_K_M.gguf`) ejecutado en CPU o GPU (Metal en Macs M1/M2).
- 🏗️ Arquitectura limpia basada en capas: dominio, aplicación, infraestructura y presentación.
- 📜 Historial de conversación gestionado en sesión HTTP (con opción a persistencia futura).
- 📝 Construcción dinámica de prompts a partir de definiciones JSON estructuradas y multilingües.
- 🌐 API REST para interacción con el asistente.
- 💻 Frontend con Thymeleaf para una interfaz web simple y eficaz.
- 📊 Logging avanzado con Log4j2, con logs a consola y fichero.
- 🔄 Extensible para múltiples perfiles de prompt y configuración personalizada.

---

## ⚙️ Requisitos técnicos

- Java 21+
- Maven 4+
- Spring Boot 3+
- Dependencias principales:
    - `llama-java` para LLM local
    - Jackson para JSON
    - Log4j2 para logging
- Modelo `openchat-3.5-0106.Q4_K_M.gguf` en carpeta `models/`

---

## 🛠️ Instalación y ejecución

1. Clonar el repositorio:

    ```bash
    git clone https://github.com/tuusuario/ia-asistente-personal.git
    cd ia-asistente-personal
    ```

2. Colocar el modelo en `models/`:

    ```bash
    mkdir models
    # Copia aquí openchat-3.5-0106.Q4_K_M.gguf
    ```

3. Compilar con Maven:

    ```bash
    mvn clean package
    ```

4. Crear carpeta de logs:

    ```bash
    mkdir logs
    ```

5. Ejecutar la aplicación:

    ```bash
    java -jar target/ia-asistente-personal.jar
    ```

6. Abrir en el navegador:

    ```
    http://localhost:8080/
    ```

---

## 🎯 Uso

- En la web puedes chatear con tu asistente personalizado.
- El historial de la conversación se mantiene en sesión.
- Las respuestas se generan localmente, sin conexión a internet.
- Puedes cambiar el perfil de prompt editando los JSON en `src/main/resources/prompts/`.

---

## 🎥 Demostración

![Demo de funcionamiento](demo.gif)

*Reemplaza la URL anterior con el enlace a tu GIF de demostración.*

---

## 🧪 Configuración avanzada

- **GPU Metal** en macOS M1/M2: configura el backend llama.cpp con soporte Metal y coloca el shader `ggml-metal.metal` en la ruta correcta.
- **Logs:** configurados con Log4j2, salida a consola y a `logs/app.log`.
- **Múltiples perfiles:** cambia el prompt cargando otros JSONs como `developer_prompt.json`.

---

## 📚 Recursos

| Herramienta      | Enlace                                           |
| ---------------- | ------------------------------------------------ |
| llama.cpp        | [https://github.com/ggerganov/llama.cpp](https://github.com/ggerganov/llama.cpp)       |
| llama-java       | [https://github.com/kherud/llama-java](https://github.com/kherud/llama-java)           |
| Spring Boot      | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot)       |

---

## 🤝 Contribuciones

¿Quieres mejorar el proyecto? ¡Bienvenido!  
Por favor, abre un issue o pull request con tus mejoras.

---

## ⚠️ Licencia

MIT License © Pablo de la Torre Jamardo

---

*¡Gracias por usar el Asistente Pablo!*

