agentscope-ai / agentscope-ai/agentscope-java

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

オープン
#1,262 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
area/core/memory bug
主要言語
Java
スター
5.6k
フォーク
1.3k
平均マージ
4日 12時間
マージ済み PR(30日)
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 を短くまとめたダイジェスト。