bertrend 0.3.18__tar.gz → 0.3.20__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 (228) hide show
  1. {bertrend-0.3.18 → bertrend-0.3.20}/PKG-INFO +35 -13
  2. {bertrend-0.3.18 → bertrend-0.3.20}/README.md +30 -9
  3. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/BERTopicModel.py +1 -1
  4. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/__init__.py +13 -0
  5. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/config/services_default_config.toml +3 -3
  6. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/data_loading_component.py +1 -1
  7. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/icons.py +5 -0
  8. bertrend-0.3.20/bertrend/demos/start_summarizer_app.sh +9 -0
  9. bertrend-0.3.20/bertrend/demos/streamlit_components/input_with_pills_component.py +101 -0
  10. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/summarization/summarizer_app.py +8 -4
  11. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +4 -4
  12. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +1 -1
  13. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +8 -8
  14. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +3 -3
  15. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/training_page.py +1 -1
  16. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/weak_signals/app.py +8 -8
  17. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/weak_signals/visualizations_utils.py +6 -6
  18. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/agent_utils.py +28 -4
  19. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/newsletter_features.py +1 -1
  20. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/newsletter_template.html +2 -6
  21. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/openai_client.py +87 -30
  22. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_client.py +3 -0
  23. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/security.py +1 -1
  24. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_service.py +3 -0
  25. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summary/chatgpt_summarizer.py +6 -12
  26. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summary/extractive_summarizer.py +3 -3
  27. bertrend-0.3.20/bertrend/services/summary/prompts.py +43 -0
  28. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_agent_utils.py +7 -3
  29. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_chatgpt_summarizer.py +4 -4
  30. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_data_structure.py +1 -1
  31. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_extractive_summarizer.py +2 -2
  32. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_newsletter_features.py +6 -6
  33. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_openai_client.py +13 -13
  34. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_topic_description.py +3 -3
  35. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/topic_description.py +1 -1
  36. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/signal_llm_template_en.html +2 -2
  37. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/weak_signals.py +1 -1
  38. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/utils/config_utils.py +5 -0
  39. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/common/crontab_utils.py +5 -2
  40. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/__main__.py +14 -8
  41. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/arxiv_provider.py +3 -0
  42. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/data_provider.py +4 -1
  43. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/newscatcher_provider.py +3 -0
  44. bertrend-0.3.20/bertrend_apps/data_provider/rss_feed_provider.py +107 -0
  45. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/app_utils.py +3 -3
  46. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/tabs/tab2.py +1 -1
  47. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/spacy/utils.py +3 -0
  48. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/__init__.py +7 -0
  49. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/app.py +7 -1
  50. bertrend-0.3.20/bertrend_apps/prospective_demo/automated_report_generation.py +351 -0
  51. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/dashboard_common.py +1 -1
  52. bertrend-0.3.20/bertrend_apps/prospective_demo/dashboard_comparative.py +731 -0
  53. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/dashboard_signals.py +1 -1
  54. bertrend-0.3.20/bertrend_apps/prospective_demo/docs/automated_report_generation.md +289 -0
  55. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/feeds_config.py +13 -2
  56. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/feeds_data.py +49 -7
  57. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/i18n_translations.py +121 -0
  58. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/models_info.py +219 -57
  59. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/process_new_data.py +36 -33
  60. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/report_generation.py +2 -18
  61. bertrend-0.3.20/bertrend_apps/prospective_demo/utils.py +11 -0
  62. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/tests/test_process_new_data.py +57 -39
  63. {bertrend-0.3.18 → bertrend-0.3.20}/pyproject.toml +5 -4
  64. bertrend-0.3.18/bertrend/demos/start_summarizer_app.sh +0 -9
  65. bertrend-0.3.18/bertrend/demos/streamlit_components/input_with_pills_components.py +0 -83
  66. bertrend-0.3.18/bertrend/services/summary/prompts.py +0 -43
  67. {bertrend-0.3.18 → bertrend-0.3.20}/AUTHORS.txt +0 -0
  68. {bertrend-0.3.18 → bertrend-0.3.20}/LICENSE.md +0 -0
  69. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/BERTrend.py +0 -0
  70. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/article_scoring/__init__.py +0 -0
  71. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/article_scoring/article_scoring.py +0 -0
  72. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/article_scoring/prompts.py +0 -0
  73. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/article_scoring/scoring_agent.py +0 -0
  74. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/config/bertopic_default_config.toml +0 -0
  75. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/config/bertrend_default_config.toml +0 -0
  76. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/config/parameters.py +0 -0
  77. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/__init__.py +0 -0
  78. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/__init__.py +0 -0
  79. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  80. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/i18n.py +0 -0
  81. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  82. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  83. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/demos_utils/state_utils.py +0 -0
  84. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  85. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/start_weak_signals_app.sh +0 -0
  86. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/streamlit_components/__init__.py +0 -0
  87. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/streamlit_components/clickable_df_component.py +0 -0
  88. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/summarization/__init__.py +0 -0
  89. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  90. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/__init__.py +0 -0
  91. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/app.py +0 -0
  92. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  93. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  94. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  95. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  96. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/weak_signals/__init__.py +0 -0
  97. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  98. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/__init__.py +0 -0
  99. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/newsletter.css +0 -0
  100. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/newsletter_model.py +0 -0
  101. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  102. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/llm_utils/prompts.py +0 -0
  103. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/metrics/__init__.py +0 -0
  104. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  105. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/metrics/topic_metrics.py +0 -0
  106. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/resources/common_ngrams.json +0 -0
  107. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/resources/stopwords-en.json +0 -0
  108. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/resources/stopwords-fr.json +0 -0
  109. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/resources/stopwords-rte.json +0 -0
  110. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/__init__.py +0 -0
  111. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/authentication.py +0 -0
  112. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/cert.pem +0 -0
  113. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/README.md +0 -0
  114. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/__init__.py +0 -0
  115. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  116. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  117. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/config/settings.py +0 -0
  118. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/main.py +0 -0
  119. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/models.py +0 -0
  120. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/requirements.txt +0 -0
  121. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/routers/__init__.py +0 -0
  122. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  123. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  124. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/routers/info.py +0 -0
  125. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/start.py +0 -0
  126. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/status.py +0 -0
  127. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/embedding_server/stop.py +0 -0
  128. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/key.pem +0 -0
  129. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summarizer.py +0 -0
  130. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summary/__init__.py +0 -0
  131. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  132. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/services/summary/lexrank.py +0 -0
  133. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/README_integration_tests.md +0 -0
  134. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/__init__.py +0 -0
  135. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/conftest.py +0 -0
  136. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_abstractive_summarizer.py +0 -0
  137. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_article_scoring.py +0 -0
  138. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_article_scoring_models.py +0 -0
  139. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_bertrend.py +0 -0
  140. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_cache_utils.py +0 -0
  141. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_config_utils.py +0 -0
  142. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_data_loading.py +0 -0
  143. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_embedding_client.py +0 -0
  144. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_installation.py +0 -0
  145. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_integration.py +0 -0
  146. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_mail_utils.py +0 -0
  147. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_newsletter_model.py +0 -0
  148. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_representative_docs.py +0 -0
  149. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_summarizer.py +0 -0
  150. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_temporal_metrics_embedding.py +0 -0
  151. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_topic_metrics.py +0 -0
  152. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_topic_model.py +0 -0
  153. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_trend_analysis_data_structure.py +0 -0
  154. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_trend_analysis_prompts.py +0 -0
  155. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_trend_analysis_visualizations.py +0 -0
  156. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_trend_analysis_weak_signals.py +0 -0
  157. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_utils_init.py +0 -0
  158. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/tests/test_visualizations.py +0 -0
  159. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/__init__.py +0 -0
  160. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/data_structure.py +0 -0
  161. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/prompts.py +0 -0
  162. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/representative_docs.py +0 -0
  163. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/topic_analysis/visualizations.py +0 -0
  164. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/__init__.py +0 -0
  165. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/data_structure.py +0 -0
  166. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/prompts.py +0 -0
  167. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  168. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/trend_analysis/visualizations.py +0 -0
  169. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/utils/__init__.py +0 -0
  170. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/utils/cache_utils.py +0 -0
  171. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend/utils/data_loading.py +0 -0
  172. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/__init__.py +0 -0
  173. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/common/__init__.py +0 -0
  174. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/common/mail_utils.py +0 -0
  175. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  176. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  177. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  178. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  179. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  180. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  181. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  182. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  183. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/decarbonation_newsletter_from_scratch.toml +0 -0
  184. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  185. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  186. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  187. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  188. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/config/newsletters/rte_newsletter_from_scratch.toml +0 -0
  189. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/__init__.py +0 -0
  190. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  191. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  192. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/google_news_provider.py +0 -0
  193. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/data_provider/utils.py +0 -0
  194. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/__init__.py +0 -0
  195. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  196. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/__init__.py +0 -0
  197. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/app.py +0 -0
  198. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/config.toml +0 -0
  199. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  200. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/prompts.py +0 -0
  201. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  202. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  203. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
  204. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/dataviz/Main_page.py +0 -0
  205. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/dataviz/__init__.py +0 -0
  206. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/dataviz/pages/1_Data_feeds.py +0 -0
  207. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/__init__.py +0 -0
  208. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/entity_utils.py +0 -0
  209. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/spacy/__init__.py +0 -0
  210. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/spacy/common_factory.py +0 -0
  211. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/spacy/dbpedia.py +0 -0
  212. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/exploration/geolocalization/spacy/nlp.config +0 -0
  213. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  214. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/newsletters/__init__.py +0 -0
  215. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/newsletters/__main__.py +0 -0
  216. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  217. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/.streamlit/secrets.toml +0 -0
  218. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/authentication.py +0 -0
  219. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  220. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/data_model.py +0 -0
  221. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/detailed_report_template.html +0 -0
  222. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  223. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  224. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  225. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  226. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/start_apps.sh +0 -0
  227. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/stop_apps.sh +0 -0
  228. {bertrend-0.3.18 → bertrend-0.3.20}/bertrend_apps/tests/__init__.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bertrend
