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.
- {besser_agentic_framework-4.3.2/besser_agentic_framework.egg-info → besser_agentic_framework-4.3.3}/PKG-INFO +23 -15
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/agent.py +10 -5
- besser_agentic_framework-4.3.3/baf/core/message.py +114 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/session.py +19 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/state.py +5 -1
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/transition_builder.py +1 -1
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_db.py +9 -5
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/base_events.py +8 -5
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/payload.py +15 -1
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/websocket_platform.py +79 -41
- besser_agentic_framework-4.3.3/baf/test/components/conftest.py +56 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_agent.py +104 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_intent_entity.py +106 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_message.py +82 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_processor.py +47 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_property.py +71 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_session.py +67 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_state.py +123 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_core_transition.py +81 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_library_events.py +78 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_nlp_configurations.py +80 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_nlp_engine.py +65 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_nlp_preprocessing.py +68 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_platforms.py +63 -0
- besser_agentic_framework-4.3.3/baf/test/components/test_workflows.py +132 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/conftest.py +6 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_core.py +136 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_docs.py +26 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_extras.py +92 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_framework.py +184 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_llms.py +21 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_tensorflow.py +21 -0
- besser_agentic_framework-4.3.3/baf/test/dependencies/test_torch.py +27 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/greetings_agent.py +1 -1
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/llm_agent.py +1 -1
- besser_agentic_framework-4.3.3/baf/test/examples/multiagent/__init__.py +0 -0
- besser_agentic_framework-4.3.3/baf/utils/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3/besser_agentic_framework.egg-info}/PKG-INFO +23 -15
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/SOURCES.txt +25 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/requires.txt +33 -13
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-core.txt +4 -2
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-extras.txt +7 -4
- besser_agentic_framework-4.3.3/requirements/requirements-tensorflow.txt +2 -0
- besser_agentic_framework-4.3.3/requirements/requirements-torch.txt +3 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/setup.cfg +1 -1
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/setup.py +10 -2
- besser_agentic_framework-4.3.2/baf/core/message.py +0 -53
- besser_agentic_framework-4.3.2/requirements/requirements-tensorflow.txt +0 -2
- besser_agentic_framework-4.3.2/requirements/requirements-torch.txt +0 -2
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/LICENSE +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/MANIFEST.in +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/README.md +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/entity.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/entity/entity_entry.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/file.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/intent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/intent/intent_parameter.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/audio_language_detection_processor.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/language_detection_processor.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/processor.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/processors/user_adaptation_processor.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/property.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/condition.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/event.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/core/transition/transition.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/db_handler.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/db_connection.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/flow_graph.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/home.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/intent_details.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/monitoring_ui.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/sidebar.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/table_overview.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/db/monitoring_ui/utils.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/exceptions.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/exceptions/logger.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/coroutine/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/coroutine/async_helpers.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/entity/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/entity/base_entities.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/intent/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/intent/intent_library.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/state/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/state/state_library.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/condition_functions.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/conditions.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/github_webhooks_events.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/library/transition/events/gitlab_webhooks_events.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier_configuration.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/intent_classifier_prediction.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/llm_intent_classifier.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/simple_intent_classifier_pytorch.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/intent_classifier/simple_intent_classifier_tensorflow.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_huggingface.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_huggingface_api.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_openai_api.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/llm/llm_replicate_api.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/any.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/datetime.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/base/number.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/matched_parameter.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/ner.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/ner_prediction.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/ner/simple_ner.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/nlp_engine.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/pipelines.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/preprocessing/text_preprocessing.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/rag/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/rag/rag.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/api_speech2text.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/hf_speech2text.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/luxasr_speech2text.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/openai_speech2text.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/speech2text/speech2text.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/hf_text2speech.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/openai_text2speech.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/piper_text2speech.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/text2speech/text2speech.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/nlp/utils.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/a2a_platform.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/agent_card.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/agent_registry.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/client.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/error_handler.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/message_router.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/server.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/a2a/task_protocol.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_actions.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_objects.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/github/github_platform.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_actions.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_objects.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/gitlab/gitlab_platform.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/platform.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/telegram/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/telegram/telegram_platform.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/audio_queue.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/chat.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/chat_interface_style.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/initialization.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/login.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/message_input.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/profile_selector.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/session_management.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/sidebar.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/streamlit_ui.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/user_db.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/vars.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/platforms/websocket/streamlit_ui/websocket_callbacks.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/__init__.py +0 -0
- {besser_agentic_framework-4.3.2/baf/test/examples → besser_agentic_framework-4.3.3/baf/test/components}/__init__.py +0 -0
- {besser_agentic_framework-4.3.2/baf/test/examples/multiagent → besser_agentic_framework-4.3.3/baf/test/dependencies}/__init__.py +0 -0
- {besser_agentic_framework-4.3.2/baf/utils → besser_agentic_framework-4.3.3/baf/test/examples}/__init__.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/a2a_multiagent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/api_speech2text_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/github_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/gitlab_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/coder_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/main_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/multiagent/reviewer_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/rag_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/speech2speech_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/speech2text_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/stargazer_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/telegram_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/text2speech_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/weather_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/test/examples/web_crawl_agent.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/baf/utils/web_crawl.py +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/dependency_links.txt +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/besser_agentic_framework.egg-info/top_level.txt +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/pyproject.toml +0 -0
- {besser_agentic_framework-4.3.2 → besser_agentic_framework-4.3.3}/requirements/requirements-docs.txt +0 -0
- {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.
|
|
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
|
|
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:
|
|
47
|
-
Requires-Dist: langchain
|
|
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.
|
|
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
|
|
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:
|
|
76
|
-
Requires-Dist: langchain
|
|
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.
|
|
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=
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
event = ReceiveJSONEvent(payload, session_id, human)
|
|
74
|
+
if isinstance(message, dict):
|
|
75
|
+
event = ReceiveJSONEvent(message, session_id, human)
|
|
77
76
|
else:
|
|
78
|
-
|
|
79
|
-
|
|
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)
|