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.
- {besser_agentic_framework-4.4.1/besser_agentic_framework.egg-info → besser_agentic_framework-4.4.2}/PKG-INFO +3 -1
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/session.py +40 -1
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/rag/rag.py +137 -5
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat.py +1 -1
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/rag_agent.py +27 -14
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2/besser_agentic_framework.egg-info}/PKG-INFO +3 -1
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/requires.txt +2 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-extras.txt +1 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/setup.cfg +1 -1
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/LICENSE +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/MANIFEST.in +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/README.md +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/entity.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/entity_entry.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/file.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_deserializer.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_schema.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_serializer.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/intent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/intent_parameter.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/message.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/audio_language_detection_processor.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/language_detection_processor.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/processor.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/user_adaptation_processor.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/property.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/state.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/condition.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/event.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/transition.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/transition_builder.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/db_handler.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_db.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/db_connection.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/flow_graph.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/home.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/intent_details.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/monitoring_ui.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/sidebar.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/table_overview.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/utils.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/exceptions.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/logger.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/coroutine/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/coroutine/async_helpers.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/entity/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/entity/base_entities.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/intent/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/intent/intent_library.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/reasoning_state_library.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/state_library.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/task_tools.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/workspace_tools.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/condition_functions.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/conditions.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/base_events.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/github_webhooks_events.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/events/gitlab_webhooks_events.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_configuration.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_prediction.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/llm_intent_classifier.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_pytorch.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_tensorflow.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface_api.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_openai_api.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_replicate_api.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/any.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/datetime.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/number.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/matched_parameter.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner_prediction.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/ner/simple_ner.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/nlp_engine.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/pipelines.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/text_preprocessing.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/rag/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/api_speech2text.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/hf_speech2text.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/luxasr_speech2text.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/openai_speech2text.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/speech2text.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/hf_text2speech.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/openai_text2speech.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/piper_text2speech.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/text2speech.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/nlp/utils.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/a2a_platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_card.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_registry.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/client.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/error_handler.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/message_router.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/server.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/task_protocol.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_actions.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_objects.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_actions.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_objects.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/payload.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/telegram_platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/audio_queue.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat_interface_style.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/initialization.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/login.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/message_input.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/profile_selector.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/reasoning.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/session_management.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/sidebar.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/streamlit_ui.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/user_db.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/vars.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/websocket_callbacks.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/websocket_platform.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/skill.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/tool.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/reasoning/workspace.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/conftest.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_intent_entity.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_message.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_processor.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_property.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_session.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_state.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_transition.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_library_events.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_configurations.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_engine.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_preprocessing.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_platforms.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/components/test_workflows.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/conftest.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_core.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_docs.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_extras.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_framework.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_llms.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_tensorflow.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_torch.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/a2a_multiagent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/api_speech2text_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/github_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/gitlab_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/greetings_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/llm_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/coder_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/main_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/reviewer_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/reasoning_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2speech_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2text_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/stargazer_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/telegram_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/text2speech_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/weather_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/web_crawl_agent.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/utils/__init__.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/utils/web_crawl.py +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/SOURCES.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/dependency_links.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/top_level.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/pyproject.toml +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-core.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-docs.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-llms.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-tensorflow.txt +0 -0
- {besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/requirements/requirements-torch.txt +0 -0
- {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.
|
|
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
|
-
|
|
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
|
-
|
|
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"]
|
|
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:
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/test/examples/rag_agent.py
RENAMED
|
@@ -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
|
-
#
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
|
61
|
-
# rag.
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
initial_state.when_no_intent_matched().go_to(
|
|
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
|
|
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
|
-
|
|
86
|
-
|
|
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.
|
|
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"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/entity/entity_entry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_deserializer.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_schema.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/gui/gui_serializer.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/intent/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/processors/processor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/__init__.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/condition.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/event.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/core/transition/transition.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/flow_graph.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/home.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/sidebar.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/utils.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/__init__.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/exceptions/exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/coroutine/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/entity/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/intent/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/state/state_library.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/__init__.py
RENAMED
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/tool/task_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
{besser_agentic_framework-4.4.1 → besser_agentic_framework-4.4.2}/baf/library/transition/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|