3
- Version: 0.3.18
3
+ Version: 0.3.20
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
7
7
  License-File: LICENSE.md
8
- Keywords: topics,BERTopic,transformers,weak signals,LLM
8
+ Keywords: topics,BERTopic,transformers,weak signals,LLM,trend analysis
9
9
  Author: Jérôme Picault
10
10
  Author-email: jerome.picault@rte-france.com
11
11
  Maintainer: Jérôme Picault
@@ -44,7 +44,7 @@ Requires-Dist: newspaper4k (>=0.9.3.1) ; extra == "apps"
44
44
  Requires-Dist: nltk (>=3.9.1)
45
45
  Requires-Dist: numpy (<2)
46
46
  Requires-Dist: openai (>=1.77.0)
47
- Requires-Dist: openai-agents[litellm] (>=0.2.5)
47
+ Requires-Dist: openai-agents[litellm] (>=0.4.0)
48
48
  Requires-Dist: openpyxl (>=3.1.5)
49
49
  Requires-Dist: opentelemetry-exporter-otlp-proto-grpc (==1.25.0)
50
50
  Requires-Dist: pandas (>=2.2.2)
@@ -55,6 +55,7 @@ Requires-Dist: pygooglenews (>=0.1.3) ; extra == "apps"
55
55
  Requires-Dist: pylabeladjust (==0.1.13)
