openrag 0.4.1.dev15__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.
Files changed (166) hide show
  1. {openrag-0.4.1.dev15/src/openrag.egg-info → openrag-0.4.1.dev16}/PKG-INFO +4 -2
  2. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/pyproject.toml +4 -2
  3. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/settings.py +9 -2
  4. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/upload.py +17 -29
  5. openrag-0.4.1.dev16/src/config/embedding_constants.py +4 -0
  6. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/config/model_constants.py +0 -2
  7. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/config/settings.py +51 -44
  8. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/service.py +7 -7
  9. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/main.py +57 -42
  10. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/models/processors.py +37 -20
  11. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16/src/openrag.egg-info}/PKG-INFO +4 -2
  12. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/openrag.egg-info/SOURCES.txt +1 -0
  13. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/openrag.egg-info/requires.txt +3 -1
  14. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/document_service.py +15 -9
  15. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/models_service.py +150 -13
  16. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/search_service.py +62 -25
  17. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/task_service.py +5 -1
  18. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/session_manager.py +2 -0
  19. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/embedding_fields.py +4 -2
  20. openrag-0.4.1.dev16/src/utils/embeddings.py +39 -0
  21. openrag-0.4.1.dev15/src/utils/embeddings.py +0 -196
  22. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/LICENSE +0 -0
  23. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/MANIFEST.in +0 -0
  24. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/README.md +0 -0
  25. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/setup.cfg +0 -0
  26. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/agent.py +0 -0
  27. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/__init__.py +0 -0
  28. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/auth.py +0 -0
  29. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/chat.py +0 -0
  30. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/connector_router.py +0 -0
  31. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/connectors.py +0 -0
  32. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/docling.py +0 -0
  33. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/documents.py +0 -0
  34. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/flows.py +0 -0
  35. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/keys.py +0 -0
  36. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/knowledge_filter.py +0 -0
  37. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/langflow_files.py +0 -0
  38. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/models.py +0 -0
  39. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/nudges.py +0 -0
  40. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/oidc.py +0 -0
  41. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/provider_health.py +0 -0
  42. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/provider_validation.py +0 -0
  43. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/router.py +0 -0
  44. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/search.py +0 -0
  45. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/tasks.py +0 -0
  46. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/__init__.py +0 -0
  47. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/chat.py +0 -0
  48. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/documents.py +0 -0
  49. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/knowledge_filters.py +0 -0
  50. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/models.py +0 -0
  51. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/search.py +0 -0
  52. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/api/v1/settings.py +0 -0
  53. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/auth_context.py +0 -0
  54. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/config/__init__.py +0 -0
  55. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/config/config_manager.py +0 -0
  56. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/__init__.py +0 -0
  57. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/__init__.py +0 -0
  58. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/api.py +0 -0
  59. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/auth.py +0 -0
  60. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/connector.py +0 -0
  61. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/models.py +0 -0
  62. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/aws_s3/support.py +0 -0
  63. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/base.py +0 -0
  64. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/connection_manager.py +0 -0
  65. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/google_drive/__init__.py +0 -0
  66. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/google_drive/connector.py +0 -0
  67. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/google_drive/oauth.py +0 -0
  68. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/__init__.py +0 -0
  69. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/api.py +0 -0
  70. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/auth.py +0 -0
  71. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/connector.py +0 -0
  72. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/models.py +0 -0
  73. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/ibm_cos/support.py +0 -0
  74. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/langflow_connector_service.py +0 -0
  75. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/onedrive/__init__.py +0 -0
  76. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/onedrive/connector.py +0 -0
  77. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/onedrive/oauth.py +0 -0
  78. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/sharepoint/__init__.py +0 -0
  79. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/sharepoint/connector.py +0 -0
  80. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/sharepoint/oauth.py +0 -0
  81. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/connectors/sharepoint/utils.py +0 -0
  82. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/dependencies.py +0 -0
  83. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/models/__init__.py +0 -0
  84. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/models/tasks.py +0 -0
  85. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/models/url.py +0 -0
  86. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/openrag.egg-info/dependency_links.txt +0 -0
  87. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/openrag.egg-info/entry_points.txt +0 -0
  88. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/openrag.egg-info/top_level.txt +0 -0
  89. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/__init__.py +0 -0
  90. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/api_key_service.py +0 -0
  91. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/auth_service.py +0 -0
  92. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/chat_service.py +0 -0
  93. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/conversation_persistence_service.py +0 -0
  94. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/flows_service.py +0 -0
  95. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/knowledge_filter_service.py +0 -0
  96. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/langflow_file_service.py +0 -0
  97. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/langflow_history_service.py +0 -0
  98. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/langflow_mcp_service.py +0 -0
  99. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/monitor_service.py +0 -0
  100. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/services/session_ownership_service.py +0 -0
  101. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/__init__.py +0 -0
  102. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  103. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/docker-compose.yml +0 -0
  104. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  105. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  106. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  107. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  108. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  109. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  110. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  111. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_agent.json +0 -0
  112. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  113. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  114. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  115. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  116. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
  117. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  118. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/cli.py +0 -0
  119. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/config_fields.py +0 -0
  120. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/main.py +0 -0
  121. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/managers/__init__.py +0 -0
  122. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/managers/container_manager.py +0 -0
  123. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/managers/docling_manager.py +0 -0
  124. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/managers/env_manager.py +0 -0
  125. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/__init__.py +0 -0
  126. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/config.py +0 -0
  127. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/diagnostics.py +0 -0
  128. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/logs.py +0 -0
  129. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/monitor.py +0 -0
  130. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/screens/welcome.py +0 -0
  131. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/__init__.py +0 -0
  132. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/clipboard.py +0 -0
  133. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/platform.py +0 -0
  134. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/startup_checks.py +0 -0
  135. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/validation.py +0 -0
  136. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/utils/version_check.py +0 -0
  137. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/__init__.py +0 -0
  138. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/command_modal.py +0 -0
  139. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/diagnostics_notification.py +0 -0
  140. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/error_notification.py +0 -0
  141. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  142. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  143. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/prune_options_modal.py +0 -0
  144. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  145. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  146. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/tui/widgets/waves.py +0 -0
  147. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/__init__.py +0 -0
  148. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/acl_utils.py +0 -0
  149. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/container_utils.py +0 -0
  150. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/docling_client.py +0 -0
  151. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/document_processing.py +0 -0
  152. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/env_utils.py +0 -0
  153. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/file_utils.py +0 -0
  154. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/gpu_detection.py +0 -0
  155. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/hash_utils.py +0 -0
  156. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/langflow_headers.py +0 -0
  157. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/langflow_utils.py +0 -0
  158. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/logging_config.py +0 -0
  159. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/opensearch_queries.py +0 -0
  160. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/opensearch_utils.py +0 -0
  161. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/paths.py +0 -0
  162. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/telemetry/__init__.py +0 -0
  163. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/telemetry/category.py +0 -0
  164. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/telemetry/client.py +0 -0
  165. {openrag-0.4.1.dev15 → openrag-0.4.1.dev16}/src/utils/telemetry/message_id.py +0 -0
  166. {openrag-0.4.1.dev15 → 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.dev15
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: openai>=1.0.0
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.dev15"
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
- "openai>=1.0.0",
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 and not DISABLE_INGEST_WITH_LANGFLOW:
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 is_no_auth_mode():
40
- owner_user_id = None
41
- owner_name = None
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 is_no_auth_mode():
89
- owner_user_id = None
90
- owner_name = None
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
- if is_no_auth_mode():
200
- owner_user_id = None
201
- owner_name = None
202
- owner_email = None
203
- task_user_id = None
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,
@@ -0,0 +1,4 @@
1
+ """Embedding model constants."""
2
+
3
+ OPENAI_DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small"
4
+ OPENAI_EMBEDDING_MODEL_PREFIX = "text-embedding"
@@ -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 = __import__('threading').Lock() # Lock for thread-safe initialization
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
- # Try to initialize the client - AsyncOpenAI() will read from environment
484
- # We'll try HTTP/2 first with a probe, then fall back to HTTP/1.1 if it times out
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 = AsyncOpenAI()
498
- logger.info("Probing OpenAI client with HTTP/2...")
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='text-embedding-3-small',
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 in a separate thread with its own event loop.
531
- # Only the probe result (bool) crosses the thread boundary;
532
- # the production client is created here so its connections are
533
- # bound to the caller's event loop, not the (now closed) probe loop.
534
- with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
535
- future = executor.submit(run_probe_in_thread)
536
- use_http2 = future.result(timeout=15)
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 = AsyncOpenAI(http_client=http_client)
547
- logger.info("OpenAI client initialized with HTTP/1.1 (fallback)")
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().provider
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 EMBED_MODEL if DISABLE_INGEST_WITH_LANGFLOW else ""
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=doc_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