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());