56
56
  Requires-Dist: pytest (>=8.4.0)
57
57
  Requires-Dist: pytest-asyncio
58
+ Requires-Dist: python-dotenv (>=1.1.1)
58
59
  Requires-Dist: requests (>=2.32.3)
59
60
  Requires-Dist: scikit-learn (>=1.5.2)
60
61
  Requires-Dist: scipy (==1.12)
@@ -62,7 +63,7 @@ Requires-Dist: seaborn (>=0.13.2)
62
63
  Requires-Dist: sentence-transformers (==3.0.1)
63
64
  Requires-Dist: sentencepiece (>=0.2.0)
64
65
  Requires-Dist: starlette (>=0.46.2)
65
- Requires-Dist: streamlit (>=1.48)
66
+ Requires-Dist: streamlit (>=1.50)
66
67
  Requires-Dist: streamlit-code-editor (>=0.1.22)
67
68
  Requires-Dist: supervisor (>=4.3.0)
68
69
  Requires-Dist: thefuzz (>=0.22.1)
@@ -150,15 +151,36 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
150
151
 
151
152
  ## Installation
152
153
 
153
- ### Environment Variables
154
-
155
- BERTrend requires the following environment variables to be set:
156
-
157
- - `BERTREND_BASE_DIR`: the home directory for BERTrend data, models, and logs
158
- - OpenAI variables (for LLM integration):
159
- - `OPENAI_API_KEY`: the API key for your LLM deployment
160
- - `OPENAI_ENDPOINT`: the endpoint for your LLM deployment (empty if using OpenAI services)
161
- - `OPENAI_DEFAULT_MODEL_NAME`: the name of the default LLM model to use
154
+ ### Environment Setup (.env and .venv)
155
+
156
+ BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load environment variables automatically using `python-dotenv`.
157
+
158
+ Recommended steps:
159
+
160
+ 1. Create and fill your `.env` at the repo root (a template is provided):
161
+ - Copy `.env` and set your values (do not commit secrets).
162
+ - Common keys:
163
+ - `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
164
+ - OpenAI/LLM:
165
+ - `OPENAI_API_KEY`
166
+ - `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
167
+ - `OPENAI_DEFAULT_MODEL`
168
+ - Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
169
+ - Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`, `CLIENT_REGISTRY_FILE`
170
+ - Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
171
+ - Misc: `CUDA_VISIBLE_DEVICES`
172
+ 2. Use a virtual environment and install dependencies inside it:
173
+ ```bash
174
+ python -m venv .venv
175
+ source .venv/bin/activate # Windows: .venv\\Scripts\\activate
176
+ pip install -U pip
177
+ pip install . # or pip install ".[apps]"
178
+ pip install python-dotenv # ensures .env is auto-loaded
179
+ ```
180
+ 3. Notes
181
+ - If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via your shell/runner.
182
+ - Scheduled jobs created from the apps use the exact interpreter of your active environment (`sys.executable`), ensuring `.venv/bin/python` is used. Keep your venv path stable on the machine running cron.
183
+ - Cron entries source your shell profile and pass through any required variables. You can also rely on `.env` for most settings.
162
184
 
163
185
  ### Hardware and Software Requirements
164
186
 
@@ -69,15 +69,36 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
69
69
 
70
70
  ## Installation
71
71
 
72
- ### Environment Variables
73
-
74
- BERTrend requires the following environment variables to be set:
75
-
76
- - `BERTREND_BASE_DIR`: the home directory for BERTrend data, models, and logs
77
- - OpenAI variables (for LLM integration):
78
- - `OPENAI_API_KEY`: the API key for your LLM deployment
79
- - `OPENAI_ENDPOINT`: the endpoint for your LLM deployment (empty if using OpenAI services)
80
- - `OPENAI_DEFAULT_MODEL_NAME`: the name of the default LLM model to use
72
+ ### Environment Setup (.env and .venv)
73
+
74
+ BERTrend now supports configuration via a repository-level `.env` file. On import, the package attempts to load environment variables automatically using `python-dotenv`.
75
+
76
+ Recommended steps:
77
+
78
+ 1. Create and fill your `.env` at the repo root (a template is provided):
79
+ - Copy `.env` and set your values (do not commit secrets).
80
+ - Common keys:
81
+ - `BERTREND_BASE_DIR`: base directory for BERTrend data/models/logs
82
+ - OpenAI/LLM:
83
+ - `OPENAI_API_KEY`
84
+ - `OPENAI_BASE_URL` (optional for OpenAI-compatible providers such as LiteLLM and Azure)
85
+ - `OPENAI_DEFAULT_MODEL`
86
+ - Providers (optional): `SEMANTIC_SCHOLAR_API_KEY`, `NEWSCATCHER_API_KEY`, `DBPEDIA_REST_API_URL`
87
+ - Embedding service security (optional): `BERTREND_SECRET_KEY`, `DEFAULT_RATE_LIMIT`, `DEFAULT_RATE_WINDOW`, `CLIENT_REGISTRY_FILE`
88
+ - Email (optional): `BERTREND_EMAIL_BACKEND`, `GMAIL_*`, `SMTP_*`, `SENDGRID_API_KEY`
89
+ - Misc: `CUDA_VISIBLE_DEVICES`
90
+ 2. Use a virtual environment and install dependencies inside it:
91
+ ```bash
92
+ python -m venv .venv
93
+ source .venv/bin/activate # Windows: .venv\\Scripts\\activate
94
+ pip install -U pip
95
+ pip install . # or pip install ".[apps]"
96
+ pip install python-dotenv # ensures .env is auto-loaded
97
+ ```
98
+ 3. Notes
99
+ - If `python-dotenv` isn’t installed, `.env` won’t be auto-loaded; you can either install it or export variables via your shell/runner.
100
+ - Scheduled jobs created from the apps use the exact interpreter of your active environment (`sys.executable`), ensuring `.venv/bin/python` is used. Keep your venv path stable on the machine running cron.
101
+ - Cron entries source your shell profile and pass through any required variables. You can also rely on `.env` for most settings.
81
102
 
82
103
  ### Hardware and Software Requirements
83
104
 
@@ -177,7 +177,7 @@ class BERTopicModel:
177
177
  return OpenAI(
178
178
  client=OpenAI_Client(
179
179
  api_key=LLM_CONFIG["api_key"],
180
- endpoint=LLM_CONFIG["endpoint"],
180
+ base_url=LLM_CONFIG["base_url"],
181
181
  model=LLM_CONFIG["model"],
182
182
  ).llm_client,
183
183
  model=LLM_CONFIG["model"],
@@ -5,6 +5,19 @@
5
5
  import os
6
6
  from pathlib import Path
7
7
 
8
+ from loguru import logger
9
+
10
+ # Auto-load .env if python-dotenv is available
11
+ try:
12
+ from dotenv import load_dotenv # type: ignore
13
+
14
+ if load_dotenv(override=True):
15
+ logger.info("Loaded .env file")
16
+ else:
17
+ logger.warning("Failed to load .env file")
18
+ except Exception:
19
+ pass
20
+
8
21
  from bertrend.utils.config_utils import load_toml_config
9
22
 
10
23
  # Default config files path
@@ -24,9 +24,9 @@ embedding_max_seq_length = 512
24
24
  # - local LLM deployed with VLLM or similar libraries
25
25
  # - the official OpenAI endpoint
26
26
  # - models deployed on Azure cloud
27
- api_key = "$AZURE_SE_WATTELSE_OPENAI_API_KEY_DEV"
28
- endpoint = "$AZURE_SE_WATTELSE_OPENAI_ENDPOINT_DEV"
29
- model = "$AZURE_SE_WATTELSE_OPENAI_DEFAULT_MODEL_NAME_DEV"
27
+ api_key = "$OPENAI_API_KEY"
28
+ base_url = "$OPENAI_BASE_URL"
29
+ model = "$OPENAI_DEFAULT_MODEL"
30
30
  temperature = 0.1
31
31
  max_output_tokens = 2048
32
32
  system_prompt = "You are a helpful assistant, skilled in detailing topic evolution over time for the detection of emerging trends and signals."
@@ -338,5 +338,5 @@ def display_data_loading_component():
338
338
  SessionStateManager.get_dataframe("time_filtered_df")[
339
339
  [TEXT_COLUMN, "timestamp"]
340
340
  ],
341
- use_container_width=True,
341
+ width="stretch",
342
342
  )
@@ -21,6 +21,7 @@ TOPIC_VISUALIZATION_ICON = ":material/monitoring:"
21
21
  TEMPORAL_VISUALIZATION_ICON = ":material/timelapse:"
22
22
  NEWSLETTER_ICON = ":material/newspaper:"
23
23
  ANALYSIS_ICON = ":material/query_stats:"
24
+ TIMELINE_ICON = ":material/timeline:"
24
25
  DATA_LOADING_ICON = ":material/drive_folder_upload:"
25
26
  MODEL_TRAINING_ICON = ":material/cognition:"
26
27
  SERVER_STORAGE_ICON = ":material/database:"
@@ -35,6 +36,10 @@ DOWNLOAD_ICON = ":material/download:"
35
36
  EMAIL_ICON = ":material/mail:"
36
37
  RESTART_ICON = ":material/restart_alt:"
37
38
  PERSON_ADD_ICON = ":material/person_add:"
39
+ PERSON_REMOVE_ICON = ":material/person_remove:"
40
+ POPULARITY_ICON = ":material/thumbs_up_down:"
41
+ SIGNAL_EVOLUTION_ICON = ":material/signal_cellular_alt:"
42
+ CYCLE_ICON = ":material/cycle:"
38
43
 
39
44
  JSON_ICON = "🧾"
40
45
  PARQUET_ICON = "📦️"
@@ -0,0 +1,9 @@
1
+ #
2
+ # Copyright (c) 2024, RTE (https://www.rte-france.com)
3
+ # See AUTHORS.txt
4
+ # SPDX-License-Identifier: MPL-2.0
5
+ # This file is part of BERTrend.
6
+ #
7
+
8
+ # Starts the Summarizer app (a comparison of various method of text summarization)
9
+ CUDA_VISIBLE_DEVICES=0 OPENAI_API_KEY=$OPENAI_API_KEY OPENAI_BASE_URL=$OPENAI_BASE_URL OPENAI_DEFAULT_MODEL=$OPENAI_DEFAULT_MODEL streamlit run --theme.primaryColor royalblue summarization/summarizer_app.py
@@ -0,0 +1,101 @@
1
+ import streamlit as st
2
+ from typing import Callable
3
+
4
+ from bertrend.demos.demos_utils.icons import PERSON_ADD_ICON
5
+
6
+
7
+ def input_with_pills(
8
+ label: str,
9
+ key: str,
10
+ placeholder: str = "",
11
+ validate_fn: Callable[[str], bool] | None = None,
12
+ label_visibility: str = "hidden",
13
+ help: str = None,
14
+ value: list[str] = None,
15
+ ) -> list[str] | None:
16
+ """
17
+ A simple Streamlit component that auto-adds valid input to pills.
18
+ Dialog-safe version that doesn't use st.rerun()
19
+ """
20
+
21
+ # Define all keys
22
+ all_items_key = f"{key}_all_items"
23
+ input_key = f"{key}_input"
24
+ pills_widget_key = f"{key}_pills_widget"
25
+ selection_tracking_key = f"{key}_selection_tracking"
26
+
27
+ if all_items_key not in st.session_state:
28
+ initial_value = value if value is not None else []
29
+ st.session_state[all_items_key] = initial_value
30
+ st.session_state[selection_tracking_key] = initial_value[:]
31
+
32
+ if input_key not in st.session_state:
33
+ st.session_state[input_key] = ""
34
+
35
+ col1, col2 = st.columns([3, 3])
36
+
37
+ with col1:
38
+ with st.form(key=f"{key}_form", clear_on_submit=True, border=False):
39
+ current_input = st.text_input(
40
+ label,
41
+ placeholder=placeholder,
42
+ key=input_key,
43
+ label_visibility=label_visibility,
44
+ help=help,
45
+ )
46
+ submitted = st.form_submit_button(PERSON_ADD_ICON)
47
+
48
+ if submitted and current_input.strip():
49
+ is_valid = True
50
+ error_msg = ""
51
+ stripped_input = current_input.strip()
52
+
53
+ if validate_fn and not validate_fn(stripped_input):
54
+ is_valid = False
55
+ error_msg = "Invalid format"
56
+ elif stripped_input in st.session_state[all_items_key]:
57
+ is_valid = False
58
+ error_msg = "Already exists"
59
+
60
+ if is_valid:
61
+ # Add to the list of all items
62
+ st.session_state[all_items_key].append(stripped_input)
63
+
64
+ # Update tracking selection
65
+ st.session_state[selection_tracking_key].append(stripped_input)
66
+
67
+ # Update pills widget selection
68
+ st.session_state[pills_widget_key] = st.session_state[
69
+ selection_tracking_key
70
+ ][:]
71
+ else:
72
+ st.error(error_msg)
73
+
74
+ with col2:
75
+ # Display pills
76
+ if st.session_state[all_items_key]:
77
+ st.markdown("<div style='margin-top: 8px;'></div>", unsafe_allow_html=True)
78
+
79
+ # Initialize pills widget if not exists
80
+ if pills_widget_key not in st.session_state:
81
+ st.session_state[pills_widget_key] = st.session_state[
82
+ selection_tracking_key
83
+ ][:]
84
+
85
+ def on_pills_change():
86
+ # Sync the widget selection to our tracking key
87
+ st.session_state[selection_tracking_key] = st.session_state[
88
+ pills_widget_key
89
+ ][:]
90
+
91
+ selected = st.pills(
92
+ "Items",
93
+ st.session_state[all_items_key],
94
+ selection_mode="multi",
95
+ key=pills_widget_key,
96
+ label_visibility="collapsed",
97
+ on_change=on_pills_change,
98
+ )
99
+
100
+ st.session_state[key] = st.session_state[selection_tracking_key]
101
+ return st.session_state[key]
@@ -3,8 +3,8 @@
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
5
  import os
6
-
7
6
  import streamlit as st
7
+ from dotenv import load_dotenv
8
8
  from loguru import logger
9
9
 
10
10
  from bertrend.demos.demos_utils.icons import WARNING_ICON
@@ -15,6 +15,9 @@ from bertrend.services.summary.extractive_summarizer import (
15
15
  ExtractiveSummarizer,
16
16
  )
17
17
 
18
+ load_dotenv(override=True)
19
+
20
+
18
21
  SUMMARIZER_OPTIONS_MAPPER = {
19
22
  "GPTSummarizer": GPTSummarizer,
20
23
  "EnhancedExtractiveSummarizer": EnhancedExtractiveSummarizer,
@@ -39,7 +42,7 @@ def get_summarizer(summary_model):
39
42
  kwargs = {}
40
43
  if summary_model == "GPTSummarizer":
41
44
  kwargs["api_key"] = st.session_state.openai_api_key
42
- kwargs["endpoint"] = st.session_state.openai_endpoint
45
+ kwargs["base_url"] = st.session_state.openai_base_url
43
46
 
44
47
  summarizer_class = SUMMARIZER_OPTIONS_MAPPER[summary_model]
45
48
  return summarizer_class(**kwargs)
@@ -63,6 +66,7 @@ def app():
63
66
  )
64
67
  / 100
65
68
  )
69
+
66
70
  st.text_input(
67
71
  "Openai API key",
68
72
  key="openai_api_key",
@@ -70,12 +74,12 @@ def app():
70
74
  type="password",
71
75
  )
72
76
  st.text_input(
73
- "Openai endpoint", key="openai_endpoint", value=os.getenv("OPENAI_ENDPOINT")
77
+ "Openai base URL", key="openai_base_url", value=os.getenv("OPENAI_BASE_URL")
74
78
  )
75
79
  st.text_input(
76
80
  "Openai model name",
77
81
  key="openai_model_name",
78
- value=os.getenv("OPENAI_DEFAULT_MODEL_NAME"),
82
+ value=os.getenv("OPENAI_DEFAULT_MODEL"),
79
83
  )
80
84
 
81
85
  col1, col2 = st.columns(2)
@@ -87,7 +87,7 @@ def display_sidebar():
87
87
  button_title += f" :red[+{new_docs_number}]"
88
88
  st.button(
89
89
  button_title,
90
- use_container_width=True,
90
+ width="stretch",
91
91
  on_click=set_topic_selection,
92
92
  args=(topic_number,),
93
93
  )
@@ -119,7 +119,7 @@ def plot_topic_over_time():
119
119
  st.session_state["topic_model"],
120
120
  ),
121
121
  config=PLOTLY_BUTTON_SAVE_CONFIG,
122
- use_container_width=True,
122
+ width="stretch",
123
123
  )
124
124
  else:
125
125
  st.plotly_chart(
@@ -132,7 +132,7 @@ def plot_topic_over_time():
132
132
  ].max(),
133
133
  ),
134
134
  config=PLOTLY_BUTTON_SAVE_CONFIG,
135
- use_container_width=True,
135
+ width="stretch",
136
136
  )
137
137
 
138
138
 
@@ -203,7 +203,7 @@ def display_source_distribution(
203
203
  showlegend=False, height=600, width=500, margin=dict(t=0, b=0, l=0, r=0)
204
204
  )
205
205
 
206
- st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True)
206
+ st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch")
207
207
 
208
208
 
209
209
  def get_website_name(url):
@@ -158,7 +158,7 @@ def main():
158
158
  generate_newsletter_clicked = st.button(
159
159
  translate("generate_newsletter_button"),
160
160
  type="primary",
161
- use_container_width=True,
161
+ width="stretch",
162
162
  )
163
163
 
164
164
  # Generate newsletters when button is clicked
@@ -340,7 +340,7 @@ def display_topic_evolution_dataframe():
340
340
  st.session_state.temptopic.final_df[columns_present].sort_values(
341
341
  by=["Topic", "Timestamp"], ascending=[True, True]
342
342
  ),
343
- use_container_width=True,
343
+ width="stretch",
344
344
  )
345
345
 
346
346
 
@@ -349,14 +349,14 @@ def display_topic_info_dataframe():
349
349
  with st.expander(translate("topic_info_dataframe")):
350
350
  st.dataframe(
351
351
  st.session_state.temptopic.topic_model.get_topic_info(),
352
- use_container_width=True,
352
+ width="stretch",
353
353
  )
354
354
 
355
355
 
356
356
  def display_documents_per_date_dataframe():
357
357
  """Display the Documents per Date Dataframe."""
358
358
  with st.expander(translate("documents_per_date_dataframe")):
359
- st.dataframe(st.session_state.aggregated_df, use_container_width=True)
359
+ st.dataframe(st.session_state.aggregated_df, width="stretch")
360
360
 
361
361
 
362
362
  def display_temptopic_visualizations():
@@ -423,7 +423,7 @@ def display_topic_evolution(topics_to_show):
423
423
  color_palette=color_palette,
424
424
  )
425
425
  st.plotly_chart(
426
- fig_topic_evolution, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True
426
+ fig_topic_evolution, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch"
427
427
  )
428
428
 
429
429
  st.divider()
@@ -447,7 +447,7 @@ def display_overall_topic_stability(topics_to_show):
447
447
  st.plotly_chart(
448
448
  fig_overall_stability,
449
449
  config=PLOTLY_BUTTON_SAVE_CONFIG,
450
- use_container_width=True,
450
+ width="stretch",
451
451
  )
452
452
 
453
453
  st.divider()
@@ -463,7 +463,7 @@ def display_temporal_stability_metrics(topics_to_show):
463
463
  topics_to_show=topics_to_show,
464
464
  )
465
465
  st.plotly_chart(
466
- fig_topic_stability, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True
466
+ fig_topic_stability, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch"
467
467
  )
468
468
 
469
469
  fig_representation_stability = plot_temporal_stability_metrics(
@@ -474,7 +474,7 @@ def display_temporal_stability_metrics(topics_to_show):
474
474
  st.plotly_chart(
475
475
  fig_representation_stability,
476
476
  config=PLOTLY_BUTTON_SAVE_CONFIG,
477
- use_container_width=True,
477
+ width="stretch",
478
478
  )
479
479
 
480
480
 
@@ -511,7 +511,7 @@ def display_topics_popularity():
511
511
  st.session_state["topic_model"],
512
512
  ),
513
513
  config=PLOTLY_BUTTON_SAVE_CONFIG,
514
- use_container_width=True,
514
+ width="stretch",
515
515
  )
516
516
 
517
517
 
@@ -231,7 +231,7 @@ def main():
231
231
  st.plotly_chart(
232
232
  overall_results_plot,
233
233
  config=PLOTLY_BUTTON_SAVE_CONFIG,
234
- use_container_width=True,
234
+ width="stretch",
235
235
  )
236
236
  else:
237
237
  st.error(translate("overall_results_display_error"), icon=ERROR_ICON)
@@ -242,7 +242,7 @@ def main():
242
242
  with st.spinner(translate("topics_treemap_computation")):
243
243
  treemap_plot = create_treemap()
244
244
  st.plotly_chart(
245
- treemap_plot, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True
245
+ treemap_plot, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch"
246
246
  )
247
247
 
248
248
  # Data Map
@@ -263,7 +263,7 @@ def main():
263
263
  data=get_binary_file_downloader_html(save_path),
264
264
  file_name="datamapplot.html",
265
265
  mime="text/html",
266
- use_container_width=True,
266
+ width="stretch",
267
267
  type="secondary",
268
268
  )
269
269
  else:
@@ -70,7 +70,7 @@ def data_distribution(df: pd.DataFrame):
70
70
  value="1M",
71
71
  )
72
72
  fig = plot_docs_repartition_over_time(df, freq)
73
- st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True)
73
+ st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch")
74
74
 
75
75
 
76
76
  def save_model_interface():
@@ -195,7 +195,7 @@ def training_page():
195
195
  selected_docs[
196
196
  ["timestamp", TEXT_COLUMN, "document_id", "source", "url"]
197
197
  ],
198
- use_container_width=True,
198
+ width="stretch",
199
199
  )
200
200
  else:
201
201
  st.warning(translate("no_data_warning"), icon=WARNING_ICON)
@@ -285,13 +285,13 @@ def analysis_page():
285
285
  st.plotly_chart(
286
286
  plot_num_topics(topic_models),
287
287
  config=PLOTLY_BUTTON_SAVE_CONFIG,
288
- use_container_width=True,
288
+ width="stretch",
289
289
  )
290
290
  # Size of Outlier Topic for each topic model
291
291
  st.plotly_chart(
292
292
  plot_size_outliers(topic_models),
293
293
  config=PLOTLY_BUTTON_SAVE_CONFIG,
294
- use_container_width=True,
294
+ width="stretch",
295
295
  )
296
296
 
297
297
  display_topics_per_timestamp(topic_models)
@@ -335,7 +335,7 @@ def analysis_page():
335
335
  st.plotly_chart(
336
336
  fig_trend,
337
337
  config=PLOTLY_BUTTON_SAVE_CONFIG,
338
- use_container_width=True,
338
+ width="stretch",
339
339
  )
340
340
 
341
341
  # Display the dataframe with zeroshot topics information
@@ -352,7 +352,7 @@ def analysis_page():
352
352
  for timestamp, data in weak_signal_trend.items()
353
353
  ]
354
354
  zeroshot_topics_df = pd.DataFrame(zeroshot_topics_data)
355
- st.dataframe(zeroshot_topics_df, use_container_width=True)
355
+ st.dataframe(zeroshot_topics_df, width="stretch")
356
356
 
357
357
  # Save the zeroshot topics data to a JSON file
358
358
  json_file_path = ZEROSHOT_TOPICS_DATA_DIR
@@ -462,7 +462,7 @@ def main():
462
462
  # State Management
463
463
  st.subheader(translate("state_management"))
464
464
 
465
- if st.button(translate("restore_previous_run"), use_container_width=True):
465
+ if st.button(translate("restore_previous_run"), width="stretch"):
466
466
  restore_state()
467
467
  try:
468
468
  SessionStateManager.set("bertrend", BERTrend.restore_model())
@@ -470,10 +470,10 @@ def main():
470
470
  except Exception:
471
471
  st.warning(translate("no_models_warning"), icon=WARNING_ICON)
472
472
 
473
- if st.button(translate("purge_cache"), use_container_width=True):
473
+ if st.button(translate("purge_cache"), width="stretch"):
474
474
  purge_cache()
475
475
 
476
- if st.button(translate("clear_session_state"), use_container_width=True):
476
+ if st.button(translate("clear_session_state"), width="stretch"):
477
477
  SessionStateManager.clear()
478
478
 
479
479
  # BERTopic Hyperparameters
@@ -75,7 +75,7 @@ def display_sankey_diagram(all_merge_histories_df: pd.DataFrame) -> None:
75
75
 
76
76
  # Display the diagram using Streamlit in an expander
77
77
  st.plotly_chart(
78
- sankey_diagram, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True
78
+ sankey_diagram, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch"
79
79
  )
80
80
 
81
81
 
@@ -227,7 +227,7 @@ def display_popularity_evolution():
227
227
  q1,
228
228
  q3,
229
229
  )
230
- st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True)
230
+ st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch")
231
231
 
232
232
 
233
233
  def display_signal_types():
@@ -309,7 +309,7 @@ def display_newly_emerged_topics(all_new_topics_df: pd.DataFrame) -> None:
309
309
  ].sort_values(by=["Timestamp", "Document_Count"], ascending=[True, False])
310
310
  )
311
311
  st.plotly_chart(
312
- fig_new_topics, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True
312
+ fig_new_topics, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch"
313
313
  )
314
314
 
315
315
 
@@ -330,15 +330,15 @@ def display_topics_per_timestamp(topic_models: dict[pd.Timestamp, BERTopic]) ->
330
330
 
331
331
  fig = plot_topics_for_model(selected_model)
332
332
 
333
- st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, use_container_width=True)
333
+ st.plotly_chart(fig, config=PLOTLY_BUTTON_SAVE_CONFIG, width="stretch")
334
334
 
335
335
  st.dataframe(
336
336
  selected_model.doc_info_df[
337
337
  ["Paragraph", "document_id", "Topic", "Representation", "source"]
338
338
  ],
339
- use_container_width=True,
339
+ width="stretch",
340
340
  )
341
- st.dataframe(selected_model.topic_info_df, use_container_width=True)
341
+ st.dataframe(selected_model.topic_info_df, width="stretch")
342
342
 
343
343
 
344
344
  def display_signal_analysis(topic_number: int):