Skip to content

Commit 0d4bbd6

Browse files
committed
fix(core): fix list hash stability for equivalent messages
1 parent 7fcccd9 commit 0d4bbd6

2 files changed

Lines changed: 45 additions & 1 deletion

File tree

  • agentscope-core/src/main/java/io/agentscope/core/session
  • agentscope-extensions/agentscope-extensions-session-mysql/src/test/java/io/agentscope/core/session/mysql

agentscope-core/src/main/java/io/agentscope/core/session/ListHashUtil.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.agentscope.core.session;
1717

1818
import io.agentscope.core.state.State;
19+
import io.agentscope.core.util.JsonUtils;
1920
import java.util.List;
2021

2122
/**
@@ -88,7 +89,7 @@ public static String computeHash(List<? extends State> values) {
8889

8990
for (int idx : sampleIndices) {
9091
State item = values.get(idx);
91-
int itemHash = item != null ? item.hashCode() : 0;
92+
int itemHash = item != null ? JsonUtils.getJsonCodec().toJson(item).hashCode() : 0;
9293
sb.append(idx).append(":").append(itemHash).append(",");
9394
}
9495

agentscope-extensions/agentscope-extensions-session-mysql/src/test/java/io/agentscope/core/session/mysql/MysqlSessionTest.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
import static org.mockito.Mockito.verify;
2626
import static org.mockito.Mockito.when;
2727

28+
import io.agentscope.core.message.Msg;
29+
import io.agentscope.core.message.MsgRole;
30+
import io.agentscope.core.message.TextBlock;
31+
import io.agentscope.core.session.ListHashUtil;
2832
import io.agentscope.core.state.SessionKey;
2933
import io.agentscope.core.state.SimpleSessionKey;
3034
import io.agentscope.core.state.State;
@@ -282,6 +286,45 @@ void testSaveAndGetListState() throws SQLException {
282286
assertEquals("value2", loaded.get(1).value());
283287
}
284288

289+
@Test
290+
@DisplayName("Should compute same hash for equivalent message lists")
291+
void testComputeHashEquivalentMessageLists() {
292+
List<Msg> first =
293+
List.of(
294+
Msg.builder()
295+
.id("m-user-1")
296+
.timestamp("2026-05-08 14:00:00.000")
297+
.role(MsgRole.USER)
298+
.content(TextBlock.builder().text("hello").build())
299+
.build(),
300+
Msg.builder()
301+
.id("m-assistant-1")
302+
.timestamp("2026-05-08 14:00:01.000")
303+
.role(MsgRole.ASSISTANT)
304+
.content(TextBlock.builder().text("hello").build())
305+
.build());
306+
307+
List<Msg> second =
308+
List.of(
309+
Msg.builder()
310+
.id("m-user-1")
311+
.timestamp("2026-05-08 14:00:00.000")
312+
.role(MsgRole.USER)
313+
.content(TextBlock.builder().text("hello").build())
314+
.build(),
315+
Msg.builder()
316+
.id("m-assistant-1")
317+
.timestamp("2026-05-08 14:00:01.000")
318+
.role(MsgRole.ASSISTANT)
319+
.content(TextBlock.builder().text("hello").build())
320+
.build());
321+
322+
String h1 = ListHashUtil.computeHash(first);
323+
String h2 = ListHashUtil.computeHash(second);
324+
325+
assertEquals(h1, h2);
326+
}
327+
285328
@Test
286329
@DisplayName("Should commit incremental list save when connection auto-commit is disabled")
287330
void testSaveListIncrementalAppendCommitsWhenAutoCommitDisabled() throws SQLException {

0 commit comments

Comments
 (0)