infiniflow/ragflow · warning · RuntimeError

document not found

Error message

document not found

What it means

Raised in FileService.delete_docs when DocumentService.get_by_id(doc_id) returns not-found for one of the submitted document ids. The per-doc try block catches it and appends it to the errors string returned to the caller, so one bad id does not abort the whole batch.

Solutions

  1. Treat the returned error text as per-file: remove the stale id from the request and re-submit the remainder.
  2. Before deleting, verify each id with DocumentService.get_by_id or the document-list API.
  3. Make deletion idempotent in your client: treat 'document not found' as success.
  4. Check for duplicate ids in the payload.

Example fix

# before
FileService.delete_docs(['doc1', 'doc1'], tenant_id)  # second lookup fails

# after
FileService.delete_docs(list(dict.fromkeys(doc_ids)), tenant_id)  # dedupe
Defensive patterns

Strategy: try-catch

Validate before calling

doc_ids = list(dict.fromkeys(doc_ids))  # dedupe
valid_ids = [d for d in doc_ids if DocumentService.get_by_id(d)[0]]

Try / catch

errors, _ = FileService.delete_docs(doc_ids, tenant_id)
if 'not found' in errors:
    # treat as already-deleted: idempotent success
    pass

Prevention

When it happens

Trigger: Calling the document deletion API with a doc id that was already deleted, belongs to another tenant, or is malformed; duplicate ids in the list where the first delete removes the doc and the second lookup fails.

Common situations: Stale document id in the UI after deletion in another tab; retrying a partially completed delete request; scripts re-running against an already-cleaned dataset.

Related errors


AI-assisted analysis of infiniflow/ragflow@554fb1133a (2026-08-15). Data as JSON: /api/errors/98b4e435a9955ea5. Report an issue: GitHub.

Appendix: source

Thrown at api/db/services/file_service.py:715

    @staticmethod
    def put_blob(user_id, location, blob):
        bname = f"{user_id}-downloads"
        return settings.STORAGE_IMPL.put(bname, location, blob)

    @classmethod
    @DB.connection_context()
    def delete_docs(cls, doc_ids, tenant_id):
        root_folder = FileService.get_root_folder(tenant_id)
        pf_id = root_folder["id"]
        FileService.init_knowledgebase_docs(pf_id, tenant_id)
        errors = ""
        kb_table_num_map = {}
        for doc_id in doc_ids:
            try:
                e, doc = DocumentService.get_by_id(doc_id)
                if not e:
                    raise RuntimeError("document not found")
                tenant_id = DocumentService.get_tenant_id(doc_id)
                if not tenant_id:
                    raise RuntimeError("Tenant not found!")

                b, n = File2DocumentService.get_storage_address(doc_id=doc_id)

                TaskService.filter_delete([Task.doc_id == doc_id])
                if not DocumentService.remove_document(doc, tenant_id):
                    raise RuntimeError("Database error (Document removal)!")

                f2d = File2DocumentService.get_by_document_id(doc_id)
                deleted_file_count = 0
                if f2d:
                    deleted_file_count = FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id])
                File2DocumentService.delete_by_document_id(doc_id)
                if deleted_file_count > 0:
                    settings.STORAGE_IMPL.rm(b, n)

View on GitHub (pinned to 554fb1133a)