openrag 0.5.0.dev34__tar.gz → 0.5.0.dev36__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 (172) hide show
  1. {openrag-0.5.0.dev34/src/openrag.egg-info → openrag-0.5.0.dev36}/PKG-INFO +1 -1
  2. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/pyproject.toml +1 -1
  3. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/langflow_files.py +23 -20
  4. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/langflow_connector_service.py +10 -2
  5. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/models/processors.py +5 -8
  6. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36/src/openrag.egg-info}/PKG-INFO +1 -1
  7. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/file_utils.py +19 -0
  8. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/LICENSE +0 -0
  9. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/MANIFEST.in +0 -0
  10. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/README.md +0 -0
  11. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/setup.cfg +0 -0
  12. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/agent.py +0 -0
  13. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/__init__.py +0 -0
  14. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/auth.py +0 -0
  15. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/chat.py +0 -0
  16. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/connector_router.py +0 -0
  17. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/connectors.py +0 -0
  18. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/docling.py +0 -0
  19. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/documents.py +0 -0
  20. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/flows.py +0 -0
  21. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/keys.py +0 -0
  22. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/knowledge_filter.py +0 -0
  23. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/models.py +0 -0
  24. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/nudges.py +0 -0
  25. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/oidc.py +0 -0
  26. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/provider_health.py +0 -0
  27. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/provider_validation.py +0 -0
  28. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/router.py +0 -0
  29. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/search.py +0 -0
  30. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/settings.py +0 -0
  31. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/tasks.py +0 -0
  32. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/upload.py +0 -0
  33. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/__init__.py +0 -0
  34. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/chat.py +0 -0
  35. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/documents.py +0 -0
  36. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/knowledge_filters.py +0 -0
  37. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/models.py +0 -0
  38. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/search.py +0 -0
  39. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/api/v1/settings.py +0 -0
  40. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/auth/__init__.py +0 -0
  41. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/auth/ibm_auth.py +0 -0
  42. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/auth_context.py +0 -0
  43. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/bootstrap.py +0 -0
  44. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/__init__.py +0 -0
  45. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/config_manager.py +0 -0
  46. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/embedding_constants.py +0 -0
  47. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/model_constants.py +0 -0
  48. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/paths.py +0 -0
  49. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/config/settings.py +0 -0
  50. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/__init__.py +0 -0
  51. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/__init__.py +0 -0
  52. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/api.py +0 -0
  53. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/auth.py +0 -0
  54. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/connector.py +0 -0
  55. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/models.py +0 -0
  56. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/aws_s3/support.py +0 -0
  57. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/base.py +0 -0
  58. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/connection_manager.py +0 -0
  59. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/google_drive/__init__.py +0 -0
  60. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/google_drive/connector.py +0 -0
  61. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/google_drive/oauth.py +0 -0
  62. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/__init__.py +0 -0
  63. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/api.py +0 -0
  64. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/auth.py +0 -0
  65. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/connector.py +0 -0
  66. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/models.py +0 -0
  67. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/ibm_cos/support.py +0 -0
  68. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/onedrive/__init__.py +0 -0
  69. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/onedrive/connector.py +0 -0
  70. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/onedrive/oauth.py +0 -0
  71. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/service.py +0 -0
  72. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/sharepoint/__init__.py +0 -0
  73. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/sharepoint/connector.py +0 -0
  74. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/sharepoint/oauth.py +0 -0
  75. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/connectors/sharepoint/utils.py +0 -0
  76. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/dependencies.py +0 -0
  77. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/main.py +0 -0
  78. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/mcp_http/__init__.py +0 -0
  79. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/mcp_http/server.py +0 -0
  80. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/models/__init__.py +0 -0
  81. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/models/tasks.py +0 -0
  82. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/models/url.py +0 -0
  83. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/openrag.egg-info/SOURCES.txt +0 -0
  84. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/openrag.egg-info/dependency_links.txt +0 -0
  85. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/openrag.egg-info/entry_points.txt +0 -0
  86. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/openrag.egg-info/requires.txt +0 -0
  87. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/openrag.egg-info/top_level.txt +0 -0
  88. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/__init__.py +0 -0
  89. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/api_key_service.py +0 -0
  90. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/auth_service.py +0 -0
  91. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/chat_service.py +0 -0
  92. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/conversation_persistence_service.py +0 -0
  93. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/document_service.py +0 -0
  94. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/flows_service.py +0 -0
  95. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/knowledge_filter_service.py +0 -0
  96. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/langflow_file_service.py +0 -0
  97. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/langflow_history_service.py +0 -0
  98. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/langflow_mcp_service.py +0 -0
  99. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/models_service.py +0 -0
  100. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/monitor_service.py +0 -0
  101. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/search_service.py +0 -0
  102. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/session_ownership_service.py +0 -0
  103. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/services/task_service.py +0 -0
  104. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/session_manager.py +0 -0
  105. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/__init__.py +0 -0
  106. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/docker-compose.gpu.yml +0 -0
  107. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/docker-compose.yml +0 -0
  108. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/ollama_embedding.json +0 -0
  109. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/ollama_llm.json +0 -0
  110. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/ollama_llm_text.json +0 -0
  111. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/watsonx_embedding.json +0 -0
  112. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/watsonx_llm.json +0 -0
  113. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/components/watsonx_llm_text.json +0 -0
  114. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/ingestion_flow.json +0 -0
  115. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/openrag_agent.json +0 -0
  116. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/openrag_nudges.json +0 -0
  117. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/flows/openrag_url_mcp.json +0 -0
  118. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/openrag-documents/docling.pdf +0 -0
  119. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/openrag-documents/ibm_anthropic.pdf +0 -0
  120. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/_assets/openrag-documents/warmup_ocr.pdf +0 -0
  121. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/cli.py +0 -0
  122. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/config_fields.py +0 -0
  123. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/main.py +0 -0
  124. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/managers/__init__.py +0 -0
  125. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/managers/container_manager.py +0 -0
  126. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/managers/docling_manager.py +0 -0
  127. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/managers/env_manager.py +0 -0
  128. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/__init__.py +0 -0
  129. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/config.py +0 -0
  130. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/diagnostics.py +0 -0
  131. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/logs.py +0 -0
  132. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/monitor.py +0 -0
  133. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/screens/welcome.py +0 -0
  134. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/__init__.py +0 -0
  135. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/clipboard.py +0 -0
  136. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/platform.py +0 -0
  137. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/startup_checks.py +0 -0
  138. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/validation.py +0 -0
  139. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/utils/version_check.py +0 -0
  140. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/__init__.py +0 -0
  141. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/command_modal.py +0 -0
  142. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/diagnostics_notification.py +0 -0
  143. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/error_notification.py +0 -0
  144. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/factory_reset_warning_modal.py +0 -0
  145. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/flow_backup_warning_modal.py +0 -0
  146. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/prune_options_modal.py +0 -0
  147. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/upgrade_instructions_modal.py +0 -0
  148. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/version_mismatch_warning_modal.py +0 -0
  149. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/tui/widgets/waves.py +0 -0
  150. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/__init__.py +0 -0
  151. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/acl_utils.py +0 -0
  152. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/container_utils.py +0 -0
  153. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/docling_client.py +0 -0
  154. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/document_processing.py +0 -0
  155. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/embedding_fields.py +0 -0
  156. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/embeddings.py +0 -0
  157. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/encryption.py +0 -0
  158. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/env_utils.py +0 -0
  159. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/gpu_detection.py +0 -0
  160. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/hash_utils.py +0 -0
  161. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/langflow_headers.py +0 -0
  162. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/langflow_utils.py +0 -0
  163. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/logging_config.py +0 -0
  164. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/opensearch_queries.py +0 -0
  165. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/opensearch_utils.py +0 -0
  166. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/paths.py +0 -0
  167. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/run_mode_utils.py +0 -0
  168. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/telemetry/__init__.py +0 -0
  169. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/telemetry/category.py +0 -0
  170. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/telemetry/client.py +0 -0
  171. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/telemetry/message_id.py +0 -0
  172. {openrag-0.5.0.dev34 → openrag-0.5.0.dev36}/src/utils/version_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.5.0.dev34
