openrag 0.3.2.dev61__tar.gz → 0.3.4__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.3.2.dev61/src/openrag.egg-info → openrag-0.3.4}/PKG-INFO +4 -3
- {openrag-0.3.2.dev61 → openrag-0.3.4}/pyproject.toml +5 -4
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/agent.py +24 -29
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/connectors.py +5 -57
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/chat.py +0 -2
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/config_manager.py +4 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/settings.py +2 -7
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/__init__.py +0 -4
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/connection_manager.py +9 -57
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/langflow_connector_service.py +29 -30
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/main.py +39 -29
- {openrag-0.3.2.dev61 → openrag-0.3.4/src/openrag.egg-info}/PKG-INFO +4 -3
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/SOURCES.txt +0 -12
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/requires.txt +3 -2
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/auth_service.py +4 -69
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/chat_service.py +9 -10
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/search_service.py +0 -2
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/docker-compose.yml +0 -8
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_agent.json +2 -2
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/config_fields.py +0 -41
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/env_manager.py +0 -26
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/file_utils.py +4 -18
- openrag-0.3.2.dev61/src/connectors/aws_s3/__init__.py +0 -19
- openrag-0.3.2.dev61/src/connectors/aws_s3/api.py +0 -175
- openrag-0.3.2.dev61/src/connectors/aws_s3/auth.py +0 -90
- openrag-0.3.2.dev61/src/connectors/aws_s3/connector.py +0 -277
- openrag-0.3.2.dev61/src/connectors/aws_s3/models.py +0 -13
- openrag-0.3.2.dev61/src/connectors/aws_s3/support.py +0 -51
- openrag-0.3.2.dev61/src/connectors/ibm_cos/__init__.py +0 -17
- openrag-0.3.2.dev61/src/connectors/ibm_cos/api.py +0 -202
- openrag-0.3.2.dev61/src/connectors/ibm_cos/auth.py +0 -183
- openrag-0.3.2.dev61/src/connectors/ibm_cos/connector.py +0 -375
- openrag-0.3.2.dev61/src/connectors/ibm_cos/models.py +0 -20
- openrag-0.3.2.dev61/src/connectors/ibm_cos/support.py +0 -68
- {openrag-0.3.2.dev61 → openrag-0.3.4}/LICENSE +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/MANIFEST.in +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/README.md +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/setup.cfg +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/auth.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/chat.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/connector_router.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/docling.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/documents.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/flows.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/keys.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/knowledge_filter.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/langflow_files.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/models.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/nudges.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/oidc.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/provider_health.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/provider_validation.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/router.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/search.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/settings.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/tasks.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/upload.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/documents.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/knowledge_filters.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/models.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/search.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/settings.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/auth_context.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/model_constants.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/base.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/connector.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/oauth.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/connector.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/oauth.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/connector.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/oauth.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/dependencies.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/processors.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/tasks.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/url.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/dependency_links.txt +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/entry_points.txt +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/top_level.txt +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/api_key_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/conversation_persistence_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/document_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/flows_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/knowledge_filter_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_file_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_history_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_mcp_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/models_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/monitor_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/session_ownership_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/task_service.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/session_manager.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/docker-compose.gpu.yml +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/ingestion_flow.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_nudges.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/cli.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/main.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/container_manager.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/docling_manager.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/config.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/diagnostics.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/logs.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/monitor.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/welcome.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/clipboard.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/platform.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/startup_checks.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/validation.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/version_check.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/command_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/diagnostics_notification.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/error_notification.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/prune_options_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/waves.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/acl_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/container_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/docling_client.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/document_processing.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/embedding_fields.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/embeddings.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/env_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/gpu_detection.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/hash_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/langflow_headers.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/langflow_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/logging_config.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/opensearch_queries.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/opensearch_utils.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/paths.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/__init__.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/category.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/client.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/message_id.py +0 -0
- {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/version_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrag
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
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
|
|
@@ -15,7 +15,6 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
15
15
|
Requires-Python: >=3.13
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
License-File: LICENSE
|
|
18
|
-
Requires-Dist: agentd>=0.2.2
|
|
19
18
|
Requires-Dist: aiofiles>=24.1.0
|
|
20
19
|
Requires-Dist: cryptography>=45.0.6
|
|
21
20
|
Requires-Dist: google-api-python-client>=2.143.0
|
|
@@ -29,7 +28,6 @@ Requires-Dist: python-multipart>=0.0.20
|
|
|
29
28
|
Requires-Dist: fastapi>=0.115.0
|
|
30
29
|
Requires-Dist: uvicorn>=0.35.0
|
|
31
30
|
Requires-Dist: boto3>=1.35.0
|
|
32
|
-
Requires-Dist: ibm-cos-sdk>=2.13.0
|
|
33
31
|
Requires-Dist: psutil>=7.0.0
|
|
34
32
|
Requires-Dist: rich>=13.0.0
|
|
35
33
|
Requires-Dist: textual>=0.45.0
|
|
@@ -37,6 +35,9 @@ Requires-Dist: python-dotenv>=1.0.0
|
|
|
37
35
|
Requires-Dist: textual-fspicker>=0.6.0
|
|
38
36
|
Requires-Dist: structlog>=25.4.0
|
|
39
37
|
Requires-Dist: zxcvbn>=4.5.0
|
|
38
|
+
Requires-Dist: openai>=1.0.0
|
|
39
|
+
Requires-Dist: pyyaml>=6.0
|
|
40
|
+
Requires-Dist: tiktoken>=0.7.0
|
|
40
41
|
Dynamic: license-file
|
|
41
42
|
|
|
42
43
|
<div align="center">
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "openrag"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.4"
|
|
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"
|
|
@@ -21,7 +21,6 @@ classifiers = [
|
|
|
21
21
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
22
22
|
]
|
|
23
23
|
dependencies = [
|
|
24
|
-
"agentd>=0.2.2",
|
|
25
24
|
"aiofiles>=24.1.0",
|
|
26
25
|
"cryptography>=45.0.6",
|
|
27
26
|
"google-api-python-client>=2.143.0",
|
|
@@ -35,14 +34,16 @@ dependencies = [
|
|
|
35
34
|
"fastapi>=0.115.0",
|
|
36
35
|
"uvicorn>=0.35.0",
|
|
37
36
|
"boto3>=1.35.0",
|
|
38
|
-
"ibm-cos-sdk>=2.13.0",
|
|
39
37
|
"psutil>=7.0.0",
|
|
40
38
|
"rich>=13.0.0",
|
|
41
39
|
"textual>=0.45.0",
|
|
42
40
|
"python-dotenv>=1.0.0",
|
|
43
41
|
"textual-fspicker>=0.6.0",
|
|
44
42
|
"structlog>=25.4.0",
|
|
45
|
-
"zxcvbn>=4.5.0"
|
|
43
|
+
"zxcvbn>=4.5.0",
|
|
44
|
+
"openai>=1.0.0",
|
|
45
|
+
"pyyaml>=6.0",
|
|
46
|
+
"tiktoken>=0.7.0"
|
|
46
47
|
]
|
|
47
48
|
|
|
48
49
|
[dependency-groups]
|
|
@@ -815,36 +815,31 @@ async def async_langflow_chat_stream(
|
|
|
815
815
|
|
|
816
816
|
|
|
817
817
|
async def delete_user_conversation(user_id: str, response_id: str) -> bool:
|
|
818
|
-
"""Delete a conversation for a user from both memory and persistent storage
|
|
819
|
-
|
|
820
|
-
Returns:
|
|
821
|
-
True — conversation was found and deleted from at least one store.
|
|
822
|
-
False — conversation did not exist in any store (confirmed not-found).
|
|
823
|
-
|
|
824
|
-
Raises:
|
|
825
|
-
Exception — on unexpected storage errors so callers can distinguish
|
|
826
|
-
a confirmed "not found" from a backend failure.
|
|
827
|
-
"""
|
|
818
|
+
"""Delete a conversation for a user from both memory and persistent storage (async, non-blocking)"""
|
|
828
819
|
deleted = False
|
|
829
820
|
|
|
830
|
-
# Delete from in-memory storage (cannot raise)
|
|
831
|
-
if user_id in active_conversations and response_id in active_conversations[user_id]:
|
|
832
|
-
del active_conversations[user_id][response_id]
|
|
833
|
-
logger.debug(f"Deleted conversation {response_id} from memory for user {user_id}")
|
|
834
|
-
deleted = True
|
|
835
|
-
|
|
836
|
-
# Delete from persistent storage — let real errors propagate to the caller
|
|
837
|
-
conversation_deleted = await conversation_persistence.delete_conversation_thread(user_id, response_id)
|
|
838
|
-
if conversation_deleted:
|
|
839
|
-
logger.debug(f"Deleted conversation {response_id} from persistent storage for user {user_id}")
|
|
840
|
-
deleted = True
|
|
841
|
-
|
|
842
|
-
# Release session ownership (best-effort; never masks storage errors above)
|
|
843
821
|
try:
|
|
844
|
-
from
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
822
|
+
# Delete from in-memory storage
|
|
823
|
+
if user_id in active_conversations and response_id in active_conversations[user_id]:
|
|
824
|
+
del active_conversations[user_id][response_id]
|
|
825
|
+
logger.debug(f"Deleted conversation {response_id} from memory for user {user_id}")
|
|
826
|
+
deleted = True
|
|
827
|
+
|
|
828
|
+
# Delete from persistent storage
|
|
829
|
+
conversation_deleted = await conversation_persistence.delete_conversation_thread(user_id, response_id)
|
|
830
|
+
if conversation_deleted:
|
|
831
|
+
logger.debug(f"Deleted conversation {response_id} from persistent storage for user {user_id}")
|
|
832
|
+
deleted = True
|
|
833
|
+
|
|
834
|
+
# Release session ownership
|
|
835
|
+
try:
|
|
836
|
+
from services.session_ownership_service import session_ownership_service
|
|
837
|
+
session_ownership_service.release_session(user_id, response_id)
|
|
838
|
+
logger.debug(f"Released session ownership for {response_id} for user {user_id}")
|
|
839
|
+
except Exception as e:
|
|
840
|
+
logger.warning(f"Failed to release session ownership: {e}")
|
|
849
841
|
|
|
850
|
-
|
|
842
|
+
return deleted
|
|
843
|
+
except Exception as e:
|
|
844
|
+
logger.error(f"Error deleting conversation {response_id} for user {user_id}: {e}")
|
|
845
|
+
return False
|
|
@@ -88,11 +88,6 @@ async def get_synced_file_ids_for_connector(
|
|
|
88
88
|
class ConnectorSyncBody(BaseModel):
|
|
89
89
|
max_files: Optional[int] = None
|
|
90
90
|
selected_files: Optional[List[Any]] = None
|
|
91
|
-
# When True, ingest ALL files from the connector (bypasses the existing-files gate).
|
|
92
|
-
# Used by direct-sync providers like IBM COS on initial ingest.
|
|
93
|
-
sync_all: bool = False
|
|
94
|
-
# When set, only ingest files from these buckets (IBM COS specific).
|
|
95
|
-
bucket_filter: Optional[List[str]] = None
|
|
96
91
|
|
|
97
92
|
|
|
98
93
|
async def list_connectors(
|
|
@@ -101,8 +96,8 @@ async def list_connectors(
|
|
|
101
96
|
):
|
|
102
97
|
"""List available connector types with metadata"""
|
|
103
98
|
try:
|
|
104
|
-
connector_types =
|
|
105
|
-
|
|
99
|
+
connector_types = (
|
|
100
|
+
connector_service.connection_manager.get_available_connector_types()
|
|
106
101
|
)
|
|
107
102
|
return JSONResponse({"connectors": connector_types})
|
|
108
103
|
except Exception as e:
|
|
@@ -205,51 +200,6 @@ async def connector_sync(
|
|
|
205
200
|
jwt_token=jwt_token,
|
|
206
201
|
file_infos=file_infos,
|
|
207
202
|
)
|
|
208
|
-
elif body.sync_all or body.bucket_filter:
|
|
209
|
-
# Full ingest: discover and ingest all files (or files from specific buckets).
|
|
210
|
-
# Used by direct-sync providers (IBM COS) on initial ingest or per-bucket sync.
|
|
211
|
-
logger.info(
|
|
212
|
-
"Full connector ingest requested",
|
|
213
|
-
connector_type=connector_type,
|
|
214
|
-
bucket_filter=body.bucket_filter,
|
|
215
|
-
)
|
|
216
|
-
connector = await connector_service.get_connector(working_connection.connection_id)
|
|
217
|
-
if body.bucket_filter:
|
|
218
|
-
# List only files from the requested buckets, then sync_specific_files
|
|
219
|
-
original_buckets = connector.bucket_names
|
|
220
|
-
connector.bucket_names = body.bucket_filter
|
|
221
|
-
try:
|
|
222
|
-
all_file_ids = []
|
|
223
|
-
page_token = None
|
|
224
|
-
while True:
|
|
225
|
-
result = await connector.list_files(page_token=page_token)
|
|
226
|
-
for f in result.get("files", []):
|
|
227
|
-
all_file_ids.append(f["id"])
|
|
228
|
-
page_token = result.get("next_page_token")
|
|
229
|
-
if not page_token:
|
|
230
|
-
break
|
|
231
|
-
finally:
|
|
232
|
-
connector.bucket_names = original_buckets
|
|
233
|
-
|
|
234
|
-
if not all_file_ids:
|
|
235
|
-
return JSONResponse(
|
|
236
|
-
{"status": "no_files", "message": "No files found in the selected buckets."},
|
|
237
|
-
status_code=200,
|
|
238
|
-
)
|
|
239
|
-
task_id = await connector_service.sync_specific_files(
|
|
240
|
-
working_connection.connection_id,
|
|
241
|
-
user.user_id,
|
|
242
|
-
all_file_ids,
|
|
243
|
-
jwt_token=jwt_token,
|
|
244
|
-
)
|
|
245
|
-
else:
|
|
246
|
-
# sync_all: ingest everything the connector can see
|
|
247
|
-
task_id = await connector_service.sync_connector_files(
|
|
248
|
-
working_connection.connection_id,
|
|
249
|
-
user.user_id,
|
|
250
|
-
max_files=max_files,
|
|
251
|
-
jwt_token=jwt_token,
|
|
252
|
-
)
|
|
253
203
|
else:
|
|
254
204
|
# No files specified - sync only files already in OpenSearch for this connector
|
|
255
205
|
# This ensures deleted files stay deleted
|
|
@@ -259,7 +209,7 @@ async def connector_sync(
|
|
|
259
209
|
session_manager=session_manager,
|
|
260
210
|
jwt_token=jwt_token,
|
|
261
211
|
)
|
|
262
|
-
|
|
212
|
+
|
|
263
213
|
if not existing_file_ids and not existing_filenames:
|
|
264
214
|
return JSONResponse(
|
|
265
215
|
{
|
|
@@ -268,7 +218,7 @@ async def connector_sync(
|
|
|
268
218
|
},
|
|
269
219
|
status_code=200,
|
|
270
220
|
)
|
|
271
|
-
|
|
221
|
+
|
|
272
222
|
# If we have document_ids (connector file IDs), use sync_specific_files
|
|
273
223
|
# Otherwise, use filename filtering with sync_connector_files
|
|
274
224
|
if existing_file_ids:
|
|
@@ -652,8 +602,6 @@ async def connector_disconnect(
|
|
|
652
602
|
)
|
|
653
603
|
|
|
654
604
|
|
|
655
|
-
# ---------------------------------------------------------------------------
|
|
656
|
-
|
|
657
605
|
async def sync_all_connectors(
|
|
658
606
|
connector_service=Depends(get_connector_service),
|
|
659
607
|
session_manager=Depends(get_session_manager),
|
|
@@ -667,7 +615,7 @@ async def sync_all_connectors(
|
|
|
667
615
|
jwt_token = user.jwt_token
|
|
668
616
|
|
|
669
617
|
# Cloud connector types to sync
|
|
670
|
-
cloud_connector_types = ["google_drive", "onedrive", "sharepoint"
|
|
618
|
+
cloud_connector_types = ["google_drive", "onedrive", "sharepoint"]
|
|
671
619
|
|
|
672
620
|
all_task_ids = []
|
|
673
621
|
synced_connectors = []
|
|
@@ -226,8 +226,6 @@ async def chat_delete_endpoint(
|
|
|
226
226
|
"""Delete a conversation. DELETE /v1/chat/{chat_id}"""
|
|
227
227
|
try:
|
|
228
228
|
result = await chat_service.delete_session(user.user_id, chat_id)
|
|
229
|
-
if result.get("not_found"):
|
|
230
|
-
return JSONResponse({"error": "Conversation not found"}, status_code=404)
|
|
231
229
|
if result.get("success"):
|
|
232
230
|
return JSONResponse({"success": True})
|
|
233
231
|
else:
|
|
@@ -49,6 +49,10 @@ class ProvidersConfig:
|
|
|
49
49
|
watsonx: WatsonXConfig
|
|
50
50
|
ollama: OllamaConfig
|
|
51
51
|
|
|
52
|
+
def any_configured(self) -> bool:
|
|
53
|
+
"""Return True if at least one provider is marked as configured."""
|
|
54
|
+
return any(p.configured for p in (self.openai, self.anthropic, self.watsonx, self.ollama))
|
|
55
|
+
|
|
52
56
|
def get_provider_config(self, provider: str):
|
|
53
57
|
"""Get configuration for a specific provider."""
|
|
54
58
|
provider_lower = provider.lower()
|
|
@@ -3,7 +3,6 @@ import os
|
|
|
3
3
|
from utils.env_utils import get_env_int, get_env_float
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
|
-
from agentd.patch import patch_openai_with_mcp
|
|
7
6
|
from dotenv import load_dotenv
|
|
8
7
|
from openai import AsyncOpenAI
|
|
9
8
|
from opensearchpy import AsyncOpenSearch
|
|
@@ -51,8 +50,6 @@ GOOGLE_OAUTH_CLIENT_ID = os.getenv("GOOGLE_OAUTH_CLIENT_ID")
|
|
|
51
50
|
GOOGLE_OAUTH_CLIENT_SECRET = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET")
|
|
52
51
|
DOCLING_OCR_ENGINE = os.getenv("DOCLING_OCR_ENGINE")
|
|
53
52
|
|
|
54
|
-
IBM_AUTH_ENABLED = os.getenv("IBM_AUTH_ENABLED", "false").lower() in ("true", "1", "yes")
|
|
55
|
-
|
|
56
53
|
# Ingestion configuration
|
|
57
54
|
DISABLE_INGEST_WITH_LANGFLOW = os.getenv(
|
|
58
55
|
"DISABLE_INGEST_WITH_LANGFLOW", "false"
|
|
@@ -537,16 +534,14 @@ class AppClients:
|
|
|
537
534
|
use_http2 = future.result(timeout=15)
|
|
538
535
|
|
|
539
536
|
if use_http2:
|
|
540
|
-
self._patched_async_client =
|
|
537
|
+
self._patched_async_client = AsyncOpenAI()
|
|
541
538
|
logger.info("OpenAI client initialized with HTTP/2")
|
|
542
539
|
else:
|
|
543
540
|
http_client = httpx.AsyncClient(
|
|
544
541
|
http2=False,
|
|
545
542
|
timeout=httpx.Timeout(60.0, connect=10.0)
|
|
546
543
|
)
|
|
547
|
-
self._patched_async_client =
|
|
548
|
-
AsyncOpenAI(http_client=http_client)
|
|
549
|
-
)
|
|
544
|
+
self._patched_async_client = AsyncOpenAI(http_client=http_client)
|
|
550
545
|
logger.info("OpenAI client initialized with HTTP/1.1 (fallback)")
|
|
551
546
|
logger.info("Successfully initialized OpenAI client")
|
|
552
547
|
except Exception as e:
|
|
@@ -2,14 +2,10 @@ from .base import BaseConnector
|
|
|
2
2
|
from .google_drive import GoogleDriveConnector
|
|
3
3
|
from .sharepoint import SharePointConnector
|
|
4
4
|
from .onedrive import OneDriveConnector
|
|
5
|
-
from .ibm_cos import IBMCOSConnector
|
|
6
|
-
from .aws_s3 import S3Connector
|
|
7
5
|
|
|
8
6
|
__all__ = [
|
|
9
7
|
"BaseConnector",
|
|
10
8
|
"GoogleDriveConnector",
|
|
11
9
|
"SharePointConnector",
|
|
12
10
|
"OneDriveConnector",
|
|
13
|
-
"IBMCOSConnector",
|
|
14
|
-
"S3Connector",
|
|
15
11
|
]
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import json
|
|
2
|
-
import os
|
|
3
2
|
import uuid
|
|
4
3
|
import aiofiles
|
|
5
4
|
from typing import Dict, List, Any, Optional
|
|
@@ -14,8 +13,6 @@ from .base import BaseConnector
|
|
|
14
13
|
from .google_drive import GoogleDriveConnector
|
|
15
14
|
from .sharepoint import SharePointConnector
|
|
16
15
|
from .onedrive import OneDriveConnector
|
|
17
|
-
from .ibm_cos import IBMCOSConnector
|
|
18
|
-
from .aws_s3 import S3Connector
|
|
19
16
|
|
|
20
17
|
|
|
21
18
|
@dataclass
|
|
@@ -333,71 +330,31 @@ class ConnectionManager:
|
|
|
333
330
|
logger.warning(f"Authentication failed for {connection_id}")
|
|
334
331
|
return None
|
|
335
332
|
|
|
336
|
-
def get_available_connector_types(
|
|
337
|
-
|
|
338
|
-
) -> Dict[str, Dict[str, Any]]:
|
|
339
|
-
"""Get available connector types with their metadata.
|
|
340
|
-
|
|
341
|
-
Availability is user-scoped when ``user_id`` is provided:
|
|
342
|
-
a connector is considered available if either:
|
|
343
|
-
1) its required env credentials are present, or
|
|
344
|
-
2) the user has an active saved connection with usable credentials.
|
|
345
|
-
"""
|
|
333
|
+
def get_available_connector_types(self) -> Dict[str, Dict[str, Any]]:
|
|
334
|
+
"""Get available connector types with their metadata"""
|
|
346
335
|
return {
|
|
347
336
|
"google_drive": {
|
|
348
337
|
"name": GoogleDriveConnector.CONNECTOR_NAME,
|
|
349
338
|
"description": GoogleDriveConnector.CONNECTOR_DESCRIPTION,
|
|
350
339
|
"icon": GoogleDriveConnector.CONNECTOR_ICON,
|
|
351
|
-
"available": self._is_connector_available("google_drive"
|
|
340
|
+
"available": self._is_connector_available("google_drive"),
|
|
352
341
|
},
|
|
353
342
|
"sharepoint": {
|
|
354
343
|
"name": SharePointConnector.CONNECTOR_NAME,
|
|
355
344
|
"description": SharePointConnector.CONNECTOR_DESCRIPTION,
|
|
356
345
|
"icon": SharePointConnector.CONNECTOR_ICON,
|
|
357
|
-
"available": self._is_connector_available("sharepoint"
|
|
346
|
+
"available": self._is_connector_available("sharepoint"),
|
|
358
347
|
},
|
|
359
348
|
"onedrive": {
|
|
360
349
|
"name": OneDriveConnector.CONNECTOR_NAME,
|
|
361
350
|
"description": OneDriveConnector.CONNECTOR_DESCRIPTION,
|
|
362
351
|
"icon": OneDriveConnector.CONNECTOR_ICON,
|
|
363
|
-
"available": self._is_connector_available("onedrive"
|
|
364
|
-
},
|
|
365
|
-
"ibm_cos": {
|
|
366
|
-
"name": IBMCOSConnector.CONNECTOR_NAME,
|
|
367
|
-
"description": IBMCOSConnector.CONNECTOR_DESCRIPTION,
|
|
368
|
-
"icon": IBMCOSConnector.CONNECTOR_ICON,
|
|
369
|
-
"available": os.environ.get("IBM_AUTH_ENABLED", "").lower() in ("1", "true", "yes"),
|
|
370
|
-
},
|
|
371
|
-
"aws_s3": {
|
|
372
|
-
"name": S3Connector.CONNECTOR_NAME,
|
|
373
|
-
"description": S3Connector.CONNECTOR_DESCRIPTION,
|
|
374
|
-
"icon": S3Connector.CONNECTOR_ICON,
|
|
375
|
-
"available": os.environ.get("IBM_AUTH_ENABLED", "").lower() in ("1", "true", "yes"),
|
|
352
|
+
"available": self._is_connector_available("onedrive"),
|
|
376
353
|
},
|
|
377
354
|
}
|
|
378
355
|
|
|
379
|
-
def
|
|
380
|
-
|
|
381
|
-
) -> bool:
|
|
382
|
-
"""Check if user has an active saved connection with usable credentials."""
|
|
383
|
-
for connection in self.connections.values():
|
|
384
|
-
if connection.connector_type != connector_type or not connection.is_active:
|
|
385
|
-
continue
|
|
386
|
-
if user_id is not None and connection.user_id != user_id:
|
|
387
|
-
continue
|
|
388
|
-
try:
|
|
389
|
-
connector = self._create_connector(connection)
|
|
390
|
-
connector.get_client_id()
|
|
391
|
-
connector.get_client_secret()
|
|
392
|
-
return True
|
|
393
|
-
except (ValueError, NotImplementedError, RuntimeError):
|
|
394
|
-
continue
|
|
395
|
-
return False
|
|
396
|
-
|
|
397
|
-
def _is_connector_available(
|
|
398
|
-
self, connector_type: str, user_id: Optional[str] = None
|
|
399
|
-
) -> bool:
|
|
400
|
-
"""Check whether connector is available for use by the given user."""
|
|
356
|
+
def _is_connector_available(self, connector_type: str) -> bool:
|
|
357
|
+
"""Check if a connector type is available (has required env vars)"""
|
|
401
358
|
try:
|
|
402
359
|
temp_config = ConnectionConfig(
|
|
403
360
|
connection_id="temp",
|
|
@@ -410,9 +367,8 @@ class ConnectionManager:
|
|
|
410
367
|
connector.get_client_id()
|
|
411
368
|
connector.get_client_secret()
|
|
412
369
|
return True
|
|
413
|
-
except (ValueError, NotImplementedError
|
|
414
|
-
|
|
415
|
-
return self._has_saved_credentials_for_user(connector_type, user_id)
|
|
370
|
+
except (ValueError, NotImplementedError):
|
|
371
|
+
return False
|
|
416
372
|
|
|
417
373
|
def _create_connector(self, config: ConnectionConfig) -> BaseConnector:
|
|
418
374
|
"""Factory method to create connector instances"""
|
|
@@ -423,10 +379,6 @@ class ConnectionManager:
|
|
|
423
379
|
return SharePointConnector(config.config)
|
|
424
380
|
elif config.connector_type == "onedrive":
|
|
425
381
|
return OneDriveConnector(config.config)
|
|
426
|
-
elif config.connector_type == "ibm_cos":
|
|
427
|
-
return IBMCOSConnector(config.config)
|
|
428
|
-
elif config.connector_type == "aws_s3":
|
|
429
|
-
return S3Connector(config.config)
|
|
430
382
|
elif config.connector_type == "box":
|
|
431
383
|
raise NotImplementedError("Box connector not implemented yet")
|
|
432
384
|
elif config.connector_type == "dropbox":
|
|
@@ -331,40 +331,39 @@ class LangflowConnectorService:
|
|
|
331
331
|
original_folder_ids = getattr(cfg, "folder_ids", None)
|
|
332
332
|
|
|
333
333
|
expanded_file_ids = file_ids # Default to original IDs
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
# here — doing so would re-list all files from all buckets, overwriting the
|
|
339
|
-
# carefully selected IDs passed in.
|
|
340
|
-
if cfg is not None:
|
|
341
|
-
try:
|
|
334
|
+
|
|
335
|
+
try:
|
|
336
|
+
# Set the file_ids we want to sync in the connector's config
|
|
337
|
+
if cfg is not None:
|
|
342
338
|
cfg.file_ids = file_ids # type: ignore
|
|
343
339
|
cfg.folder_ids = None # type: ignore
|
|
344
340
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
if not expanded_file_ids:
|
|
350
|
-
logger.warning(
|
|
351
|
-
f"No files found after expanding file_ids. "
|
|
352
|
-
f"Original IDs: {file_ids}. This may indicate all IDs were folders "
|
|
353
|
-
f"with no contents, or files that were filtered out."
|
|
354
|
-
)
|
|
355
|
-
# If we have file_infos with download URLs, use original file_ids
|
|
356
|
-
# (OneDrive sharing IDs can't be expanded but can be downloaded directly)
|
|
357
|
-
if file_infos:
|
|
358
|
-
logger.info("Using original file IDs with cached download URLs")
|
|
359
|
-
expanded_file_ids = file_ids
|
|
360
|
-
else:
|
|
361
|
-
raise ValueError("No files to sync after expanding folders")
|
|
341
|
+
# Get the expanded list of file IDs (folders will be expanded to their contents)
|
|
342
|
+
# This uses the connector's list_files() which calls _iter_selected_items()
|
|
343
|
+
result = await connector.list_files()
|
|
344
|
+
expanded_file_ids = [f["id"] for f in result.get("files", [])]
|
|
362
345
|
|
|
363
|
-
|
|
364
|
-
logger.
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
346
|
+
if not expanded_file_ids:
|
|
347
|
+
logger.warning(
|
|
348
|
+
f"No files found after expanding file_ids. "
|
|
349
|
+
f"Original IDs: {file_ids}. This may indicate all IDs were folders "
|
|
350
|
+
f"with no contents, or files that were filtered out."
|
|
351
|
+
)
|
|
352
|
+
# If we have file_infos with download URLs, use original file_ids
|
|
353
|
+
# (OneDrive sharing IDs can't be expanded but can be downloaded directly)
|
|
354
|
+
if file_infos:
|
|
355
|
+
logger.info("Using original file IDs with cached download URLs")
|
|
356
|
+
expanded_file_ids = file_ids
|
|
357
|
+
else:
|
|
358
|
+
raise ValueError("No files to sync after expanding folders")
|
|
359
|
+
|
|
360
|
+
except Exception as e:
|
|
361
|
+
logger.error(f"Failed to expand file_ids via list_files(): {e}")
|
|
362
|
+
# Fallback to original file_ids if expansion fails
|
|
363
|
+
expanded_file_ids = file_ids
|
|
364
|
+
finally:
|
|
365
|
+
# Restore original config values
|
|
366
|
+
if cfg is not None:
|
|
368
367
|
cfg.file_ids = original_file_ids # type: ignore
|
|
369
368
|
cfg.folder_ids = original_folder_ids # type: ignore
|
|
370
369
|
|
|
@@ -44,18 +44,6 @@ from api import (
|
|
|
44
44
|
)
|
|
45
45
|
|
|
46
46
|
from api.connector_router import ConnectorRouter
|
|
47
|
-
from connectors.ibm_cos.api import (
|
|
48
|
-
ibm_cos_defaults,
|
|
49
|
-
ibm_cos_configure,
|
|
50
|
-
ibm_cos_list_buckets,
|
|
51
|
-
ibm_cos_bucket_status,
|
|
52
|
-
)
|
|
53
|
-
from connectors.aws_s3.api import (
|
|
54
|
-
s3_defaults,
|
|
55
|
-
s3_configure,
|
|
56
|
-
s3_list_buckets,
|
|
57
|
-
s3_bucket_status,
|
|
58
|
-
)
|
|
59
47
|
from services.api_key_service import APIKeyService
|
|
60
48
|
from api import keys as api_keys
|
|
61
49
|
from api.v1 import (
|
|
@@ -1504,23 +1492,45 @@ async def create_app():
|
|
|
1504
1492
|
)
|
|
1505
1493
|
|
|
1506
1494
|
# Connector endpoints
|
|
1507
|
-
app.add_api_route(
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
app.add_api_route(
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
app.add_api_route(
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
app.add_api_route(
|
|
1523
|
-
|
|
1495
|
+
app.add_api_route(
|
|
1496
|
+
"/connectors", connectors.list_connectors, methods=["GET"], tags=["internal"]
|
|
1497
|
+
)
|
|
1498
|
+
app.add_api_route(
|
|
1499
|
+
"/connectors/{connector_type}/sync",
|
|
1500
|
+
connectors.connector_sync,
|
|
1501
|
+
methods=["POST"],
|
|
1502
|
+
tags=["internal"],
|
|
1503
|
+
)
|
|
1504
|
+
app.add_api_route(
|
|
1505
|
+
"/connectors/sync-all",
|
|
1506
|
+
connectors.sync_all_connectors,
|
|
1507
|
+
methods=["POST"],
|
|
1508
|
+
tags=["internal"],
|
|
1509
|
+
)
|
|
1510
|
+
app.add_api_route(
|
|
1511
|
+
"/connectors/{connector_type}/status",
|
|
1512
|
+
connectors.connector_status,
|
|
1513
|
+
methods=["GET"],
|
|
1514
|
+
tags=["internal"],
|
|
1515
|
+
)
|
|
1516
|
+
app.add_api_route(
|
|
1517
|
+
"/connectors/{connector_type}/token",
|
|
1518
|
+
connectors.connector_token,
|
|
1519
|
+
methods=["GET"],
|
|
1520
|
+
tags=["internal"],
|
|
1521
|
+
)
|
|
1522
|
+
app.add_api_route(
|
|
1523
|
+
"/connectors/{connector_type}/disconnect",
|
|
1524
|
+
connectors.connector_disconnect,
|
|
1525
|
+
methods=["DELETE"],
|
|
1526
|
+
tags=["internal"],
|
|
1527
|
+
)
|
|
1528
|
+
app.add_api_route(
|
|
1529
|
+
"/connectors/{connector_type}/webhook",
|
|
1530
|
+
connectors.connector_webhook,
|
|
1531
|
+
methods=["POST", "GET"],
|
|
1532
|
+
tags=["internal"],
|
|
1533
|
+
)
|
|
1524
1534
|
|
|
1525
1535
|
# Document endpoints
|
|
1526
1536
|
app.add_api_route(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: openrag
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
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
|
|
@@ -15,7 +15,6 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
15
15
|
Requires-Python: >=3.13
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
License-File: LICENSE
|
|
18
|
-
Requires-Dist: agentd>=0.2.2
|
|
19
18
|
Requires-Dist: aiofiles>=24.1.0
|
|
20
19
|
Requires-Dist: cryptography>=45.0.6
|
|
21
20
|
Requires-Dist: google-api-python-client>=2.143.0
|
|
@@ -29,7 +28,6 @@ Requires-Dist: python-multipart>=0.0.20
|
|
|
29
28
|
Requires-Dist: fastapi>=0.115.0
|
|
30
29
|
Requires-Dist: uvicorn>=0.35.0
|
|
31
30
|
Requires-Dist: boto3>=1.35.0
|
|
32
|
-
Requires-Dist: ibm-cos-sdk>=2.13.0
|
|
33
31
|
Requires-Dist: psutil>=7.0.0
|
|
34
32
|
Requires-Dist: rich>=13.0.0
|
|
35
33
|
Requires-Dist: textual>=0.45.0
|
|
@@ -37,6 +35,9 @@ Requires-Dist: python-dotenv>=1.0.0
|
|
|
37
35
|
Requires-Dist: textual-fspicker>=0.6.0
|
|
38
36
|
Requires-Dist: structlog>=25.4.0
|
|
39
37
|
Requires-Dist: zxcvbn>=4.5.0
|
|
38
|
+
Requires-Dist: openai>=1.0.0
|
|
39
|
+
Requires-Dist: pyyaml>=6.0
|
|
40
|
+
Requires-Dist: tiktoken>=0.7.0
|
|
40
41
|
Dynamic: license-file
|
|
41
42
|
|
|
42
43
|
<div align="center">
|
|
@@ -44,21 +44,9 @@ src/connectors/base.py
|
|
|
44
44
|
src/connectors/connection_manager.py
|
|
45
45
|
src/connectors/langflow_connector_service.py
|
|
46
46
|
src/connectors/service.py
|
|
47
|
-
src/connectors/aws_s3/__init__.py
|
|
48
|
-
src/connectors/aws_s3/api.py
|
|
49
|
-
src/connectors/aws_s3/auth.py
|
|
50
|
-
src/connectors/aws_s3/connector.py
|
|
51
|
-
src/connectors/aws_s3/models.py
|
|
52
|
-
src/connectors/aws_s3/support.py
|
|
53
47
|
src/connectors/google_drive/__init__.py
|
|
54
48
|
src/connectors/google_drive/connector.py
|
|
55
49
|
src/connectors/google_drive/oauth.py
|
|
56
|
-
src/connectors/ibm_cos/__init__.py
|
|
57
|
-
src/connectors/ibm_cos/api.py
|
|
58
|
-
src/connectors/ibm_cos/auth.py
|
|
59
|
-
src/connectors/ibm_cos/connector.py
|
|
60
|
-
src/connectors/ibm_cos/models.py
|
|
61
|
-
src/connectors/ibm_cos/support.py
|
|
62
50
|
src/connectors/onedrive/__init__.py
|
|
63
51
|
src/connectors/onedrive/connector.py
|
|
64
52
|
src/connectors/onedrive/oauth.py
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
agentd>=0.2.2
|
|
2
1
|
aiofiles>=24.1.0
|
|
3
2
|
cryptography>=45.0.6
|
|
4
3
|
google-api-python-client>=2.143.0
|
|
@@ -12,7 +11,6 @@ python-multipart>=0.0.20
|
|
|
12
11
|
fastapi>=0.115.0
|
|
13
12
|
uvicorn>=0.35.0
|
|
14
13
|
boto3>=1.35.0
|
|
15
|
-
ibm-cos-sdk>=2.13.0
|
|
16
14
|
psutil>=7.0.0
|
|
17
15
|
rich>=13.0.0
|
|
18
16
|
textual>=0.45.0
|
|
@@ -20,3 +18,6 @@ python-dotenv>=1.0.0
|
|
|
20
18
|
textual-fspicker>=0.6.0
|
|
21
19
|
structlog>=25.4.0
|
|
22
20
|
zxcvbn>=4.5.0
|
|
21
|
+
openai>=1.0.0
|
|
22
|
+
pyyaml>=6.0
|
|
23
|
+
tiktoken>=0.7.0
|