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 摘要。