From 9b0f781987864f4635991238abe7272e8c787622 Mon Sep 17 00:00:00 2001 From: guslegend <1670547022@qq.com> Date: Thu, 25 Jun 2026 23:28:08 +0800 Subject: [PATCH] fix(dify): handle string query response --- .../integration/dify/model/DifyResponse.java | 27 ++++++++++ .../integration/dify/DifyRAGClientTest.java | 53 +++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/main/java/io/agentscope/core/rag/integration/dify/model/DifyResponse.java b/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/main/java/io/agentscope/core/rag/integration/dify/model/DifyResponse.java index bd258fdad0..57581f8ffc 100644 --- a/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/main/java/io/agentscope/core/rag/integration/dify/model/DifyResponse.java +++ b/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/main/java/io/agentscope/core/rag/integration/dify/model/DifyResponse.java @@ -15,6 +15,7 @@ */ package io.agentscope.core.rag.integration.dify.model; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; @@ -25,6 +26,25 @@ *

This class maps the JSON response from Dify's retrieve endpoint: *

{@code
  * {
+ *   "query": "..." ,
+ *   "records": [
+ *     {
+ *       "segment": {
+ *         "id": "...",
+ *         "document_id": "...",
+ *         "content": "...",
+ *         "position": 1,
+ *         "document": { "id": "...", "name": "..." }
+ *       },
+ *       "score": 0.95
+ *     }
+ *   ]
+ * }
+ *
+ * 

Some Dify deployments return {@code query} as an object with a {@code content} field. + * The model keeps that form compatible as well. + *

{@code
+ * {
  *   "query": { "content": "..." },
  *   "records": [
  *     {
@@ -70,6 +90,13 @@ public void setRecords(List records) {
     public static class Query {
         private String content;
 
+        @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
+        public static Query fromString(String content) {
+            Query query = new Query();
+            query.setContent(content);
+            return query;
+        }
+
         public String getContent() {
             return content;
         }
diff --git a/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/test/java/io/agentscope/core/rag/integration/dify/DifyRAGClientTest.java b/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/test/java/io/agentscope/core/rag/integration/dify/DifyRAGClientTest.java
index 2bca9bc819..fa79d3296c 100644
--- a/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/test/java/io/agentscope/core/rag/integration/dify/DifyRAGClientTest.java
+++ b/agentscope-extensions/agentscope-extensions-rag/agentscope-extensions-rag-dify/src/test/java/io/agentscope/core/rag/integration/dify/DifyRAGClientTest.java
@@ -75,6 +75,31 @@ private MockResponse createSuccessResponse() {
                 .setBody(responseBody);
     }
 
+    private MockResponse createSuccessResponseWithQuery(String queryJson) {
+        String responseBody =
+                String.format(
+                        """
+                        {
+                            "query": %s,
+                            "records": [
+                                {
+                                    "segment": {
+                                        "id": "seg-1",
+                                        "content": "Test content",
+                                        "document_id": "doc-1"
+                                    },
+                                    "score": 0.95
+                                }
+                            ]
+                        }
+                        """,
+                        queryJson);
+        return new MockResponse()
+                .setResponseCode(200)
+                .setHeader("Content-Type", "application/json")
+                .setBody(responseBody);
+    }
+
     private MockResponse createEmptyResponse() {
         return new MockResponse()
                 .setResponseCode(200)
@@ -408,6 +433,34 @@ void testParseSuccessfulResponse() throws Exception {
         assertEquals(0.95, response.getRecords().get(0).getScore(), 0.001);
     }
 
+    @Test
+    void testParseStringQueryResponse() throws Exception {
+        mockWebServer.enqueue(createSuccessResponseWithQuery("\"ping\""));
+
+        DifyRAGClient client = new DifyRAGClient(createConfig());
+        DifyResponse response = client.retrieve("test query", 5).block();
+
+        assertNotNull(response);
+        assertNotNull(response.getQuery());
+        assertEquals("ping", response.getQuery().getContent());
+        assertNotNull(response.getRecords());
+        assertEquals(1, response.getRecords().size());
+    }
+
+    @Test
+    void testParseObjectQueryResponse() throws Exception {
+        mockWebServer.enqueue(createSuccessResponseWithQuery("{\"content\":\"ping\"}"));
+
+        DifyRAGClient client = new DifyRAGClient(createConfig());
+        DifyResponse response = client.retrieve("test query", 5).block();
+
+        assertNotNull(response);
+        assertNotNull(response.getQuery());
+        assertEquals("ping", response.getQuery().getContent());
+        assertNotNull(response.getRecords());
+        assertEquals(1, response.getRecords().size());
+    }
+
     @Test
     void testHandleEmptyResponse() throws Exception {
         mockWebServer.enqueue(createEmptyResponse());