openrag 0.4.1.dev14__tar.gz → 0.4.1.dev16__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.1.dev14/src/openrag.egg-info → openrag-0.4.1.dev16}/PKG-INFO +4 -2
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/pyproject.toml +4 -2
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/settings.py +9 -2
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/upload.py +17 -29
- openrag-0.4.1.dev16/src/config/embedding_constants.py +4 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/config/model_constants.py +0 -2
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/config/settings.py +51 -44
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/service.py +7 -7
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/main.py +57 -42
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/models/processors.py +37 -20
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16/src/openrag.egg-info}/PKG-INFO +4 -2
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/openrag.egg-info/SOURCES.txt +1 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/openrag.egg-info/requires.txt +3 -1
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/document_service.py +15 -9
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/models_service.py +150 -13
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/search_service.py +62 -25
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/task_service.py +5 -1
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/session_manager.py +2 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/embedding_fields.py +4 -2
- openrag-0.4.1.dev16/src/utils/embeddings.py +39 -0
- openrag-0.4.1.dev14/src/utils/embeddings.py +0 -196
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/LICENSE +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/MANIFEST.in +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/README.md +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/setup.cfg +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/agent.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/auth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/chat.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/connector_router.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/connectors.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/docling.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/documents.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/flows.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/keys.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/knowledge_filter.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/langflow_files.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/models.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/nudges.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/oidc.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/provider_health.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/provider_validation.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/router.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/search.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/tasks.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/chat.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/documents.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/knowledge_filters.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/models.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/search.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/api/v1/settings.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/auth_context.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/config/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/config/config_manager.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/api.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/auth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/connector.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/models.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/aws_s3/support.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/base.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/connection_manager.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/google_drive/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/google_drive/connector.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/google_drive/oauth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/api.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/auth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/connector.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/models.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/support.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/langflow_connector_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/onedrive/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/onedrive/connector.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/onedrive/oauth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/sharepoint/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/sharepoint/connector.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/sharepoint/oauth.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/connectors/sharepoint/utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/dependencies.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/models/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/models/tasks.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/models/url.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/openrag.egg-info/dependency_links.txt +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/openrag.egg-info/entry_points.txt +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/openrag.egg-info/top_level.txt +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/api_key_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/auth_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/chat_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/conversation_persistence_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/flows_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/knowledge_filter_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/langflow_file_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/langflow_history_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/langflow_mcp_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/monitor_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/services/session_ownership_service.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/docker-compose.gpu.yml +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/docker-compose.yml +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/ingestion_flow.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_agent.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_nudges.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/cli.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/config_fields.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/main.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/managers/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/managers/container_manager.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/managers/docling_manager.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/managers/env_manager.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/config.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/diagnostics.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/logs.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/monitor.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/screens/welcome.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/clipboard.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/platform.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/startup_checks.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/validation.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/utils/version_check.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/command_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/diagnostics_notification.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/error_notification.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/prune_options_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/tui/widgets/waves.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/acl_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/container_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/docling_client.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/document_processing.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/env_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/file_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/gpu_detection.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/hash_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/langflow_headers.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/langflow_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/logging_config.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/opensearch_queries.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/opensearch_utils.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/paths.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/telemetry/__init__.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/telemetry/category.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/telemetry/client.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/src/utils/telemetry/message_id.py +0 -0
- {openrag-0.4.1.dev14 → openrag-0.4.1.dev16}/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.1.
|
|
3
|
+
Version: 0.4.1.dev16
|
|
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,6 +15,7 @@ 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.8.1
|
|
18
19
|
Requires-Dist: aiofiles>=24.1.0
|
|
19
20
|
Requires-Dist: cryptography>=45.0.6
|
|
20
21
|
Requires-Dist: google-api-python-client>=2.143.0
|
|
@@ -36,9 +37,10 @@ Requires-Dist: python-dotenv>=1.0.0
|
|
|
36
37
|
Requires-Dist: textual-fspicker>=0.6.0
|
|
37
38
|
Requires-Dist: structlog>=25.4.0
|
|
38
39
|
Requires-Dist: zxcvbn>=4.5.0
|
|
39
|
-
Requires-Dist:
|
|
40
|
+
Requires-Dist: litellm==1.83.3
|
|
40
41
|
Requires-Dist: pyyaml>=6.0
|
|
41
42
|
Requires-Dist: tiktoken>=0.7.0
|
|
43
|
+
Requires-Dist: openai>=2.30.0
|
|
42
44
|
Dynamic: license-file
|
|
43
45
|
|
|
44
46
|
<div align="center">
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "openrag"
|
|
7
|
-
version = "0.4.1.
|
|
7
|
+
version = "0.4.1.dev16"
|
|
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,6 +21,7 @@ classifiers = [
|
|
|
21
21
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
22
22
|
]
|
|
23
23
|
dependencies = [
|
|
24
|
+
"agentd>=0.8.1",
|
|
24
25
|
"aiofiles>=24.1.0",
|
|
25
26
|
"cryptography>=45.0.6",
|
|
26
27
|
"google-api-python-client>=2.143.0",
|
|
@@ -42,9 +43,10 @@ dependencies = [
|
|
|
42
43
|
"textual-fspicker>=0.6.0",
|
|
43
44
|
"structlog>=25.4.0",
|
|
44
45
|
"zxcvbn>=4.5.0",
|
|
45
|
-
"
|
|
46
|
+
"litellm==1.83.3",
|
|
46
47
|
"pyyaml>=6.0",
|
|
47
48
|
"tiktoken>=0.7.0",
|
|
49
|
+
"openai>=2.30.0",
|
|
48
50
|
]
|
|
49
51
|
|
|
50
52
|
[dependency-groups]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from dependencies import get_models_service
|
|
1
2
|
import asyncio
|
|
2
3
|
import json
|
|
3
4
|
import platform
|
|
@@ -9,7 +10,6 @@ from utils.telemetry import TelemetryClient, Category, MessageId
|
|
|
9
10
|
from utils.version_utils import OPENRAG_VERSION
|
|
10
11
|
from config.settings import (
|
|
11
12
|
DEFAULT_DOCS_URL,
|
|
12
|
-
DISABLE_INGEST_WITH_LANGFLOW,
|
|
13
13
|
INGEST_SAMPLE_DATA,
|
|
14
14
|
LANGFLOW_URL,
|
|
15
15
|
LANGFLOW_CHAT_FLOW_ID,
|
|
@@ -885,6 +885,7 @@ async def onboarding(
|
|
|
885
885
|
flows_service=Depends(get_flows_service),
|
|
886
886
|
session_manager=Depends(get_session_manager),
|
|
887
887
|
document_service=Depends(get_document_service),
|
|
888
|
+
models_service=Depends(get_models_service),
|
|
888
889
|
task_service=Depends(get_task_service),
|
|
889
890
|
langflow_file_service=Depends(get_langflow_file_service),
|
|
890
891
|
knowledge_filter_service=Depends(get_knowledge_filter_service),
|
|
@@ -936,7 +937,7 @@ async def onboarding(
|
|
|
936
937
|
embedding_model_selected = None
|
|
937
938
|
embedding_provider_selected = None
|
|
938
939
|
|
|
939
|
-
if body.embedding_model
|
|
940
|
+
if body.embedding_model:
|
|
940
941
|
embedding_model_selected = body.embedding_model.strip()
|
|
941
942
|
current_config.knowledge.embedding_model = embedding_model_selected
|
|
942
943
|
config_updated = True
|
|
@@ -1151,8 +1152,12 @@ async def onboarding(
|
|
|
1151
1152
|
# Import the function here to avoid circular imports
|
|
1152
1153
|
from main import ingest_default_documents_when_ready
|
|
1153
1154
|
|
|
1155
|
+
if not config_manager.save_config_file(current_config):
|
|
1156
|
+
logger.error("Failed to save embedding model to config")
|
|
1157
|
+
|
|
1154
1158
|
task_id = await ingest_default_documents_when_ready(
|
|
1155
1159
|
document_service,
|
|
1160
|
+
models_service,
|
|
1156
1161
|
task_service,
|
|
1157
1162
|
langflow_file_service,
|
|
1158
1163
|
session_manager,
|
|
@@ -1888,6 +1893,7 @@ async def update_docling_preset(
|
|
|
1888
1893
|
async def refresh_openrag_docs(
|
|
1889
1894
|
document_service=Depends(get_document_service),
|
|
1890
1895
|
task_service=Depends(get_task_service),
|
|
1896
|
+
models_service=Depends(get_models_service),
|
|
1891
1897
|
langflow_file_service=Depends(get_langflow_file_service),
|
|
1892
1898
|
session_manager=Depends(get_session_manager),
|
|
1893
1899
|
user: User = Depends(get_current_user),
|
|
@@ -1898,6 +1904,7 @@ async def refresh_openrag_docs(
|
|
|
1898
1904
|
|
|
1899
1905
|
refreshed = await refresh_default_openrag_docs(
|
|
1900
1906
|
document_service=document_service,
|
|
1907
|
+
models_service=models_service,
|
|
1901
1908
|
task_service=task_service,
|
|
1902
1909
|
langflow_file_service=langflow_file_service,
|
|
1903
1910
|
session_manager=session_manager,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from dependencies import get_models_service
|
|
1
2
|
import os
|
|
2
3
|
from typing import Optional
|
|
3
4
|
from urllib.parse import urlparse
|
|
@@ -35,15 +36,10 @@ async def upload(
|
|
|
35
36
|
try:
|
|
36
37
|
|
|
37
38
|
from config.settings import is_no_auth_mode
|
|
38
|
-
|
|
39
|
-
if
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
owner_email = None
|
|
43
|
-
else:
|
|
44
|
-
owner_user_id = user.user_id
|
|
45
|
-
owner_name = user.name
|
|
46
|
-
owner_email = user.email
|
|
39
|
+
is_no_auth = is_no_auth_mode()
|
|
40
|
+
owner_user_id = user.user_id if (user and not is_no_auth) else None
|
|
41
|
+
owner_name = user.name if user else None
|
|
42
|
+
owner_email = user.email if user else None
|
|
47
43
|
|
|
48
44
|
result = await document_service.process_upload_file(
|
|
49
45
|
file,
|
|
@@ -84,15 +80,10 @@ async def upload_path(
|
|
|
84
80
|
jwt_token = user.jwt_token
|
|
85
81
|
|
|
86
82
|
from config.settings import is_no_auth_mode
|
|
87
|
-
|
|
88
|
-
if
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
owner_email = None
|
|
92
|
-
else:
|
|
93
|
-
owner_user_id = user.user_id
|
|
94
|
-
owner_name = user.name
|
|
95
|
-
owner_email = user.email
|
|
83
|
+
is_no_auth = is_no_auth_mode()
|
|
84
|
+
owner_user_id = user.user_id if (user and not is_no_auth) else None
|
|
85
|
+
owner_name = user.name if user else None
|
|
86
|
+
owner_email = user.email if user else None
|
|
96
87
|
|
|
97
88
|
from api.documents import _ensure_index_exists
|
|
98
89
|
await _ensure_index_exists()
|
|
@@ -163,6 +154,7 @@ async def upload_options(
|
|
|
163
154
|
async def upload_bucket(
|
|
164
155
|
body: UploadBucketBody,
|
|
165
156
|
task_service=Depends(get_task_service),
|
|
157
|
+
models_service=Depends(get_models_service),
|
|
166
158
|
session_manager=Depends(get_session_manager),
|
|
167
159
|
user: User = Depends(get_current_user),
|
|
168
160
|
):
|
|
@@ -194,18 +186,13 @@ async def upload_bucket(
|
|
|
194
186
|
jwt_token = user.jwt_token
|
|
195
187
|
|
|
196
188
|
from models.processors import S3FileProcessor
|
|
197
|
-
from config.settings import is_no_auth_mode
|
|
198
189
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
else
|
|
205
|
-
owner_user_id = user.user_id
|
|
206
|
-
owner_name = user.name
|
|
207
|
-
owner_email = user.email
|
|
208
|
-
task_user_id = user.user_id
|
|
190
|
+
from config.settings import is_no_auth_mode
|
|
191
|
+
is_no_auth = is_no_auth_mode()
|
|
192
|
+
owner_user_id = user.user_id if (user and not is_no_auth) else None
|
|
193
|
+
owner_name = user.name if user else None
|
|
194
|
+
owner_email = user.email if user else None
|
|
195
|
+
task_user_id = user.user_id if (user and not is_no_auth) else None
|
|
209
196
|
|
|
210
197
|
from api.documents import _ensure_index_exists
|
|
211
198
|
await _ensure_index_exists()
|
|
@@ -213,6 +200,7 @@ async def upload_bucket(
|
|
|
213
200
|
processor = S3FileProcessor(
|
|
214
201
|
task_service.document_service,
|
|
215
202
|
bucket,
|
|
203
|
+
models_service=models_service,
|
|
216
204
|
s3_client=s3_client,
|
|
217
205
|
owner_user_id=owner_user_id,
|
|
218
206
|
jwt_token=jwt_token,
|
|
@@ -31,8 +31,6 @@ OPENAI_VALIDATION_MODELS = [
|
|
|
31
31
|
]
|
|
32
32
|
|
|
33
33
|
OPENAI_DEFAULT_LANGUAGE_MODEL = "gpt-4o"
|
|
34
|
-
OPENAI_DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small"
|
|
35
|
-
OPENAI_EMBEDDING_MODEL_PREFIX = "text-embedding"
|
|
36
34
|
|
|
37
35
|
ANTHROPIC_DEFAULT_LANGUAGE_MODEL = "claude-sonnet-4-5-20250929"
|
|
38
36
|
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import os
|
|
3
|
+
import threading
|
|
4
|
+
import concurrent.futures
|
|
3
5
|
from utils.env_utils import get_env_int, get_env_float
|
|
4
6
|
|
|
5
7
|
import httpx
|
|
8
|
+
from agentd.patch import patch_openai_with_mcp
|
|
6
9
|
from dotenv import load_dotenv
|
|
7
10
|
from openai import AsyncOpenAI
|
|
8
11
|
from opensearchpy import AsyncOpenSearch
|
|
9
12
|
from opensearchpy._async.http_aiohttp import AIOHttpConnection
|
|
13
|
+
from config.embedding_constants import OPENAI_DEFAULT_EMBEDDING_MODEL
|
|
10
14
|
|
|
11
15
|
from utils.container_utils import get_container_host
|
|
12
16
|
from utils.logging_config import get_logger
|
|
@@ -106,26 +110,6 @@ WEBHOOK_BASE_URL = os.getenv(
|
|
|
106
110
|
VECTOR_DIM = 1536
|
|
107
111
|
KNN_EF_CONSTRUCTION = 100
|
|
108
112
|
KNN_M = 16
|
|
109
|
-
EMBED_MODEL = "text-embedding-3-small"
|
|
110
|
-
|
|
111
|
-
OPENAI_EMBEDDING_DIMENSIONS = {
|
|
112
|
-
"text-embedding-3-small": 1536,
|
|
113
|
-
"text-embedding-3-large": 3072,
|
|
114
|
-
"text-embedding-ada-002": 1536,
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
WATSONX_EMBEDDING_DIMENSIONS = {
|
|
118
|
-
# IBM Models
|
|
119
|
-
"ibm/granite-embedding-107m-multilingual": 384,
|
|
120
|
-
"ibm/granite-embedding-278m-multilingual": 1024,
|
|
121
|
-
"ibm/slate-125m-english-rtrvr": 768,
|
|
122
|
-
"ibm/slate-125m-english-rtrvr-v2": 768,
|
|
123
|
-
"ibm/slate-30m-english-rtrvr": 384,
|
|
124
|
-
"ibm/slate-30m-english-rtrvr-v2": 384,
|
|
125
|
-
# Third Party Models
|
|
126
|
-
"intfloat/multilingual-e5-large": 1024,
|
|
127
|
-
"sentence-transformers/all-minilm-l6-v2": 384,
|
|
128
|
-
}
|
|
129
113
|
|
|
130
114
|
INDEX_BODY = {
|
|
131
115
|
"settings": {
|
|
@@ -319,7 +303,7 @@ class AppClients:
|
|
|
319
303
|
self.langflow_client = None
|
|
320
304
|
self.langflow_http_client = None
|
|
321
305
|
self._patched_async_client = None # Private attribute - single client for all providers
|
|
322
|
-
self._client_init_lock =
|
|
306
|
+
self._client_init_lock = threading.Lock() # Lock for thread-safe initialization
|
|
323
307
|
self.docling_http_client = None
|
|
324
308
|
|
|
325
309
|
async def initialize(self):
|
|
@@ -454,6 +438,11 @@ class AppClients:
|
|
|
454
438
|
if config.providers.openai.api_key:
|
|
455
439
|
os.environ["OPENAI_API_KEY"] = config.providers.openai.api_key
|
|
456
440
|
logger.debug("Loaded OpenAI API key from config")
|
|
441
|
+
elif not os.environ.get("OPENAI_API_KEY"):
|
|
442
|
+
# Provide dummy key to satisfy AsyncOpenAI constructor;
|
|
443
|
+
# LiteLLM/MCP will handle routing to other providers if needed.
|
|
444
|
+
os.environ["OPENAI_API_KEY"] = "no-key-required"
|
|
445
|
+
logger.debug("Using dummy OpenAI API key to satisfy client constructor")
|
|
457
446
|
|
|
458
447
|
# Set Anthropic credentials
|
|
459
448
|
if config.providers.anthropic.api_key:
|
|
@@ -477,14 +466,23 @@ class AppClients:
|
|
|
477
466
|
os.environ["OLLAMA_ENDPOINT"] = config.providers.ollama.endpoint
|
|
478
467
|
logger.debug("Loaded Ollama endpoint from config")
|
|
479
468
|
|
|
469
|
+
# Determine model and provider for both probe and production client
|
|
470
|
+
model_name = config.knowledge.embedding_model or OPENAI_DEFAULT_EMBEDDING_MODEL
|
|
471
|
+
provider = config.knowledge.embedding_provider or "openai"
|
|
480
472
|
except Exception as e:
|
|
481
473
|
logger.debug("Could not load provider credentials from config", error=str(e))
|
|
474
|
+
# Provide fallbacks if config loading failed
|
|
475
|
+
model_name = OPENAI_DEFAULT_EMBEDDING_MODEL
|
|
476
|
+
provider = "openai"
|
|
477
|
+
# Ensure a dummy key is available to satisfy the AsyncOpenAI constructor
|
|
478
|
+
# and avoid AuthenticationError if config loading failed.
|
|
479
|
+
if not os.environ.get("OPENAI_API_KEY"):
|
|
480
|
+
os.environ["OPENAI_API_KEY"] = "no-key-required"
|
|
481
|
+
logger.debug("Using dummy OpenAI API key fallback (config load failed)")
|
|
482
|
+
|
|
482
483
|
|
|
483
|
-
#
|
|
484
|
-
|
|
485
|
-
import asyncio
|
|
486
|
-
import concurrent.futures
|
|
487
|
-
import threading
|
|
484
|
+
# API key for AsyncOpenAI constructor
|
|
485
|
+
api_key = os.environ.get("OPENAI_API_KEY")
|
|
488
486
|
|
|
489
487
|
async def probe_http2():
|
|
490
488
|
"""Returns True if HTTP/2 works, False to fall back to HTTP/1.1.
|
|
@@ -494,20 +492,21 @@ class AppClients:
|
|
|
494
492
|
production client is created after this thread exits, in the
|
|
495
493
|
caller's event loop, avoiding cross-loop SSL transport errors.
|
|
496
494
|
"""
|
|
497
|
-
client
|
|
498
|
-
|
|
495
|
+
# Use a standard OpenAI client for the probe (only runs for OpenAI provider)
|
|
496
|
+
client = AsyncOpenAI(api_key=api_key)
|
|
497
|
+
logger.info(f"Probing client with HTTP/2 using model {model_name}...")
|
|
499
498
|
try:
|
|
500
499
|
await asyncio.wait_for(
|
|
501
500
|
client.embeddings.create(
|
|
502
|
-
model=
|
|
501
|
+
model=model_name,
|
|
503
502
|
input=['test']
|
|
504
503
|
),
|
|
505
504
|
timeout=5.0
|
|
506
505
|
)
|
|
507
|
-
logger.info("HTTP/2 probe successful")
|
|
506
|
+
logger.info(f"HTTP/2 probe successful with {model_name}")
|
|
508
507
|
return True
|
|
509
508
|
except (asyncio.TimeoutError, Exception) as probe_error:
|
|
510
|
-
logger.warning("HTTP/2 probe failed, falling back to HTTP/1.1", error=str(probe_error))
|
|
509
|
+
logger.warning(f"HTTP/2 probe failed with {model_name}, falling back to HTTP/1.1", error=str(probe_error))
|
|
511
510
|
return False
|
|
512
511
|
finally:
|
|
513
512
|
# Always close the probe client so its connections are fully
|
|
@@ -527,24 +526,32 @@ class AppClients:
|
|
|
527
526
|
loop.close()
|
|
528
527
|
|
|
529
528
|
try:
|
|
530
|
-
# Run the probe
|
|
531
|
-
#
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
529
|
+
# Run the probe only for OpenAI provider; local and other providers
|
|
530
|
+
# (Ollama, WatsonX) typically use HTTP/1.1 for reliability.
|
|
531
|
+
if provider.lower() == "openai":
|
|
532
|
+
# Run the probe in a separate thread with its own event loop.
|
|
533
|
+
# Only the probe result (bool) crosses the thread boundary;
|
|
534
|
+
# the production client is created here so its connections are
|
|
535
|
+
# bound to the caller's event loop, not the (now closed) probe loop.
|
|
536
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
|
|
537
|
+
future = executor.submit(run_probe_in_thread)
|
|
538
|
+
use_http2 = future.result(timeout=15)
|
|
539
|
+
else:
|
|
540
|
+
use_http2 = False
|
|
541
|
+
logger.debug(f"Skipping HTTP/2 probe for provider: {provider}")
|
|
537
542
|
|
|
538
543
|
if use_http2:
|
|
539
|
-
self._patched_async_client = AsyncOpenAI()
|
|
540
|
-
logger.info("OpenAI client initialized with HTTP/2")
|
|
544
|
+
self._patched_async_client = patch_openai_with_mcp(AsyncOpenAI(api_key=api_key))
|
|
545
|
+
logger.info(f"OpenAI-compatible client initialized with HTTP/2 (model: {model_name})")
|
|
541
546
|
else:
|
|
542
547
|
http_client = httpx.AsyncClient(
|
|
543
548
|
http2=False,
|
|
544
549
|
timeout=httpx.Timeout(60.0, connect=10.0)
|
|
545
550
|
)
|
|
546
|
-
self._patched_async_client =
|
|
547
|
-
|
|
551
|
+
self._patched_async_client = patch_openai_with_mcp(
|
|
552
|
+
AsyncOpenAI(api_key=api_key, http_client=http_client)
|
|
553
|
+
)
|
|
554
|
+
logger.info(f"OpenAI-compatible client initialized with HTTP/1.1 fallback (model: {model_name})")
|
|
548
555
|
logger.info("Successfully initialized OpenAI client")
|
|
549
556
|
except Exception as e:
|
|
550
557
|
logger.error(f"Failed to initialize OpenAI client: {e.__class__.__name__}: {str(e)}")
|
|
@@ -861,7 +868,7 @@ def get_openrag_config():
|
|
|
861
868
|
# Expose configuration settings for backward compatibility and easy access
|
|
862
869
|
def get_provider_config():
|
|
863
870
|
"""Get provider configuration."""
|
|
864
|
-
return get_openrag_config().
|
|
871
|
+
return get_openrag_config().providers
|
|
865
872
|
|
|
866
873
|
|
|
867
874
|
def get_knowledge_config():
|
|
@@ -876,7 +883,7 @@ def get_agent_config():
|
|
|
876
883
|
|
|
877
884
|
def get_embedding_model() -> str:
|
|
878
885
|
"""Return the currently configured embedding model."""
|
|
879
|
-
return get_openrag_config().knowledge.embedding_model or
|
|
886
|
+
return get_openrag_config().knowledge.embedding_model or (OPENAI_DEFAULT_EMBEDDING_MODEL if DISABLE_INGEST_WITH_LANGFLOW else "")
|
|
880
887
|
|
|
881
888
|
|
|
882
889
|
def get_index_name() -> str:
|
|
@@ -20,6 +20,8 @@ class ConnectorService:
|
|
|
20
20
|
index_name: str,
|
|
21
21
|
task_service=None,
|
|
22
22
|
session_manager=None,
|
|
23
|
+
models_service=None,
|
|
24
|
+
document_service=None,
|
|
23
25
|
):
|
|
24
26
|
self.clients = patched_async_client
|
|
25
27
|
self.embed_model = embed_model
|
|
@@ -27,6 +29,8 @@ class ConnectorService:
|
|
|
27
29
|
self.task_service = task_service
|
|
28
30
|
self.session_manager = session_manager
|
|
29
31
|
self.connection_manager = ConnectionManager()
|
|
32
|
+
self.models_service = models_service
|
|
33
|
+
self.document_service = document_service
|
|
30
34
|
|
|
31
35
|
async def initialize(self):
|
|
32
36
|
"""Initialize the service by loading existing connections"""
|
|
@@ -57,18 +61,12 @@ class ConnectorService:
|
|
|
57
61
|
with open(tmp_path, "wb") as f:
|
|
58
62
|
f.write(document.content)
|
|
59
63
|
|
|
60
|
-
# Use existing process_file_common function with connector document metadata
|
|
61
|
-
# We'll use the document service's process_file_common method
|
|
62
|
-
from services.document_service import DocumentService
|
|
63
|
-
|
|
64
|
-
doc_service = DocumentService(session_manager=self.session_manager)
|
|
65
|
-
|
|
66
64
|
logger.debug("Processing connector document", document_id=document.id)
|
|
67
65
|
|
|
68
66
|
# Process using consolidated processing pipeline
|
|
69
67
|
from models.processors import TaskProcessor
|
|
70
68
|
|
|
71
|
-
processor = TaskProcessor(document_service=
|
|
69
|
+
processor = TaskProcessor(document_service=self.document_service, models_service=self.models_service)
|
|
72
70
|
result = await processor.process_document_standard(
|
|
73
71
|
file_path=tmp_path,
|
|
74
72
|
file_hash=document.id, # Use connector document ID as hash
|
|
@@ -284,6 +282,7 @@ class ConnectorService:
|
|
|
284
282
|
if self.task_service and self.task_service.document_service
|
|
285
283
|
else DocumentService(session_manager=self.session_manager)
|
|
286
284
|
),
|
|
285
|
+
models_service=self.models_service,
|
|
287
286
|
)
|
|
288
287
|
|
|
289
288
|
# Use file IDs as items (no more fake file paths!)
|
|
@@ -415,6 +414,7 @@ class ConnectorService:
|
|
|
415
414
|
if self.task_service and self.task_service.document_service
|
|
416
415
|
else DocumentService(session_manager=self.session_manager)
|
|
417
416
|
),
|
|
417
|
+
models_service=self.models_service,
|
|
418
418
|
)
|
|
419
419
|
|
|
420
420
|
# Create custom task using TaskService
|