besser-agentic-framework 4.4.1__tar.gz → 4.4.2__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 (213) hide show
  1. {besser_agentic_framework-4.4.1/besser_agentic_framework.egg-info → besser_agentic_framework-4.4.2}/PKG-INFO +3 -1
  2. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/session.py +40 -1
  3. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/rag/rag.py +137 -5
  4. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat.py +1 -1
  5. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/rag_agent.py +27 -14
  6. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2/besser_agentic_framework.egg-info}/PKG-INFO +3 -1
  7. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/requires.txt +2 -0
  8. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-extras.txt +1 -0
  9. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/setup.cfg +1 -1
  10. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/LICENSE +0 -0
  11. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/MANIFEST.in +0 -0
  12. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/README.md +0 -0
  13. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/__init__.py +0 -0
  14. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/__init__.py +0 -0
  15. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/agent.py +0 -0
  16. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/__init__.py +0 -0
  17. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/entity.py +0 -0
  18. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/entity_entry.py +0 -0
  19. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/file.py +0 -0
  20. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/__init__.py +0 -0
  21. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_deserializer.py +0 -0
  22. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_schema.py +0 -0
  23. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_serializer.py +0 -0
  24. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/__init__.py +0 -0
  25. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/intent.py +0 -0
  26. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/intent_parameter.py +0 -0
  27. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/message.py +0 -0
  28. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/__init__.py +0 -0
  29. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/audio_language_detection_processor.py +0 -0
  30. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/language_detection_processor.py +0 -0
  31. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/processor.py +0 -0
  32. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/user_adaptation_processor.py +0 -0
  33. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/property.py +0 -0
  34. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/state.py +0 -0
  35. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/__init__.py +0 -0
  36. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/condition.py +0 -0
  37. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/event.py +0 -0
  38. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/transition.py +0 -0
  39. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/transition_builder.py +0 -0
  40. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/__init__.py +0 -0
  41. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/db_handler.py +0 -0
  42. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_db.py +0 -0
  43. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/__init__.py +0 -0
  44. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/db_connection.py +0 -0
  45. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/flow_graph.py +0 -0
  46. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/home.py +0 -0
  47. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/intent_details.py +0 -0
  48. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/monitoring_ui.py +0 -0
  49. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/sidebar.py +0 -0
  50. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/table_overview.py +0 -0
  51. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/utils.py +0 -0
  52. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/__init__.py +0 -0
  53. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/exceptions.py +0 -0
  54. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/logger.py +0 -0
  55. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/__init__.py +0 -0
  56. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/coroutine/__init__.py +0 -0
  57. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/coroutine/async_helpers.py +0 -0
  58. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/entity/__init__.py +0 -0
  59. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/entity/base_entities.py +0 -0
  60. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/intent/__init__.py +0 -0
  61. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/intent/intent_library.py +0 -0
  62. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/__init__.py +0 -0
  63. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/reasoning_state_library.py +0 -0
  64. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/state_library.py +0 -0
  65. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/__init__.py +0 -0
  66. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/task_tools.py +0 -0
  67. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/workspace_tools.py +0 -0
  68. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/__init__.py +0 -0
  69. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/condition_functions.py +0 -0
  70. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/conditions.py +0 -0
  71. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/__init__.py +0 -0
  72. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/base_events.py +0 -0
  73. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/github_webhooks_events.py +0 -0
  74. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/gitlab_webhooks_events.py +0 -0
  75. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/__init__.py +0 -0
  76. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/__init__.py +0 -0
  77. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier.py +0 -0
  78. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_configuration.py +0 -0
  79. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_prediction.py +0 -0
  80. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/llm_intent_classifier.py +0 -0
  81. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_pytorch.py +0 -0
  82. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_tensorflow.py +0 -0
  83. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/__init__.py +0 -0
  84. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm.py +0 -0
  85. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface.py +0 -0
  86. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface_api.py +0 -0
  87. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_openai_api.py +0 -0
  88. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_replicate_api.py +0 -0
  89. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/__init__.py +0 -0
  90. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/__init__.py +0 -0
  91. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/any.py +0 -0
  92. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/datetime.py +0 -0
  93. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/number.py +0 -0
  94. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/matched_parameter.py +0 -0
  95. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner.py +0 -0
  96. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner_prediction.py +0 -0
  97. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/simple_ner.py +0 -0
  98. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/nlp_engine.py +0 -0
  99. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/__init__.py +0 -0
  100. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/pipelines.py +0 -0
  101. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/text_preprocessing.py +0 -0
  102. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/rag/__init__.py +0 -0
  103. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/__init__.py +0 -0
  104. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/api_speech2text.py +0 -0
  105. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/hf_speech2text.py +0 -0
  106. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/luxasr_speech2text.py +0 -0
  107. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/openai_speech2text.py +0 -0
  108. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/speech2text.py +0 -0
  109. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/__init__.py +0 -0
  110. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/hf_text2speech.py +0 -0
  111. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/openai_text2speech.py +0 -0
  112. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/piper_text2speech.py +0 -0
  113. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/text2speech.py +0 -0
  114. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/utils.py +0 -0
  115. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/__init__.py +0 -0
  116. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/__init__.py +0 -0
  117. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/a2a_platform.py +0 -0
  118. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_card.py +0 -0
  119. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_registry.py +0 -0
  120. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/client.py +0 -0
  121. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/error_handler.py +0 -0
  122. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/message_router.py +0 -0
  123. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/server.py +0 -0
  124. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/task_protocol.py +0 -0
  125. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/__init__.py +0 -0
  126. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_actions.py +0 -0
  127. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_objects.py +0 -0
  128. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_platform.py +0 -0
  129. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/__init__.py +0 -0
  130. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_actions.py +0 -0
  131. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_objects.py +0 -0
  132. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_platform.py +0 -0
  133. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/payload.py +0 -0
  134. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/platform.py +0 -0
  135. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/__init__.py +0 -0
  136. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/telegram_platform.py +0 -0
  137. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/__init__.py +0 -0
  138. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/__init__.py +0 -0
  139. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/audio_queue.py +0 -0
  140. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat_interface_style.py +0 -0
  141. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/initialization.py +0 -0
  142. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/login.py +0 -0
  143. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/message_input.py +0 -0
  144. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/profile_selector.py +0 -0
  145. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/reasoning.py +0 -0
  146. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/session_management.py +0 -0
  147. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/sidebar.py +0 -0
  148. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/streamlit_ui.py +0 -0
  149. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/user_db.py +0 -0
  150. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/vars.py +0 -0
  151. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/websocket_callbacks.py +0 -0
  152. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/websocket_platform.py +0 -0
  153. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/__init__.py +0 -0
  154. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/skill.py +0 -0
  155. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/tool.py +0 -0
  156. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/workspace.py +0 -0
  157. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/__init__.py +0 -0
  158. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/__init__.py +0 -0
  159. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/conftest.py +0 -0
  160. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_agent.py +0 -0
  161. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_intent_entity.py +0 -0
  162. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_message.py +0 -0
  163. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_processor.py +0 -0
  164. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_property.py +0 -0
  165. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_session.py +0 -0
  166. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_state.py +0 -0
  167. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_transition.py +0 -0
  168. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_library_events.py +0 -0
  169. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_configurations.py +0 -0
  170. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_engine.py +0 -0
  171. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_preprocessing.py +0 -0
  172. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_platforms.py +0 -0
  173. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_workflows.py +0 -0
  174. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/__init__.py +0 -0
  175. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/conftest.py +0 -0
  176. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_core.py +0 -0
  177. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_docs.py +0 -0
  178. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_extras.py +0 -0
  179. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_framework.py +0 -0
  180. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_llms.py +0 -0
  181. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_tensorflow.py +0 -0
  182. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_torch.py +0 -0
  183. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/__init__.py +0 -0
  184. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/a2a_multiagent.py +0 -0
  185. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/api_speech2text_agent.py +0 -0
  186. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/github_agent.py +0 -0
  187. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/gitlab_agent.py +0 -0
  188. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/greetings_agent.py +0 -0
  189. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/llm_agent.py +0 -0
  190. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/__init__.py +0 -0
  191. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/coder_agent.py +0 -0
  192. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/main_agent.py +0 -0
  193. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/reviewer_agent.py +0 -0
  194. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/reasoning_agent.py +0 -0
  195. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2speech_agent.py +0 -0
  196. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2text_agent.py +0 -0
  197. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/stargazer_agent.py +0 -0
  198. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/telegram_agent.py +0 -0
  199. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/text2speech_agent.py +0 -0
  200. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/weather_agent.py +0 -0
  201. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/web_crawl_agent.py +0 -0
  202. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/utils/__init__.py +0 -0
  203. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/utils/web_crawl.py +0 -0
  204. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/SOURCES.txt +0 -0
  205. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/dependency_links.txt +0 -0
  206. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/top_level.txt +0 -0
  207. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/pyproject.toml +0 -0
  208. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-core.txt +0 -0
  209. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-docs.txt +0 -0
  210. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-llms.txt +0 -0
  211. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-tensorflow.txt +0 -0
  212. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-torch.txt +0 -0
  213. {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: besser-agentic-framework
3
- Version: 4.4.1
3
+ Version: 4.4.2
4
4
  Summary: BESSER Agentic Framework (BAF)
5
5
  Author: Luxembourg Institute of Science and Technology
6
6
  License: MIT
@@ -51,6 +51,7 @@ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra ==
51
51
  Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "extras"
52
52
  Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "extras"
53
53
  Requires-Dist: pypdf==4.3.1; extra == "extras"
54
+ Requires-Dist: python-docx==1.2.0; extra == "extras"
54
55
  Requires-Dist: tiktoken==0.9.0; extra == "extras"
55
56
  Provides-Extra: llms
56
57
  Requires-Dist: openai==1.93.0; extra == "llms"
@@ -83,6 +84,7 @@ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra ==
83
84
  Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "all"
84
85
  Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "all"
85
86
  Requires-Dist: pypdf==4.3.1; extra == "all"
87
+ Requires-Dist: python-docx==1.2.0; extra == "all"
86
88
  Requires-Dist: tiktoken==0.9.0; extra == "all"
87
89
  Requires-Dist: openai==1.93.0; extra == "all"
88
90
  Requires-Dist: replicate==0.23.1; extra == "all"
@@ -18,7 +18,7 @@ from baf.library.transition.events.base_events import ReceiveMessageEvent, Recei
18
18
  from baf.core.message import Message, get_message_type
19
19
  from baf.exceptions.logger import logger
20
20
  from baf.db import DB_MONITORING
21
- from baf.nlp.rag.rag import RAGMessage
21
+ from baf.nlp.rag.rag import RAGMessage, RAG
22
22
  from baf.platforms.payload import PayloadEncoder, Payload, PayloadAction
23
23
 
24
24
  if TYPE_CHECKING:
@@ -27,6 +27,8 @@ if TYPE_CHECKING:
27
27
  from baf.core.state import State
28
28
  from baf.platforms.platform import Platform
29
29
 
30
+ _SESSION_RAG_KEY = '__session_rag__'
31
+
30
32
 
31
33
  class Session:
32
34
  """A user session in an agent execution.
@@ -400,3 +402,40 @@ class Session:
400
402
  if self._agent.nlp_engine._rag is None:
401
403
  raise ValueError('Attempting to run RAG in an agent with no RAG engine.')
402
404
  return self._agent.nlp_engine._rag.run(message, self, llm_prompt, llm_name, k, num_previous_messages)
405
+
406
+ @property
407
+ def session_rag(self) -> RAG:
408
+ """RAG: The session-scoped RAG for this session, or ``None`` if not configured."""
409
+ return self.__dict__.get(_SESSION_RAG_KEY)
410
+
411
+ @session_rag.setter
412
+ def session_rag(self, rag: RAG) -> None:
413
+ """Set the session-scoped RAG for this session.
414
+
415
+ Args:
416
+ rag (RAG): a :class:`~baf.nlp.rag.rag.RAG` instance created with ``session_scoped=True``
417
+ """
418
+ # Stored as a plain instance attribute, not in _dictionary, so it is
419
+ # never picked up by get_dictionary() / JSON serialization to monitoring DB.
420
+ # RAG holds live in-memory objects (Chroma client, embeddings) that cannot
421
+ # be meaningfully serialized or restored from JSON.
422
+ self.__dict__[_SESSION_RAG_KEY] = rag
423
+
424
+ def run_session_rag(self, message: str, llm_prompt: str = None, llm_name: str = None, k: int = None) -> RAGMessage:
425
+ """Run RAG over this session's isolated corpus.
426
+
427
+ Args:
428
+ message (str): the input query
429
+ llm_prompt (str): override the LLM prompt for this call
430
+ llm_name (str): override the LLM name for this call
431
+ k (int): override the number of chunks to retrieve for this call
432
+
433
+ Returns:
434
+ RAGMessage: the answer generated by the session-scoped RAG engine
435
+
436
+ Raises:
437
+ RuntimeError: if no session-scoped RAG has been assigned to this session
438
+ """
439
+ if self.session_rag is None:
440
+ raise RuntimeError('No session-scoped RAG configured. Assign one via session.session_rag = RAG(..., session_scoped=True).')
441
+ return self.session_rag.run(message, self, llm_prompt, llm_name, k)
@@ -1,14 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from baf.exceptions.logger import logger
4
+ import base64
4
5
  import os
5
- from typing import TYPE_CHECKING
6
+ import tempfile
7
+ from typing import TYPE_CHECKING, Callable
6
8
 
7
9
  from baf.core.message import Message, MessageType
8
10
  from baf.nlp.llm.llm import LLM
9
11
 
10
12
  if TYPE_CHECKING:
11
13
  from baf.core.agent import Agent
14
+ from baf.core.file import File
12
15
  from baf.core.session import Session
13
16
  from baf.nlp.nlp_engine import NLPEngine
14
17
 
@@ -70,7 +73,9 @@ class RAG:
70
73
 
71
74
  Args:
72
75
  agent (Agent): the agent the RAG engine belongs to
73
- vector_store (langchain_core.vectorstores.base.VectorStore): the vector store of the RAG engine
76
+ vector_store (langchain_core.vectorstores.base.VectorStore | Callable[[], VectorStore]): the vector store of the RAG engine, , or
77
+ a zero-arg factory that produces one. A factory is recommended when ``session_scoped=True`` so that each
78
+ session's RAG receives its own isolated store
74
79
  splitter (langchain_text_splitters.base.TextSplitter): the text splitter of the RAG engine
75
80
  llm_name (str): the name of the LLM of the RAG engine. It must have been previously created and assigned to the
76
81
  agent
@@ -79,6 +84,7 @@ class RAG:
79
84
  k (int): number of chunks to retrieve from the vector store
80
85
  num_previous_messages (int): number of previous messages of the conversation to add to the LLM prompt context.
81
86
  Necessary a connection to :class:`~baf.db.monitoring_db.MonitoringDB`.
87
+ session_scoped (bool): True if each session should have its own RAG engine and vector store.
82
88
 
83
89
  Attributes:
84
90
  _nlp_engine (NLPEngine): the NLPEngine that handles the NLP processes of the agent the RAG engine belongs to
@@ -94,18 +100,22 @@ class RAG:
94
100
  """
95
101
 
96
102
  DEFAULT_LLM_PROMPT = "You are an assistant for question-answering tasks. Based on the previous messages in the conversation (if provided), and additional context retrieved from a database (if provided), answer the user question. If you don't know the answer, just say that you don't know. Note that if the question refers to a previous message, you may have to ignore the context since it is retrieved from the database based only on the question (the retrieval does not take into account the previous messages). Use three sentences maximum and keep the answer concise"
103
+ SUPPORTED_FORMATS = ('pdf', 'docx', 'txt', 'md')
97
104
 
98
105
  def __init__(
99
106
  self,
100
107
  agent: 'Agent',
101
- vector_store: VectorStore,
108
+ vector_store: VectorStore | Callable[[], VectorStore],
102
109
  splitter: TextSplitter,
103
110
  llm_name: str,
104
111
  llm_prompt: str = None,
105
112
  k: int = 4,
106
- num_previous_messages: int = 0
113
+ num_previous_messages: int = 0,
114
+ session_scoped: bool = False
107
115
  ):
108
116
  self._nlp_engine: 'NLPEngine' = agent.nlp_engine
117
+ if callable(vector_store) and not hasattr(vector_store, 'add_documents'):
118
+ vector_store = vector_store()
109
119
  self.vector_store: VectorStore = vector_store
110
120
  self.splitter: TextSplitter = splitter
111
121
  self.llm_name: str = llm_name
@@ -114,7 +124,43 @@ class RAG:
114
124
  self.llm_prompt = llm_prompt
115
125
  self.k: int = k
116
126
  self.num_previous_messages: int = num_previous_messages
117
- self._nlp_engine._rag = self
127
+ if not session_scoped:
128
+ self._nlp_engine._rag = self
129
+
130
+ def load_documents_from_path(path: str, fmt: str) -> list['Document']:
131
+ """Load raw (un-chunked) LangChain Documents from a file path.
132
+
133
+ Dispatches to the appropriate loader based on ``fmt``. Used internally by
134
+ :meth:`RAG.load_documents` and :meth:`RAG.add_file`.
135
+
136
+ Args:
137
+ path (str): path to the file on disk
138
+ fmt (str): lowercase file format
139
+
140
+ Returns:
141
+ list[Document]: raw LangChain Documents (not yet chunked)
142
+
143
+ Raises:
144
+ ValueError: if ``fmt`` is not in `RAG.SUPPORTED_FORMATS`
145
+ ImportError: if ``fmt`` is ``'docx'`` and python-docx is not installed
146
+ """
147
+
148
+ if fmt not in RAG.SUPPORTED_FORMATS:
149
+ raise ValueError(f"Unsupported format '{fmt}'. Supported formats: {RAG.SUPPORTED_FORMATS}")
150
+ if fmt == 'pdf':
151
+ return PyPDFLoader(path).load()
152
+ elif fmt == 'docx':
153
+ try:
154
+ from docx import Document as DocxDocument
155
+ except ImportError:
156
+ raise ImportError('python-docx is required for DOCX support. Install with: pip install python-docx')
157
+ docx_doc = DocxDocument(path)
158
+ text = '\n'.join(p.text for p in docx_doc.paragraphs if p.text.strip())
159
+ return [Document(page_content=text, metadata={'source': os.path.basename(path)})]
160
+ elif fmt in ('txt', 'md'):
161
+ with open(path, 'r', encoding='utf-8') as f:
162
+ text = f.read()
163
+ return [Document(page_content=text, metadata={'source': os.path.basename(path)})]
118
164
 
119
165
  def load_pdfs(self, path: str) -> int:
120
166
  """Load PDF files from a given location into the RAG's vector store.
@@ -136,6 +182,92 @@ class RAG:
136
182
  self.vector_store.add_documents(chunked_documents)
137
183
  logger.info(f'[RAG] Added {n_chunks} chunks to RAG\'s vector store. Total: {len(self.vector_store.get()["documents"])}')
138
184
  return n_chunks
185
+
186
+ def is_empty(self) -> bool:
187
+ """Return ``True`` if the vector store contains no documents.
188
+
189
+ Returns:
190
+ bool: ``True`` if the corpus is empty
191
+ """
192
+ return len(self.vector_store.get()['ids']) == 0
193
+
194
+ def clear(self) -> None:
195
+ """Remove all documents from the vector store."""
196
+ ids = self.vector_store.get()['ids']
197
+ if ids:
198
+ self.vector_store.delete(ids)
199
+ logger.info('[RAG] Vector store cleared')
200
+
201
+ def load_documents(self, path: str, formats: list[str] = None) -> int:
202
+ """Load documents from a directory into the RAG's vector store.
203
+
204
+ Supports multiple file formats. Use :meth:`load_pdfs` if only PDF loading is needed.
205
+
206
+ Args:
207
+ path (str): path to the directory containing the files
208
+ formats (list[str]): restrict loading to a subset of formats, e.g. ``['pdf', 'docx']``.
209
+ If ``None``, all `RAG.SUPPORTED_FORMATS` are loaded.
210
+
211
+ Returns:
212
+ int: the number of chunks added to the vector store
213
+ """
214
+ allowed = set(formats) if formats else set(RAG.SUPPORTED_FORMATS)
215
+ documents = []
216
+ for fname in os.listdir(path):
217
+ fmt = os.path.splitext(fname)[1].lower().lstrip('.')
218
+ if fmt in allowed:
219
+ documents.extend(RAG.load_documents_from_path(os.path.join(path, fname), fmt))
220
+ chunked_documents = self.splitter.split_documents(documents)
221
+ n_chunks = len(chunked_documents)
222
+ self.vector_store.add_documents(chunked_documents)
223
+ logger.info(f'[RAG] Added {n_chunks} chunks to RAG\'s vector store. Total: {len(self.vector_store.get()["documents"])}')
224
+ return n_chunks
225
+
226
+ def add_file(self, file: 'File') -> int:
227
+ """Extract text from a BAF :class:`~baf.core.file.File` object and add it to the RAG's vector store at runtime.
228
+
229
+ Args:
230
+ file (File): the BAF File object to load
231
+
232
+ Returns:
233
+ int: the number of chunks added to the vector store
234
+
235
+ Raises:
236
+ ValueError: if the file type is not in RAG.SUPPORTED_FORMATS`
237
+ """
238
+ fmt = (file.type or '').lower().lstrip('.')
239
+ if not fmt or '/' in fmt: # MIME type (e.g. "application/pdf") — derive from filename
240
+ fmt = os.path.splitext(file.name or '')[1].lower().lstrip('.')
241
+ file_bytes = base64.b64decode(file.base64)
242
+ with tempfile.NamedTemporaryFile(suffix=f'.{fmt}', delete=False) as tmp:
243
+ tmp.write(file_bytes)
244
+ tmp_path = tmp.name
245
+ try:
246
+ documents = RAG.load_documents_from_path(tmp_path, fmt)
247
+ finally:
248
+ os.unlink(tmp_path)
249
+ chunked_documents = self.splitter.split_documents(documents)
250
+ n_chunks = len(chunked_documents)
251
+ self.vector_store.add_documents(chunked_documents)
252
+ logger.info(f'[RAG] Added {n_chunks} chunks from \'{file.name}\' to RAG\'s vector store.')
253
+ return n_chunks
254
+
255
+ def add_text(self, text: str, metadata: dict = None) -> int:
256
+ """Chunk a raw text string and add it to the RAG's vector store at runtime.
257
+
258
+ Args:
259
+ text (str): the raw text to add
260
+ metadata (dict): optional metadata to attach to each chunk
261
+
262
+ Returns:
263
+ int: the number of chunks added to the vector store
264
+ """
265
+ doc = Document(page_content=text, metadata=metadata or {})
266
+ chunked_documents = self.splitter.split_documents([doc])
267
+ n_chunks = len(chunked_documents)
268
+ self.vector_store.add_documents(chunked_documents)
269
+ logger.info(f'[RAG] Added {n_chunks} text chunks to RAG\'s vector store.')
270
+ return n_chunks
139
271
 
140
272
  def run_retrieval(self, question: str, k: int = None) -> list[Document]:
141
273
  """Run retrieval. Given a query, return the `k` most relevant documents (i.e., chunks) from the RAG's vector store.
@@ -134,7 +134,7 @@ def write_message(message: Message, key_count: int, stream: bool = False):
134
134
  for i, doc in enumerate(message.content['docs']):
135
135
  st.write(f'**Document {i + 1}/{len(message.content["docs"])}**')
136
136
  st.write(f'- **Source:** {doc["metadata"]["source"]}')
137
- st.write(f'- **Page:** {doc["metadata"]["page"]}')
137
+ st.write(f'- **Page:** {doc["metadata"].get("page", "N/A")}')
138
138
  st.write(f'- **Content:** {doc["content"]}')
139
139
 
140
140
  elif message.type == MessageType.REASONING_TRACE:
@@ -3,7 +3,9 @@
3
3
  # sys.path.append("/Path/to/directory/agentic-framework") # Replace with your directory path
4
4
 
5
5
  import logging
6
+ import uuid
6
7
 
8
+ from chromadb import EphemeralClient
7
9
  from langchain_community.embeddings import OpenAIEmbeddings
8
10
  from langchain_community.vectorstores import Chroma
9
11
  from langchain_text_splitters import RecursiveCharacterTextSplitter
@@ -12,10 +14,12 @@ from baf import nlp
12
14
  from baf.core.agent import Agent
13
15
  from baf.core.session import Session
14
16
  from baf.exceptions.logger import logger
17
+ from baf.library.transition.events.base_events import ReceiveFileEvent
15
18
  from baf.nlp.llm.llm_huggingface_api import LLMHuggingFaceAPI
16
19
  from baf.nlp.llm.llm_openai_api import LLMOpenAI
17
20
  from baf.nlp.llm.llm_replicate_api import LLMReplicate
18
21
  from baf.nlp.rag.rag import RAGMessage, RAG
22
+ from baf.library.transition.events.base_events import ReceiveTextEvent, ReceiveMessageEvent, ReceiveFileEvent
19
23
 
20
24
  # Configure the logging module (optional)
21
25
  logger.setLevel(logging.INFO)
@@ -27,11 +31,10 @@ agent.load_properties('config.yaml')
27
31
  # Define the platform your agent will use
28
32
  websocket_platform = agent.use_websocket_platform(use_ui=True)
29
33
 
30
- # Create Vector Store (RAG's DB)
31
- vector_store: Chroma = Chroma(
32
- embedding_function=OpenAIEmbeddings(openai_api_key=agent.get_property(nlp.OPENAI_API_KEY)),
33
- persist_directory='vector_store'
34
- )
34
+ #To keep RAG as session scoped or not
35
+ SESSION_SCOPED=True
36
+
37
+
35
38
  # Create text splitter (RAG creates a vector for each chunk)
36
39
  splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
37
40
  # Create the LLM (for the answer generation)
@@ -57,33 +60,43 @@ rag = RAG(
57
60
  k=4,
58
61
  num_previous_messages=0
59
62
  )
60
- # Uncomment to fill the DB
61
- # rag.load_pdfs('./pdfs')
63
+ # Uncomment the relevant line to directly provide text to RAG instead of uploading at runtime
64
+ # rag.load_documents('C:/Users/chidambaram/Downloads/example', formats=['docx']) # read all the files of the given format in the directory
65
+ # rag.add_text('raw text to index and base your RAG on.') # add a text string directly
66
+
67
+ # If not uploading at runtime, comment the following function, L84, L87 and L88, and uncomment L85.
68
+ def upload_file_body(session: Session):
69
+ rag.add_file(session.event.file)
70
+
62
71
 
63
72
  # STATES
64
73
 
65
74
  initial_state = agent.new_state('initial_state', initial=True)
66
- rag_state = agent.new_state('rag_state')
75
+ upload_file_state = agent.new_state('upload_file_state')
76
+ ask_question_state = agent.new_state('ask_question_state')
67
77
 
68
78
 
69
79
  # STATES BODIES' DEFINITION + TRANSITIONS
70
80
 
71
81
  def initial_body(session: Session):
72
- session.reply('Hi!')
82
+ session.reply('Hi!, upload a file to use as RAG context. If already done, ask your question.')
73
83
 
74
84
 
75
85
  initial_state.set_body(initial_body)
76
- # TODO : fix no_intent_matched
77
- initial_state.when_no_intent_matched().go_to(rag_state)
86
+ initial_state.when_event(ReceiveFileEvent()).go_to(upload_file_state)
87
+ # initial_state.when_no_intent_matched().go_to(ask_question_state)
88
+
89
+ upload_file_state.set_body(upload_file_body)
90
+ upload_file_state.when_no_intent_matched().go_to(ask_question_state)
78
91
 
79
92
 
80
- def rag_body(session: Session):
93
+ def ask_question_body(session: Session):
81
94
  rag_message: RAGMessage = session.run_rag(session.event.message)
82
95
  websocket_platform.reply_rag(session, rag_message)
83
96
 
84
97
 
85
- rag_state.set_body(rag_body)
86
- rag_state.go_to(initial_state)
98
+ ask_question_state.set_body(ask_question_body)
99
+ ask_question_state.go_to(initial_state)
87
100
 
88
101
 
89
102
  # RUN APPLICATION
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: besser-agentic-framework
3
- Version: 4.4.1
3
+ Version: 4.4.2
4
4
  Summary: BESSER Agentic Framework (BAF)
5
5
  Author: Luxembourg Institute of Science and Technology
6
6
  License: MIT
@@ -51,6 +51,7 @@ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra ==
51
51
  Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "extras"
52
52
  Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "extras"
53
53
  Requires-Dist: pypdf==4.3.1; extra == "extras"
54
+ Requires-Dist: python-docx==1.2.0; extra == "extras"
54
55
  Requires-Dist: tiktoken==0.9.0; extra == "extras"
55
56
  Provides-Extra: llms
56
57
  Requires-Dist: openai==1.93.0; extra == "llms"
@@ -83,6 +84,7 @@ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra ==
83
84
  Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "all"
84
85
  Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "all"
85
86
  Requires-Dist: pypdf==4.3.1; extra == "all"
87
+ Requires-Dist: python-docx==1.2.0; extra == "all"
86
88
  Requires-Dist: tiktoken==0.9.0; extra == "all"
87
89
  Requires-Dist: openai==1.93.0; extra == "all"
88
90
  Requires-Dist: replicate==0.23.1; extra == "all"
@@ -37,6 +37,7 @@ soundfile==0.13.1
37
37
  opencv-python==4.10.0.84
38
38
  plotly==5.18.0
39
39
  pypdf==4.3.1
40
+ python-docx==1.2.0
40
41
  tiktoken==0.9.0
41
42
  openai==1.93.0
42
43
  replicate==0.23.1
@@ -71,6 +72,7 @@ soundfile==0.13.1
71
72
  opencv-python==4.10.0.84
72
73
  plotly==5.18.0
73
74
  pypdf==4.3.1
75
+ python-docx==1.2.0
74
76
  tiktoken==0.9.0
75
77
 
76
78
  [extras:python_version < "3.13"]
@@ -24,4 +24,5 @@ langchain-community==0.2.7; python_version < "3.13"
24
24
  langchain==0.3.10; python_version >= "3.13"
25
25
  langchain-community==0.3.10; python_version >= "3.13"
26
26
  pypdf==4.3.1
27
+ python-docx==1.2.0
27
28
  tiktoken==0.9.0
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = besser-agentic-framework
3
- version = 4.4.1
3
+ version = 4.4.2
4
4
  author = Luxembourg Institute of Science and Technology
5
5
  description = BESSER Agentic Framework (BAF)
6
6
  long_description = file: README.md