From 3730ad8b842cd51b0d30762bdcd23092b20e710e Mon Sep 17 00:00:00 2001 From: guslegend <1670547022@qq.com> Date: Thu, 25 Jun 2026 22:56:26 +0800 Subject: [PATCH 1/2] fix(agentrun): unwrap data envelopes --- .../sandbox/agentrun/AgentRunDataPlaneHttp.java | 11 +++++++++-- .../sandbox/agentrun/AgentRunDataPlaneHttpTest.java | 7 +++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/main/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttp.java b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/main/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttp.java index eb99c4657..d723a06ae 100644 --- a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/main/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttp.java +++ b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/main/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttp.java @@ -102,6 +102,13 @@ JsonNode getSandbox(String sandboxId) throws IOException { return AgentRunRetry.withRetries(opt.getMaxRetries(), () -> getJson(url)); } + private JsonNode unwrapData(JsonNode node) { + if (node != null && node.hasNonNull("data")) { + return node.get("data"); + } + return node; + } + /** * Deletes the sandbox. Returns silently on HTTP 404 (already gone). All other non-2xx * responses raise. @@ -195,7 +202,7 @@ private JsonNode postJson(String url, ObjectNode body) throws IOException { if (text.isBlank()) { return json.createObjectNode(); } - return json.readTree(text); + return unwrapData(json.readTree(text)); } } @@ -208,7 +215,7 @@ private JsonNode getJson(String url) throws IOException { SandboxErrorCode.WORKSPACE_START_ERROR, "AgentRun HTTP " + res.code() + " " + res.message() + ": " + text); } - return json.readTree(text); + return unwrapData(json.readTree(text)); } } } diff --git a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java index 6bca0d66e..40be0fb1d 100644 --- a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java +++ b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java @@ -63,7 +63,8 @@ void usesSandboxPathsWithoutVersionPrefix() throws Exception { AgentRunDataPlaneHttp http = new AgentRunDataPlaneHttp(opt); - mockServer.enqueue(new MockResponse().setResponseCode(200).setBody("{\"id\":\"sb-1\"}")); + mockServer.enqueue( + new MockResponse().setResponseCode(200).setBody("{\"data\":{\"id\":\"sb-1\"}}")); JsonNode created = http.createSandbox("sb-1"); assertNotNull(created); assertEquals("sb-1", created.get("id").asText()); @@ -76,7 +77,9 @@ void usesSandboxPathsWithoutVersionPrefix() throws Exception { assertTrue(createReq.getBody().readUtf8().contains("\"sandboxId\":\"sb-1\"")); mockServer.enqueue( - new MockResponse().setResponseCode(200).setBody("{\"status\":\"READY\"}")); + new MockResponse() + .setResponseCode(200) + .setBody("{\"data\":{\"status\":\"READY\"}}")); JsonNode fetched = http.getSandbox("sb-1"); assertNotNull(fetched); assertEquals("READY", fetched.get("status").asText()); From 940a4fc0d3af6cb47f9794de86c15cd681cf44ee Mon Sep 17 00:00:00 2001 From: guslegend <1670547022@qq.com> Date: Fri, 26 Jun 2026 07:46:45 +0800 Subject: [PATCH 2/2] test(agentrun): cover unwrapped data envelopes --- .../agentrun/AgentRunDataPlaneHttpTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java index 40be0fb1d..c4f2981ce 100644 --- a/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java +++ b/agentscope-extensions/agentscope-extensions-sandbox/agentscope-extensions-sandbox-agentrun/src/test/java/io/agentscope/extensions/sandbox/agentrun/AgentRunDataPlaneHttpTest.java @@ -95,4 +95,33 @@ void usesSandboxPathsWithoutVersionPrefix() throws Exception { assertEquals("DELETE", deleteReq.getMethod()); assertEquals("/sandboxes/sb-1", deleteReq.getPath()); } + + @Test + void acceptsResponsesWithoutDataEnvelope() throws Exception { + String baseUrl = mockServer.url("/").toString(); + if (baseUrl.endsWith("/")) { + baseUrl = baseUrl.substring(0, baseUrl.length() - 1); + } + + AgentRunSandboxClientOptions opt = + new AgentRunSandboxClientOptions() + .setApiKey("test-key") + .setTemplateName("agentscope-default") + .setMcpServerUrl("https://example.com/mcp") + .setDataPlaneBaseUrl(baseUrl) + .setHttpClient(new OkHttpClient()); + + AgentRunDataPlaneHttp http = new AgentRunDataPlaneHttp(opt); + + mockServer.enqueue(new MockResponse().setResponseCode(200).setBody("{\"id\":\"sb-2\"}")); + JsonNode created = http.createSandbox("sb-2"); + assertNotNull(created); + assertEquals("sb-2", created.get("id").asText()); + + mockServer.enqueue( + new MockResponse().setResponseCode(200).setBody("{\"status\":\"RUNNING\"}")); + JsonNode fetched = http.getSandbox("sb-2"); + assertNotNull(fetched); + assertEquals("RUNNING", fetched.get("status").asText()); + } }