From c7f54d76db7f82422d696e580b532578deaf8c73 Mon Sep 17 00:00:00 2001 From: PAVEL PALMA Date: Wed, 5 Nov 2025 16:54:21 -0600 Subject: [PATCH] UPDATE 05-Nov --- .../ConversationContextMapper.java | 29 +++++++++++++++---- .../ConversationContextMapperTest.java | 27 +++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/mapper/messagefilter/ConversationContextMapper.java b/src/main/java/com/example/mapper/messagefilter/ConversationContextMapper.java index 811723f..70340cc 100644 --- a/src/main/java/com/example/mapper/messagefilter/ConversationContextMapper.java +++ b/src/main/java/com/example/mapper/messagefilter/ConversationContextMapper.java @@ -20,6 +20,8 @@ public class ConversationContextMapper { @Value("${conversation.context.days.limit:30}") private int daysLimit; + + private static final int MAX_HISTORY_BYTES = 50 * 1024; // 50 KB public String toText(ConversationSessionDTO session, List messages) { if (messages == null || messages.isEmpty()) { @@ -41,7 +43,7 @@ public class ConversationContextMapper { .limit(messageLimit) .sorted(Comparator.comparing(ConversationMessageDTO::timestamp)) .collect(Collectors.toList()); - return toTextFromMessages(recentEntries); + return toTextWithTruncation(recentEntries); } public String toTextFromMessages(List messages) { @@ -50,6 +52,27 @@ public class ConversationContextMapper { .collect(Collectors.joining("\n")); } + public String toTextWithTruncation(List messages) { + if (messages == null || messages.isEmpty()) { + return ""; + } + + StringBuilder textBlock = new StringBuilder(); + List formattedMessages = messages.stream() + .map(this::formatEntry) + .collect(Collectors.toList()); + + for (int i = formattedMessages.size() - 1; i >= 0; i--) { + String message = formattedMessages.get(i) + "\n"; + if (textBlock.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8).length + message.getBytes(java.nio.charset.StandardCharsets.UTF_8).length > MAX_HISTORY_BYTES) { + break; + } + textBlock.insert(0, message); + } + + return textBlock.toString().trim(); + } + private String formatEntry(ConversationMessageDTO entry) { String prefix = "User: "; @@ -70,10 +93,6 @@ public class ConversationContextMapper { String text = prefix + entry.text(); - if (entry.parameters() != null && !entry.parameters().isEmpty()) { - text += " " + entry.parameters().toString(); - } - if (entry.type() == MessageType.AGENT) { text = cleanAgentMessage(text); } diff --git a/src/test/java/com/example/mapper/messagefilter/ConversationContextMapperTest.java b/src/test/java/com/example/mapper/messagefilter/ConversationContextMapperTest.java index b5d51b0..4e90cd7 100644 --- a/src/test/java/com/example/mapper/messagefilter/ConversationContextMapperTest.java +++ b/src/test/java/com/example/mapper/messagefilter/ConversationContextMapperTest.java @@ -1,8 +1,15 @@ package com.example.mapper.messagefilter; +import com.example.dto.dialogflow.conversation.ConversationMessageDTO; +import com.example.dto.dialogflow.conversation.MessageType; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class ConversationContextMapperTest { @@ -91,4 +98,24 @@ public class ConversationContextMapperTest { String result = (String) method.invoke(mapper, input); assertEquals(expected, result); } + + @Test + public void testToTextWithTruncation() { + ConversationContextMapper mapper = new ConversationContextMapper(); + List messages = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + messages.add(createMessage("This is message " + i, MessageType.USER)); + } + for (int i = 1000; i < 2000; i++) { + messages.add(createMessage("This is message " + i, MessageType.AGENT)); + } + + String result = mapper.toTextWithTruncation(messages); + assertTrue(result.length() > 0); + assertTrue(result.getBytes(java.nio.charset.StandardCharsets.UTF_8).length <= 50 * 1024); + } + + private ConversationMessageDTO createMessage(String text, MessageType type) { + return new ConversationMessageDTO(type, Instant.now(), text, null, null); + } }