From ccf7ea1a62af2e1d694667cfa5f61ebaddc423b5 Mon Sep 17 00:00:00 2001 From: jujn <2087687391@qq.com> Date: Sat, 6 Jun 2026 21:49:31 +0800 Subject: [PATCH 1/2] feat(agui): add enable acting chunk configuration --- .../core/agui/adapter/AguiAdapterConfig.java | 29 ++++++++++++++++++ .../core/agui/adapter/AguiAgentAdapter.java | 1 + .../agui/adapter/AguiAdapterConfigTest.java | 30 +++++++++++++++++++ .../boot/agui/common/AguiProperties.java | 17 +++++++++++ .../AgentscopeAguiMvcAutoConfiguration.java | 1 + ...gentscopeAguiWebFluxAutoConfiguration.java | 1 + 6 files changed, 79 insertions(+) diff --git a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java index 8870e2689e..92bdc11a1f 100644 --- a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java +++ b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java @@ -30,6 +30,7 @@ public class AguiAdapterConfig { private final boolean emitStateEvents; private final boolean emitToolCallArgs; private final boolean enableReasoning; + private final boolean enableActingChunk; private final Duration runTimeout; private final String defaultAgentId; @@ -38,6 +39,7 @@ private AguiAdapterConfig(Builder builder) { this.emitStateEvents = builder.emitStateEvents; this.emitToolCallArgs = builder.emitToolCallArgs; this.enableReasoning = builder.enableReasoning; + this.enableActingChunk = builder.enableActingChunk; this.runTimeout = builder.runTimeout; this.defaultAgentId = builder.defaultAgentId; } @@ -82,6 +84,18 @@ public boolean isEnableReasoning() { return enableReasoning; } + /** + * Check if intermediate acting chunk emissions should be included. + * + *

When enabled, intermediate tool execution outputs (such as progress) + * will be streamed to the frontend. + * + * @return true if acting chunks should be included + */ + public boolean isEnableActingChunk() { + return enableActingChunk; + } + /** * Get the run timeout duration. * @@ -127,6 +141,7 @@ public static class Builder { private boolean emitStateEvents = true; private boolean emitToolCallArgs = true; private boolean enableReasoning = false; + private boolean enableActingChunk = false; private Duration runTimeout = Duration.ofMinutes(10); private String defaultAgentId; @@ -178,6 +193,20 @@ public Builder enableReasoning(boolean enableReasoning) { return this; } + /** + * Set whether to enable acting chunk emissions. + * + *

When enabled, tools can emit intermediate chunks (e.g., Custom events for progress + * or real-time logs) during execution. Default is true. + * + * @param enableActingChunk true to enable acting chunks + * @return This builder + */ + public Builder enableActingChunk(boolean enableActingChunk) { + this.enableActingChunk = enableActingChunk; + return this; + } + /** * Set the run timeout duration. * diff --git a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAgentAdapter.java b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAgentAdapter.java index 2314e72b9d..936d3b1f30 100644 --- a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAgentAdapter.java +++ b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAgentAdapter.java @@ -102,6 +102,7 @@ public Flux run(RunAgentInput input) { StreamOptions.builder() .eventTypes(EventType.ALL) .incremental(true) + .includeActingChunk(config.isEnableActingChunk()) .build(); // Track state for event conversion diff --git a/agentscope-extensions/agentscope-extensions-agui/src/test/java/io/agentscope/core/agui/adapter/AguiAdapterConfigTest.java b/agentscope-extensions/agentscope-extensions-agui/src/test/java/io/agentscope/core/agui/adapter/AguiAdapterConfigTest.java index f33eb70ffc..9383818e62 100644 --- a/agentscope-extensions/agentscope-extensions-agui/src/test/java/io/agentscope/core/agui/adapter/AguiAdapterConfigTest.java +++ b/agentscope-extensions/agentscope-extensions-agui/src/test/java/io/agentscope/core/agui/adapter/AguiAdapterConfigTest.java @@ -39,6 +39,7 @@ void testDefaultConfig() { assertTrue(config.isEmitStateEvents()); assertTrue(config.isEmitToolCallArgs()); assertFalse(config.isEnableReasoning()); // Default should be false + assertFalse(config.isEnableActingChunk()); assertEquals(Duration.ofMinutes(10), config.getRunTimeout()); assertNull(config.getDefaultAgentId()); } @@ -51,6 +52,8 @@ void testBuilderWithDefaults() { assertEquals(ToolMergeMode.MERGE_FRONTEND_PRIORITY, config.getToolMergeMode()); assertTrue(config.isEmitStateEvents()); assertTrue(config.isEmitToolCallArgs()); + assertFalse(config.isEnableReasoning()); + assertFalse(config.isEnableActingChunk()); assertEquals(Duration.ofMinutes(10), config.getRunTimeout()); } @@ -95,6 +98,31 @@ void testBuilderEmitToolCallArgs() { assertTrue(configEnabled.isEmitToolCallArgs()); } + @Test + void testBuilderEnableReasoning() { + AguiAdapterConfig configDisabled = + AguiAdapterConfig.builder().enableReasoning(false).build(); + + assertFalse(configDisabled.isEnableReasoning()); + + AguiAdapterConfig configEnabled = AguiAdapterConfig.builder().enableReasoning(true).build(); + + assertTrue(configEnabled.isEnableReasoning()); + } + + @Test + void testBuilderEnableActingChunk() { + AguiAdapterConfig configDisabled = + AguiAdapterConfig.builder().enableActingChunk(false).build(); + + assertFalse(configDisabled.isEnableActingChunk()); + + AguiAdapterConfig configEnabled = + AguiAdapterConfig.builder().enableActingChunk(true).build(); + + assertTrue(configEnabled.isEnableActingChunk()); + } + @Test void testBuilderRunTimeout() { Duration customTimeout = Duration.ofMinutes(30); @@ -133,6 +161,7 @@ void testBuilderFullConfiguration() { .emitStateEvents(false) .emitToolCallArgs(false) .enableReasoning(true) + .enableActingChunk(true) .runTimeout(Duration.ofHours(1)) .defaultAgentId("my-agent") .build(); @@ -141,6 +170,7 @@ void testBuilderFullConfiguration() { assertFalse(config.isEmitStateEvents()); assertFalse(config.isEmitToolCallArgs()); assertTrue(config.isEnableReasoning()); + assertTrue(config.isEnableActingChunk()); assertEquals(Duration.ofHours(1), config.getRunTimeout()); assertEquals("my-agent", config.getDefaultAgentId()); } diff --git a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/common/AguiProperties.java b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/common/AguiProperties.java index a2edda5af0..c83575b5bb 100644 --- a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/common/AguiProperties.java +++ b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/common/AguiProperties.java @@ -38,6 +38,7 @@ * agent-id-header: X-Agent-Id * enable-path-routing: true * enable-reasoning: false + * enable-acting-chunk: false * */ @ConfigurationProperties(prefix = "agentscope.agui") @@ -73,6 +74,14 @@ public class AguiProperties { */ private boolean enableReasoning = false; + /** + * Whether to enable acting chunk emissions. + * + *

When enabled, tools can emit intermediate chunks (e.g., Custom events for progress + * or real-time logs) during execution. + */ + private boolean enableActingChunk = false; + /** Default agent ID to use when not specified in the request. */ private String defaultAgentId = "default"; @@ -176,6 +185,14 @@ public void setEnableReasoning(boolean enableReasoning) { this.enableReasoning = enableReasoning; } + public boolean isEnableActingChunk() { + return enableActingChunk; + } + + public void setEnableActingChunk(boolean enableActingChunk) { + this.enableActingChunk = enableActingChunk; + } + public String getDefaultAgentId() { return defaultAgentId; } diff --git a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/mvc/AgentscopeAguiMvcAutoConfiguration.java b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/mvc/AgentscopeAguiMvcAutoConfiguration.java index e74d5a91b0..abd44cf272 100644 --- a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/mvc/AgentscopeAguiMvcAutoConfiguration.java +++ b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/mvc/AgentscopeAguiMvcAutoConfiguration.java @@ -81,6 +81,7 @@ public AguiMvcController aguiMvcController( .emitStateEvents(props.isEmitStateEvents()) .emitToolCallArgs(props.isEmitToolCallArgs()) .enableReasoning(props.isEnableReasoning()) + .enableActingChunk(props.isEnableActingChunk()) .defaultAgentId(props.getDefaultAgentId()) .build(); diff --git a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/webflux/AgentscopeAguiWebFluxAutoConfiguration.java b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/webflux/AgentscopeAguiWebFluxAutoConfiguration.java index 23513f2b42..67c8dfdeb7 100644 --- a/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/webflux/AgentscopeAguiWebFluxAutoConfiguration.java +++ b/agentscope-extensions/agentscope-spring-boot-starters/agentscope-agui-spring-boot-starter/src/main/java/io/agentscope/spring/boot/agui/webflux/AgentscopeAguiWebFluxAutoConfiguration.java @@ -84,6 +84,7 @@ public AguiWebFluxHandler aguiWebFluxHandler( .emitStateEvents(props.isEmitStateEvents()) .emitToolCallArgs(props.isEmitToolCallArgs()) .enableReasoning(props.isEnableReasoning()) + .enableActingChunk(props.isEnableActingChunk()) .defaultAgentId(props.getDefaultAgentId()) .build(); From eb5e6c1c397fe49eedc02d8787eecdb452d268f3 Mon Sep 17 00:00:00 2001 From: jujn <2087687391@qq.com> Date: Sat, 6 Jun 2026 21:59:32 +0800 Subject: [PATCH 2/2] fix: comment --- .../java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java index 92bdc11a1f..a5c4042736 100644 --- a/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java +++ b/agentscope-extensions/agentscope-extensions-agui/src/main/java/io/agentscope/core/agui/adapter/AguiAdapterConfig.java @@ -197,7 +197,7 @@ public Builder enableReasoning(boolean enableReasoning) { * Set whether to enable acting chunk emissions. * *

When enabled, tools can emit intermediate chunks (e.g., Custom events for progress - * or real-time logs) during execution. Default is true. + * or real-time logs) during execution. Default is false. * * @param enableActingChunk true to enable acting chunks * @return This builder