agentscope-ai / agentscope-ai/agentscope-java

[Bug]:HarnessAgent does not forward per-session interrupt methods from ReActAgent

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

Descripción

**Describe the bug**

`ReActAgent` provides per-session interrupt methods that are essential for the stateless (singleton) agent pattern introduced in 2.0:

- `interrupt(RuntimeContext ctx)`
- `interrupt(String userId, String sessionId)`
- `interrupt(String userId, String sessionId, Msg msg)`

However, `HarnessAgent` only overrides the deprecated no-arg `interrupt()` and `interrupt(Msg)`, which fall back to `defaultSessionId`. In a multi-session singleton deployment, calling `interrupt()` on a shared `HarnessAgent` cannot target a specific session — it always hits the default session, leaving other concurrent sessions unaffected when they should be interrupted.

**To Reproduce**

1. Build a singleton `HarnessAgent` (no `defaultSessionId` set):
```java
HarnessAgent agent = HarnessAgent.builder()
.name("my-agent")
.model(model)
.stateStore(new MysqlAgentStateStore(dataSource))
.build();
```
2. Start concurrent calls with different `RuntimeContext`:
```java
agent.streamEvents(msgs, RuntimeContext.builder()
.userId("user-1").sessionId("session-A").build());
agent.streamEvents(msgs, RuntimeContext.builder()
.userId("user-2").sessionId("session-B").build());
```
3. Try to interrupt only session-A:
```java
agent.interrupt("user-1", "session-A"); // compile error: method not found
```
4. Workaround via `getDelegate()`:
```java
agent.getDelegate().interrupt("user-1", "session-A"); // works but leaks internals
```

**Expected behavior**

`HarnessAgent` should forward the per-session interrupt methods to its `ReActAgent` delegate, consistent with how it already forwards `interrupt()` and `interrupt(Msg)`:

```java
public void interrupt(RuntimeContext ctx) {
delegate.interrupt(ctx);
}

public void interrupt(String userId, String sessionId) {
delegate.interrupt(userId, sessionId);
}

public void interrupt(String userId, String sessionId, Msg msg) {
delegate.interrupt(userId, sessionId, msg);
}
```

**Environment**
- AgentScope-Java Version: 2.0.0-RC2
- Java Version: 21
- OS: Windows 11

**Additional context**

The `HarnessAgent.getDelegate()` method exists as a workaround, but requiring users to reach through the wrapper defeats the purpose of the facade. Since 2.0 explicitly promotes the stateless singleton pattern, per-session interrupt is a core capability that `HarnessAgent` should expose.

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.