diff --git a/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/main/java/com/vaadin/flow/component/ai/tests/AIOrchestratorPage.java b/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/main/java/com/vaadin/flow/component/ai/tests/AIOrchestratorPage.java index fd2f5c15dde..d2137e9cbe7 100644 --- a/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/main/java/com/vaadin/flow/component/ai/tests/AIOrchestratorPage.java +++ b/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/main/java/com/vaadin/flow/component/ai/tests/AIOrchestratorPage.java @@ -15,11 +15,13 @@ */ package com.vaadin.flow.component.ai.tests; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.vaadin.flow.component.ai.common.AIAttachment; +import com.vaadin.flow.component.ai.common.ChatMessage; import com.vaadin.flow.component.ai.orchestrator.AIOrchestrator; import com.vaadin.flow.component.ai.provider.LLMProvider; import com.vaadin.flow.component.html.Div; @@ -34,6 +36,7 @@ import com.vaadin.flow.component.upload.UploadFileListVariant; import com.vaadin.flow.component.upload.UploadManager; import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.VaadinSession; import reactor.core.publisher.Flux; @@ -45,7 +48,9 @@ @Route("vaadin-ai/orchestrator") public class AIOrchestratorPage extends UploadDropZone { - private final AIOrchestrator orchestrator; + private static final String HISTORY_SESSION_KEY = "ai-orchestrator-history"; + + private AIOrchestrator orchestrator; // Attachment storage keyed by message ID private final Map> attachmentStorage = new HashMap<>(); @@ -53,6 +58,7 @@ public class AIOrchestratorPage extends UploadDropZone { // Displays info about the last clicked attachment private final Span clickedAttachmentInfo = new Span(); + @SuppressWarnings("unchecked") public AIOrchestratorPage() { setHeightFull(); @@ -74,7 +80,7 @@ public AIOrchestratorPage() { clickedAttachmentInfo.setId("clicked-attachment-info"); - orchestrator = AIOrchestrator.builder(new EchoLLMProvider(), null) + var builder = AIOrchestrator.builder(new EchoLLMProvider(), null) .withMessageList(messageList).withInput(messageInput) .withFileReceiver(uploadManager) .withAttachmentSubmitListener(event -> { @@ -89,7 +95,18 @@ public AIOrchestratorPage() { clickedAttachmentInfo.setText(attachment.name() + " | " + attachment.mimeType()); } - }).build(); + }) + .withResponseCompleteListener(event -> VaadinSession + .getCurrent().setAttribute(HISTORY_SESSION_KEY, + orchestrator.getHistory())); + + var savedHistory = (List) VaadinSession.getCurrent() + .getAttribute(HISTORY_SESSION_KEY); + if (savedHistory != null) { + builder.withHistory(savedHistory, Collections.emptyMap()); + } + + orchestrator = builder.build(); var promptButton = new NativeButton("Send Hello", e -> orchestrator.prompt("Hello from button")); @@ -117,5 +134,11 @@ public Flux stream(LLMRequest request) { var response = "Echo: " + request.userMessage(); return Flux.fromArray(response.split(" ")).map(word -> word + " "); } + + @Override + public void setHistory(List history, + Map> attachmentsByMessageId) { + // No-op for testing + } } } diff --git a/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/test/java/com/vaadin/flow/component/ai/tests/AIOrchestratorIT.java b/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/test/java/com/vaadin/flow/component/ai/tests/AIOrchestratorIT.java index 18dd0f7a560..f11e10a5ae1 100644 --- a/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/test/java/com/vaadin/flow/component/ai/tests/AIOrchestratorIT.java +++ b/vaadin-ai-components-flow-parent/vaadin-ai-components-flow-integration-tests/src/test/java/com/vaadin/flow/component/ai/tests/AIOrchestratorIT.java @@ -79,6 +79,23 @@ public void uploadFile_submitMessage_attachmentRenderedInMessage() Assert.assertNotNull(userMessage.getAttachmentByName("test-file.txt")); } + @Test + public void submitMessage_refreshPage_historyRestored() { + messageInput.submit("Hello"); + waitUntil(driver -> getMessageCount() >= 2, 5); + Assert.assertEquals(2, getMessageCount()); + + // Refresh the page - history should be auto-restored from session + open(); + messageList = $(MessageListElement.class).single(); + + waitUntil(driver -> getMessageCount() >= 2, 5); + var messages = messageList.getMessageElements(); + Assert.assertEquals(2, messages.size()); + Assert.assertTrue(messages.get(0).getText().contains("Hello")); + Assert.assertTrue(messages.get(1).getText().contains("Echo: Hello")); + } + @Test public void uploadFile_submitMessage_clickAttachment_infoDisplayed() throws Exception {