openrag 0.4.0.dev6__tar.gz → 0.4.0.dev8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {openrag-0.4.0.dev6/src/openrag.egg-info → openrag-0.4.0.dev8}/PKG-INFO +1 -1
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/pyproject.toml +1 -1
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/settings.py +83 -40
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/main.py +46 -17
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/models/processors.py +3 -2
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8/src/openrag.egg-info}/PKG-INFO +1 -1
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/flows_service.py +110 -36
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/task_service.py +33 -24
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/docker-compose.yml +3 -1
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/config_fields.py +6 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/main.py +83 -30
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/managers/container_manager.py +1 -1
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/managers/env_manager.py +5 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/config.py +83 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/monitor.py +25 -6
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/LICENSE +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/MANIFEST.in +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/README.md +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/setup.cfg +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/agent.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/auth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/chat.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/connector_router.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/connectors.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/docling.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/documents.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/flows.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/keys.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/knowledge_filter.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/langflow_files.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/models.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/nudges.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/oidc.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/provider_health.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/provider_validation.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/router.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/search.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/tasks.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/upload.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/chat.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/documents.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/knowledge_filters.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/models.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/search.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/api/v1/settings.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/auth_context.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/config/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/config/config_manager.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/config/model_constants.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/config/settings.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/api.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/auth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/connector.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/models.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/aws_s3/support.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/base.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/connection_manager.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/google_drive/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/google_drive/connector.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/google_drive/oauth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/api.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/auth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/connector.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/models.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/ibm_cos/support.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/langflow_connector_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/onedrive/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/onedrive/connector.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/onedrive/oauth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/sharepoint/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/sharepoint/connector.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/sharepoint/oauth.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/connectors/sharepoint/utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/dependencies.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/models/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/models/tasks.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/models/url.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/openrag.egg-info/SOURCES.txt +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/openrag.egg-info/dependency_links.txt +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/openrag.egg-info/entry_points.txt +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/openrag.egg-info/requires.txt +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/openrag.egg-info/top_level.txt +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/api_key_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/auth_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/chat_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/conversation_persistence_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/document_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/knowledge_filter_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/langflow_file_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/langflow_history_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/langflow_mcp_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/models_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/monitor_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/search_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/services/session_ownership_service.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/session_manager.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/docker-compose.gpu.yml +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/ingestion_flow.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/openrag_agent.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/openrag_nudges.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/cli.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/managers/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/managers/docling_manager.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/diagnostics.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/logs.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/screens/welcome.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/clipboard.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/platform.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/startup_checks.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/validation.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/utils/version_check.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/command_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/diagnostics_notification.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/error_notification.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/prune_options_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/tui/widgets/waves.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/acl_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/container_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/docling_client.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/document_processing.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/embedding_fields.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/embeddings.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/env_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/file_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/gpu_detection.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/hash_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/langflow_headers.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/langflow_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/logging_config.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/opensearch_queries.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/opensearch_utils.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/paths.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/telemetry/__init__.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/telemetry/category.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/telemetry/client.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/telemetry/message_id.py +0 -0
- {openrag-0.4.0.dev6 → openrag-0.4.0.dev8}/src/utils/version_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrag
|
|
3
|
-
Version: 0.4.0.
|
|
3
|
+
Version: 0.4.0.dev8
|
|
4
4
|
Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
|
|
5
5
|
Classifier: Development Status :: 4 - Beta
|
|
6
6
|
Classifier: Environment :: Console
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "openrag"
|
|
7
|
-
version = "0.4.0.
|
|
7
|
+
version = "0.4.0.dev8"
|
|
8
8
|
description = "OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13"
|
|
@@ -211,6 +211,9 @@ class RollbackResponse(BaseModel):
|
|
|
211
211
|
cancelled_tasks: int
|
|
212
212
|
deleted_files: int
|
|
213
213
|
|
|
214
|
+
class RollbackBody(BaseModel):
|
|
215
|
+
embedding_only: bool = False
|
|
216
|
+
|
|
214
217
|
|
|
215
218
|
# Docling preset configurations
|
|
216
219
|
def get_docling_preset_configs(
|
|
@@ -1638,8 +1641,10 @@ async def reapply_all_settings(session_manager = None):
|
|
|
1638
1641
|
|
|
1639
1642
|
async def rollback_onboarding(
|
|
1640
1643
|
request: Request,
|
|
1644
|
+
body: Optional[RollbackBody] = None,
|
|
1641
1645
|
session_manager=Depends(get_session_manager),
|
|
1642
1646
|
task_service=Depends(get_task_service),
|
|
1647
|
+
knowledge_filter_service=Depends(get_knowledge_filter_service),
|
|
1643
1648
|
user: User = Depends(get_current_user),
|
|
1644
1649
|
) -> RollbackResponse:
|
|
1645
1650
|
"""Rollback onboarding configuration when sample data files fail.
|
|
@@ -1669,7 +1674,36 @@ async def rollback_onboarding(
|
|
|
1669
1674
|
cancelled_tasks = []
|
|
1670
1675
|
deleted_files = []
|
|
1671
1676
|
|
|
1677
|
+
# Delete knowledge filters created during onboarding
|
|
1678
|
+
try:
|
|
1679
|
+
async def remove_filter(filter_id: Optional[str]):
|
|
1680
|
+
if filter_id and knowledge_filter_service:
|
|
1681
|
+
try:
|
|
1682
|
+
result = await knowledge_filter_service.delete_knowledge_filter(
|
|
1683
|
+
filter_id, user.user_id, user.jwt_token
|
|
1684
|
+
)
|
|
1685
|
+
if result and result.get("success"):
|
|
1686
|
+
logger.info(f"Deleted knowledge filter {filter_id}")
|
|
1687
|
+
else:
|
|
1688
|
+
error_msg = result.get("error") if result else "Unknown error"
|
|
1689
|
+
logger.warning(f"Could not delete knowledge filter {filter_id}: {error_msg}")
|
|
1690
|
+
except Exception as e:
|
|
1691
|
+
logger.warning(f"Exception deleting knowledge filter {filter_id}: {str(e)}")
|
|
1692
|
+
|
|
1693
|
+
if getattr(current_config.onboarding, 'openrag_docs_filter_id', None):
|
|
1694
|
+
await remove_filter(current_config.onboarding.openrag_docs_filter_id)
|
|
1695
|
+
current_config.onboarding.openrag_docs_filter_id = None
|
|
1696
|
+
|
|
1697
|
+
if getattr(current_config.onboarding, 'user_doc_filter_id', None):
|
|
1698
|
+
await remove_filter(current_config.onboarding.user_doc_filter_id)
|
|
1699
|
+
current_config.onboarding.user_doc_filter_id = None
|
|
1700
|
+
except Exception as e:
|
|
1701
|
+
logger.error(f"Error while cleaning up knowledge filters: {e}")
|
|
1702
|
+
|
|
1672
1703
|
# Cancel all active tasks and collect successfully ingested files
|
|
1704
|
+
from session_manager import AnonymousUser
|
|
1705
|
+
anonymous_user_id = AnonymousUser().user_id
|
|
1706
|
+
|
|
1673
1707
|
for task_data in all_tasks:
|
|
1674
1708
|
task_id = task_data.get("task_id")
|
|
1675
1709
|
task_status = task_data.get("status")
|
|
@@ -1684,41 +1718,40 @@ async def rollback_onboarding(
|
|
|
1684
1718
|
except Exception as e:
|
|
1685
1719
|
logger.error(f"Failed to cancel task {task_id}: {str(e)}")
|
|
1686
1720
|
|
|
1687
|
-
#
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
logger.error(f"Failed to delete documents for {filename}: {str(e)}")
|
|
1721
|
+
# Delete all files associated with any task, regardless of whether
|
|
1722
|
+
# the task failed or completed, to ensure no partial chunks remain in OpenSearch.
|
|
1723
|
+
files = task_data.get("files", {})
|
|
1724
|
+
if isinstance(files, dict):
|
|
1725
|
+
for file_path, file_info in files.items():
|
|
1726
|
+
if isinstance(file_info, dict):
|
|
1727
|
+
filename = file_info.get("filename") or file_path.split("/")[-1]
|
|
1728
|
+
if filename:
|
|
1729
|
+
try:
|
|
1730
|
+
opensearch_client = session_manager.get_user_opensearch_client(
|
|
1731
|
+
user.user_id, jwt_token
|
|
1732
|
+
)
|
|
1733
|
+
from utils.opensearch_queries import build_filename_delete_body
|
|
1734
|
+
from config.settings import get_index_name
|
|
1735
|
+
|
|
1736
|
+
delete_query = build_filename_delete_body(filename)
|
|
1737
|
+
result = await opensearch_client.delete_by_query(
|
|
1738
|
+
index=get_index_name(),
|
|
1739
|
+
body=delete_query,
|
|
1740
|
+
conflicts="proceed"
|
|
1741
|
+
)
|
|
1742
|
+
deleted_count = result.get("deleted", 0)
|
|
1743
|
+
if deleted_count > 0:
|
|
1744
|
+
deleted_files.append(filename)
|
|
1745
|
+
logger.info(f"Deleted {deleted_count} chunks for filename {filename}")
|
|
1746
|
+
except Exception as e:
|
|
1747
|
+
logger.error(f"Failed to delete documents for {filename}: {str(e)}")
|
|
1748
|
+
|
|
1749
|
+
# Wipe the task completely from memory so the frontend doesn't see it anymore
|
|
1750
|
+
for check_user_id in [user.user_id, anonymous_user_id]:
|
|
1751
|
+
if check_user_id in task_service.task_store and task_id in task_service.task_store[check_user_id]:
|
|
1752
|
+
task_service._task_locks.pop(task_id, None)
|
|
1753
|
+
task_service.task_store[check_user_id].pop(task_id, None)
|
|
1754
|
+
logger.info(f"Purged task {task_id} completely from task_store for user {check_user_id}")
|
|
1722
1755
|
|
|
1723
1756
|
# Clear embedding provider and model settings
|
|
1724
1757
|
current_config.knowledge.embedding_provider = "openai" # Reset to default
|
|
@@ -1726,11 +1759,21 @@ async def rollback_onboarding(
|
|
|
1726
1759
|
current_config.onboarding.openrag_docs_ingested_version = None
|
|
1727
1760
|
current_config.onboarding.openrag_docs_remote_signature = None
|
|
1728
1761
|
|
|
1762
|
+
embedding_only = body.embedding_only if body else False
|
|
1763
|
+
|
|
1729
1764
|
# Mark config as not edited so user can go through onboarding again
|
|
1730
|
-
|
|
1731
|
-
|
|
1765
|
+
if not embedding_only:
|
|
1766
|
+
current_config.edited = False
|
|
1767
|
+
current_config.onboarding.current_step = 0
|
|
1768
|
+
# Also clear LLM provider and model settings when doing a full rollback
|
|
1769
|
+
current_config.agent.llm_provider = "openai" # Reset to default
|
|
1770
|
+
current_config.agent.llm_model = ""
|
|
1771
|
+
else:
|
|
1772
|
+
# When rolling back embedding only, we keep edited=True
|
|
1773
|
+
# and set current_step to 1 (which is the embedding step)
|
|
1774
|
+
current_config.onboarding.current_step = 1
|
|
1732
1775
|
|
|
1733
|
-
# Save the rolled back configuration manually
|
|
1776
|
+
# Save the rolled back configuration manually
|
|
1734
1777
|
try:
|
|
1735
1778
|
import yaml
|
|
1736
1779
|
config_file = config_manager.config_file
|
|
@@ -1738,14 +1781,14 @@ async def rollback_onboarding(
|
|
|
1738
1781
|
# Ensure directory exists
|
|
1739
1782
|
config_file.parent.mkdir(parents=True, exist_ok=True)
|
|
1740
1783
|
|
|
1741
|
-
# Save config with edited
|
|
1784
|
+
# Save config with current edited state
|
|
1742
1785
|
with open(config_file, "w") as f:
|
|
1743
1786
|
yaml.dump(current_config.to_dict(), f, default_flow_style=False, indent=2)
|
|
1744
1787
|
|
|
1745
1788
|
# Update cached config
|
|
1746
1789
|
config_manager._config = current_config
|
|
1747
1790
|
|
|
1748
|
-
logger.info("Successfully saved rolled back configuration with edited=
|
|
1791
|
+
logger.info(f"Successfully saved rolled back configuration with edited={current_config.edited}")
|
|
1749
1792
|
except Exception as e:
|
|
1750
1793
|
logger.error(f"Failed to save rolled back configuration: {e}")
|
|
1751
1794
|
return JSONResponse(
|
|
@@ -410,13 +410,14 @@ async def ingest_openrag_docs_when_ready(
|
|
|
410
410
|
):
|
|
411
411
|
"""Ingest OpenRAG docs during onboarding."""
|
|
412
412
|
use_url_ingest = _should_use_url_default_docs_ingest()
|
|
413
|
+
task_id = None
|
|
413
414
|
if use_url_ingest:
|
|
414
415
|
try:
|
|
415
416
|
await TelemetryClient.send_event(
|
|
416
417
|
Category.DOCUMENT_INGESTION, MessageId.ORB_DOC_DEFAULT_URL_START
|
|
417
418
|
)
|
|
418
419
|
if DISABLE_INGEST_WITH_LANGFLOW:
|
|
419
|
-
await _ingest_default_documents_url(
|
|
420
|
+
task_id = await _ingest_default_documents_url(
|
|
420
421
|
document_service=document_service,
|
|
421
422
|
docs_url=DEFAULT_DOCS_URL,
|
|
422
423
|
crawl_depth=DEFAULT_DOCS_CRAWL_DEPTH,
|
|
@@ -426,7 +427,7 @@ async def ingest_openrag_docs_when_ready(
|
|
|
426
427
|
"Ingesting default documents using Langflow",
|
|
427
428
|
docs_url=DEFAULT_DOCS_URL,
|
|
428
429
|
)
|
|
429
|
-
await _ingest_default_documents_url_langflow(
|
|
430
|
+
task_id = await _ingest_default_documents_url_langflow(
|
|
430
431
|
langflow_file_service=langflow_file_service,
|
|
431
432
|
session_manager=session_manager,
|
|
432
433
|
task_service=task_service,
|
|
@@ -441,6 +442,7 @@ async def ingest_openrag_docs_when_ready(
|
|
|
441
442
|
await TelemetryClient.send_event(
|
|
442
443
|
Category.DOCUMENT_INGESTION, MessageId.ORB_DOC_DEFAULT_URL_FAILED
|
|
443
444
|
)
|
|
445
|
+
return task_id
|
|
444
446
|
|
|
445
447
|
|
|
446
448
|
async def ingest_default_documents_when_ready(
|
|
@@ -456,9 +458,11 @@ async def ingest_default_documents_when_ready(
|
|
|
456
458
|
await TelemetryClient.send_event(
|
|
457
459
|
Category.DOCUMENT_INGESTION, MessageId.ORB_DOC_DEFAULT_START
|
|
458
460
|
)
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
461
|
+
task_id = None
|
|
462
|
+
if _should_use_url_default_docs_ingest():
|
|
463
|
+
task_id = await ingest_openrag_docs_when_ready(
|
|
464
|
+
document_service, task_service, langflow_file_service, session_manager
|
|
465
|
+
)
|
|
462
466
|
|
|
463
467
|
base_dir = _get_documents_dir()
|
|
464
468
|
if not os.path.isdir(base_dir):
|
|
@@ -469,8 +473,7 @@ async def ingest_default_documents_when_ready(
|
|
|
469
473
|
excluded_files = set(EXCLUDED_INGESTION_FILES)
|
|
470
474
|
if _should_use_url_default_docs_ingest():
|
|
471
475
|
excluded_files.update(URL_INGEST_EXCLUDED_INGESTION_FILES)
|
|
472
|
-
|
|
473
|
-
# Collect files recursively, excluding warmup files and URL-ingested docs
|
|
476
|
+
|
|
474
477
|
file_paths = [
|
|
475
478
|
os.path.join(root, fn)
|
|
476
479
|
for root, _, files in os.walk(base_dir)
|
|
@@ -482,18 +485,22 @@ async def ingest_default_documents_when_ready(
|
|
|
482
485
|
raise FileNotFoundError(f"No default documents found in {base_dir}")
|
|
483
486
|
|
|
484
487
|
if DISABLE_INGEST_WITH_LANGFLOW:
|
|
485
|
-
await _ingest_default_documents_openrag(
|
|
486
|
-
document_service, task_service, file_paths
|
|
488
|
+
new_task_id = await _ingest_default_documents_openrag(
|
|
489
|
+
document_service, task_service, file_paths, existing_task_id=task_id, connector_type="local"
|
|
487
490
|
)
|
|
491
|
+
task_id = new_task_id or task_id
|
|
488
492
|
else:
|
|
489
|
-
await _ingest_default_documents_langflow(
|
|
490
|
-
langflow_file_service, session_manager, task_service, file_paths
|
|
493
|
+
new_task_id = await _ingest_default_documents_langflow(
|
|
494
|
+
langflow_file_service, session_manager, task_service, file_paths, existing_task_id=task_id, connector_type="local"
|
|
491
495
|
)
|
|
496
|
+
task_id = new_task_id or task_id
|
|
492
497
|
|
|
493
498
|
await TelemetryClient.send_event(
|
|
494
499
|
Category.DOCUMENT_INGESTION, MessageId.ORB_DOC_DEFAULT_COMPLETE
|
|
495
500
|
)
|
|
496
501
|
|
|
502
|
+
return task_id
|
|
503
|
+
|
|
497
504
|
except Exception as e:
|
|
498
505
|
logger.error("Default documents ingestion failed", error=str(e))
|
|
499
506
|
await TelemetryClient.send_event(
|
|
@@ -503,7 +510,7 @@ async def ingest_default_documents_when_ready(
|
|
|
503
510
|
|
|
504
511
|
|
|
505
512
|
async def _ingest_default_documents_langflow(
|
|
506
|
-
langflow_file_service, session_manager, task_service, file_paths
|
|
513
|
+
langflow_file_service, session_manager, task_service, file_paths, existing_task_id: str = None, connector_type: str = "openrag_docs"
|
|
507
514
|
):
|
|
508
515
|
"""Ingest default documents using Langflow upload-ingest-delete pipeline."""
|
|
509
516
|
|
|
@@ -538,7 +545,7 @@ async def _ingest_default_documents_langflow(
|
|
|
538
545
|
{"key": "owner", "value": None},
|
|
539
546
|
{"key": "owner_name", "value": anonymous_user.name},
|
|
540
547
|
{"key": "owner_email", "value": anonymous_user.email},
|
|
541
|
-
{"key": "connector_type", "value": "
|
|
548
|
+
{"key": "connector_type", "value": "openrag_docs"},
|
|
542
549
|
{"key": "is_sample_data", "value": "true"},
|
|
543
550
|
]
|
|
544
551
|
}
|
|
@@ -558,6 +565,8 @@ async def _ingest_default_documents_langflow(
|
|
|
558
565
|
settings=None, # Use default ingestion settings
|
|
559
566
|
delete_after_ingest=True, # Clean up after ingestion
|
|
560
567
|
replace_duplicates=True,
|
|
568
|
+
connector_type=connector_type,
|
|
569
|
+
existing_task_id=existing_task_id,
|
|
561
570
|
)
|
|
562
571
|
|
|
563
572
|
logger.info(
|
|
@@ -565,6 +574,7 @@ async def _ingest_default_documents_langflow(
|
|
|
565
574
|
task_id=task_id,
|
|
566
575
|
file_count=len(file_paths),
|
|
567
576
|
)
|
|
577
|
+
return task_id
|
|
568
578
|
|
|
569
579
|
|
|
570
580
|
async def _ingest_default_documents_url_langflow(
|
|
@@ -626,6 +636,7 @@ async def _ingest_default_documents_url_langflow(
|
|
|
626
636
|
task_id=task_id,
|
|
627
637
|
docs_url=docs_url,
|
|
628
638
|
)
|
|
639
|
+
return task_id
|
|
629
640
|
|
|
630
641
|
|
|
631
642
|
async def _ingest_default_documents_url(
|
|
@@ -657,7 +668,7 @@ async def _ingest_default_documents_url(
|
|
|
657
668
|
owner_name=None,
|
|
658
669
|
owner_email=None,
|
|
659
670
|
is_sample_data=True,
|
|
660
|
-
connector_type="
|
|
671
|
+
connector_type="openrag_docs",
|
|
661
672
|
)
|
|
662
673
|
await processor.process_document_standard(
|
|
663
674
|
file_path=temp_file_path,
|
|
@@ -668,7 +679,7 @@ async def _ingest_default_documents_url(
|
|
|
668
679
|
owner_name=None,
|
|
669
680
|
owner_email=None,
|
|
670
681
|
file_size=os.path.getsize(temp_file_path),
|
|
671
|
-
connector_type="
|
|
682
|
+
connector_type="openrag_docs",
|
|
672
683
|
is_sample_data=True,
|
|
673
684
|
)
|
|
674
685
|
finally:
|
|
@@ -1035,7 +1046,7 @@ async def opensearch_health_ready(request):
|
|
|
1035
1046
|
|
|
1036
1047
|
|
|
1037
1048
|
async def _ingest_default_documents_openrag(
|
|
1038
|
-
document_service, task_service, file_paths, connector_type: str = "
|
|
1049
|
+
document_service, task_service, file_paths, existing_task_id: str = None, connector_type: str = "openrag_docs"
|
|
1039
1050
|
):
|
|
1040
1051
|
"""Ingest default documents using traditional OpenRAG processor."""
|
|
1041
1052
|
logger.info(
|
|
@@ -1056,12 +1067,13 @@ async def _ingest_default_documents_openrag(
|
|
|
1056
1067
|
connector_type=connector_type,
|
|
1057
1068
|
)
|
|
1058
1069
|
|
|
1059
|
-
task_id = await task_service.create_custom_task("anonymous", file_paths, processor)
|
|
1070
|
+
task_id = await task_service.create_custom_task("anonymous", file_paths, processor, existing_task_id=existing_task_id)
|
|
1060
1071
|
logger.info(
|
|
1061
1072
|
"Started traditional OpenRAG ingestion task",
|
|
1062
1073
|
task_id=task_id,
|
|
1063
1074
|
file_count=len(file_paths),
|
|
1064
1075
|
)
|
|
1076
|
+
return task_id
|
|
1065
1077
|
|
|
1066
1078
|
|
|
1067
1079
|
async def _update_mcp_servers_with_provider_credentials(services):
|
|
@@ -1198,6 +1210,20 @@ async def startup_tasks(services):
|
|
|
1198
1210
|
# Update MCP servers with provider credentials (especially important for no-auth mode)
|
|
1199
1211
|
await _update_mcp_servers_with_provider_credentials(services)
|
|
1200
1212
|
|
|
1213
|
+
# Ensure all configured flows exist in Langflow (create-only, never overwrites).
|
|
1214
|
+
# This replaces LANGFLOW_LOAD_FLOWS_PATH, which performed a blind upsert on
|
|
1215
|
+
# every container start and discarded any user edits made in the Langflow UI.
|
|
1216
|
+
newly_created: set[str] = set()
|
|
1217
|
+
try:
|
|
1218
|
+
flows_service = services["flows_service"]
|
|
1219
|
+
newly_created = await flows_service.ensure_flows_exist()
|
|
1220
|
+
except Exception as e:
|
|
1221
|
+
logger.error(
|
|
1222
|
+
"Failed to ensure Langflow flows exist at startup — "
|
|
1223
|
+
"flows may be missing until the next restart",
|
|
1224
|
+
error=str(e),
|
|
1225
|
+
)
|
|
1226
|
+
|
|
1201
1227
|
# Check if flows were reset and reapply settings if config is edited
|
|
1202
1228
|
try:
|
|
1203
1229
|
config = get_openrag_config()
|
|
@@ -1205,6 +1231,9 @@ async def startup_tasks(services):
|
|
|
1205
1231
|
logger.info("Checking if Langflow flows were reset")
|
|
1206
1232
|
flows_service = services["flows_service"]
|
|
1207
1233
|
reset_flows = await flows_service.check_flows_reset()
|
|
1234
|
+
# Exclude flows that were just seeded — they match the JSON by design,
|
|
1235
|
+
# not because they were externally reset.
|
|
1236
|
+
reset_flows = [f for f in reset_flows if f not in newly_created]
|
|
1208
1237
|
|
|
1209
1238
|
if reset_flows:
|
|
1210
1239
|
logger.info(
|
|
@@ -730,6 +730,7 @@ class LangflowFileProcessor(TaskProcessor):
|
|
|
730
730
|
settings: dict = None,
|
|
731
731
|
delete_after_ingest: bool = True,
|
|
732
732
|
replace_duplicates: bool = False,
|
|
733
|
+
connector_type: str = "local",
|
|
733
734
|
):
|
|
734
735
|
super().__init__()
|
|
735
736
|
self.langflow_file_service = langflow_file_service
|
|
@@ -743,6 +744,7 @@ class LangflowFileProcessor(TaskProcessor):
|
|
|
743
744
|
self.settings = settings
|
|
744
745
|
self.delete_after_ingest = delete_after_ingest
|
|
745
746
|
self.replace_duplicates = replace_duplicates
|
|
747
|
+
self.connector_type = connector_type
|
|
746
748
|
|
|
747
749
|
async def process_item(
|
|
748
750
|
self, upload_task: UploadTask, item: str, file_task: FileTask
|
|
@@ -828,8 +830,7 @@ class LangflowFileProcessor(TaskProcessor):
|
|
|
828
830
|
owner=self.owner_user_id,
|
|
829
831
|
owner_name=self.owner_name,
|
|
830
832
|
owner_email=self.owner_email,
|
|
831
|
-
connector_type=
|
|
832
|
-
|
|
833
|
+
connector_type=self.connector_type,
|
|
833
834
|
)
|
|
834
835
|
|
|
835
836
|
# Update task with success
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrag
|
|
3
|
-
Version: 0.4.0.
|
|
3
|
+
Version: 0.4.0.dev8
|
|
4
4
|
Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
|
|
5
5
|
Classifier: Development Status :: 4 - Beta
|
|
6
6
|
Classifier: Environment :: Console
|