agentscope-ai / agentscope-ai/agentscope-java

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

Abierto
#1,262 0 comentarios 0 reacciones 0 asignados Ver en GitHub
area/core/memory bug
Lenguaje dominante
Java
Estrellas
5.6k
Forks
1.3k
Merge medio
4 d 12 h
PR fusionados (30 d)
77

Descripción

---

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

---

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.