iflytek/astron-agent · error · BusinessException

REPO_KNOWLEDGE_DELETE_FAILED

REPO_KNOWLEDGE_DELETE_FAILED

Error message

ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED

What it means

After resolving the file and applying the RAGFlow dataset ID, KnowledgeService calls knowledgeV2ServiceCallHandler.deleteDocOrChunk(request) to remove chunks. A response code != 0 triggers the log 'Failed to delete knowledge chunk' and BusinessException(REPO_KNOWLEDGE_DELETE_FAILED), wrapping any upstream rejection of the chunk delete.

Solutions

  1. Read 'Failed to delete knowledge chunk, message:{}' in the logs for the upstream cause.
  2. Verify chunks still exist upstream; treat 'not found' as success for idempotency.
  3. Re-validate the file's source/ragType and regenerate the ragflowDatasetId before retrying.
  4. Retry after upstream recovery; if state is divergent, reconcile the upstream index (re-sync or recreate dataset mapping).

Example fix

// before
KnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);
if (response.getCode() != 0) {
    throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);
}

// after
KnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);
if (response.getCode() != 0) {
    log.warn("chunk delete failed docId={} msg={}", request.getDocId(), response.getMessage());
    if (!isNotFoundUpstream(response)) {
        throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);
    } // else: already gone, treat as success
}
Defensive patterns

Strategy: retry

Validate before calling

// ensure dataset mapping is valid before delete
if (fileInfoV2.getSource().equals(ProjectContent.FILE_SOURCE_RAG_FLOW_RAG_STR)
        && repo.getRagflowDatasetId() == null) {
    return; // cannot delete upstream without dataset mapping
}

Try / catch

try {
    knowledgeService.deleteChunks(docId, chunkIds);
} catch (BusinessException e) {
    if (ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED.getCode().equals(e.getCode())) {
        // if upstream says not-found, treat as success; otherwise retry with backoff
    } else { throw e; }
}

Prevention

When it happens

Trigger: deleteDocOrChunk returns non-zero: chunks already removed upstream, invalid/missing ragflowDatasetId (or applyRagflowDatasetIdForDelete produced a state the upstream rejects), wrong ragType, or upstream RAG service failure/outage.

Common situations: Concurrent deletions of the same chunks; RAGFlow dataset deleted/recreated making datasetId stale; upstream maintenance window; contract drift after knowledge-service upgrade.

Related errors


AI-assisted analysis of iflytek/astron-agent@5e758547a8 (2026-09-12). Data as JSON: /api/errors/25f15832ce297461. Report an issue: GitHub.

Appendix: source

Thrown at console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java:1677

     * @throws BusinessException if file not found or deletion operations fail
     */
    public void deleteKnowledgeChunks(String docId, JSONArray deleteChunkIds) {
        if (!deleteChunkIds.isEmpty()) { // Delete documents
            KnowledgeRequest request = new KnowledgeRequest();
            request.setDocId(docId);
            request.setChunkIds(deleteChunkIds.toJavaList(String.class));
            FileInfoV2 fileInfoV2 = fileInfoV2Service.getOnly(new QueryWrapper<FileInfoV2>().eq("uuid", docId));
            if (fileInfoV2 == null) {
                throw new BusinessException(ResponseEnum.REPO_FILE_NOT_EXIST);
            }
            request.setRagType(fileInfoV2.getSource());
            if (!applyRagflowDatasetIdForDelete(request, fileInfoV2)) {
                return;
            }
            KnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);
            if (response.getCode() != 0) {
                log.error("Failed to delete knowledge chunk, message:{}", response.getMessage());
                throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);
            }
        }
    }

    /**
     * Create a Knowledge POJO from KnowledgeVO with default settings
     *
     * @param knowledgeVO the knowledge value object containing user input
     * @param fileId the file UUID associated with this knowledge
     * @return Knowledge object with populated default values
     */
    private Knowledge getKnowledgePojo(KnowledgeVO knowledgeVO, String fileId) {
        Knowledge knowledge = new Knowledge();
        knowledge.setFileId(fileId);
        knowledge.setContent(this.getKnowledgeDefaultConfig(knowledgeVO.getContent()));
        knowledge.setCharCount((long) knowledgeVO.getContent().length());
        knowledge.setEnabled(1);
        // Source is manual creation

View on GitHub (pinned to 5e758547a8)