agentscope-ai / agentscope-ai/agentscope-java

[Bug]:Multiple system messages caused by StaticLongTermMemoryHook leads to LLM request failure

未關閉
#1,262 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
area/core/memory bug
主要語言
Java
星號
5.6k
分支
1.3k
平均合併
4 天 12 小時
30 天內合併 PR
77

描述

---

## Multiple `system` messages caused by `StaticLongTermMemoryHook` leads to LLM request failure

### Describe the bug

When using `StaticLongTermMemoryHook`, the `handlePreCall` method injects a new `system` message (`memoryMsg`) into the message list.

However, in most cases, the original input messages already contain a `system` message. This results in **multiple `system` messages**, which violates the constraints of many LLM APIs and causes request failures.

---

### To Reproduce

1. Enable `StaticLongTermMemoryHook`
2. Ensure the original `inputMessages` already contains a `system` message
3. Trigger a model call
4. Observe the error from the LLM backend

---

### Expected behavior

The memory content should be **merged into the existing `system` message**, instead of adding a new one.

There should always be **at most one `system` message** in the final request.

---

### Actual behavior

A second `system` message (`memoryMsg`) is appended:

```java
enhancedMessages.addAll(inputMessages);
enhancedMessages.add(memoryMsg);
```

This results in:

```text
system: original system prompt
...
system: long_term_memory
```

Which causes LLM request errors.

---

### Error messages

Typical errors depend on the backend, for example:

* "Multiple system messages are not allowed"
* "Invalid message format"
* Request validation failure from LLM provider

---

### Environment

* AgentScope-Java Version: (please fill)
* Java Version: (please fill)
* OS: (please fill)

---

### Additional context

Relevant code in `StaticLongTermMemoryHook#handlePreCall`:

```java
Msg memoryMsg =
Msg.builder()
.role(MsgRole.SYSTEM)
.name("long_term_memory")
.content(
TextBlock.builder().text(wrappedMemory).build())
.build();

// Inject memory message
List enhancedMessages = new ArrayList<>();
enhancedMessages.addAll(inputMessages);
enhancedMessages.add(memoryMsg);
event.setInputMessages(enhancedMessages);
```

---

### Suggested fix

Instead of appending a new `system` message, merge the memory into the existing one:

* If a `system` message exists → append memory content to it
* Otherwise → create a new `system` message

---

### Why this matters

Many LLM providers (e.g., strict ChatML implementations) only allow a **single `system` message**. Violating this constraint causes runtime failures and breaks compatibility.

---

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。