3
+ Version: 0.5.0.dev36
4
4
  Summary: OpenRAG is a comprehensive Retrieval-Augmented Generation platform that enables intelligent document search and AI-powered conversations.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Environment :: Console
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "openrag"
7
- version = "0.5.0.dev34"
7
+ version = "0.5.0.dev36"
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"
@@ -1,43 +1,43 @@
1
1
  import json
2
2
  import os
3
3
  import tempfile
4
- from typing import List, Optional
5
4
 
6
5
  from fastapi import Depends, File, Form, UploadFile
7
- from pydantic import BaseModel
8
6
  from fastapi.responses import JSONResponse
7
+ from pydantic import BaseModel
9
8
 
10
9
  from dependencies import (
10
+ get_current_user,
11
11
  get_langflow_file_service,
12
+ get_optional_user,
12
13
  get_session_manager,
13
14
  get_task_service,
14
- get_current_user,
15
- get_optional_user,
16
15
  )
17
16
  from session_manager import User
17
+ from utils.file_utils import langflow_safe_filename_and_mimetype
18
18
  from utils.logging_config import get_logger
19
19
 
20
20
  logger = get_logger(__name__)
21
21
 
22
22
 
23
23
  class RunIngestionBody(BaseModel):
24
- file_paths: List[str] = []
25
- file_ids: Optional[List[str]] = None
26
- file_metadata: Optional[List[dict]] = None
27
- session_id: Optional[str] = None
28
- tweaks: Optional[dict] = None
29
- settings: Optional[dict] = None
24
+ file_paths: list[str] = []
25
+ file_ids: list[str] | None = None
26
+ file_metadata: list[dict] | None = None
27
+ session_id: str | None = None
28
+ tweaks: dict | None = None
29
+ settings: dict | None = None
30
30
 
