]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Auto-trigger llmindex rebuild when enabled
authorshamoon <4887959+shamoon@users.noreply.github.com>
Wed, 30 Apr 2025 03:16:02 +0000 (20:16 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Wed, 2 Jul 2025 18:04:04 +0000 (11:04 -0700)
src/documents/tasks.py
src/paperless/views.py
src/paperless_ai/indexing.py

index 73dd11a79ae6ad994ac00c51a10be2c5606a2d0a..d0d2bd95bcbe9d2dca536ed9af02d44c282d8427 100644 (file)
@@ -535,12 +535,20 @@ def check_scheduled_workflows():
 
 
 @shared_task
-def llmindex_index(*, progress_bar_disable=True, rebuild=False, scheduled=True):
+def llmindex_index(
+    *,
+    progress_bar_disable=True,
+    rebuild=False,
+    scheduled=True,
+    auto=False,
+):
     ai_config = AIConfig()
     if ai_config.llm_index_enabled():
         task = PaperlessTask.objects.create(
             type=PaperlessTask.TaskType.SCHEDULED_TASK
             if scheduled
+            else PaperlessTask.TaskType.AUTO
+            if auto
             else PaperlessTask.TaskType.MANUAL_TASK,
             task_id=uuid.uuid4(),
             task_name=PaperlessTask.TaskName.LLMINDEX_UPDATE,
index f206b6b15f67dbf48625b0e401b12e085572fbea..e628d63e338318a07c79bdf312d200db36d3eed3 100644 (file)
@@ -35,6 +35,7 @@ from rest_framework.viewsets import ModelViewSet
 
 from documents.index import DelayedQuery
 from documents.permissions import PaperlessObjectPermissions
+from documents.tasks import llmindex_index
 from paperless.filters import GroupFilterSet
 from paperless.filters import UserFilterSet
 from paperless.models import ApplicationConfiguration
@@ -43,6 +44,7 @@ from paperless.serialisers import GroupSerializer
 from paperless.serialisers import PaperlessAuthTokenSerializer
 from paperless.serialisers import ProfileSerializer
 from paperless.serialisers import UserSerializer
+from paperless_ai.indexing import vector_store_file_exists
 
 
 class PaperlessObtainAuthTokenView(ObtainAuthToken):
@@ -353,6 +355,30 @@ class ApplicationConfigurationViewSet(ModelViewSet):
     def create(self, request, *args, **kwargs):
         return Response(status=405)  # Not Allowed
 
+    def perform_update(self, serializer):
+        old_instance = ApplicationConfiguration.objects.all().first()
+        old_ai_index_enabled = (
+            old_instance.ai_enabled and old_instance.llm_embedding_backend
+        )
+
+        new_instance: ApplicationConfiguration = serializer.save()
+        new_ai_index_enabled = (
+            new_instance.ai_enabled and new_instance.llm_embedding_backend
+        )
+
+        if (
+            not old_ai_index_enabled
+            and new_ai_index_enabled
+            and not vector_store_file_exists()
+        ):
+            # AI index was just enabled and vector store file does not exist
+            llmindex_index.delay(
+                progress_bar_disable=True,
+                rebuild=True,
+                scheduled=False,
+                auto=True,
+            )
+
 
 @extend_schema_view(
     post=extend_schema(
index 548b6ba51b78babea9f3cdbdb645373e7d22b777..4e0f2ffdf58e3a5f0fbcfbc48ce2cc63d8f46c9b 100644 (file)
@@ -115,6 +115,13 @@ def remove_document_docstore_nodes(document: Document, index: VectorStoreIndex):
         index.docstore.delete_document(node_id)
 
 
+def vector_store_file_exists():
+    """
+    Check if the vector store file exists in the LLM index directory.
+    """
+    return Path(settings.LLM_INDEX_DIR / "default__vector_store.json").exists()
+
+
 def update_llm_index(*, progress_bar_disable=False, rebuild=False) -> str:
     """
     Rebuild or update the LLM index.
@@ -127,10 +134,7 @@ def update_llm_index(*, progress_bar_disable=False, rebuild=False) -> str:
         logger.warning(msg)
         return msg
 
-    if (
-        rebuild
-        or not Path(settings.LLM_INDEX_DIR / "default__vector_store.json").exists()
-    ):
+    if rebuild or not vector_store_file_exists():
         # Rebuild index from scratch
         logger.info("Rebuilding LLM index.")
         embed_model = get_embedding_model()