agentscope-ai / agentscope-ai/agentscope-java

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

Aberta
#1,262 0 comentários 0 reações 0 responsáveis Ver no GitHub
area/core/memory bug
Linguagem predominante
Java
Estrelas
5.6k
Forks
1.3k
Merge médio
4d 12h
PRs com merge (30d)
77

Descrição

---

## 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.

---

Guia de contribuição

Abrir o guia de contribuição

Avaliação

Esta issue ainda não foi avaliada.

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.