Skip to content

Commit 9d93ec8

Browse files
committed
Fix spring boot start mode, make it runnable with 1.0
Change-Id: I9bc2d9249faf91041160647e9e4212cfb6ffda15
1 parent d762ee3 commit 9d93ec8

File tree

11 files changed

+525
-136
lines changed

11 files changed

+525
-136
lines changed

core/src/test/java/io/agentscope/runtime/adapters/agentscope/AgentScopeStreamAdapterTest.java

Lines changed: 462 additions & 126 deletions
Large diffs are not rendered by default.

core/src/test/java/io/agentscope/runtime/sandbox/manager/ContainerPoolTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.junit.jupiter.api.Test;
2323
import org.junit.jupiter.api.BeforeEach;
2424
import org.junit.jupiter.api.AfterEach;
25+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
2526

2627
import static org.junit.jupiter.api.Assertions.*;
2728

@@ -36,6 +37,7 @@
3637
* <li>If port conflicts occur, SandboxManager will automatically retry</li>
3738
* </ul>
3839
*/
40+
@EnabledIfDockerAvailable
3941
public class ContainerPoolTest {
4042

4143
private SandboxManager manager;

core/src/test/java/io/agentscope/runtime/sandbox/manager/DockerLifecycleTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import io.agentscope.runtime.sandbox.manager.model.container.SandboxType;
2929
import io.agentscope.runtime.sandbox.manager.model.container.ContainerModel;
30+
import org.junit.jupiter.api.condition.EnabledIf;
31+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
3032

3133
import java.util.UUID;
3234

@@ -35,6 +37,8 @@
3537
* Docker Sandbox Lifecycle Test
3638
* Tests sandbox creation, startup, status checking, stopping and cleanup functionality in Docker environment
3739
*/
40+
@EnabledIfDockerAvailable
41+
@EnabledIf(value = "isCI", disabledReason = "this test is designed to run only in the GitHub CI environment.")
3842
public class DockerLifecycleTest {
3943

4044
private SandboxManager sandboxManager;

core/src/test/java/io/agentscope/runtime/sandbox/manager/LocalFileSystemTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.junit.jupiter.api.BeforeEach;
2424
import org.junit.jupiter.api.Test;
2525
import org.junit.jupiter.api.AfterEach;
26+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
2627

2728
import java.io.File;
2829
import java.io.FileWriter;
@@ -42,6 +43,7 @@
4243
* Environment Variable Configuration:
4344
* - LOCAL_STORAGE_PATH: Local storage root directory path (optional, defaults to ./test_storage)
4445
*/
46+
@EnabledIfDockerAvailable
4547
public class LocalFileSystemTest {
4648

4749
private String localStoragePath;

core/src/test/java/io/agentscope/runtime/sandbox/tools/BaseToolsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
import org.junit.jupiter.api.AfterEach;
2525
import org.junit.jupiter.api.BeforeEach;
2626
import org.junit.jupiter.api.Test;
27+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
28+
2729
import static org.junit.jupiter.api.Assertions.*;
2830

31+
@EnabledIfDockerAvailable
2932
public class BaseToolsTest {
3033

3134
private SandboxManager sandboxManager;

core/src/test/java/io/agentscope/runtime/sandbox/tools/BrowserInteractiveToolsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,15 @@
2424
import org.junit.jupiter.api.AfterEach;
2525
import org.junit.jupiter.api.BeforeEach;
2626
import org.junit.jupiter.api.Test;
27+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
28+
2729
import static org.junit.jupiter.api.Assertions.*;
2830

2931
/**
3032
* Test browser tools that require page element interaction
3133
* These tests require pages with specific elements to work properly
3234
*/
35+
@EnabledIfDockerAvailable
3336
public class BrowserInteractiveToolsTest {
3437

3538
private SandboxManager sandboxManager;

core/src/test/java/io/agentscope/runtime/sandbox/tools/BrowserToolsTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@
2424
import org.junit.jupiter.api.AfterEach;
2525
import org.junit.jupiter.api.BeforeEach;
2626
import org.junit.jupiter.api.Test;
27+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
2728

2829
import static org.junit.jupiter.api.Assertions.*;
2930

31+
@EnabledIfDockerAvailable
3032
public class BrowserToolsTest{
3133

3234
private SandboxManager sandboxManager;

core/src/test/java/io/agentscope/runtime/sandbox/tools/FilesystemToolsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,11 @@
2424
import org.junit.jupiter.api.AfterEach;
2525
import org.junit.jupiter.api.BeforeEach;
2626
import org.junit.jupiter.api.Test;
27+
import org.testcontainers.junit.jupiter.EnabledIfDockerAvailable;
28+
2729
import static org.junit.jupiter.api.Assertions.*;
2830

31+
@EnabledIfDockerAvailable
2932
public class FilesystemToolsTest{
3033

3134
private SandboxManager sandboxManager;

examples/browser_use_fullstack_runtime/backend/src/main/java/io/agentscope/browser/agent/AgentscopeBrowserUseAgent.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public class AgentscopeBrowserUseAgent extends AgentScopeAgentHandler {
6565
private String baseUrl;
6666
private String runtimeToken;
6767

68+
private volatile boolean connected = false;
69+
6870
/**
6971
* Creates a new AgentscopeBrowserUseAgent.
7072
*/
@@ -83,7 +85,7 @@ public AgentscopeBrowserUseAgent() {
8385
/**
8486
* Connect and initialize the agent
8587
*/
86-
public Sandbox connect(String sessionId, String userId) {
88+
public synchronized Sandbox connect(String sessionId, String userId) {
8789
logger.info("Initializing sand box...");
8890
Sandbox sandbox = null;
8991
// Get browser WebSocket URL and VNC info
@@ -180,7 +182,7 @@ public Flux<Event> streamQuery(AgentRequest request, Object messages) {
180182
.model(
181183
DashScopeChatModel.builder()
182184
.apiKey(apiKey)
183-
.modelName("qwen-plus")
185+
.modelName("qwen-max")
184186
.stream(true)
185187
.enableThinking(true)
186188
.formatter(new DashScopeChatFormatter())
@@ -255,7 +257,7 @@ public Flux<Event> streamQuery(AgentRequest request, Object messages) {
255257
// Return raw framework stream - Runner will handle conversion via StreamAdapter
256258
return agentScopeEvents
257259
.doOnNext(event -> {
258-
logger.debug("Agent event: {}", event);
260+
logger.info("Agent event: {}", event);
259261
})
260262
.doFinally(signalType -> {
261263
// Step 9: Save state after completion

examples/browser_use_fullstack_runtime/backend/src/main/java/io/agentscope/browser/controller/ChatController.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,13 @@
1717
package io.agentscope.browser.controller;
1818

1919
import io.agentscope.browser.agent.AgentscopeBrowserUseAgent;
20+
import io.agentscope.core.agent.EventType;
2021
import io.agentscope.core.message.ContentBlock;
2122
import io.agentscope.core.message.Msg;
2223
import io.agentscope.core.message.MsgRole;
2324
import io.agentscope.core.message.TextBlock;
25+
import io.agentscope.core.message.ThinkingBlock;
26+
import io.agentscope.core.message.ToolResultBlock;
2427
import io.agentscope.core.message.ToolUseBlock;
2528
import io.agentscope.runtime.engine.schemas.AgentRequest;
2629
import org.slf4j.Logger;
@@ -36,6 +39,8 @@
3639
import java.util.List;
3740
import java.util.Map;
3841

42+
import javax.annotation.PostConstruct;
43+
3944
/**
4045
* REST controller for browser agent chat endpoints
4146
*/
@@ -54,6 +59,11 @@ public ChatController(AgentscopeBrowserUseAgent agent) {
5459
this.agent = agent;
5560
}
5661

62+
@PostConstruct
63+
public void init() {
64+
this.agent.start();
65+
}
66+
5767
/**
5868
* Stream chat completions endpoint (OpenAI-compatible)
5969
*/
@@ -81,16 +91,24 @@ public Flux<String> streamChatCompletions(@RequestBody Map<String, Object> reque
8191

8292
return agent.streamQuery(agentRequest, convertedMessages)
8393
.flatMap(event -> {
94+
EventType type = event.getType();
95+
boolean isLast = false;
96+
if (event.isLast() || type == EventType.AGENT_RESULT) {
97+
isLast = true;
98+
}
99+
84100
Msg msgGenerated = event.getMessage();
85-
if (msgGenerated == null || msgGenerated.getContent() == null || msgGenerated.getContent().isEmpty()) {
101+
if (msgGenerated == null || msgGenerated.getContent() == null || msgGenerated.getContent()
102+
.isEmpty()) {
86103
return Flux.just(simpleYield("", "content"));
87104
}
88105

89106
List<ContentBlock> contentList = msgGenerated.getContent();
90107
StringBuilder responseBuilder = new StringBuilder();
108+
StringBuilder thinkingBuilder = new StringBuilder();
91109

92110
for (ContentBlock item : contentList) {
93-
if (item instanceof TextBlock textContent) {
111+
if (item instanceof TextBlock textContent && !isLast) {
94112
String text = textContent.getText();
95113
if (text != null && !text.isEmpty()) {
96114
responseBuilder.append(text);
@@ -99,15 +117,28 @@ public Flux<String> streamChatCompletions(@RequestBody Map<String, Object> reque
99117
}
100118
else if (item instanceof ToolUseBlock toolUseBlock) {
101119
responseBuilder.append("Using tool: ").append(toolUseBlock.getName()).append("\n");
120+
} else if (item instanceof ToolResultBlock toolResultBlock) {
121+
responseBuilder.append("Tool result: ").append(toolResultBlock.getOutput()).append("\n");
122+
} else if (item instanceof ThinkingBlock thinkingBlock) {
123+
String thought = thinkingBlock.getThinking();
124+
if (thought != null && !thought.isEmpty()) {
125+
thinkingBuilder.append("[Thinking]: ").append(thought).append("\n");
126+
}
102127
}
103128
}
104129

105130
String response = responseBuilder.toString();
106131
if (!response.isEmpty()) {
107132
return Flux.just(simpleYield(response, "content"));
108-
} else {
109-
return Flux.just(simpleYield("", "content"));
110133
}
134+
135+
String thinking = thinkingBuilder.toString();
136+
if (!thinking.isEmpty()) {
137+
return Flux.just(simpleYield(thinking, "think"));
138+
}
139+
140+
return Flux.just(simpleYield("", "content"));
141+
111142
})
112143
.onErrorResume(error -> {
113144
logger.error("Error during chat completion", error);
@@ -122,6 +153,8 @@ else if (item instanceof ToolUseBlock toolUseBlock) {
122153
public ResponseEntity<Map<String, String>> getEnvInfo() {
123154
logger.info("Received env_info request");
124155

156+
agent.connect(SESSION_ID, USER_ID);
157+
125158
String baseUrl = agent.getBaseUrl();
126159
String runtimeToken = agent.getRuntimeToken();
127160

0 commit comments

Comments
 (0)