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.
Files changed (164) hide show
  1. {openrag-0.3.2.dev61/src/openrag.egg-info → openrag-0.3.4}/PKG-INFO +4 -3
  2. {openrag-0.3.2.dev61 → openrag-0.3.4}/pyproject.toml +5 -4
  3. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/agent.py +24 -29
  4. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/connectors.py +5 -57
  5. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/chat.py +0 -2
  6. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/config_manager.py +4 -0
  7. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/settings.py +2 -7
  8. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/__init__.py +0 -4
  9. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/connection_manager.py +9 -57
  10. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/langflow_connector_service.py +29 -30
  11. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/main.py +39 -29
  12. {openrag-0.3.2.dev61 → openrag-0.3.4/src/openrag.egg-info}/PKG-INFO +4 -3
  13. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/SOURCES.txt +0 -12
  14. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/requires.txt +3 -2
  15. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/auth_service.py +4 -69
  16. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/chat_service.py +9 -10
  17. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/search_service.py +0 -2
  18. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/docker-compose.yml +0 -8
  19. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_agent.json +2 -2
  20. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/config_fields.py +0 -41
  21. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/env_manager.py +0 -26
  22. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/file_utils.py +4 -18
  23. openrag-0.3.2.dev61/src/connectors/aws_s3/__init__.py +0 -19
  24. openrag-0.3.2.dev61/src/connectors/aws_s3/api.py +0 -175
  25. openrag-0.3.2.dev61/src/connectors/aws_s3/auth.py +0 -90
  26. openrag-0.3.2.dev61/src/connectors/aws_s3/connector.py +0 -277
  27. openrag-0.3.2.dev61/src/connectors/aws_s3/models.py +0 -13
  28. openrag-0.3.2.dev61/src/connectors/aws_s3/support.py +0 -51
  29. openrag-0.3.2.dev61/src/connectors/ibm_cos/__init__.py +0 -17
  30. openrag-0.3.2.dev61/src/connectors/ibm_cos/api.py +0 -202
  31. openrag-0.3.2.dev61/src/connectors/ibm_cos/auth.py +0 -183
  32. openrag-0.3.2.dev61/src/connectors/ibm_cos/connector.py +0 -375
  33. openrag-0.3.2.dev61/src/connectors/ibm_cos/models.py +0 -20
  34. openrag-0.3.2.dev61/src/connectors/ibm_cos/support.py +0 -68
  35. {openrag-0.3.2.dev61 → openrag-0.3.4}/LICENSE +0 -0
  36. {openrag-0.3.2.dev61 → openrag-0.3.4}/MANIFEST.in +0 -0
  37. {openrag-0.3.2.dev61 → openrag-0.3.4}/README.md +0 -0
  38. {openrag-0.3.2.dev61 → openrag-0.3.4}/setup.cfg +0 -0
  39. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/__init__.py +0 -0
  40. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/auth.py +0 -0
  41. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/chat.py +0 -0
  42. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/connector_router.py +0 -0
  43. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/docling.py +0 -0
  44. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/documents.py +0 -0
  45. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/flows.py +0 -0
  46. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/keys.py +0 -0
  47. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/knowledge_filter.py +0 -0
  48. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/langflow_files.py +0 -0
  49. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/models.py +0 -0
  50. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/nudges.py +0 -0
  51. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/oidc.py +0 -0
  52. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/provider_health.py +0 -0
  53. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/provider_validation.py +0 -0
  54. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/router.py +0 -0
  55. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/search.py +0 -0
  56. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/settings.py +0 -0
  57. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/tasks.py +0 -0
  58. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/upload.py +0 -0
  59. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/__init__.py +0 -0
  60. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/documents.py +0 -0
  61. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/knowledge_filters.py +0 -0
  62. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/models.py +0 -0
  63. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/search.py +0 -0
  64. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/api/v1/settings.py +0 -0
  65. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/auth_context.py +0 -0
  66. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/__init__.py +0 -0
  67. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/config/model_constants.py +0 -0
  68. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/base.py +0 -0
  69. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/__init__.py +0 -0
  70. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/connector.py +0 -0
  71. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/google_drive/oauth.py +0 -0
  72. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/__init__.py +0 -0
  73. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/connector.py +0 -0
  74. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/onedrive/oauth.py +0 -0
  75. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/service.py +0 -0
  76. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/__init__.py +0 -0
  77. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/connector.py +0 -0
  78. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/oauth.py +0 -0
  79. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/connectors/sharepoint/utils.py +0 -0
  80. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/dependencies.py +0 -0
  81. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/__init__.py +0 -0
  82. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/processors.py +0 -0
  83. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/tasks.py +0 -0
  84. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/models/url.py +0 -0
  85. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/dependency_links.txt +0 -0
  86. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/entry_points.txt +0 -0
  87. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/openrag.egg-info/top_level.txt +0 -0
  88. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/__init__.py +0 -0
  89. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/api_key_service.py +0 -0
  90. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/conversation_persistence_service.py +0 -0
  91. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/document_service.py +0 -0
  92. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/flows_service.py +0 -0
  93. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/knowledge_filter_service.py +0 -0
  94. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_file_service.py +0 -0
  95. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_history_service.py +0 -0
  96. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/langflow_mcp_service.py +0 -0
  97. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/models_service.py +0 -0
  98. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/monitor_service.py +0 -0
  99. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/session_ownership_service.py +0 -0
  100. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/services/task_service.py +0 -0
  101. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/session_manager.py +0 -0
  102. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/__init__.py +0 -0
  103. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  104. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  105. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  106. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  107. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  108. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  109. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  110. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  111. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  112. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  113. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  114. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  115. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/openrag-documentation.pdf +0 -0
  116. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  117. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/cli.py +0 -0
  118. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/main.py +0 -0
  119. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/__init__.py +0 -0
  120. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/container_manager.py +0 -0
  121. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/managers/docling_manager.py +0 -0
  122. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/__init__.py +0 -0
  123. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/config.py +0 -0
  124. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/diagnostics.py +0 -0
  125. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/logs.py +0 -0
  126. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/monitor.py +0 -0
  127. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/screens/welcome.py +0 -0
  128. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/__init__.py +0 -0
  129. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/clipboard.py +0 -0
  130. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/platform.py +0 -0
  131. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/startup_checks.py +0 -0
  132. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/validation.py +0 -0
  133. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/utils/version_check.py +0 -0
  134. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/__init__.py +0 -0
  135. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/command_modal.py +0 -0
  136. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/diagnostics_notification.py +0 -0
  137. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/error_notification.py +0 -0
  138. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  139. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  140. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/prune_options_modal.py +0 -0
  141. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  142. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  143. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/tui/widgets/waves.py +0 -0
  144. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/__init__.py +0 -0
  145. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/acl_utils.py +0 -0
  146. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/container_utils.py +0 -0
  147. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/docling_client.py +0 -0
  148. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/document_processing.py +0 -0
  149. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/embedding_fields.py +0 -0
  150. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/embeddings.py +0 -0
  151. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/env_utils.py +0 -0
  152. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/gpu_detection.py +0 -0
  153. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/hash_utils.py +0 -0
  154. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/langflow_headers.py +0 -0
  155. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/langflow_utils.py +0 -0
  156. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/logging_config.py +0 -0
  157. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/opensearch_queries.py +0 -0
  158. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/opensearch_utils.py +0 -0
  159. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/paths.py +0 -0
  160. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/__init__.py +0 -0
  161. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/category.py +0 -0
  162. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/client.py +0 -0
  163. {openrag-0.3.2.dev61 → openrag-0.3.4}/src/utils/telemetry/message_id.py +0 -0
  164. {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.2.dev61
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.2.dev61"
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 services.session_ownership_service import session_ownership_service
845
- session_ownership_service.release_session(user_id, response_id)
846
- logger.debug(f"Released session ownership for {response_id} for user {user_id}")
847
- except Exception as e:
848
- logger.warning(f"Failed to release session ownership: {e}")
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
- return deleted
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 = connector_service.connection_manager.get_available_connector_types(
105
- user_id=user.user_id
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", "ibm_cos", "aws_s3"]
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 = patch_openai_with_mcp(AsyncOpenAI())
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 = patch_openai_with_mcp(
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
- self, user_id: Optional[str] = None
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", user_id),
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", user_id),
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", user_id),
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 _has_saved_credentials_for_user(
380
- self, connector_type: str, user_id: Optional[str]
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, RuntimeError):
414
- # Fallback: saved per-user connection config (e.g. aws_s3 / ibm_cos)
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
- # Only attempt folder expansion for connectors that use cfg-based filtering
336
- # (Google Drive, OneDrive, SharePoint). Connectors without a cfg attribute
337
- # (e.g. IBM COS) receive pre-filtered file IDs and must NOT call list_files()
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
- # Expand file IDs folders become their individual file contents
346
- result = await connector.list_files()
347
- expanded_file_ids = [f["id"] for f in result.get("files", [])]
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
- except Exception as e:
364
- logger.error(f"Failed to expand file_ids via list_files(): {e}")
365
- # Fallback to original file_ids if expansion fails
366
- expanded_file_ids = file_ids
367
- finally:
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("/connectors", connectors.list_connectors, methods=["GET"], tags=["internal"])
1508
- # IBM COS-specific routes (registered before generic /{connector_type}/... to avoid shadowing)
1509
- app.add_api_route("/connectors/ibm_cos/defaults", ibm_cos_defaults, methods=["GET"], tags=["internal"])
1510
- app.add_api_route("/connectors/ibm_cos/configure", ibm_cos_configure, methods=["POST"], tags=["internal"])
1511
- app.add_api_route("/connectors/ibm_cos/{connection_id}/buckets", ibm_cos_list_buckets, methods=["GET"], tags=["internal"])
1512
- app.add_api_route("/connectors/ibm_cos/{connection_id}/bucket-status", ibm_cos_bucket_status, methods=["GET"], tags=["internal"])
1513
- # AWS S3-specific routes (registered before generic /{connector_type}/... to avoid shadowing)
1514
- app.add_api_route("/connectors/aws_s3/defaults", s3_defaults, methods=["GET"], tags=["internal"])
1515
- app.add_api_route("/connectors/aws_s3/configure", s3_configure, methods=["POST"], tags=["internal"])
1516
- app.add_api_route("/connectors/aws_s3/{connection_id}/buckets", s3_list_buckets, methods=["GET"], tags=["internal"])
1517
- app.add_api_route("/connectors/aws_s3/{connection_id}/bucket-status", s3_bucket_status, methods=["GET"], tags=["internal"])
1518
- app.add_api_route("/connectors/{connector_type}/sync", connectors.connector_sync, methods=["POST"], tags=["internal"])
1519
- app.add_api_route("/connectors/sync-all", connectors.sync_all_connectors, methods=["POST"], tags=["internal"])
1520
- app.add_api_route("/connectors/{connector_type}/status", connectors.connector_status, methods=["GET"], tags=["internal"])
1521
- app.add_api_route("/connectors/{connector_type}/token", connectors.connector_token, methods=["GET"], tags=["internal"])
1522
- app.add_api_route("/connectors/{connector_type}/disconnect", connectors.connector_disconnect, methods=["DELETE"], tags=["internal"])
1523
- app.add_api_route("/connectors/{connector_type}/webhook", connectors.connector_webhook, methods=["POST", "GET"], tags=["internal"])
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.2.dev61
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