bertrend 0.4.6__tar.gz → 0.4.7__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 (331) hide show
  1. {bertrend-0.4.6 → bertrend-0.4.7}/PKG-INFO +22 -2
  2. {bertrend-0.4.6 → bertrend-0.4.7}/README.md +20 -1
  3. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/BERTrend.py +1 -1
  4. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/apscheduler_utils.py +41 -8
  5. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/tabs/tab1.py +1 -1
  6. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/tabs/tab3.py +2 -2
  7. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/authentication.py +18 -1
  8. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/feeds_config.py +3 -1
  9. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/i18n_translations.py +10 -2
  10. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/models_info.py +21 -10
  11. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/process_new_data.py +38 -28
  12. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/utils/logging_utils.py +1 -1
  13. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/config/default_config.toml +1 -1
  14. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/routers/info.py +7 -0
  15. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_bing_news_provider.py +1 -1
  16. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_data_provider_base.py +0 -3
  17. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_deep_research_provider.py +1 -2
  18. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_newscatcher_provider.py +1 -1
  19. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/demos/summarization/test_summarizer_app.py +0 -1
  20. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_openai_client.py +1 -1
  21. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding_server/test_security.py +1 -2
  22. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summary/test_summary_client.py +1 -1
  23. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summary/test_summary_config.py +1 -1
  24. {bertrend-0.4.6 → bertrend-0.4.7}/pyproject.toml +6 -3
  25. {bertrend-0.4.6 → bertrend-0.4.7}/AUTHORS.txt +0 -0
  26. {bertrend-0.4.6 → bertrend-0.4.7}/LICENSE.md +0 -0
  27. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/BERTopicModel.py +0 -0
  28. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/__init__.py +0 -0
  29. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/article_scoring/__init__.py +0 -0
  30. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/article_scoring/article_scoring.py +0 -0
  31. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/article_scoring/prompts.py +0 -0
  32. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/article_scoring/scoring_agent.py +0 -0
  33. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/__init__.py +0 -0
  34. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/__init__.py +0 -0
  35. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/crontab_utils.py +0 -0
  36. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/date_utils.py +0 -0
  37. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/mail_utils.py +0 -0
  38. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/common/scheduler_utils.py +0 -0
  39. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  40. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  41. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/feed_deep_research_example.toml +0 -0
  42. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  43. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  44. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  45. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  46. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  47. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  48. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  49. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  50. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  51. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  52. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/__init__.py +0 -0
  53. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/__main__.py +0 -0
  54. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  55. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  56. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  57. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/data_provider.py +0 -0
  58. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/data_provider_utils.py +0 -0
  59. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/deep_research_provider.py +0 -0
  60. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/google_news_provider.py +0 -0
  61. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  62. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/rss_feed_provider.py +0 -0
  63. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/data_provider/utils.py +0 -0
  64. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/__init__.py +0 -0
  65. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  66. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/__init__.py +0 -0
  67. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/app.py +0 -0
  68. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  69. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/config.toml +0 -0
  70. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  71. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/prompts.py +0 -0
  72. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  73. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +0 -0
  74. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  75. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/geoviz/.streamlit/config.toml +0 -0
  76. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/geoviz/__init__.py +0 -0
  77. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/geoviz/app.py +0 -0
  78. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/geoviz/backend.py +0 -0
  79. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/start_apps.sh +0 -0
  80. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/exploration/stop_apps.sh +0 -0
  81. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  82. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/newsletters/__init__.py +0 -0
  83. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/newsletters/__main__.py +0 -0
  84. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/newsletters/newsletter_generation.py +0 -0
  85. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/newsletters/utils.py +0 -0
  86. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  87. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
  88. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/__init__.py +0 -0
  89. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/app.py +0 -0
  90. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/automated_report_generation.py +0 -0
  91. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  92. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  93. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/dashboard_comparative.py +0 -0
  94. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  95. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/data_model.py +0 -0
  96. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +0 -0
  97. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  98. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  99. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/i18n.py +0 -0
  100. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  101. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  102. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/report_generation.py +0 -0
  103. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/report_generation_utils.py +0 -0
  104. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  105. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/prospective_demo/utils.py +0 -0
  106. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/__init__.py +0 -0
  107. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/__init__.py +0 -0
  108. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/bertrend_service.py +0 -0
  109. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/config/__init__.py +0 -0
  110. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/config/default_config.toml +0 -0
  111. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/config/settings.py +0 -0
  112. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/models/__init__.py +0 -0
  113. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/models/bertrend_app_models.py +0 -0
  114. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/models/data_provider_models.py +0 -0
  115. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/models/newsletters_models.py +0 -0
  116. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +0 -0
  117. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +0 -0
  118. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/routers/data_provider.py +0 -0
  119. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/routers/info.py +0 -0
  120. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/routers/newsletters.py +0 -0
  121. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/start.py +0 -0
  122. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/status.py +0 -0
  123. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/bertrend/stop.py +0 -0
  124. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/__init__.py +0 -0
  125. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +0 -0
  126. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/client.py +0 -0
  127. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +0 -0
  128. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/queue_manager.py +0 -0
  129. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +0 -0
  130. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +0 -0
  131. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +0 -0
  132. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_monitor/__init__.py +0 -0
  133. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/queue_monitor/app.py +0 -0
  134. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/bertrend_apps/services/utils/__init__.py +0 -0
  135. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/config/bertopic_default_config.toml +0 -0
  136. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/config/bertrend_default_config.toml +0 -0
  137. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/config/parameters.py +0 -0
  138. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/config/services_default_config.toml +0 -0
  139. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/__init__.py +0 -0
  140. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/__init__.py +0 -0
  141. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
  142. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  143. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/i18n.py +0 -0
  144. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  145. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/icons.py +0 -0
  146. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  147. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/demos_utils/state_utils.py +0 -0
  148. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/start_summarizer_app.sh +0 -0
  149. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  150. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/start_weak_signals_app.sh +0 -0
  151. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/streamlit_components/__init__.py +0 -0
  152. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/streamlit_components/clickable_df_component.py +0 -0
  153. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/streamlit_components/input_with_pills_component.py +0 -0
  154. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/summarization/__init__.py +0 -0
  155. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/summarization/summarizer_app.py +0 -0
  156. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  157. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/__init__.py +0 -0
  158. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/app.py +0 -0
  159. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  160. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  161. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
  162. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
  163. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  164. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  165. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
  166. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  167. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  168. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/weak_signals/__init__.py +0 -0
  169. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/weak_signals/app.py +0 -0
  170. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  171. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  172. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/__init__.py +0 -0
  173. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/agent_utils.py +0 -0
  174. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/newsletter.css +0 -0
  175. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/newsletter_features.py +0 -0
  176. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/newsletter_model.py +0 -0
  177. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  178. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/newsletter_template.html +0 -0
  179. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/openai_client.py +0 -0
  180. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/llm_utils/prompts.py +0 -0
  181. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/metrics/__init__.py +0 -0
  182. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  183. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/metrics/topic_metrics.py +0 -0
  184. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/resources/common_ngrams.json +0 -0
  185. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/resources/stopwords-en.json +0 -0
  186. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/resources/stopwords-fr.json +0 -0
  187. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/resources/stopwords-rte.json +0 -0
  188. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/__init__.py +0 -0
  189. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/authentication.py +0 -0
  190. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/cert.pem +0 -0
  191. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_client.py +0 -0
  192. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/README.md +0 -0
  193. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/__init__.py +0 -0
  194. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  195. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  196. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/config/settings.py +0 -0
  197. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/main.py +0 -0
  198. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/models.py +0 -0
  199. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/requirements.txt +0 -0
  200. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/routers/__init__.py +0 -0
  201. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  202. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  203. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/routers/info.py +0 -0
  204. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/security.py +0 -0
  205. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/start.py +0 -0
  206. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/status.py +0 -0
  207. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_server/stop.py +0 -0
  208. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/embedding_service.py +0 -0
  209. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/key.pem +0 -0
  210. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/.dockerignore +0 -0
  211. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/Docker_setup.md +0 -0
  212. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/Dockerfile +0 -0
  213. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/__init__.py +0 -0
  214. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/dashboard_scheduling.py +0 -0
  215. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/docker-compose.yml +0 -0
  216. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/job_utils/__init__.py +0 -0
  217. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/job_utils/job_functions.py +0 -0
  218. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/models/__init__.py +0 -0
  219. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/models/scheduling_models.py +0 -0
  220. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/requirements.txt +0 -0
  221. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/routers/info.py +0 -0
  222. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/routers/scheduling.py +0 -0
  223. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/scheduling_service.py +0 -0
  224. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/scheduling/start_docker_scheduling_service.sh +0 -0
  225. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summarizer.py +0 -0
  226. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/__init__.py +0 -0
  227. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  228. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  229. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/extractive_summarizer.py +0 -0
  230. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/lexrank.py +0 -0
  231. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary/prompts.py +0 -0
  232. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_client.py +0 -0
  233. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/__init__.py +0 -0
  234. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/config/__init__.py +0 -0
  235. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/config/settings.py +0 -0
  236. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/main.py +0 -0
  237. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/models.py +0 -0
  238. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/routers/__init__.py +0 -0
  239. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/routers/summarize.py +0 -0
  240. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/services/summary_server/start.py +0 -0
  241. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/README_integration_tests.md +0 -0
  242. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/__init__.py +0 -0
  243. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/apps/__init__.py +0 -0
  244. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/apps/test_process_new_data.py +0 -0
  245. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/conftest.py +0 -0
  246. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/__init__.py +0 -0
  247. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_bertrend.py +0 -0
  248. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_data_structure.py +0 -0
  249. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_representative_docs.py +0 -0
  250. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_temporal_metrics_embedding.py +0 -0
  251. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_topic_description.py +0 -0
  252. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_topic_metrics.py +0 -0
  253. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_topic_model.py +0 -0
  254. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_trend_analysis_data_structure.py +0 -0
  255. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_trend_analysis_prompts.py +0 -0
  256. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_trend_analysis_visualizations.py +0 -0
  257. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_trend_analysis_weak_signals.py +0 -0
  258. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/core/test_visualizations.py +0 -0
  259. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/__init__.py +0 -0
  260. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_arxiv_provider.py +0 -0
  261. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_data_provider_utils.py +0 -0
  262. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_deep_research_live.py +0 -0
  263. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_google_news_provider.py +0 -0
  264. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/data_provider/test_rss_atom_provider.py +0 -0
  265. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/demos/__init__.py +0 -0
  266. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/demos/summarization/__init__.py +0 -0
  267. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/__init__.py +0 -0
  268. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_agent_utils.py +0 -0
  269. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_article_scoring.py +0 -0
  270. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_article_scoring_models.py +0 -0
  271. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_newsletter_features.py +0 -0
  272. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/llm/test_newsletter_model.py +0 -0
  273. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/__init__.py +0 -0
  274. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/__init__.py +0 -0
  275. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/test_bertrend_service.py +0 -0
  276. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/test_models.py +0 -0
  277. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/test_routers_bertrend_app.py +0 -0
  278. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/test_routers_info.py +0 -0
  279. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/bertrend/test_routers_newsletters.py +0 -0
  280. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding/__init__.py +0 -0
  281. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding/test_embedding_client.py +0 -0
  282. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding_server/__init__.py +0 -0
  283. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding_server/test_models.py +0 -0
  284. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding_server/test_routers.py +0 -0
  285. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/embedding_server/test_settings.py +0 -0
  286. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/queue/__init__.py +0 -0
  287. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/queue/test_bertrend_worker.py +0 -0
  288. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/queue/test_client.py +0 -0
  289. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/queue/test_queue_manager.py +0 -0
  290. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/scheduling/__init__.py +0 -0
  291. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/scheduling/test_job_exception_fix.py +0 -0
  292. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/scheduling/test_scheduling_service.py +0 -0
  293. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/scheduling/test_stress_test.py +0 -0
  294. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summarizer/__init__.py +0 -0
  295. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +0 -0
  296. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +0 -0
  297. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +0 -0
  298. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summarizer/test_summarizer.py +0 -0
  299. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summary/__init__.py +0 -0
  300. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/services/summary/test_summary_server.py +0 -0
  301. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/test_installation.py +0 -0
  302. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/test_integration.py +0 -0
  303. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/__init__.py +0 -0
  304. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_apscheduler_utils.py +0 -0
  305. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_cache_utils.py +0 -0
  306. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_config_utils.py +0 -0
  307. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_crontab_utils.py +0 -0
  308. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_data_loading.py +0 -0
  309. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_date_utils.py +0 -0
  310. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_lazy_scheduler.py +0 -0
  311. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_mail_utils.py +0 -0
  312. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_multiworker.py +0 -0
  313. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_scheduler_utils.py +0 -0
  314. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/tests/utils/test_utils_init.py +0 -0
  315. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/__init__.py +0 -0
  316. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/data_structure.py +0 -0
  317. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/prompts.py +0 -0
  318. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/representative_docs.py +0 -0
  319. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/topic_description.py +0 -0
  320. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/topic_analysis/visualizations.py +0 -0
  321. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/__init__.py +0 -0
  322. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/data_structure.py +0 -0
  323. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/prompts.py +0 -0
  324. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  325. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  326. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/visualizations.py +0 -0
  327. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/trend_analysis/weak_signals.py +0 -0
  328. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/utils/__init__.py +0 -0
  329. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/utils/cache_utils.py +0 -0
  330. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/utils/config_utils.py +0 -0
  331. {bertrend-0.4.6 → bertrend-0.4.7}/bertrend/utils/data_loading.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bertrend
