besser-agentic-framework 4.3.2__tar.gz → 4.3.3__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 (202) hide show
  1. {besser_agentic_framework-4.3.2/besser_agentic_framework.egg-info → besser_agentic_framework-4.3.3}/PKG-INFO +23 -15
  2. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/agent.py +10 -5
  3. besser_agentic_framework-4.3.3/baf/core/message.py +114 -0
  4. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/session.py +19 -0
  5. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/state.py +5 -1
  6. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/transition_builder.py +1 -1
  7. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_db.py +9 -5
  8. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/base_events.py +8 -5
  9. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/payload.py +15 -1
  10. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/websocket_platform.py +79 -41
  11. besser_agentic_framework-4.3.3/baf/test/components/conftest.py +56 -0
  12. besser_agentic_framework-4.3.3/baf/test/components/test_core_agent.py +104 -0
  13. besser_agentic_framework-4.3.3/baf/test/components/test_core_intent_entity.py +106 -0
  14. besser_agentic_framework-4.3.3/baf/test/components/test_core_message.py +82 -0
  15. besser_agentic_framework-4.3.3/baf/test/components/test_core_processor.py +47 -0
  16. besser_agentic_framework-4.3.3/baf/test/components/test_core_property.py +71 -0
  17. besser_agentic_framework-4.3.3/baf/test/components/test_core_session.py +67 -0
  18. besser_agentic_framework-4.3.3/baf/test/components/test_core_state.py +123 -0
  19. besser_agentic_framework-4.3.3/baf/test/components/test_core_transition.py +81 -0
  20. besser_agentic_framework-4.3.3/baf/test/components/test_library_events.py +78 -0
  21. besser_agentic_framework-4.3.3/baf/test/components/test_nlp_configurations.py +80 -0
  22. besser_agentic_framework-4.3.3/baf/test/components/test_nlp_engine.py +65 -0
  23. besser_agentic_framework-4.3.3/baf/test/components/test_nlp_preprocessing.py +68 -0
  24. besser_agentic_framework-4.3.3/baf/test/components/test_platforms.py +63 -0
  25. besser_agentic_framework-4.3.3/baf/test/components/test_workflows.py +132 -0
  26. besser_agentic_framework-4.3.3/baf/test/dependencies/conftest.py +6 -0
  27. besser_agentic_framework-4.3.3/baf/test/dependencies/test_core.py +136 -0
  28. besser_agentic_framework-4.3.3/baf/test/dependencies/test_docs.py +26 -0
  29. besser_agentic_framework-4.3.3/baf/test/dependencies/test_extras.py +92 -0
  30. besser_agentic_framework-4.3.3/baf/test/dependencies/test_framework.py +184 -0
  31. besser_agentic_framework-4.3.3/baf/test/dependencies/test_llms.py +21 -0
  32. besser_agentic_framework-4.3.3/baf/test/dependencies/test_tensorflow.py +21 -0
  33. besser_agentic_framework-4.3.3/baf/test/dependencies/test_torch.py +27 -0
  34. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/greetings_agent.py +1 -1
  35. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/llm_agent.py +1 -1
  36. besser_agentic_framework-4.3.3/baf/test/examples/multiagent/__init__.py +0 -0
  37. besser_agentic_framework-4.3.3/baf/utils/__init__.py +0 -0
  38. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3/besser_agentic_framework.egg-info}/PKG-INFO +23 -15
  39. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/SOURCES.txt +25 -0
  40. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/requires.txt +33 -13
  41. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-core.txt +4 -2
  42. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-extras.txt +7 -4
  43. besser_agentic_framework-4.3.3/requirements/requirements-tensorflow.txt +2 -0
  44. besser_agentic_framework-4.3.3/requirements/requirements-torch.txt +3 -0
  45. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/setup.cfg +1 -1
  46. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/setup.py +10 -2
  47. besser_agentic_framework-4.3.2/baf/core/message.py +0 -53
  48. besser_agentic_framework-4.3.2/requirements/requirements-tensorflow.txt +0 -2
  49. besser_agentic_framework-4.3.2/requirements/requirements-torch.txt +0 -2
  50. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/LICENSE +0 -0
  51. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/MANIFEST.in +0 -0
  52. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/README.md +0 -0
  53. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/__init__.py +0 -0
  54. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/__init__.py +0 -0
  55. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/__init__.py +0 -0
  56. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/entity.py +0 -0
  57. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/entity_entry.py +0 -0
  58. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/file.py +0 -0
  59. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/__init__.py +0 -0
  60. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/intent.py +0 -0
  61. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/intent_parameter.py +0 -0
  62. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/__init__.py +0 -0
  63. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/audio_language_detection_processor.py +0 -0
  64. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/language_detection_processor.py +0 -0
  65. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/processor.py +0 -0
  66. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/user_adaptation_processor.py +0 -0
  67. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/property.py +0 -0
  68. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/__init__.py +0 -0
  69. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/condition.py +0 -0
  70. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/event.py +0 -0
  71. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/transition.py +0 -0
  72. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/__init__.py +0 -0
  73. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/db_handler.py +0 -0
  74. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/__init__.py +0 -0
  75. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/db_connection.py +0 -0
  76. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/flow_graph.py +0 -0
  77. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/home.py +0 -0
  78. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/intent_details.py +0 -0
  79. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/monitoring_ui.py +0 -0
  80. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/sidebar.py +0 -0
  81. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/table_overview.py +0 -0
  82. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/utils.py +0 -0
  83. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/__init__.py +0 -0
  84. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/exceptions.py +0 -0
  85. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/logger.py +0 -0
  86. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/__init__.py +0 -0
  87. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/coroutine/__init__.py +0 -0
  88. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/coroutine/async_helpers.py +0 -0
  89. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/entity/__init__.py +0 -0
  90. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/entity/base_entities.py +0 -0
  91. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/intent/__init__.py +0 -0
  92. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/intent/intent_library.py +0 -0
  93. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/state/__init__.py +0 -0
  94. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/state/state_library.py +0 -0
  95. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/__init__.py +0 -0
  96. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/condition_functions.py +0 -0
  97. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/conditions.py +0 -0
  98. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/__init__.py +0 -0
  99. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/github_webhooks_events.py +0 -0
  100. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/gitlab_webhooks_events.py +0 -0
  101. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/__init__.py +0 -0
  102. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/__init__.py +0 -0
  103. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier.py +0 -0
  104. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier_configuration.py +0 -0
  105. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier_prediction.py +0 -0
  106. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/llm_intent_classifier.py +0 -0
  107. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/simple_intent_classifier_pytorch.py +0 -0
  108. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/simple_intent_classifier_tensorflow.py +0 -0
  109. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/__init__.py +0 -0
  110. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm.py +0 -0
  111. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_huggingface.py +0 -0
  112. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_huggingface_api.py +0 -0
  113. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_openai_api.py +0 -0
  114. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_replicate_api.py +0 -0
  115. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/__init__.py +0 -0
  116. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/__init__.py +0 -0
  117. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/any.py +0 -0
  118. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/datetime.py +0 -0
  119. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/number.py +0 -0
  120. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/matched_parameter.py +0 -0
  121. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/ner.py +0 -0
  122. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/ner_prediction.py +0 -0
  123. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/simple_ner.py +0 -0
  124. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/nlp_engine.py +0 -0
  125. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/__init__.py +0 -0
  126. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/pipelines.py +0 -0
  127. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/text_preprocessing.py +0 -0
  128. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/rag/__init__.py +0 -0
  129. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/rag/rag.py +0 -0
  130. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/__init__.py +0 -0
  131. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/api_speech2text.py +0 -0
  132. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/hf_speech2text.py +0 -0
  133. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/luxasr_speech2text.py +0 -0
  134. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/openai_speech2text.py +0 -0
  135. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/speech2text.py +0 -0
  136. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/__init__.py +0 -0
  137. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/hf_text2speech.py +0 -0
  138. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/openai_text2speech.py +0 -0
  139. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/piper_text2speech.py +0 -0
  140. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/text2speech.py +0 -0
  141. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/utils.py +0 -0
  142. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/__init__.py +0 -0
  143. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/__init__.py +0 -0
  144. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/a2a_platform.py +0 -0
  145. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/agent_card.py +0 -0
  146. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/agent_registry.py +0 -0
  147. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/client.py +0 -0
  148. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/error_handler.py +0 -0
  149. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/message_router.py +0 -0
  150. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/server.py +0 -0
  151. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/task_protocol.py +0 -0
  152. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/__init__.py +0 -0
  153. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_actions.py +0 -0
  154. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_objects.py +0 -0
  155. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_platform.py +0 -0
  156. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/__init__.py +0 -0
  157. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_actions.py +0 -0
  158. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_objects.py +0 -0
  159. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_platform.py +0 -0
  160. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/platform.py +0 -0
  161. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/telegram/__init__.py +0 -0
  162. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/telegram/telegram_platform.py +0 -0
  163. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/__init__.py +0 -0
  164. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/__init__.py +0 -0
  165. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/audio_queue.py +0 -0
  166. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/chat.py +0 -0
  167. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/chat_interface_style.py +0 -0
  168. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/initialization.py +0 -0
  169. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/login.py +0 -0
  170. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/message_input.py +0 -0
  171. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/profile_selector.py +0 -0
  172. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/session_management.py +0 -0
  173. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/sidebar.py +0 -0
  174. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/streamlit_ui.py +0 -0
  175. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/user_db.py +0 -0
  176. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/vars.py +0 -0
  177. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/websocket_callbacks.py +0 -0
  178. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/__init__.py +0 -0
  179. {besser_agentic_framework-4.3.2/baf/test/examples → besser_agentic_framework-4.3.3/baf/test/components}/__init__.py +0 -0
  180. {besser_agentic_framework-4.3.2/baf/test/examples/multiagent → besser_agentic_framework-4.3.3/baf/test/dependencies}/__init__.py +0 -0
  181. {besser_agentic_framework-4.3.2/baf/utils → besser_agentic_framework-4.3.3/baf/test/examples}/__init__.py +0 -0
  182. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/a2a_multiagent.py +0 -0
  183. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/api_speech2text_agent.py +0 -0
  184. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/github_agent.py +0 -0
  185. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/gitlab_agent.py +0 -0
  186. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/coder_agent.py +0 -0
  187. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/main_agent.py +0 -0
  188. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/reviewer_agent.py +0 -0
  189. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/rag_agent.py +0 -0
  190. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/speech2speech_agent.py +0 -0
  191. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/speech2text_agent.py +0 -0
  192. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/stargazer_agent.py +0 -0
  193. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/telegram_agent.py +0 -0
  194. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/text2speech_agent.py +0 -0
  195. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/weather_agent.py +0 -0
  196. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/web_crawl_agent.py +0 -0
  197. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/utils/web_crawl.py +0 -0
  198. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/dependency_links.txt +0 -0
  199. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/top_level.txt +0 -0
  200. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/pyproject.toml +0 -0
  201. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-docs.txt +0 -0
  202. {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-llms.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: besser-agentic-framework
3
- Version: 4.3.2
3
+ Version: 4.3.3
4
4
  Summary: BESSER Agentic Framework (BAF)
5
5
  Author: Luxembourg Institute of Science and Technology
6
6
  License: MIT
@@ -18,7 +18,8 @@ Requires-Dist: dateparser==1.1.8
18
18
  Requires-Dist: langdetect==1.0.9
19
19
  Requires-Dist: markdownify==1.2.2
20
20
  Requires-Dist: nltk==3.9.1
21
- Requires-Dist: numpy==1.26.4
21
+ Requires-Dist: numpy==1.26.4; python_version < "3.13"
22
+ Requires-Dist: numpy<3,>=2.1; python_version >= "3.13"
22
23
  Requires-Dist: pandas==2.3.3
23
24
  Requires-Dist: python-telegram-bot==21.0
24
25
  Requires-Dist: psycopg2-binary>=2.9.10
@@ -27,7 +28,8 @@ Requires-Dist: pyvis==0.3.2
27
28
  Requires-Dist: PyYAML==6.0.2
28
29
  Requires-Dist: requests==2.31.0
29
30
  Requires-Dist: snowballstemmer==2.2.0
30
- Requires-Dist: sqlalchemy==2.0.29
31
+ Requires-Dist: sqlalchemy==2.0.29; python_version < "3.13"
32
+ Requires-Dist: sqlalchemy<2.1,>=2.0.31; python_version >= "3.13"
31
33
  Requires-Dist: streamlit==1.40.0
32
34
  Requires-Dist: streamlit-antd-components==0.3.2
33
35
  Requires-Dist: text2num==2.5.0
@@ -35,16 +37,19 @@ Requires-Dist: websocket-client==1.6.4
35
37
  Requires-Dist: websockets==11.0.3
36
38
  Requires-Dist: bcrypt==4.0.1
37
39
  Provides-Extra: extras
38
- Requires-Dist: spacy==3.7.2; extra == "extras"
40
+ Requires-Dist: spacy==3.8.7; extra == "extras"
39
41
  Requires-Dist: scikit-learn>=1.7.0; extra == "extras"
40
42
  Requires-Dist: librosa==0.10.1; extra == "extras"
41
43
  Requires-Dist: SpeechRecognition==3.10.0; extra == "extras"
42
44
  Requires-Dist: soundfile==0.13.1; extra == "extras"
43
45
  Requires-Dist: opencv-python==4.10.0.84; extra == "extras"
44
46
  Requires-Dist: plotly==5.18.0; extra == "extras"
45
- Requires-Dist: chromadb==0.5.4; extra == "extras"
46
- Requires-Dist: langchain==0.2.9; extra == "extras"
47
- Requires-Dist: langchain-community==0.2.7; extra == "extras"
47
+ Requires-Dist: chromadb==0.5.4; python_version < "3.13" and extra == "extras"
48
+ Requires-Dist: chromadb==1.0.0; python_version >= "3.13" and extra == "extras"
49
+ Requires-Dist: langchain==0.2.9; python_version < "3.13" and extra == "extras"
50
+ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra == "extras"
51
+ Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "extras"
52
+ Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "extras"
48
53
  Requires-Dist: pypdf==4.3.1; extra == "extras"
49
54
  Requires-Dist: tiktoken==0.9.0; extra == "extras"
50
55
  Provides-Extra: llms
@@ -53,9 +58,9 @@ Requires-Dist: replicate==0.23.1; extra == "llms"
53
58
  Requires-Dist: transformers==4.53.0; extra == "llms"
54
59
  Provides-Extra: tensorflow
55
60
  Requires-Dist: keras==3.12.0; extra == "tensorflow"
56
- Requires-Dist: tensorflow==2.20.0; extra == "tensorflow"
61
+ Requires-Dist: tensorflow-cpu==2.20.0; extra == "tensorflow"
57
62
  Provides-Extra: torch
58
- Requires-Dist: torch==2.5.1; extra == "torch"
63
+ Requires-Dist: torch==2.6.0+cpu; extra == "torch"
59
64
  Requires-Dist: scikit-learn>=1.7.0; extra == "torch"
60
65
  Provides-Extra: docs
61
66
  Requires-Dist: sphinx==7.2.3; extra == "docs"
@@ -64,24 +69,27 @@ Requires-Dist: sphinx-paramlinks==0.6.0; extra == "docs"
64
69
  Requires-Dist: furo==2023.8.19; extra == "docs"
65
70
  Requires-Dist: m2r2==0.3.3; extra == "docs"
66
71
  Provides-Extra: all
67
- Requires-Dist: spacy==3.7.2; extra == "all"
72
+ Requires-Dist: spacy==3.8.7; extra == "all"
68
73
  Requires-Dist: scikit-learn>=1.7.0; extra == "all"
69
74
  Requires-Dist: librosa==0.10.1; extra == "all"
70
75
  Requires-Dist: SpeechRecognition==3.10.0; extra == "all"
71
76
  Requires-Dist: soundfile==0.13.1; extra == "all"
72
77
  Requires-Dist: opencv-python==4.10.0.84; extra == "all"
73
78
  Requires-Dist: plotly==5.18.0; extra == "all"
74
- Requires-Dist: chromadb==0.5.4; extra == "all"
75
- Requires-Dist: langchain==0.2.9; extra == "all"
76
- Requires-Dist: langchain-community==0.2.7; extra == "all"
79
+ Requires-Dist: chromadb==0.5.4; python_version < "3.13" and extra == "all"
80
+ Requires-Dist: chromadb==1.0.0; python_version >= "3.13" and extra == "all"
81
+ Requires-Dist: langchain==0.2.9; python_version < "3.13" and extra == "all"
82
+ Requires-Dist: langchain-community==0.2.7; python_version < "3.13" and extra == "all"
83
+ Requires-Dist: langchain==0.3.10; python_version >= "3.13" and extra == "all"
84
+ Requires-Dist: langchain-community==0.3.10; python_version >= "3.13" and extra == "all"
77
85
  Requires-Dist: pypdf==4.3.1; extra == "all"
78
86
  Requires-Dist: tiktoken==0.9.0; extra == "all"
79
87
  Requires-Dist: openai==1.93.0; extra == "all"
80
88
  Requires-Dist: replicate==0.23.1; extra == "all"
81
89
  Requires-Dist: transformers==4.53.0; extra == "all"
82
90
  Requires-Dist: keras==3.12.0; extra == "all"
83
- Requires-Dist: tensorflow==2.20.0; extra == "all"
84
- Requires-Dist: torch==2.5.1; extra == "all"
91
+ Requires-Dist: tensorflow-cpu==2.20.0; extra == "all"
92
+ Requires-Dist: torch==2.6.0+cpu; extra == "all"
85
93
  Requires-Dist: scikit-learn>=1.7.0; extra == "all"
86
94
  Dynamic: license-file
87
95
  Dynamic: provides-extra
@@ -24,7 +24,7 @@ from baf.db.monitoring_db import MonitoringDB
24
24
  from baf.exceptions.exceptions import AgentNotTrainedError, DuplicatedEntityError, DuplicatedInitialStateError, \
25
25
  DuplicatedIntentError, DuplicatedStateError, InitialStateNotFound
26
26
  from baf.exceptions.logger import logger
27
- from baf.library.transition.events.base_events import ReceiveMessageEvent, ReceiveJSONEvent
27
+ from baf.library.transition.events.base_events import ReceiveMessageEvent, ReceiveJSONEvent, ReceiveFileEvent
28
28
  from baf.nlp.intent_classifier.intent_classifier_configuration import IntentClassifierConfiguration, \
29
29
  SimpleIntentClassifierConfiguration
30
30
  from baf.nlp.intent_classifier.intent_classifier_prediction import IntentClassifierPrediction
@@ -534,6 +534,9 @@ class Agent:
534
534
  else:
535
535
  t = MessageType.STR
536
536
  session.save_message(Message(t=t, content=event.message, is_user=True, timestamp=datetime.now()))
537
+ if isinstance(event, ReceiveFileEvent):
538
+ session.save_message(Message(t=MessageType.FILE, content=event.file.get_json_string(), is_user=True, timestamp=datetime.now()))
539
+
537
540
  logger.info(f'Received event: {event.log()}')
538
541
 
539
542
  def process(self, session: Session, message: Any, is_user_message: bool) -> Any:
@@ -602,12 +605,14 @@ class Agent:
602
605
  else:
603
606
  return None
604
607
 
605
- def _new_session(self, session_id: str, platform: Platform) -> Session:
608
+ def _new_session(self, session_id: str, platform: Platform, username: str or None = None, session_name: str or None = None) -> Session:
606
609
  """Create a new session for the agent.
607
610
 
608
611
  Args:
609
612
  session_id (str): the session id
610
613
  platform (Platform): the platform where the session is to be created and used
614
+ username (str): the name of the session user (optional)
615
+ session_name (str): the name of the session (optional)
611
616
 
612
617
  Returns:
613
618
  Session: the session
@@ -616,7 +621,7 @@ class Agent:
616
621
  raise ValueError(f'Trying to create a new session with an existing id" {session_id}')
617
622
  if platform not in self._platforms:
618
623
  raise ValueError(f"Platform {platform.__class__.__name__} not found in agent '{self.name}'")
619
- session = Session(session_id, self, platform)
624
+ session = Session(session_id, self, platform, username, session_name)
620
625
  self._sessions[session_id] = session
621
626
  if self._persist_sessions and self._monitoring_db_session_exists(session_id, platform):
622
627
  dest_state = self._monitoring_db_get_last_state_of_session(session_id, platform)
@@ -635,10 +640,10 @@ class Agent:
635
640
  session._run_event_thread()
636
641
  return session
637
642
 
638
- def get_or_create_session(self, session_id: str, platform: Platform) -> Session:
643
+ def get_or_create_session(self, session_id: str, platform: Platform, username: str or None = None, session_name: str or None = None) -> Session:
639
644
  session = self._get_session(session_id)
640
645
  if session is None:
641
- session = self._new_session(session_id, platform)
646
+ session = self._new_session(session_id, platform, username, session_name)
642
647
  return session
643
648
 
644
649
  def close_session(self, session_id: str) -> None:
@@ -0,0 +1,114 @@
1
+ from datetime import datetime
2
+ from enum import Enum
3
+ from typing import Any
4
+
5
+ from baf.platforms.payload import PayloadAction
6
+
7
+
8
+ class MessageType(Enum):
9
+ """Enumeration of the different message types in :class:`Message`."""
10
+
11
+ STR = 'str'
12
+ JSON = 'json'
13
+ MARKDOWN = 'markdown'
14
+ HTML = 'html'
15
+ FILE = 'file'
16
+ IMAGE = 'image'
17
+ DATAFRAME = 'dataframe'
18
+ PLOTLY = 'plotly'
19
+ LOCATION = 'location'
20
+ OPTIONS = 'options'
21
+ AUDIO = 'audio'
22
+ RAG_ANSWER = 'rag_answer'
23
+ UI = 'ui'
24
+
25
+
26
+ def get_message_type(value: str):
27
+ for message_type in MessageType:
28
+ if message_type.value == value:
29
+ return message_type
30
+ return None
31
+
32
+
33
+ class Message:
34
+ """
35
+ A conversation message. It is used by the streamlit UI to display the messages properly, depending on the sender
36
+ (i.e., user or agent) and the type (string, audio, file, DataFrame, plot, etc.)
37
+
38
+ Args:
39
+ t (MessageType): The type of the message
40
+ content (Any): The message content
41
+ is_user (bool): Whether the message comes from the user (true) or the agent (false)
42
+ timestamp (datetime): The timestamp of the message (when the message was sent)
43
+
44
+ Attributes:
45
+ type (MessageType): The type of the message
46
+ content (Any): The message content
47
+ is_user (bool): Whether the message comes from the user (true) or the agent (false)
48
+ timestamp (datetime): The timestamp of the message (when the message was sent)
49
+ """
50
+
51
+ def __init__(self, t: MessageType, content: Any, is_user: bool, timestamp: datetime):
52
+ self.type: MessageType = t
53
+ self.content: Any = content
54
+ self.is_user: bool = is_user
55
+ self.timestamp: datetime = timestamp
56
+ # TODO: Parse content to specific type (in DB, messages are stored a str)
57
+
58
+ def get_action(self):
59
+ if self.is_user:
60
+ match self.type:
61
+ case MessageType.STR:
62
+ return PayloadAction.USER_MESSAGE
63
+ case MessageType.JSON:
64
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
65
+ case MessageType.MARKDOWN:
66
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
67
+ case MessageType.HTML:
68
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
69
+ case MessageType.FILE:
70
+ return PayloadAction.USER_FILE
71
+ case MessageType.IMAGE:
72
+ return PayloadAction.USER_FILE # TODO: Not implemented
73
+ case MessageType.DATAFRAME:
74
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
75
+ case MessageType.PLOTLY:
76
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
77
+ case MessageType.LOCATION:
78
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
79
+ case MessageType.OPTIONS:
80
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
81
+ case MessageType.AUDIO:
82
+ return PayloadAction.USER_VOICE
83
+ case MessageType.RAG_ANSWER:
84
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
85
+ case MessageType.UI:
86
+ return PayloadAction.USER_MESSAGE # TODO: Not implemented
87
+ else:
88
+ match self.type:
89
+ case MessageType.STR:
90
+ return PayloadAction.AGENT_REPLY_STR
91
+ case MessageType.JSON:
92
+ return PayloadAction.AGENT_REPLY_STR # TODO: Not implemented
93
+ case MessageType.MARKDOWN:
94
+ return PayloadAction.AGENT_REPLY_MARKDOWN
95
+ case MessageType.HTML:
96
+ return PayloadAction.AGENT_REPLY_HTML
97
+ case MessageType.FILE:
98
+ return PayloadAction.AGENT_REPLY_FILE
99
+ case MessageType.IMAGE:
100
+ return PayloadAction.AGENT_REPLY_IMAGE
101
+ case MessageType.DATAFRAME:
102
+ return PayloadAction.AGENT_REPLY_DF
103
+ case MessageType.PLOTLY:
104
+ return PayloadAction.AGENT_REPLY_PLOTLY
105
+ case MessageType.LOCATION:
106
+ return PayloadAction.AGENT_REPLY_LOCATION
107
+ case MessageType.OPTIONS:
108
+ return PayloadAction.AGENT_REPLY_OPTIONS
109
+ case MessageType.AUDIO:
110
+ return PayloadAction.AGENT_REPLY_AUDIO
111
+ case MessageType.RAG_ANSWER:
112
+ return PayloadAction.AGENT_REPLY_RAG
113
+ case MessageType.UI:
114
+ return PayloadAction.AGENT_REPLY_UI
@@ -39,9 +39,13 @@ class Session:
39
39
  session_id (str): The session id, which must unique among all agent sessions
40
40
  agent (Agent): The agent the session belongs to
41
41
  platform (Platform): The platform where the session has been created
42
+ username (str): the name of the session user (optional)
43
+ session_name (str): the name of the session (optional)
42
44
 
43
45
  Attributes:
44
46
  _id (str): The session id, which must unique among all agent sessions
47
+ _username (str): the name of the session user (optional)
48
+ _session_name (str): the name of the session (optional)
45
49
  _agent (str): The agent the session belongs to
46
50
  _platform (str): The platform where the session has been created
47
51
  _current_state (str): The current state in the agent for this session
@@ -60,8 +64,12 @@ class Session:
60
64
  session_id: str,
61
65
  agent: 'Agent',
62
66
  platform: 'Platform',
67
+ username: str or None = None,
68
+ session_name: str or None = None
63
69
  ):
64
70
  self._id: str = session_id
71
+ self._username: str = username
72
+ self._session_name: str = session_name
65
73
  self._agent: 'Agent' = agent
66
74
  self._platform: 'Platform' = platform
67
75
  self._current_state: 'State' = self._agent.initial_state()
@@ -133,6 +141,17 @@ class Session:
133
141
 
134
142
  def start_event_loop():
135
143
  logger.debug(f'Starting Event Loop for session: {self.id}')
144
+ # Wait for the platform to finish starting before running the agent.
145
+ # Platforms run in their own threads and may not be ready immediately.
146
+ timeout = 30 # seconds
147
+ elapsed = 0.0
148
+ interval = 0.05 # 50ms polling interval
149
+ while not self._platform.running:
150
+ if elapsed >= timeout:
151
+ logger.error(f'Platform did not start within {timeout}s for session {self.id}. Aborting session start.')
152
+ return
153
+ time.sleep(interval)
154
+ elapsed += interval
136
155
  asyncio.set_event_loop(self._event_loop)
137
156
  asyncio.get_event_loop().call_soon(self.manage_transition)
138
157
  self._event_loop.run_forever()
@@ -275,8 +275,12 @@ class State:
275
275
  TransitionBuilder: the transition builder
276
276
  """
277
277
  event = ReceiveFileEvent()
278
+ if allowed_types:
279
+ params = {'allowed_types': allowed_types}
280
+ else:
281
+ params = {}
278
282
  transition_builder: TransitionBuilder = TransitionBuilder(source=self, event=event)
279
- transition_builder.with_condition(function=file_type, params={'allowed_types': allowed_types})
283
+ transition_builder.with_condition(function=file_type, params=params)
280
284
  return transition_builder
281
285
 
282
286
  def check_transitions(self, session: Session) -> None:
@@ -62,7 +62,7 @@ class TransitionBuilder:
62
62
  if len(func_params) == 1:
63
63
  # session param
64
64
  condition_function = function
65
- elif len(func_params) == 2 and params:
65
+ elif len(func_params) == 2 and params is not None:
66
66
  # (session, params) param
67
67
  condition_function = partial(function, params=params)
68
68
  else:
@@ -90,6 +90,8 @@ class MonitoringDB:
90
90
  id = Column(Integer, primary_key=True, autoincrement=True)
91
91
  agent_name = Column(String, nullable=False)
92
92
  session_id = Column(String, nullable=False)
93
+ session_name = Column(String, nullable=True)
94
+ username = Column(String, nullable=True)
93
95
  platform_name = Column(String, nullable=False)
94
96
  timestamp = Column(DateTime, nullable=False)
95
97
  variables = Column(String, nullable=True)
@@ -100,7 +102,7 @@ class MonitoringDB:
100
102
  class TableIntentPrediction(Base):
101
103
  __tablename__ = TABLE_INTENT_PREDICTION
102
104
  id = Column(Integer, primary_key=True, autoincrement=True)
103
- session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id'), nullable=False)
105
+ session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id', ondelete='CASCADE'), nullable=False)
104
106
  message = Column(String, nullable=False)
105
107
  timestamp = Column(DateTime, nullable=False)
106
108
  intent_classifier = Column(String, nullable=False)
@@ -110,7 +112,7 @@ class MonitoringDB:
110
112
  class TableParameter(Base):
111
113
  __tablename__ = TABLE_PARAMETER
112
114
  id = Column(Integer, primary_key=True, autoincrement=True)
113
- intent_prediction_id = Column(Integer, ForeignKey(f'{TABLE_INTENT_PREDICTION}.id'), nullable=False)
115
+ intent_prediction_id = Column(Integer, ForeignKey(f'{TABLE_INTENT_PREDICTION}.id', ondelete='CASCADE'), nullable=False)
114
116
  name = Column(String, nullable=False)
115
117
  value = Column(String)
116
118
  info = Column(String)
@@ -118,7 +120,7 @@ class MonitoringDB:
118
120
  class TableTransition(Base):
119
121
  __tablename__ = TABLE_TRANSITION
120
122
  id = Column(Integer, primary_key=True, autoincrement=True)
121
- session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id'), nullable=False)
123
+ session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id', ondelete='CASCADE'), nullable=False)
122
124
  source_state = Column(String, nullable=False)
123
125
  dest_state = Column(String, nullable=False)
124
126
  event = Column(String, nullable=True)
@@ -128,7 +130,7 @@ class MonitoringDB:
128
130
  class TableChat(Base):
129
131
  __tablename__ = TABLE_CHAT
130
132
  id = Column(Integer, primary_key=True, autoincrement=True)
131
- session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id'), nullable=False)
133
+ session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id', ondelete='CASCADE'), nullable=False)
132
134
  type = Column(String, nullable=False)
133
135
  content = Column(JSONB, nullable=False) # JSONB allows to handle the dictionary (TTS messages)
134
136
  is_user = Column(Boolean, nullable=False)
@@ -137,7 +139,7 @@ class MonitoringDB:
137
139
  class TableEvent(Base):
138
140
  __tablename__ = TABLE_EVENT
139
141
  id = Column(Integer, primary_key=True, autoincrement=True)
140
- session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id'), nullable=True)
142
+ session_id = Column(Integer, ForeignKey(f'{TABLE_SESSION}.id', ondelete='CASCADE'), nullable=True)
141
143
  event = Column(String, nullable=False)
142
144
  info = Column(String, nullable=True)
143
145
  timestamp = Column(DateTime, nullable=False)
@@ -153,6 +155,8 @@ class MonitoringDB:
153
155
  """
154
156
  table = Table(TABLE_SESSION, MetaData(), autoload_with=self.conn)
155
157
  stmt = insert(table).values(
158
+ username=session._username,
159
+ session_name=session._session_name,
156
160
  agent_name=session._agent.name,
157
161
  session_id=session.id,
158
162
  platform_name=session.platform.__class__.__name__,
@@ -71,12 +71,15 @@ class ReceiveMessageEvent(Event):
71
71
  message = session._agent.process(session=session, message=message, is_user_message=human)
72
72
 
73
73
  try:
74
- payload = json.loads(message)
75
- if isinstance(payload, dict):
76
- event = ReceiveJSONEvent(payload, session_id, human)
74
+ if isinstance(message, dict):
75
+ event = ReceiveJSONEvent(message, session_id, human)
77
76
  else:
78
- event = ReceiveTextEvent(message, session_id, human)
79
- except json.JSONDecodeError:
77
+ payload = json.loads(message)
78
+ if isinstance(payload, dict):
79
+ event = ReceiveJSONEvent(payload, session_id, human)
80
+ else:
81
+ event = ReceiveTextEvent(message, session_id, human)
82
+ except Exception as e:
80
83
  event = ReceiveTextEvent(message, session_id, human)
81
84
  finally:
82
85
  return event
@@ -1,4 +1,5 @@
1
1
  import json
2
+ from datetime import datetime
2
3
 
3
4
  from enum import Enum
4
5
 
@@ -19,6 +20,9 @@ class PayloadAction(Enum):
19
20
  """PayloadAction: Indicates that the user intends to set a session variable. The payload must include a dictionary containing the variable name and its value, sent as a Payload message.
20
21
  """
21
22
 
23
+ USER_UPDATE_UI = 'user_update_ui'
24
+ """PayloadAction: Indicates that the payload's purpose is to send a UI update from the user."""
25
+
22
26
  RESET = 'reset'
23
27
  """PayloadAction: Use the :class:`~baf.platforms.websocket.websocket_platform.WebSocketPlatform` on this
24
28
  agent.
@@ -74,6 +78,11 @@ class PayloadAction(Enum):
74
78
  dictionary containing the audio data (as a base 64 String) and the metadata to reconstruct the audio array, composed
75
79
  of sample_rate, dtype and shape."""
76
80
 
81
+ AGENT_REPLY_UI = 'agent_reply_ui'
82
+ """PayloadAction: Indicates that the payload's purpose is to send an agent reply containing a UI, which is based on
83
+ the GUI metamodel in :class:`besser.BUML.metamodel.gui.graphical_ui.GUIModel`.
84
+ """
85
+
77
86
  FETCH_USER_MESSAGES = 'fetch_user_messages'
78
87
  """PayloadAction: Request to fetch old messages for a given user."""
79
88
 
@@ -103,10 +112,11 @@ class Payload:
103
112
  return Payload(action, payload_message, history=history)
104
113
  return None
105
114
 
106
- def __init__(self, action: PayloadAction, message: str or dict = None, history: bool = False):
115
+ def __init__(self, action: PayloadAction, message: str or dict = None, history: bool = False, timestamp: datetime = None):
107
116
  self.action: str = action.value
108
117
  self.message: str or dict = message
109
118
  self.history: bool = history
119
+ self.timestamp: datetime = timestamp
110
120
 
111
121
 
112
122
  class PayloadEncoder(json.JSONEncoder):
@@ -130,10 +140,14 @@ class PayloadEncoder(json.JSONEncoder):
130
140
  """
131
141
  if isinstance(obj, Payload):
132
142
  # Convert the Payload object to a dictionary
143
+ timestamp = getattr(obj, 'timestamp', None)
144
+ if timestamp:
145
+ timestamp = timestamp.strftime("%Y-%m-%d %H:%M:%S")
133
146
  payload_dict = {
134
147
  'action': obj.action,
135
148
  'message': obj.message,
136
149
  'history': getattr(obj, 'history', None),
150
+ 'timestamp': timestamp
137
151
  }
138
152
  return payload_dict
139
153
  return super().default(obj)