agentscope-ai / agentscope-ai/agentscope-java
[Bug]:Multiple system messages caused by StaticLongTermMemoryHook leads to LLM request failure
- Dominant language
- Java
- Stars
- 5.6k
- Forks
- 1.3k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 77
Description
---
## 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.
---
Contributor guide
Assessment
This issue has not been assessed yet.