besser-agentic-framework 4.4.0__tar.gz → 4.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. {besser_agentic_framework-4.4.0/besser_agentic_framework.egg-info → besser_agentic_framework-4.4.2}/PKG-INFO +4 -2
  2. besser_agentic_framework-4.4.2/baf/core/gui/gui_deserializer.py +398 -0
  3. besser_agentic_framework-4.4.2/baf/core/gui/gui_schema.py +515 -0
  4. besser_agentic_framework-4.4.2/baf/core/gui/gui_serializer.py +470 -0
  5. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/session.py +40 -1
  6. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/rag/rag.py +137 -5
  7. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat.py +1 -1
  8. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/websocket_platform.py +37 -23
  9. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/rag_agent.py +27 -14
  10. besser_agentic_framework-4.4.2/baf/utils/__init__.py +0 -0
  11. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2/besser_agentic_framework.egg-info}/PKG-INFO +4 -2
  12. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/SOURCES.txt +4 -0
  13. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/requires.txt +3 -1
  14. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-core.txt +1 -1
  15. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-extras.txt +1 -0
  16. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/setup.cfg +1 -1
  17. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/LICENSE +0 -0
  18. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/MANIFEST.in +0 -0
  19. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/README.md +0 -0
  20. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/__init__.py +0 -0
  21. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/__init__.py +0 -0
  22. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/agent.py +0 -0
  23. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/entity/__init__.py +0 -0
  24. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/entity/entity.py +0 -0
  25. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/entity/entity_entry.py +0 -0
  26. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/file.py +0 -0
  27. {besser_agentic_framework-4.4.0/baf/core/intent → besser_agentic_framework-4.4.2/baf/core/gui}/__init__.py +0 -0
  28. {besser_agentic_framework-4.4.0/baf/core/processors → besser_agentic_framework-4.4.2/baf/core/intent}/__init__.py +0 -0
  29. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/intent/intent.py +0 -0
  30. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/intent/intent_parameter.py +0 -0
  31. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/message.py +0 -0
  32. {besser_agentic_framework-4.4.0/baf/core/transition → besser_agentic_framework-4.4.2/baf/core/processors}/__init__.py +0 -0
  33. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/processors/audio_language_detection_processor.py +0 -0
  34. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/processors/language_detection_processor.py +0 -0
  35. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/processors/processor.py +0 -0
  36. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/processors/user_adaptation_processor.py +0 -0
  37. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/property.py +0 -0
  38. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/state.py +0 -0
  39. {besser_agentic_framework-4.4.0/baf/db/monitoring_ui → besser_agentic_framework-4.4.2/baf/core/transition}/__init__.py +0 -0
  40. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/transition/condition.py +0 -0
  41. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/transition/event.py +0 -0
  42. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/transition/transition.py +0 -0
  43. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/core/transition/transition_builder.py +0 -0
  44. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/__init__.py +0 -0
  45. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/db_handler.py +0 -0
  46. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_db.py +0 -0
  47. {besser_agentic_framework-4.4.0/baf/exceptions → besser_agentic_framework-4.4.2/baf/db/monitoring_ui}/__init__.py +0 -0
  48. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/db_connection.py +0 -0
  49. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/flow_graph.py +0 -0
  50. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/home.py +0 -0
  51. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/intent_details.py +0 -0
  52. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/monitoring_ui.py +0 -0
  53. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/sidebar.py +0 -0
  54. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/table_overview.py +0 -0
  55. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/db/monitoring_ui/utils.py +0 -0
  56. {besser_agentic_framework-4.4.0/baf/library → besser_agentic_framework-4.4.2/baf/exceptions}/__init__.py +0 -0
  57. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/exceptions/exceptions.py +0 -0
  58. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/exceptions/logger.py +0 -0
  59. {besser_agentic_framework-4.4.0/baf/library/coroutine → besser_agentic_framework-4.4.2/baf/library}/__init__.py +0 -0
  60. {besser_agentic_framework-4.4.0/baf/library/entity → besser_agentic_framework-4.4.2/baf/library/coroutine}/__init__.py +0 -0
  61. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/coroutine/async_helpers.py +0 -0
  62. {besser_agentic_framework-4.4.0/baf/library/intent → besser_agentic_framework-4.4.2/baf/library/entity}/__init__.py +0 -0
  63. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/entity/base_entities.py +0 -0
  64. {besser_agentic_framework-4.4.0/baf/library/transition → besser_agentic_framework-4.4.2/baf/library/intent}/__init__.py +0 -0
  65. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/intent/intent_library.py +0 -0
  66. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/state/__init__.py +0 -0
  67. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/state/reasoning_state_library.py +0 -0
  68. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/state/state_library.py +0 -0
  69. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/tool/__init__.py +0 -0
  70. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/tool/task_tools.py +0 -0
  71. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/tool/workspace_tools.py +0 -0
  72. {besser_agentic_framework-4.4.0/baf/library/transition/events → besser_agentic_framework-4.4.2/baf/library/transition}/__init__.py +0 -0
  73. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/transition/condition_functions.py +0 -0
  74. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/transition/conditions.py +0 -0
  75. {besser_agentic_framework-4.4.0/baf/nlp/intent_classifier → besser_agentic_framework-4.4.2/baf/library/transition/events}/__init__.py +0 -0
  76. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/transition/events/base_events.py +0 -0
  77. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/transition/events/github_webhooks_events.py +0 -0
  78. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/library/transition/events/gitlab_webhooks_events.py +0 -0
  79. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/__init__.py +0 -0
  80. {besser_agentic_framework-4.4.0/baf/nlp/llm → besser_agentic_framework-4.4.2/baf/nlp/intent_classifier}/__init__.py +0 -0
  81. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier.py +0 -0
  82. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_configuration.py +0 -0
  83. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/intent_classifier_prediction.py +0 -0
  84. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/llm_intent_classifier.py +0 -0
  85. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_pytorch.py +0 -0
  86. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/intent_classifier/simple_intent_classifier_tensorflow.py +0 -0
  87. {besser_agentic_framework-4.4.0/baf/nlp/ner → besser_agentic_framework-4.4.2/baf/nlp/llm}/__init__.py +0 -0
  88. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm.py +0 -0
  89. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface.py +0 -0
  90. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_huggingface_api.py +0 -0
  91. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_openai_api.py +0 -0
  92. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/llm/llm_replicate_api.py +0 -0
  93. {besser_agentic_framework-4.4.0/baf/nlp/ner/base → besser_agentic_framework-4.4.2/baf/nlp/ner}/__init__.py +0 -0
  94. {besser_agentic_framework-4.4.0/baf/nlp/preprocessing → besser_agentic_framework-4.4.2/baf/nlp/ner/base}/__init__.py +0 -0
  95. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/any.py +0 -0
  96. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/datetime.py +0 -0
  97. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/base/number.py +0 -0
  98. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/matched_parameter.py +0 -0
  99. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner.py +0 -0
  100. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/ner_prediction.py +0 -0
  101. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/ner/simple_ner.py +0 -0
  102. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/nlp_engine.py +0 -0
  103. {besser_agentic_framework-4.4.0/baf/nlp/rag → besser_agentic_framework-4.4.2/baf/nlp/preprocessing}/__init__.py +0 -0
  104. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/pipelines.py +0 -0
  105. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/preprocessing/text_preprocessing.py +0 -0
  106. {besser_agentic_framework-4.4.0/baf/nlp/speech2text → besser_agentic_framework-4.4.2/baf/nlp/rag}/__init__.py +0 -0
  107. {besser_agentic_framework-4.4.0/baf/nlp/text2speech → besser_agentic_framework-4.4.2/baf/nlp/speech2text}/__init__.py +0 -0
  108. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/api_speech2text.py +0 -0
  109. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/hf_speech2text.py +0 -0
  110. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/luxasr_speech2text.py +0 -0
  111. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/openai_speech2text.py +0 -0
  112. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/speech2text/speech2text.py +0 -0
  113. {besser_agentic_framework-4.4.0/baf/platforms → besser_agentic_framework-4.4.2/baf/nlp/text2speech}/__init__.py +0 -0
  114. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/hf_text2speech.py +0 -0
  115. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/openai_text2speech.py +0 -0
  116. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/piper_text2speech.py +0 -0
  117. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/text2speech/text2speech.py +0 -0
  118. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/nlp/utils.py +0 -0
  119. {besser_agentic_framework-4.4.0/baf/test → besser_agentic_framework-4.4.2/baf/platforms}/__init__.py +0 -0
  120. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/__init__.py +0 -0
  121. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/a2a_platform.py +0 -0
  122. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_card.py +0 -0
  123. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/agent_registry.py +0 -0
  124. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/client.py +0 -0
  125. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/error_handler.py +0 -0
  126. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/message_router.py +0 -0
  127. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/server.py +0 -0
  128. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/a2a/task_protocol.py +0 -0
  129. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/github/__init__.py +0 -0
  130. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_actions.py +0 -0
  131. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_objects.py +0 -0
  132. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/github/github_platform.py +0 -0
  133. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/__init__.py +0 -0
  134. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_actions.py +0 -0
  135. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_objects.py +0 -0
  136. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/gitlab/gitlab_platform.py +0 -0
  137. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/payload.py +0 -0
  138. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/platform.py +0 -0
  139. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/__init__.py +0 -0
  140. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/telegram/telegram_platform.py +0 -0
  141. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/__init__.py +0 -0
  142. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/__init__.py +0 -0
  143. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/audio_queue.py +0 -0
  144. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/chat_interface_style.py +0 -0
  145. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/initialization.py +0 -0
  146. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/login.py +0 -0
  147. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/message_input.py +0 -0
  148. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/profile_selector.py +0 -0
  149. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/reasoning.py +0 -0
  150. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/session_management.py +0 -0
  151. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/sidebar.py +0 -0
  152. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/streamlit_ui.py +0 -0
  153. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/user_db.py +0 -0
  154. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/vars.py +0 -0
  155. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/platforms/websocket/streamlit_ui/websocket_callbacks.py +0 -0
  156. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/reasoning/__init__.py +0 -0
  157. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/reasoning/skill.py +0 -0
  158. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/reasoning/tool.py +0 -0
  159. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/reasoning/workspace.py +0 -0
  160. {besser_agentic_framework-4.4.0/baf/test/components → besser_agentic_framework-4.4.2/baf/test}/__init__.py +0 -0
  161. {besser_agentic_framework-4.4.0/baf/test/dependencies → besser_agentic_framework-4.4.2/baf/test/components}/__init__.py +0 -0
  162. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/conftest.py +0 -0
  163. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_agent.py +0 -0
  164. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_intent_entity.py +0 -0
  165. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_message.py +0 -0
  166. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_processor.py +0 -0
  167. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_property.py +0 -0
  168. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_session.py +0 -0
  169. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_state.py +0 -0
  170. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_core_transition.py +0 -0
  171. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_library_events.py +0 -0
  172. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_configurations.py +0 -0
  173. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_engine.py +0 -0
  174. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_nlp_preprocessing.py +0 -0
  175. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_platforms.py +0 -0
  176. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/components/test_workflows.py +0 -0
  177. {besser_agentic_framework-4.4.0/baf/test/examples → besser_agentic_framework-4.4.2/baf/test/dependencies}/__init__.py +0 -0
  178. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/conftest.py +0 -0
  179. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_core.py +0 -0
  180. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_docs.py +0 -0
  181. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_extras.py +0 -0
  182. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_framework.py +0 -0
  183. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_llms.py +0 -0
  184. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_tensorflow.py +0 -0
  185. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/dependencies/test_torch.py +0 -0
  186. {besser_agentic_framework-4.4.0/baf/test/examples/multiagent → besser_agentic_framework-4.4.2/baf/test/examples}/__init__.py +0 -0
  187. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/a2a_multiagent.py +0 -0
  188. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/api_speech2text_agent.py +0 -0
  189. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/github_agent.py +0 -0
  190. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/gitlab_agent.py +0 -0
  191. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/greetings_agent.py +0 -0
  192. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/llm_agent.py +0 -0
  193. {besser_agentic_framework-4.4.0/baf/utils → besser_agentic_framework-4.4.2/baf/test/examples/multiagent}/__init__.py +0 -0
  194. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/coder_agent.py +0 -0
  195. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/main_agent.py +0 -0
  196. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/multiagent/reviewer_agent.py +0 -0
  197. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/reasoning_agent.py +0 -0
  198. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2speech_agent.py +0 -0
  199. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/speech2text_agent.py +0 -0
  200. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/stargazer_agent.py +0 -0
  201. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/telegram_agent.py +0 -0
  202. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/text2speech_agent.py +0 -0
  203. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/weather_agent.py +0 -0
  204. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/test/examples/web_crawl_agent.py +0 -0
  205. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/baf/utils/web_crawl.py +0 -0
  206. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/dependency_links.txt +0 -0
  207. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/besser_agentic_framework.egg-info/top_level.txt +0 -0
  208. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/pyproject.toml +0 -0
  209. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-docs.txt +0 -0
  210. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-llms.txt +0 -0
  211. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-tensorflow.txt +0 -0
  212. {besser_agentic_framework-4.4.0 → besser_agentic_framework-4.4.2}/requirements/requirements-torch.txt +0 -0
  213. {besser_agentic_framework-4.4.0 → 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.0
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
@@ -23,7 +23,7 @@ Requires-Dist: numpy<3,>=2.1; python_version >= "3.13"
23
23
  Requires-Dist: pandas==2.3.3
24
24
  Requires-Dist: python-telegram-bot==21.0
25
25
  Requires-Dist: psycopg2-binary>=2.9.10
26
- Requires-Dist: pydantic==2.11.7
26
+ Requires-Dist: pydantic>=2.6.3
27
27
  Requires-Dist: pyvis==0.3.2
28
28
  Requires-Dist: PyYAML==6.0.2
29
29
  Requires-Dist: requests==2.31.0
@@ -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"
@@ -0,0 +1,398 @@
1
+ """Deserialization helpers: JSON string → GUIModel."""
2
+ import json
3
+ from types import SimpleNamespace
4
+
5
+ from baf.exceptions.logger import logger
6
+
7
+ try:
8
+ from besser.BUML.metamodel.gui.graphical_ui import (
9
+ GUIModel, Module, Screen,
10
+ ViewElement, ViewContainer, ViewComponent,
11
+ Button, Text, Image, InputField, Form, Menu, MenuItem,
12
+ DataList, EmbeddedContent, Link,
13
+ )
14
+ from besser.BUML.metamodel.gui.style import Styling, Size, Position, Color, Layout
15
+ from besser.BUML.metamodel.gui.dashboard import (
16
+ LineChart, BarChart, PieChart, RadarChart, RadialBarChart,
17
+ Table, MetricCard, AgentComponent, Series,
18
+ Column, FieldColumn, LookupColumn, ExpressionColumn,
19
+ )
20
+ except ImportError:
21
+ logger.warning("besser dependencies in gui_deserializer.py could not be imported. You can install them with "
22
+ "'pip install --no-deps besser'")
23
+
24
+ # ─── Known parameter names for each style class ─────────────────────────────
25
+
26
+ _SIZE_PROPS = frozenset({
27
+ 'width', 'height', 'padding', 'margin', 'font_size', 'line_height', 'icon_size', 'unit_size',
28
+ 'font_weight', 'font_family', 'font_style', 'text_decoration', 'text_transform',
29
+ 'letter_spacing', 'word_spacing', 'white_space', 'word_break',
30
+ 'min_width', 'max_width', 'min_height', 'max_height',
31
+ 'padding_top', 'padding_right', 'padding_bottom', 'padding_left',
32
+ 'margin_top', 'margin_right', 'margin_bottom', 'margin_left',
33
+ })
34
+
35
+ _POSITION_PROPS = frozenset({
36
+ 'p_type', 'top', 'left', 'right', 'bottom', 'alignment', 'z_index', 'display',
37
+ 'overflow', 'overflow_x', 'overflow_y', 'visibility', 'cursor',
38
+ 'box_sizing', 'transform', 'transition', 'animation', 'filter',
39
+ })
40
+
41
+ _COLOR_PROPS = frozenset({
42
+ 'background_color', 'text_color', 'border_color', 'line_color', 'grid_color', 'axis_color',
43
+ 'bar_color', 'label_color', 'fill_color', 'opacity', 'color_palette', 'primary_color',
44
+ 'border_radius', 'border_width', 'border_style', 'border',
45
+ 'border_top', 'border_right', 'border_bottom', 'border_left',
46
+ 'box_shadow', 'text_shadow',
47
+ 'background_image', 'background_size', 'background_position', 'background_repeat',
48
+ })
49
+
50
+ _LAYOUT_PROPS = frozenset({
51
+ 'layout_type', 'orientation', 'padding', 'margin', 'gap', 'alignment', 'wrap',
52
+ 'flex_direction', 'justify_content', 'align_items', 'flex_wrap',
53
+ 'grid_template_columns', 'grid_template_rows', 'grid_gap', 'justify_items',
54
+ 'flex', 'flex_grow', 'flex_shrink', 'flex_basis', 'order', 'align_self',
55
+ })
56
+
57
+ _CATEGORY_KEYS = frozenset({'size', 'position', 'color', 'layout'})
58
+
59
+
60
+ def _normalize_styling_dict(d: dict) -> dict:
61
+ """Normalize a styling dict from either nested or flat (LLM-generated) format.
62
+
63
+ LLMs often produce flat styling like ``{"background_color": "#fff", "padding": "10px"}``
64
+ instead of the expected nested format. This function detects that pattern and
65
+ groups properties into the correct ``size`` / ``color`` / ``position`` / ``layout``
66
+ sub-objects so the rest of the deserializer can handle them uniformly.
67
+ """
68
+ if not d or any(k in d for k in _CATEGORY_KEYS):
69
+ return d # already nested (or empty)
70
+
71
+ size_props, position_props, color_props, layout_props = {}, {}, {}, {}
72
+ for k, v in d.items():
73
+ if k in _SIZE_PROPS:
74
+ size_props[k] = v
75
+ elif k in _POSITION_PROPS:
76
+ position_props[k] = v
77
+ elif k in _COLOR_PROPS:
78
+ color_props[k] = v
79
+ elif k in _LAYOUT_PROPS:
80
+ layout_props[k] = v
81
+
82
+ result = {}
83
+ if size_props:
84
+ result['size'] = size_props
85
+ if position_props:
86
+ result['position'] = position_props
87
+ if color_props:
88
+ result['color'] = color_props
89
+ if layout_props:
90
+ result['layout'] = layout_props
91
+ return result if result else d
92
+
93
+
94
+ def _deserialize_layout(d: dict) -> "Layout | None":
95
+ if not d:
96
+ return None
97
+ return Layout(**{k: v for k, v in d.items() if k in _LAYOUT_PROPS})
98
+
99
+
100
+ def _deserialize_styling(d: dict) -> "Styling | None":
101
+ if not d:
102
+ return None
103
+ d = _normalize_styling_dict(d)
104
+ size = Size(**{k: v for k, v in d["size"].items() if k in _SIZE_PROPS}) if d.get("size") else None
105
+ position = Position(**{k: v for k, v in d["position"].items() if k in _POSITION_PROPS}) if d.get("position") else None
106
+ color = Color(**{k: v for k, v in d["color"].items() if k in _COLOR_PROPS}) if d.get("color") else None
107
+ layout = _deserialize_layout(d.get("layout"))
108
+ return Styling(size=size, position=position, color=color, layout=layout)
109
+
110
+
111
+ def _deserialize_series(d: dict) -> Series:
112
+ return Series(
113
+ name=d["name"],
114
+ label=d.get("label"),
115
+ data_binding=None,
116
+ styling=_deserialize_styling(d.get("styling")),
117
+ )
118
+
119
+
120
+ def _deserialize_column(d: dict) -> Column:
121
+ t = d.get("type", "Column")
122
+ label = d.get("label", "")
123
+ if t == "FieldColumn":
124
+ return FieldColumn(label=label, field=SimpleNamespace(name=d.get("field", "")))
125
+ if t == "LookupColumn":
126
+ return LookupColumn(
127
+ label=label,
128
+ path=SimpleNamespace(name=d.get("path", "")),
129
+ field=SimpleNamespace(name=d.get("field", "")),
130
+ )
131
+ if t == "ExpressionColumn":
132
+ return ExpressionColumn(label=label, expression=d.get("expression", ""))
133
+ return Column(label=label)
134
+
135
+
136
+ def _deserialize_view_element(d: dict) -> ViewElement:
137
+ t = d.get("type", "ViewComponent")
138
+ base = {
139
+ "name": d["name"],
140
+ "description": d.get("description", ""),
141
+ "styling": _deserialize_styling(d.get("styling")),
142
+ }
143
+ for opt in ("component_id", "tag_name", "css_classes", "custom_attributes"):
144
+ if d.get(opt) is not None:
145
+ base[opt] = d[opt]
146
+ if d.get("display_order") is not None:
147
+ base["display_order"] = d["display_order"]
148
+
149
+ series_list = [_deserialize_series(s) for s in d.get("series", [])]
150
+
151
+ if t == "AgentComponent":
152
+ return AgentComponent(
153
+ agent_name=d.get("agent_name"),
154
+ agent_title=d.get("agent_title"),
155
+ **base,
156
+ )
157
+
158
+ if t == "LineChart":
159
+ el = LineChart(
160
+ line_width=d.get("line_width", 2),
161
+ show_grid=d.get("show_grid", True),
162
+ show_legend=d.get("show_legend", True),
163
+ show_tooltip=d.get("show_tooltip", True),
164
+ curve_type=d.get("curve_type", "monotone"),
165
+ animate=d.get("animate", True),
166
+ legend_position=d.get("legend_position", "top"),
167
+ grid_color=d.get("grid_color"),
168
+ dot_size=d.get("dot_size", 4),
169
+ title=d.get("title"),
170
+ primary_color=d.get("primary_color"),
171
+ **base,
172
+ )
173
+ el.series = series_list
174
+ return el
175
+
176
+ if t == "BarChart":
177
+ el = BarChart(
178
+ bar_width=d.get("bar_width", 20),
179
+ orientation=d.get("orientation", "vertical"),
180
+ show_grid=d.get("show_grid", True),
181
+ show_legend=d.get("show_legend", True),
182
+ show_tooltip=d.get("show_tooltip", True),
183
+ stacked=d.get("stacked", False),
184
+ animate=d.get("animate", True),
185
+ legend_position=d.get("legend_position", "top"),
186
+ grid_color=d.get("grid_color"),
187
+ bar_gap=d.get("bar_gap", 4),
188
+ title=d.get("title"),
189
+ primary_color=d.get("primary_color"),
190
+ **base,
191
+ )
192
+ el.series = series_list
193
+ return el
194
+
195
+ if t == "PieChart":
196
+ el = PieChart(
197
+ show_legend=d.get("show_legend", True),
198
+ legend_position=d.get("legend_position", "top"),
199
+ show_labels=d.get("show_labels", True),
200
+ label_position=d.get("label_position", "outside"),
201
+ padding_angle=d.get("padding_angle", 0),
202
+ inner_radius=d.get("inner_radius", 0),
203
+ outer_radius=d.get("outer_radius", 80),
204
+ start_angle=d.get("start_angle", 0),
205
+ end_angle=d.get("end_angle", 360),
206
+ title=d.get("title"),
207
+ primary_color=d.get("primary_color"),
208
+ **base,
209
+ )
210
+ el.series = series_list
211
+ return el
212
+
213
+ if t == "RadarChart":
214
+ el = RadarChart(
215
+ show_grid=d.get("show_grid", True),
216
+ show_tooltip=d.get("show_tooltip", True),
217
+ show_radius_axis=d.get("show_radius_axis", True),
218
+ show_legend=d.get("show_legend", True),
219
+ legend_position=d.get("legend_position", "top"),
220
+ dot_size=d.get("dot_size", 3),
221
+ grid_type=d.get("grid_type", "polygon"),
222
+ stroke_width=d.get("stroke_width", 2),
223
+ title=d.get("title"),
224
+ primary_color=d.get("primary_color"),
225
+ **base,
226
+ )
227
+ el.series = series_list
228
+ return el
229
+
230
+ if t == "RadialBarChart":
231
+ el = RadialBarChart(
232
+ start_angle=d.get("start_angle", 0),
233
+ end_angle=d.get("end_angle", 360),
234
+ inner_radius=d.get("inner_radius", 30),
235
+ outer_radius=d.get("outer_radius", 80),
236
+ show_legend=d.get("show_legend", True),
237
+ legend_position=d.get("legend_position", "top"),
238
+ show_tooltip=d.get("show_tooltip", True),
239
+ title=d.get("title"),
240
+ primary_color=d.get("primary_color"),
241
+ **base,
242
+ )
243
+ el.series = series_list
244
+ return el
245
+
246
+ if t == "Table":
247
+ return Table(
248
+ show_header=d.get("show_header", True),
249
+ striped_rows=d.get("striped_rows", False),
250
+ show_pagination=d.get("show_pagination", False),
251
+ rows_per_page=d.get("rows_per_page", 5),
252
+ title=d.get("title"),
253
+ primary_color=d.get("primary_color"),
254
+ columns=[_deserialize_column(c) for c in d.get("columns", [])],
255
+ action_buttons=d.get("action_buttons", False),
256
+ **base,
257
+ )
258
+
259
+ if t == "MetricCard":
260
+ return MetricCard(
261
+ metric_title=d.get("metric_title", "Metric Title"),
262
+ format=d.get("format", "number"),
263
+ value_color=d.get("value_color", "#2c3e50"),
264
+ value_size=d.get("value_size", 32),
265
+ show_trend=d.get("show_trend", True),
266
+ positive_color=d.get("positive_color", "#27ae60"),
267
+ negative_color=d.get("negative_color", "#e74c3c"),
268
+ title=d.get("title"),
269
+ primary_color=d.get("primary_color"),
270
+ **base,
271
+ )
272
+
273
+ if t == "Button":
274
+ return Button(
275
+ label=d.get("label", ""),
276
+ buttonType=d.get("buttonType", "Raised Button"),
277
+ actionType=d.get("actionType", "navigate"),
278
+ confirmation_required=d.get("confirmation_required", False),
279
+ confirmation_message=d.get("confirmation_message"),
280
+ **base,
281
+ )
282
+
283
+ if t == "Text":
284
+ return Text(
285
+ content=d.get("content", ""),
286
+ **base,
287
+ )
288
+
289
+ if t == "Link":
290
+ return Link(
291
+ label=d.get("label", ""),
292
+ url=d.get("url"),
293
+ target=d.get("target"),
294
+ rel=d.get("rel"),
295
+ **base,
296
+ )
297
+
298
+ if t == "Image":
299
+ return Image(
300
+ source=d.get("source"),
301
+ **base,
302
+ )
303
+
304
+ if t == "InputField":
305
+ return InputField(
306
+ field_type=d.get("field_type", "text"),
307
+ validationRules=d.get("validationRules"),
308
+ **base,
309
+ )
310
+
311
+ if t == "Form":
312
+ return Form(
313
+ inputFields=set(_deserialize_view_element(f) for f in d.get("inputFields", [])),
314
+ **base,
315
+ )
316
+
317
+ if t == "Menu":
318
+ menu_items = set(
319
+ MenuItem(
320
+ label=mi.get("label", ""),
321
+ url=mi.get("url"),
322
+ target=mi.get("target"),
323
+ rel=mi.get("rel"),
324
+ )
325
+ for mi in d.get("menuItems", [])
326
+ )
327
+ return Menu(menuItems=menu_items, **base)
328
+
329
+ if t == "DataList":
330
+ return DataList(list_sources=set(), **base)
331
+
332
+ if t == "EmbeddedContent":
333
+ return EmbeddedContent(
334
+ source=d.get("source", ""),
335
+ content_type=d.get("content_type", ""),
336
+ extra_props=d.get("extra_props"),
337
+ **base,
338
+ )
339
+
340
+ if t == "ViewContainer":
341
+ return ViewContainer(
342
+ view_elements=set(_deserialize_view_element(c) for c in d.get("view_elements", [])),
343
+ layout=_deserialize_layout(d.get("layout")),
344
+ **base,
345
+ )
346
+
347
+ # Fallback: generic ViewComponent
348
+ return ViewComponent(**base)
349
+
350
+
351
+ def _deserialize_screen(d: dict) -> Screen:
352
+ base = {
353
+ "name": d["name"],
354
+ "description": d.get("description", ""),
355
+ "view_elements": set(_deserialize_view_element(el) for el in d.get("view_elements", [])),
356
+ "x_dpi": d.get("x_dpi", ""),
357
+ "y_dpi": d.get("y_dpi", ""),
358
+ "screen_size": d.get("screen_size", "Medium"),
359
+ "is_main_page": d.get("is_main_page", False),
360
+ "layout": _deserialize_layout(d.get("layout")),
361
+ "styling": _deserialize_styling(d.get("styling")),
362
+ "route_path": d.get("route_path"),
363
+ }
364
+ for opt in ("component_id", "tag_name", "css_classes", "custom_attributes", "display_order"):
365
+ if d.get(opt) is not None:
366
+ base[opt] = d[opt]
367
+ return Screen(**base)
368
+
369
+
370
+ def json_to_gui(json_str: str) -> GUIModel:
371
+ """Deserialize a JSON string produced by :func:`gui_to_json` back into a :class:`GUIModel`.
372
+
373
+ Args:
374
+ json_str: JSON string representing the GUI model.
375
+
376
+ Returns:
377
+ A reconstructed :class:`GUIModel` instance.
378
+ """
379
+ data = json.loads(json_str)
380
+ modules = set()
381
+ for m in data.get("modules", []):
382
+ screens = set(_deserialize_screen(s) for s in m.get("screens", []))
383
+ modules.add(Module(name=m["name"], screens=screens))
384
+ gui_kwargs = dict(
385
+ name=data["name"],
386
+ package=data.get("package", ""),
387
+ versionCode=data.get("versionCode", 1),
388
+ versionName=data.get("versionName", "1.0"),
389
+ modules=modules,
390
+ description=data.get("description", ""),
391
+ )
392
+ style_entries = data.get("style_entries")
393
+ if style_entries is not None:
394
+ try:
395
+ return GUIModel(**gui_kwargs, style_entries=style_entries)
396
+ except TypeError:
397
+ pass
398
+ return GUIModel(**gui_kwargs)