From 91d73357d612720f2a332c6dd28e2c512b9ab5ca Mon Sep 17 00:00:00 2001 From: JGoP-L <741047428@qq.com> Date: Wed, 27 May 2026 17:47:30 +0800 Subject: [PATCH] fix(agent): complete stream for empty results --- .../io/agentscope/core/agent/AgentBase.java | 6 +-- .../core/agent/AgentStreamingTest.java | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/agentscope-core/src/main/java/io/agentscope/core/agent/AgentBase.java b/agentscope-core/src/main/java/io/agentscope/core/agent/AgentBase.java index df9a4f1c1..244c0a8c0 100644 --- a/agentscope-core/src/main/java/io/agentscope/core/agent/AgentBase.java +++ b/agentscope-core/src/main/java/io/agentscope/core/agent/AgentBase.java @@ -936,11 +936,9 @@ private Flux createEventStream(StreamOptions options, Supplier> finalMsg, true)); } - - // Complete the stream - sink.complete(); }, - sink::error); + sink::error, + sink::complete); }, FluxSink.OverflowStrategy.BUFFER) .publishOn(Schedulers.boundedElastic())); diff --git a/agentscope-core/src/test/java/io/agentscope/core/agent/AgentStreamingTest.java b/agentscope-core/src/test/java/io/agentscope/core/agent/AgentStreamingTest.java index cfdc2e439..79e90657b 100644 --- a/agentscope-core/src/test/java/io/agentscope/core/agent/AgentStreamingTest.java +++ b/agentscope-core/src/test/java/io/agentscope/core/agent/AgentStreamingTest.java @@ -20,10 +20,13 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import io.agentscope.core.ReActAgent; +import io.agentscope.core.agent.test.MockModel; import io.agentscope.core.interruption.InterruptContext; import io.agentscope.core.message.Msg; import io.agentscope.core.message.MsgRole; import io.agentscope.core.message.TextBlock; +import io.agentscope.core.model.ChatResponse; import java.time.Duration; import java.util.ArrayList; import java.util.List; @@ -248,4 +251,38 @@ void testStreamEventCount() { // Should have at least one event (the agent result) assertTrue(eventCount.get() >= 1); } + + @Test + void testReActAgentStreamCompletesWhenModelReturnsEmptyText() { + MockModel model = + new MockModel( + messages -> + List.of( + ChatResponse.builder() + .id("empty-msg") + .content( + List.of( + TextBlock.builder() + .text("") + .build())) + .build())); + ReActAgent agent = ReActAgent.builder().name("test-agent").model(model).build(); + + Msg inputMsg = + Msg.builder() + .name("user") + .role(MsgRole.USER) + .content(List.of(TextBlock.builder().text("hello").build())) + .build(); + + StepVerifier.create(agent.stream(List.of(inputMsg))) + .expectNextMatches( + event -> + event.getType() == EventType.REASONING + && !event.isLast() + && event.getMessage() != null) + .thenConsumeWhile(event -> true) + .expectComplete() + .verify(Duration.ofSeconds(2)); + } }