diff --git a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/application/muse/facade/HttpRagFlowKnowledgeRuntimeClient.java b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/application/muse/facade/HttpRagFlowKnowledgeRuntimeClient.java index f0007610..d4c966f2 100644 --- a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/application/muse/facade/HttpRagFlowKnowledgeRuntimeClient.java +++ b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/main/java/cn/iocoder/muse/module/knowledge/application/muse/facade/HttpRagFlowKnowledgeRuntimeClient.java @@ -144,7 +144,11 @@ public class HttpRagFlowKnowledgeRuntimeClient implements RagFlowKnowledgeRuntim public RuntimeResult retrieveChunks(RetrieveChunksCommand command) { Map body = new LinkedHashMap<>(); body.put("dataset_ids", command.ragflowDatasetIds()); - body.put("document_ids", command.ragflowDocumentIds()); + // RAGFlow 要求 document_ids 为 list;为 null(不限定具体文档、按授权 dataset 全量检索)时不放入 body, + // 否则 RAGFlow 拒绝 code 102 "`documents` should be a list" → 检索 fail-closed,P-A 上下文检索永不命中。 + if (command.ragflowDocumentIds() != null) { + body.put("document_ids", command.ragflowDocumentIds()); + } body.put("question", command.question()); body.put("top_k", command.topK()); body.put("similarity_threshold", command.threshold()); diff --git a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/RagFlowKnowledgeRuntimeClientTest.java b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/RagFlowKnowledgeRuntimeClientTest.java index f40cd2b3..3284a77e 100644 --- a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/RagFlowKnowledgeRuntimeClientTest.java +++ b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/facade/RagFlowKnowledgeRuntimeClientTest.java @@ -347,6 +347,24 @@ class RagFlowKnowledgeRuntimeClientTest { assertFalse(result.redactedSummary().contains("private prompt")); } + @Test + void retrieveChunksShouldOmitDocumentIdsFromBodyWhenNull() { + // 回归:document_ids 为 null(P-A 按授权 dataset 全量检索、不限定具体文档)时不得放入 body; + // RAGFlow 要求其为 list,传 null 会被拒 code 102 "`documents` should be a list" 致检索 fail-closed → P-A 永不命中。 + CapturingHttpRagFlowKnowledgeRuntimeClient client = new CapturingHttpRagFlowKnowledgeRuntimeClient( + "https://ragflow.example", "configured-api-key", + "{\"code\":0,\"data\":{\"chunks\":[{\"content\":\"c\",\"score\":0.9}]}}"); + + RagFlowKnowledgeRuntimeClient.RuntimeResult result = client.retrieveChunks( + new RagFlowKnowledgeRuntimeClient.RetrieveChunksCommand(100L, 2001L, 4001L, + List.of("dataset-1"), null, "q", 5, 0.2, null, "corr-null-doc", "hash-null-doc", 1)); + + assertEquals(RagFlowKnowledgeRuntimeClient.Status.SUCCEEDED, result.status()); + String requestBody = new String(client.requests.get(0).body(), StandardCharsets.UTF_8); + assertFalse(requestBody.contains("document_ids"), "document_ids 为 null 时不应出现在请求 body"); + assertTrue(requestBody.contains("dataset_ids")); + } + @Test void listChunksShouldSucceedWithoutTopLevelId() { HttpRagFlowKnowledgeRuntimeClient client = new StubHttpRagFlowKnowledgeRuntimeClient(