Add AI-powered automatic welcome message on chat initialization

This commit is contained in:
Pablo de la Torre Jamardo 2025-06-28 23:49:53 +02:00
parent ecdc334da9
commit a150ce37f8
4 changed files with 21 additions and 3 deletions

View File

@ -1,7 +1,11 @@
package com.pablotj.ia.chat.boot.adapter.controller; package com.pablotj.ia.chat.boot.adapter.controller;
import com.pablotj.ia.chat.boot.application.usecase.ChatUseCase;
import com.pablotj.ia.chat.boot.domain.model.ChatMessage;
import com.pablotj.ia.chat.boot.web.session.ChatSessionManager; import com.pablotj.ia.chat.boot.web.session.ChatSessionManager;
import jakarta.servlet.http.HttpSession; import jakarta.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@ -15,15 +19,25 @@ public class ChatPageController {
private static final Logger LOGGER = LogManager.getLogger(ChatPageController.class); private static final Logger LOGGER = LogManager.getLogger(ChatPageController.class);
private final ChatSessionManager chatSessionManager; private final ChatSessionManager chatSessionManager;
private final ChatUseCase chatUseCase;
public ChatPageController(ChatSessionManager chatSessionManager) { public ChatPageController(ChatSessionManager chatSessionManager, ChatUseCase chatUseCase) {
this.chatSessionManager = chatSessionManager; this.chatSessionManager = chatSessionManager;
this.chatUseCase = chatUseCase;
} }
@GetMapping @GetMapping
public String showChat(Model model, HttpSession session) { public String showChat(Model model, HttpSession session) {
LOGGER.debug("Accessing to chat"); LOGGER.debug("Accessing to chat");
model.addAttribute("messages", chatSessionManager.getMessages(session)); List<ChatMessage> messages = chatSessionManager.getMessages(session);
if (messages != null && messages.isEmpty()) {
try {
chatUseCase.processUserPrompt("", session);
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
}
model.addAttribute("messages", messages);
return "chat"; return "chat";
} }
} }

View File

@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpSession;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
@Component @Component
public class ChatSessionManager { public class ChatSessionManager {
@ -18,6 +19,7 @@ public class ChatSessionManager {
messages = new ArrayList<>(); messages = new ArrayList<>();
session.setAttribute(ATTR_MESSAGES, messages); session.setAttribute(ATTR_MESSAGES, messages);
} }
messages.removeIf(m -> ObjectUtils.isEmpty(m.text()));
return messages; return messages;
} }

View File

@ -13,7 +13,8 @@
"Si alguien te pregunta por tu origen, responde que surgiste de la nada.", "Si alguien te pregunta por tu origen, responde que surgiste de la nada.",
"No mencionas a OpenAI, ni a ninguna tecnología subyacente.", "No mencionas a OpenAI, ni a ninguna tecnología subyacente.",
"Sé honesto si no sabes algo, y ofrece alternativas o ideas prácticas.", "Sé honesto si no sabes algo, y ofrece alternativas o ideas prácticas.",
"Evita hablar de política o religión si no se solicita expresamente." "Evita hablar de política o religión si no se solicita expresamente.",
"Si se te envía un mensaje vacío debes saludar."
], ],
"context": "Estás ejecutándote en una aplicación web privada y personalizada para Pablo.", "context": "Estás ejecutándote en una aplicación web privada y personalizada para Pablo.",
"style": "Usas un lenguaje fluido, ordenado y útil. Puedes usar listas o pasos si facilita la comprensión.", "style": "Usas un lenguaje fluido, ordenado y útil. Puedes usar listas o pasos si facilita la comprensión.",

View File

@ -10,6 +10,7 @@
<div id="chat-log"> <div id="chat-log">
<div th:each="msg : ${messages}" <div th:each="msg : ${messages}"
th:if="${msg.text != ''}"
th:class="'bubble ' + ${msg.role}"> th:class="'bubble ' + ${msg.role}">
<span th:text="${msg.text}"></span> <span th:text="${msg.text}"></span>
<em class="timestamp" th:text="${#dates.format(msg.date, 'dd/MM/yyyy HH:mm')}"></em> <em class="timestamp" th:text="${#dates.format(msg.date, 'dd/MM/yyyy HH:mm')}"></em>