3
- Version: 0.4.6
3
+ Version: 0.4.7
4
4
  Summary: BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM
5
5
  License: LICENSE.md
6
6
  License-File: AUTHORS.txt
@@ -12,6 +12,7 @@ Maintainer: Jérôme Picault
12
12
  Maintainer-email: jerome.picault@rte-france.com
13
13
  Requires-Python: >=3.12,<4.0
14
14
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
15
+ Classifier: Development Status :: 4 - Beta
15
16
  Requires-Dist: APScheduler (>=3.11.2)
16
17
  Requires-Dist: PyJWT (>=2.11.0)
17
18
  Requires-Dist: SQLAlchemy (>=2.0.46)
@@ -91,6 +92,7 @@ Description-Content-Type: text/markdown
91
92
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
92
93
  ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
93
94
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
95
+ [![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Frte-france%2FBERTrend%2Flines)](https://tokei.kojix2.net/github/rte-france/BERTrend)
94
96
 
95
97
  ## News
96
98
 
@@ -122,7 +124,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
122
124
  topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
123
125
  topics and trends over time.
124
126
 
125
- The code base is illustrated via two main demos:
127
+ The code base is illustrated via three main demos:
126
128
 
127
129
  ### Dynamic Topic Modeling Analysis
128
130
 
@@ -168,6 +170,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
168
170
  - Interpretation of these signals using LLMs
169
171
  - Inspection of the topic merging process using Sankey diagram
170
172
 
173
+ ### Prospective Analysis
174
+
175
+ - [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
176
+ Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
177
+
178
+ #### Prospective Analysis Demonstrator Video
179
+
180
+ (Coming soon)
181
+
182
+ #### Demonstrator Features
183
+
184
+ - Data flow configuration and collection status monitoring
185
+ - Model status and monitoring by information source
186
+ - Real-time signal analysis and trend exploration
187
+ - Detailed topic analysis and interpretation
188
+ - Automated report and newsletter generation
189
+ - Comparative analysis between different periods
190
+
171
191
  ## Installation
172
192
 
173
193
  ### Environment Setup (.env and .venv)
@@ -8,6 +8,7 @@
8
8
  [![PyPi_Version](https://img.shields.io/pypi/v/bertrend.svg)](https://pypi.org/project/bertrend/)
9
9
  ![Static Badge](https://img.shields.io/badge/python-%3E%3D3.12-blue)
10
10
  ![GitHub License](https://img.shields.io/github/license/rte-france/BERTrend)
11
+ [![Lines of Code](https://img.shields.io/endpoint?url=https%3A%2F%2Ftokei.kojix2.net%2Fbadge%2Fgithub%2Frte-france%2FBERTrend%2Flines)](https://tokei.kojix2.net/github/rte-france/BERTrend)
11
12
 
12
13
  ## News
13
14
 
@@ -39,7 +40,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
39
40
  topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
40
41
  topics and trends over time.
41
42
 
42
- The code base is illustrated via two main demos:
43
+ The code base is illustrated via three main demos:
43
44
 
44
45
  ### Dynamic Topic Modeling Analysis
45
46
 
@@ -85,6 +86,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
85
86
  - Interpretation of these signals using LLMs
86
87
  - Inspection of the topic merging process using Sankey diagram
87
88
 
89
+ ### Prospective Analysis
90
+
91
+ - [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
92
+ Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
93
+
94
+ #### Prospective Analysis Demonstrator Video
95
+
96
+ (Coming soon)
97
+
98
+ #### Demonstrator Features
99
+
100
+ - Data flow configuration and collection status monitoring
101
+ - Model status and monitoring by information source
102
+ - Real-time signal analysis and trend exploration
103
+ - Detailed topic analysis and interpretation
104
+ - Automated report and newsletter generation
105
+ - Comparative analysis between different periods
106
+
88
107
  ## Installation
89
108
 
90
109
  ### Environment Setup (.env and .venv)
@@ -364,7 +364,7 @@ class BERTrend:
364
364
  # Check if both timestamps exist in topic models
365
365
  if new_model is None or self.last_topic_model is None:
366
366
  raise ValueError(
367
- f"At least one topic model is not valid. You must fit the BERTrend model before merging models."
367
+ "At least one topic model is not valid. You must fit the BERTrend model before merging models."
368
368
  )
369
369
 
370
370
  # Get default BERTrend config if argument is not provided
@@ -7,6 +7,7 @@ from __future__ import annotations
7
7
 
8
8
  import hashlib
9
9
  import os
10
+ import re
10
11
  from contextlib import contextmanager
11
12
  from datetime import datetime
12
13
  from pathlib import Path
@@ -293,11 +294,15 @@ class APSchedulerUtils(SchedulerUtils):
293
294
 
294
295
  def remove_scrapping_for_user(self, feed_id: str, user: str | None = None):
295
296
  """Removes from the scheduler service the job matching the provided feed_id"""
297
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
296
298
  try:
297
299
  job_ids = self.find_jobs(
298
300
  patterns={
299
301
  "url": ".*/scrape-feed.*",
300
- "json_data": {"user": user, "model_id": feed_id},
302
+ "json_data": {
303
+ "user": re.escape(user),
304
+ "model_id": re.escape(feed_id),
305
+ },
301
306
  }
302
307
  )
303
308
  self.remove_jobs(job_ids)
@@ -308,11 +313,15 @@ class APSchedulerUtils(SchedulerUtils):
308
313
 
309
314
  def remove_scheduled_training_for_user(self, model_id: str, user: str):
310
315
  """Removes from the crontab the training job matching the provided model_id"""
316
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
311
317
  try:
312
318
  job_ids = self.find_jobs(
313
319
  patterns={
314
320
  "url": ".*/train-new-model.*",
315
- "json_data": {"user": user, "model_id": model_id},
321
+ "json_data": {
322
+ "user": re.escape(user),
323
+ "model_id": re.escape(model_id),
324
+ },
316
325
  }
317
326
  )
318
327
  self.remove_jobs(job_ids)
@@ -325,11 +334,15 @@ class APSchedulerUtils(SchedulerUtils):
325
334
  self, model_id: str, user: str
326
335
  ) -> bool:
327
336
  """Removes from the crontab the report generation job matching the provided model_id"""
337
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
328
338
  try:
329
339
  job_ids = self.find_jobs(
330
340
  patterns={
331
341
  "url": ".*/generate-report.*",
332
- "json_data": {"user": user, "model_id": model_id},
342
+ "json_data": {
343
+ "user": re.escape(user),
344
+ "model_id": re.escape(model_id),
345
+ },
333
346
  }
334
347
  )
335
348
  self.remove_jobs(job_ids)
@@ -342,11 +355,15 @@ class APSchedulerUtils(SchedulerUtils):
342
355
  self, feed_id: str, user: str | None = None
343
356
  ) -> bool:
344
357
  """Checks if a given scrapping feed is active (registered with the service)."""
358
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
345
359
  try:
346
360
  job_ids = self.find_jobs(
347
361
  patterns={
348
362
  "url": ".*/scrape-feed.*",
349
- "json_data": {"user": user, "model_id": feed_id},
363
+ "json_data": {
364
+ "user": re.escape(user),
365
+ "model_id": re.escape(feed_id),
366
+ },
350
367
  }
351
368
  )
352
369
  return len(job_ids) > 0
@@ -358,11 +375,15 @@ class APSchedulerUtils(SchedulerUtils):
358
375
 
359
376
  def check_if_learning_active_for_user(self, model_id: str, user: str) -> bool:
360
377
  """Checks if a given scrapping feed is active (registered in the crontab"""
378
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
361
379
  try:
362
380
  job_ids = self.find_jobs(
363
381
  patterns={
364
382
  "url": ".*/train-new-model.*",
365
- "json_data": {"user": user, "model_id": model_id},
383
+ "json_data": {
384
+ "user": re.escape(user),
385
+ "model_id": re.escape(model_id),
386
+ },
366
387
  }
367
388
  )
368
389
  return len(job_ids) > 0
@@ -376,11 +397,15 @@ class APSchedulerUtils(SchedulerUtils):
376
397
  self, model_id: str, user: str
377
398
  ) -> bool:
378
399
  """Checks if automated report generation is active (registered in the crontab)"""
400
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
379
401
  try:
380
402
  job_ids = self.find_jobs(
381
403
  patterns={
382
404
  "url": ".*/generate-report.*",
383
- "json_data": {"user": user, "model_id": model_id},
405
+ "json_data": {
406
+ "user": re.escape(user),
407
+ "model_id": re.escape(model_id),
408
+ },
384
409
  }
385
410
  )
386
411
  return len(job_ids) > 0
@@ -394,11 +419,15 @@ class APSchedulerUtils(SchedulerUtils):
394
419
  self, feed_id: str, user: str | None = None
395
420
  ) -> datetime | None:
396
421
  """Return the next scrapping date for the given feed_id and user"""
422
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
397
423
  try:
398
424
  jobs = self.find_jobs_description(
399
425
  patterns={
400
426
  "url": ".*/scrape-feed.*",
401
- "json_data": {"user": user, "model_id": feed_id},
427
+ "json_data": {
428
+ "user": re.escape(user),
429
+ "model_id": re.escape(feed_id),
430
+ },
402
431
  }
403
432
  )
404
433
  if len(jobs) == 0:
@@ -414,11 +443,15 @@ class APSchedulerUtils(SchedulerUtils):
414
443
  self, model_id: str, user: str | None = None
415
444
  ) -> datetime | None:
416
445
  """Return the next scrapping date for the given feed_id and user"""
446
+ # NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
417
447
  try:
418
448
  jobs = self.find_jobs_description(
419
449
  patterns={
420
450
  "url": ".*/train-new-model.*",
421
- "json_data": {"user": user, "model_id": model_id},
451
+ "json_data": {
452
+ "user": re.escape(user),
453
+ "model_id": re.escape(model_id),
454
+ },
422
455
  }
423
456
  )
424
457
  if len(jobs) == 0:
@@ -31,7 +31,7 @@ def show() -> None:
31
31
  except Exception as e:
32
32
  logger.error(e)
33
33
  st.error(
34
- f"Erreur lors du chargement des données. Vérifiez que vos données respectent le format Curebot attendu."
34
+ "Erreur lors du chargement des données. Vérifiez que vos données respectent le format Curebot attendu."
35
35
  )
36
36
 
37
37
  # If data is loaded
@@ -45,7 +45,7 @@ def show() -> None:
45
45
  st.button(
46
46
  "Éditer",
47
47
  on_click=edit_newsletter,
48
- disabled=not "newsletter_text" in st.session_state,
48
+ disabled="newsletter_text" not in st.session_state,
49
49
  )
50
50
 
51
51
  # Show newsletter download button
@@ -65,7 +65,7 @@ def show() -> None:
65
65
  file_name="newsletters.html",
66
66
  mime="text/html",
67
67
  data=data,
68
- disabled=not "newsletter_text" in st.session_state,
68
+ disabled="newsletter_text" not in st.session_state,
69
69
  )
70
70
 
71
71
  # Show newsletter
@@ -3,14 +3,17 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
  import hmac
6
+ import os
6
7
 
7
8
  import streamlit as st
8
9
 
9
- from bertrend.demos.demos_utils.icons import UNHAPPY_ICON
10
+ from bertrend.bertrend_apps.prospective_demo.i18n import translate
11
+ from bertrend.demos.demos_utils.icons import EMAIL_ICON, UNHAPPY_ICON
10
12
 
11
13
 
12
14
  def login_form():
13
15
  """Form with widgets to collect user information"""
16
+ st.header("")
14
17
  with st.form("Credentials"):
15
18
  st.text_input("Username", key="username")
16
19
  st.text_input("Password", type="password", key="password")
@@ -38,6 +41,16 @@ def logout():
38
41
  del st.session_state["username"]
39
42
 
40
43
 
44
+ def show_contact_info():
45
+ contact = os.getenv("BERTREND_CONTACT_EMAIL", "contact@bertrend.com")
46
+ st.link_button(translate("contact_msg"), f"mailto:{contact}", icon=EMAIL_ICON)
47
+
48
+
49
+ def show_project_info():
50
+ st.write("")
51
+ st.markdown(translate("project_info_msg"))
52
+
53
+
41
54
  def check_password() -> str | None:
42
55
  """Returns the user name if the user had a correct password, otherwise None."""
43
56
 
@@ -49,4 +62,8 @@ def check_password() -> str | None:
49
62
  login_form()
50
63
  if "password_correct" in st.session_state:
51
64
  st.error(f"{UNHAPPY_ICON} User not known or password incorrect")
65
+
66
+ show_contact_info()
67
+
68
+ show_project_info()
52
69
  return None
@@ -20,6 +20,7 @@ from bertrend.bertrend_apps.prospective_demo.feeds_common import (
20
20
  read_user_feeds,
21
21
  )
22
22
  from bertrend.bertrend_apps.prospective_demo.i18n import translate
23
+ from bertrend.bertrend_apps.prospective_demo.models_info import delete_model_config
23
24
  from bertrend.config.parameters import LANGUAGES
24
25
  from bertrend.demos.demos_utils.icons import (
25
26
  ADD_ICON,
@@ -337,7 +338,6 @@ def handle_delete(row_dict: dict):
337
338
  feed_id=feed_id, user=st.session_state.username
338
339
  )
339
340
  delete_feed_config(feed_id)
340
- logger.info(f"Flux {feed_id} supprimé !")
341
341
  # Remove from crontab associated training
342
342
  SCHEDULER_UTILS.remove_scheduled_training_for_user(
343
343
  model_id=feed_id, user=st.session_state.username
@@ -349,6 +349,8 @@ def handle_delete(row_dict: dict):
349
349
  SCHEDULER_UTILS.remove_scheduled_report_generation_for_user(
350
350
  model_id=feed_id, user=st.session_state.username
351
351
  )
352
+ delete_model_config(feed_id)
353
+ logger.info(f"Flux {feed_id} supprimé !")
352
354
  time.sleep(0.2)
353
355
  st.rerun()
354
356
  with col2:
@@ -3,10 +3,18 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
  TRANSLATIONS = {
6
+ "project_info_msg": {
7
+ "fr": "BERTrend est un projet open-source développé par RTE. Visitez notre github pour plus d'informations: https://github.com/rte-france/BERTrend",
8
+ "en": "BERTrend is an open-source project developed by RTE. Visit our github for more information: https://github.com/rte-france/BERTrend",
9
+ },
10
+ "contact_msg": {
11
+ "en": "Questions, new account or bug reports? Contact us !",
12
+ "fr": "Des questions, un nouveau compte ou des rapports de bugs ? Contactez-nous !",
13
+ },
6
14
  # App.py translations
7
15
  "app_title": {
8
- "fr": "BERTrend - Démo Veille & Analyse",
9
- "en": "BERTrend - Monitoring & Analysis Demo",
16
+ "fr": "BERTrend - IA pour la Veille (Analyses & Tendances)",
17
+ "en": "BERTrend - AI for Monitoring, Analysis & Trends",
10
18
  },
11
19
  "check_data_button_label": {"fr": "Vérifier les données", "en": "Check data"},
12
20
  "tab_monitoring": {"fr": "Veilles", "en": "Monitoring"},
@@ -13,6 +13,16 @@ import toml
13
13
  from loguru import logger
14
14
 
15
15
  from bertrend import load_toml_config
16
+ from bertrend.bertrend_apps import SCHEDULER_UTILS
17
+ from bertrend.bertrend_apps.prospective_demo import (
18
+ DEFAULT_ANALYSIS_CFG,
19
+ get_model_cfg_path,
20
+ get_user_models_path,
21
+ )
22
+ from bertrend.bertrend_apps.prospective_demo.i18n import translate
23
+ from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
24
+ from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
25
+ from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
16
26
  from bertrend.config.parameters import LANGUAGES
17
27
  from bertrend.demos.demos_utils.icons import (
18
28
  DELETE_ICON,
@@ -28,16 +38,6 @@ from bertrend.demos.streamlit_components.clickable_df_component import clickable
28
38
  from bertrend.demos.streamlit_components.input_with_pills_component import (
29
39
  input_with_pills,
30
40
  )
31
- from bertrend.bertrend_apps import SCHEDULER_UTILS
32
- from bertrend.bertrend_apps.prospective_demo import (
33
- DEFAULT_ANALYSIS_CFG,
34
- get_model_cfg_path,
35
- get_user_models_path,
36
- )
37
- from bertrend.bertrend_apps.prospective_demo.i18n import translate
38
- from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
39
- from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
40
- from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
41
41
 
42
42
 
43
43
  @st.cache_data(ttl=60)
@@ -302,6 +302,17 @@ def save_model_config(model_id: str, config: dict):
302
302
  logger.debug(f"Saved model analysis config {config} to {model_cfg_path}")
303
303
 
304
304
 
305
+ def delete_model_config(model_id: str):
306
+ model_cfg_path = get_model_cfg_path(
307
+ user_name=st.session_state.username, model_id=model_id
308
+ )
309
+ if os.path.exists(model_cfg_path):
310
+ os.remove(model_cfg_path)
311
+ logger.info(f"Model config {model_id} removed")
312
+ else:
313
+ logger.warning(f"Model config {model_id} not found")
314
+
315
+
305
316
  @st.dialog(translate("dialog_confirmation"))
306
317
  def handle_delete_models(row_dict: dict):
307
318
  """Function to handle remove models from cache"""
@@ -14,14 +14,6 @@ from loguru import logger
14
14
  from bertrend import FEED_BASE_PATH, load_toml_config
15
15
  from bertrend.BERTopicModel import BERTopicModel
16
16
  from bertrend.BERTrend import BERTrend, train_new_data
17
- from bertrend.services.embedding_service import EmbeddingService
18
- from bertrend.trend_analysis.weak_signals import analyze_signal
19
- from bertrend.utils.data_loading import (
20
- TEXT_COLUMN,
21
- group_by_days,
22
- load_data,
23
- split_data,
24
- )
25
17
  from bertrend.bertrend_apps.prospective_demo import (
26
18
  LLM_TOPIC_DESCRIPTION_COLUMN,
27
19
  LLM_TOPIC_TITLE_COLUMN,
@@ -37,6 +29,14 @@ from bertrend.bertrend_apps.prospective_demo import (
37
29
  from bertrend.bertrend_apps.prospective_demo.llm_utils import (
38
30
  generate_bertrend_topic_description,
39
31
  )
32
+ from bertrend.services.embedding_service import EmbeddingService
33
+ from bertrend.trend_analysis.weak_signals import analyze_signal
34
+ from bertrend.utils.data_loading import (
35
+ TEXT_COLUMN,
36
+ group_by_days,
37
+ load_data,
38
+ split_data,
39
+ )
40
40
 
41
41
  DEFAULT_TOP_K = 5
42
42
 
@@ -236,7 +236,7 @@ def train_new_model_for_period(
236
236
  reference_timestamp: pd.Timestamp,
237
237
  ):
238
238
  logger.info(
239
- f"Training BERTrend model with new data - user: {user_name}, model_id: {model_id}, reference_timestamp: {reference_timestamp}..."
239
+ f"[U:{user_name}|M:{model_id}|TS:{reference_timestamp}] Training BERTrend model with new data..."
240
240
  )
241
241
  # Initialization of embedding service
242
242
  # TODO: customize service (lang, etc)
@@ -317,17 +317,24 @@ def train_new_model_for_period(
317
317
 
318
318
  output_path = interpretation_path / f"{df_name}.parquet"
319
319
  df.to_parquet(output_path)
320
- logger.success(f"{df_name} saved to: {output_path}")
321
-
322
- # Obtain detailed LLM-based interpretion for signals
323
- generate_llm_interpretation(
324
- bertrend,
325
- reference_timestamp=reference_timestamp,
326
- df=df,
327
- df_name=df_name,
328
- output_path=interpretation_path,
320
+ logger.success(
321
+ f"[U:{user_name}|M:{model_id}|TS:{reference_timestamp}] {df_name} saved to: {output_path}"
329
322
  )
330
323
 
324
+ # Do not generate LLM interpretation for NOISE
325
+ if df_name != NOISE:
326
+ # Obtain detailed LLM-based interpretion for signals
327
+ logger.info(
328
+ f"[U:{user_name}|M:{model_id}|TS:{reference_timestamp}] Generating LLM interpretation for {df_name}"
329
+ )
330
+ generate_llm_interpretation(
331
+ bertrend,
332
+ reference_timestamp=reference_timestamp,
333
+ df=df,
334
+ df_name=df_name,
335
+ output_path=interpretation_path,
336
+ )
337
+
331
338
 
332
339
  def regenerate_models(
333
340
  model_id: str, user: str, with_analysis: bool = True, since: pd.Timestamp = None
@@ -335,8 +342,7 @@ def regenerate_models(
335
342
  """Regenerate from scratch (method retrospective) the models associated with the specified model identifier
336
343
  for the specified user."""
337
344
  logger.info(
338
- f"Regenerating models for user '{user}' about '{model_id}', "
339
- f"with analysis: {with_analysis}..."
345
+ f"[U:{user}|M:{model_id}] Regenerating models, with analysis: {with_analysis}..."
340
346
  )
341
347
  # Get relevant model info from config
342
348
  model_config = get_model_config(model_id=model_id, user=user)
@@ -346,12 +352,14 @@ def regenerate_models(
346
352
 
347
353
  # Load model config
348
354
  df = load_all_data(model_id=model_id, user=user, language_code=language_code)
349
- logger.info(f"Size of dataset: {len(df)}")
355
+ logger.info(f"[U:{user}|M:{model_id}] Size of dataset: {len(df)}")
350
356
 
351
357
  if since:
352
358
  # Keep only the most recent data
353
359
  df = df[df["timestamp"] >= since]
354
- logger.info(f"Size of dataset (after date {since}): {len(df)}")
360
+ logger.info(
361
+ f"[U:{user}|M:{model_id}] Size of dataset (after date {since}): {len(df)}"
362
+ )
355
363
 
356
364
  # Split data by paragraphs
357
365
  if split_by_paragraph:
@@ -392,7 +400,7 @@ def regenerate_models(
392
400
  bertrend.save_model(models_path=bertrend_models_path)
393
401
 
394
402
  logger.success(
395
- f"Regenerated models for '{model_id}' from scratch. BERTrend model was built using {len(bertrend.doc_groups)} models/time periods."
403
+ f"[U:{user}|M:{model_id}] Regenerated models from scratch. BERTrend model was built using {len(bertrend.doc_groups)} models/time periods."
396
404
  )
397
405
 
398
406
  else: # with analysis
@@ -405,7 +413,7 @@ def regenerate_models(
405
413
  )
406
414
 
407
415
  logger.success(
408
- f"Regenerated models for '{model_id}' from scratch with LLM-based analysis. BERTrend model was built using {len(grouped_data)} models/time periods."
416
+ f"[U:{user}|M:{model_id}] Regenerated models from scratch with LLM-based analysis. BERTrend model was built using {len(grouped_data)} models/time periods."
409
417
  )
410
418
 
411
419
 
@@ -419,7 +427,7 @@ def train_new_model(
419
427
  Returns:
420
428
  dict with keys: status, message, and optionally error details
421
429
  """
422
- logger.info(f'Processing new data for user "{user_name}" about "{model_id}"...')
430
+ logger.info(f"[U:{user_name}|M:{model_id}] Processing new data...")
423
431
 
424
432
  # Get relevant model info from config
425
433
  model_config = get_model_config(model_id=model_id, user=user_name)
@@ -427,7 +435,9 @@ def train_new_model(
427
435
  language_code = model_config["language"]
428
436
  split_by_paragraph = model_config.get("split_by_paragraph", True)
429
437
 
430
- logger.info(f"Splitting data by paragraphs: {split_by_paragraph}")
438
+ logger.info(
439
+ f"[U:{user_name}|M:{model_id}] Splitting data by paragraphs: {split_by_paragraph}"
440
+ )
431
441
 
432
442
  # Load data for last period
433
443
  new_data = load_all_data(
@@ -437,7 +447,7 @@ def train_new_model(
437
447
  if new_data is None or new_data.empty:
438
448
  return {
439
449
  "status": "no_data",
440
- "message": f"No new data found for model '{model_id}'",
450
+ "message": f"[U:{user_name}|M:{model_id}] No new data found.",
441
451
  }
442
452
 
443
453
  # Filter data according to granularity
@@ -463,7 +473,7 @@ def train_new_model(
463
473
 
464
474
  return {
465
475
  "status": "success",
466
- "message": f"Successfully trained new model for user '{user_name}' and model '{model_id}'",
476
+ "message": f"[U:{user_name}|M:{model_id}|TS:{reference_timestamp}] Successfully trained new model",
467
477
  }
468
478
 
469
479
 
@@ -29,6 +29,6 @@ def get_file_logger(id: str, user_name: str = "", model_id: str = "") -> int:
29
29
  level="DEBUG",
30
30
  format="<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
31
31
  colorize=True,
32
- retention="60 days", # Remove automatically logs after x days
32
+ retention="90 days", # Remove automatically logs after x days
33
33
  )
34
34
  return logger_id
@@ -1,3 +1,3 @@
1
1
  host = "0.0.0.0"
2
- port = 8885
2
+ port = 8886
3
3
  number_workers = 1
@@ -4,6 +4,7 @@
4
4
  # This file is part of BERTrend.
5
5
 
6
6
  from fastapi import APIRouter
7
+ from starlette.responses import RedirectResponse
7
8
 
8
9
  from bertrend.services.summary_server.models import SummarizerInfo
9
10
  from bertrend.services.summary_server.routers.summarize import (
@@ -19,6 +20,12 @@ def health():
19
20
  return {"status": "ok"}
20
21
 
21
22
 
23
+ @router.get("/", summary="Redirect to API documentation")
24
+ def root():
25
+ """Redirect root path to /docs"""
26
+ return RedirectResponse(url="/docs")
27
+
28
+
22
29
  @router.get("/summarizers", response_model=list[SummarizerInfo])
23
30
  def list_summarizers():
24
31
  return [
@@ -3,7 +3,7 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
 
6
- from unittest.mock import MagicMock, patch
6
+ from unittest.mock import patch
7
7
 
8
8
  import pytest
9
9
 
@@ -3,9 +3,6 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
 
6
- import json
7
- import os
8
- from pathlib import Path
9
6
  from unittest.mock import MagicMock, patch
10
7
 
11
8
  import pytest
@@ -3,9 +3,8 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
 
6
- from unittest.mock import AsyncMock, MagicMock, patch
6
+ from unittest.mock import MagicMock, patch
7
7
 
8
- import pytest
9
8
 
10
9
  from bertrend.bertrend_apps.data_provider.deep_research_provider import (
11
10
  DeepResearchProvider,
@@ -3,7 +3,7 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
 
6
- from unittest.mock import MagicMock, patch
6
+ from unittest.mock import patch
7
7
 
8
8
  import pytest
9
9
 
@@ -5,7 +5,6 @@
5
5
 
6
6
  from unittest.mock import MagicMock, patch
7
7
 
8
- import pytest
9
8
 
10
9
  from bertrend.demos.summarization.summarizer_app import (
11
10
  DEFAULT_TEXT,