31
31
 
32
32
  class DeleteFilesBody(BaseModel):
33
- file_ids: List[str]
33
+ file_ids: list[str]
34
34
 
35
35
 
36
36
  async def upload_user_file(
37
37
  file: UploadFile = File(...),
38
38
  langflow_file_service=Depends(get_langflow_file_service),
39
39
  session_manager=Depends(get_session_manager),
40
- user: Optional[User] = Depends(get_optional_user),
40
+ user: User | None = Depends(get_optional_user),
41
41
  ):
42
42
  """Upload a file to Langflow's Files API"""
43
43
  try:
@@ -45,11 +45,11 @@ async def upload_user_file(
45
45
  logger.debug("Processing file", filename=file.filename, size=file.size)
46
46
 
47
47
  content = await file.read()
48
- file_tuple = (
49
- file.filename,
50
- content,
51
- file.content_type or "application/octet-stream",
48
+ # Langflow's docling chokes on text/plain — rename .txt -> .md.
49
+ upload_filename, upload_mimetype = langflow_safe_filename_and_mimetype(
50
+ file.filename, file.content_type
52
51
  )
52
+ file_tuple = (upload_filename, content, upload_mimetype)
53
53
 
54
54
  jwt_token = user.jwt_token if user else session_manager.get_effective_jwt_token(None, None)
55
55
 
@@ -60,6 +60,7 @@ async def upload_user_file(
60
60
  except Exception as e:
61
61
  logger.error("upload_user_file endpoint failed", error_type=type(e).__name__, error=str(e))
62
62
  import traceback
63
+
63
64
  logger.error("Full traceback", traceback=traceback.format_exc())
64
65
  return JSONResponse({"error": str(e)}, status_code=500)
65
66
 
@@ -111,6 +112,7 @@ async def run_ingestion(
111
112
 
112
113
  if jwt_token:
113
114
  from auth_context import set_auth_context
115
+
114
116
  set_auth_context(user.user_id, jwt_token)
115
117
 
116
118
  try:
@@ -132,9 +134,9 @@ async def run_ingestion(
132
134
 
133
135
  async def upload_and_ingest_user_file(
134
136
  file: UploadFile = File(...),
135
- session_id: Optional[str] = Form(None),
136
- settings_json: Optional[str] = Form(None, alias="settings"),
137
- tweaks_json: Optional[str] = Form(None, alias="tweaks"),
137
+ session_id: str | None = Form(None),
138
+ settings_json: str | None = Form(None, alias="settings"),
139
+ tweaks_json: str | None = Form(None, alias="tweaks"),
138
140
  delete_after_ingest: str = Form("true"),
139
141
  langflow_file_service=Depends(get_langflow_file_service),
140
142
  session_manager=Depends(get_session_manager),
@@ -193,6 +195,7 @@ async def upload_and_ingest_user_file(
193
195
  )
194
196
  except Exception:
195
197
  from utils.file_utils import safe_unlink
198
+
196
199
  safe_unlink(temp_path)
197
200
  raise
198
201
 
@@ -221,4 +224,4 @@ async def delete_user_files(
221
224
  "errors": errors,
222
225
  },
223
226
  status_code=status,
224
- )
227
+ )
@@ -3,11 +3,15 @@ from typing import Any, Dict, List, Optional
3
3
  # Create custom processor for connector files using Langflow
4
4
  from models.processors import LangflowConnectorFileProcessor
5
5
  from services.langflow_file_service import LangflowFileService
6
+ from utils.file_utils import (
7
+ clean_connector_filename,
8
+ get_file_extension,
9
+ langflow_safe_filename_and_mimetype,
10
+ )
6
11
  from utils.logging_config import get_logger
7
12
 
8
13
  from .base import BaseConnector, ConnectorDocument
9
14
  from .connection_manager import ConnectionManager
10
- from utils.file_utils import get_file_extension, clean_connector_filename
11
15
 
12
16
  logger = get_logger(__name__)
13
17
 
@@ -73,11 +77,15 @@ class LangflowConnectorService:
73
77
 
74
78
  # Clean filename and ensure we don't add a double extension
75
79
  processed_filename = clean_connector_filename(document.filename, document.mimetype)
80
+ # Langflow's docling chokes on text/plain — rename .txt -> .md.
81
+ processed_filename, processed_mimetype = langflow_safe_filename_and_mimetype(
82
+ processed_filename, document.mimetype
83
+ )
76
84
 
77
85
  file_tuple = (
78
86
  processed_filename,
79
87
  content,
80
- document.mimetype or "application/octet-stream",
88
+ processed_mimetype,
81
89
  )
82
90
 
83
91
  # Step 0: Delete existing chunks for this file before re-ingesting
@@ -5,6 +5,7 @@ from utils.file_utils import (
5
5
  get_file_extension,
6
6
  clean_connector_filename,
7
7
  get_filename_aliases,
8
+ langflow_safe_filename_and_mimetype,
8
9
  )
9
10
 
10
11
  logger = get_logger(__name__)
@@ -868,14 +869,10 @@ class LangflowFileProcessor(TaskProcessor):
868
869
  if not content_type:
869
870
  content_type = 'application/octet-stream'
870
871
 
871
- # Rename .txt to .md for Langflow compatibility
872
- # Langflow has issues processing text/plain files
873
- langflow_filename = original_filename
874
- if original_filename.lower().endswith('.txt'):
875
- langflow_filename = original_filename[:-4] + '.md'
876
- content_type = 'text/markdown'
877
- logger.debug(f"Renamed {original_filename} to {langflow_filename} for Langflow")
878
-
872
+ # Langflow's docling chokes on text/plain — rename .txt -> .md.
873
+ langflow_filename, content_type = langflow_safe_filename_and_mimetype(
874
+ original_filename, content_type
875
+ )
879
876
  file_tuple = (langflow_filename, content, content_type)
880
877
 
881
878
  # Get JWT token using same logic as DocumentFileProcessor
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrag
3
- Version: 0.5.0.dev34
3
+ Version: 0.5.0.dev36
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
@@ -101,6 +101,25 @@ def clean_connector_filename(filename: str, mimetype: str) -> str:
101
101
  return clean_name
102
102
 
103
103
 
104
+ def langflow_safe_filename_and_mimetype(filename: str, mimetype: str | None) -> tuple[str, str]:
105
+ """Apply the .txt -> .md workaround for Langflow ingestion.
106
+
107
+ Langflow's docling component fails on text/plain (see commit f6b9fe0).
108
+ The workaround is to rename .txt files to .md with text/markdown before
109
+ handing the file to Langflow. Centralised here so every Langflow-upload
110
+ site applies it identically — local user uploads, connector-driven
111
+ ingestion, and the direct upload route.
112
+
113
+ Returns the (possibly rewritten) (filename, mimetype) pair. Pass-through
114
+ for all other extensions; falls back to application/octet-stream when
115
+ mimetype is missing.
116
+ """
117
+ safe_mimetype = mimetype or "application/octet-stream"
118
+ if filename and filename.lower().endswith(".txt"):
119
+ return filename[:-4] + ".md", "text/markdown"
120
+ return filename, safe_mimetype
121
+
122
+
104
123
  def get_filename_aliases(filename: str) -> list[str]:
105
124
  """Return equivalent filename variants used by ingestion/indexing.
106
125
 
File without changes
File without changes
File without changes
File without changes
File without changes