bertrend 0.4.7__tar.gz → 0.4.8__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 (341) hide show
  1. {bertrend-0.4.7 → bertrend-0.4.8}/PKG-INFO +6 -1
  2. {bertrend-0.4.7 → bertrend-0.4.8}/README.md +5 -0
  3. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider.py +39 -14
  4. bertrend-0.4.8/bertrend/services/article_scoring_server/config/default_config.toml +3 -0
  5. bertrend-0.4.8/bertrend/services/article_scoring_server/config/settings.py +32 -0
  6. bertrend-0.4.8/bertrend/services/article_scoring_server/models.py +21 -0
  7. bertrend-0.4.8/bertrend/services/article_scoring_server/routers/info.py +19 -0
  8. bertrend-0.4.8/bertrend/services/article_scoring_server/routers/scoring.py +43 -0
  9. bertrend-0.4.8/bertrend/services/article_scoring_server/scoring_service.py +12 -0
  10. bertrend-0.4.8/bertrend/services/article_scoring_server/start.py +18 -0
  11. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_base.py +40 -12
  12. bertrend-0.4.8/bertrend/tests/services/summarizer/__init__.py +4 -0
  13. bertrend-0.4.8/bertrend/tests/services/summary/__init__.py +4 -0
  14. bertrend-0.4.8/bertrend/tests/utils/__init__.py +4 -0
  15. {bertrend-0.4.7 → bertrend-0.4.8}/pyproject.toml +1 -1
  16. {bertrend-0.4.7 → bertrend-0.4.8}/AUTHORS.txt +0 -0
  17. {bertrend-0.4.7 → bertrend-0.4.8}/LICENSE.md +0 -0
  18. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/BERTopicModel.py +0 -0
  19. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/BERTrend.py +0 -0
  20. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/__init__.py +0 -0
  21. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/article_scoring/__init__.py +0 -0
  22. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/article_scoring/article_scoring.py +0 -0
  23. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/article_scoring/prompts.py +0 -0
  24. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/article_scoring/scoring_agent.py +0 -0
  25. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/__init__.py +0 -0
  26. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/__init__.py +0 -0
  27. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/apscheduler_utils.py +0 -0
  28. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/crontab_utils.py +0 -0
  29. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/date_utils.py +0 -0
  30. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/mail_utils.py +0 -0
  31. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/common/scheduler_utils.py +0 -0
  32. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
  33. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
  34. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/feed_deep_research_example.toml +0 -0
  35. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
  36. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_feed.toml +0 -0
  37. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
  38. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/rte_feed.toml +0 -0
  39. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
  40. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
  41. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
  42. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
  43. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
  44. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
  45. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__init__.py +0 -0
  46. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__main__.py +0 -0
  47. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/arxiv_provider.py +0 -0
  48. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
  49. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/bing_news_provider.py +0 -0
  50. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider_utils.py +0 -0
  51. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/deep_research_provider.py +0 -0
  52. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/google_news_provider.py +0 -0
  53. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
  54. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/rss_feed_provider.py +0 -0
  55. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/utils.py +0 -0
  56. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/__init__.py +0 -0
  57. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
  58. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/__init__.py +0 -0
  59. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app.py +0 -0
  60. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app_utils.py +0 -0
  61. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/config.toml +0 -0
  62. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
  63. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/prompts.py +0 -0
  64. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
  65. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +0 -0
  66. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab1.py +0 -0
  67. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
  68. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab3.py +0 -0
  69. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/.streamlit/config.toml +0 -0
  70. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/__init__.py +0 -0
  71. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/app.py +0 -0
  72. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/backend.py +0 -0
  73. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/start_apps.sh +0 -0
  74. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/stop_apps.sh +0 -0
  75. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/install_feeds_and_newsletters.py +0 -0
  76. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__init__.py +0 -0
  77. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__main__.py +0 -0
  78. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/newsletter_generation.py +0 -0
  79. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/utils.py +0 -0
  80. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
  81. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
  82. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/__init__.py +0 -0
  83. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/app.py +0 -0
  84. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/authentication.py +0 -0
  85. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/automated_report_generation.py +0 -0
  86. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
  87. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
  88. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_comparative.py +0 -0
  89. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
  90. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/data_model.py +0 -0
  91. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +0 -0
  92. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_common.py +0 -0
  93. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_config.py +0 -0
  94. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_data.py +0 -0
  95. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n.py +0 -0
  96. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n_translations.py +0 -0
  97. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/llm_utils.py +0 -0
  98. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/models_info.py +0 -0
  99. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/perf_utils.py +0 -0
  100. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/process_new_data.py +0 -0
  101. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation.py +0 -0
  102. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation_utils.py +0 -0
  103. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/start_demo.sh +0 -0
  104. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/utils.py +0 -0
  105. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/__init__.py +0 -0
  106. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/__init__.py +0 -0
  107. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/bertrend_service.py +0 -0
  108. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/__init__.py +0 -0
  109. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/default_config.toml +0 -0
  110. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/settings.py +0 -0
  111. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/__init__.py +0 -0
  112. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/bertrend_app_models.py +0 -0
  113. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/data_provider_models.py +0 -0
  114. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/newsletters_models.py +0 -0
  115. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +0 -0
  116. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +0 -0
  117. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/data_provider.py +0 -0
  118. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/info.py +0 -0
  119. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/newsletters.py +0 -0
  120. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/start.py +0 -0
  121. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/status.py +0 -0
  122. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/stop.py +0 -0
  123. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/__init__.py +0 -0
  124. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +0 -0
  125. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/client.py +0 -0
  126. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +0 -0
  127. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/queue_manager.py +0 -0
  128. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +0 -0
  129. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +0 -0
  130. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +0 -0
  131. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/__init__.py +0 -0
  132. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/app.py +0 -0
  133. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/__init__.py +0 -0
  134. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/logging_utils.py +0 -0
  135. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/config/bertopic_default_config.toml +0 -0
  136. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/config/bertrend_default_config.toml +0 -0
  137. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/config/parameters.py +0 -0
  138. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/config/services_default_config.toml +0 -0
  139. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/__init__.py +0 -0
  140. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/__init__.py +0 -0
  141. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
  142. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
  143. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n.py +0 -0
  144. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
  145. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/icons.py +0 -0
  146. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/parameters_component.py +0 -0
  147. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/demos_utils/state_utils.py +0 -0
  148. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/start_summarizer_app.sh +0 -0
  149. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/start_topic_analysis_app.sh +0 -0
  150. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/start_weak_signals_app.sh +0 -0
  151. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/streamlit_components/__init__.py +0 -0
  152. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/streamlit_components/clickable_df_component.py +0 -0
  153. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/streamlit_components/input_with_pills_component.py +0 -0
  154. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/summarization/__init__.py +0 -0
  155. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/summarization/summarizer_app.py +0 -0
  156. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
  157. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/__init__.py +0 -0
  158. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app.py +0 -0
  159. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app_utils.py +0 -0
  160. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
  161. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
  162. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
  163. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
  164. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
  165. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
  166. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
  167. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
  168. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/weak_signals/__init__.py +0 -0
  169. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/weak_signals/app.py +0 -0
  170. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
  171. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
  172. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/__init__.py +0 -0
  173. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/agent_utils.py +0 -0
  174. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/newsletter.css +0 -0
  175. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_features.py +0 -0
  176. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_model.py +0 -0
  177. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
  178. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_template.html +0 -0
  179. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/openai_client.py +0 -0
  180. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/llm_utils/prompts.py +0 -0
  181. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/metrics/__init__.py +0 -0
  182. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
  183. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/metrics/topic_metrics.py +0 -0
  184. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/resources/common_ngrams.json +0 -0
  185. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/resources/stopwords-en.json +0 -0
  186. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/resources/stopwords-fr.json +0 -0
  187. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/resources/stopwords-rte.json +0 -0
  188. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/__init__.py +0 -0
  189. {bertrend-0.4.7/bertrend/services/embedding_server → bertrend-0.4.8/bertrend/services/article_scoring_server}/__init__.py +0 -0
  190. {bertrend-0.4.7/bertrend/services/embedding_server/routers → bertrend-0.4.8/bertrend/services/article_scoring_server/config}/__init__.py +0 -0
  191. {bertrend-0.4.7/bertrend/services/scheduling → bertrend-0.4.8/bertrend/services/article_scoring_server/routers}/__init__.py +0 -0
  192. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/authentication.py +0 -0
  193. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/cert.pem +0 -0
  194. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_client.py +0 -0
  195. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/README.md +0 -0
  196. {bertrend-0.4.7/bertrend/services/scheduling/job_utils → bertrend-0.4.8/bertrend/services/embedding_server}/__init__.py +0 -0
  197. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
  198. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/config/default_config.toml +0 -0
  199. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/config/settings.py +0 -0
  200. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/main.py +0 -0
  201. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/models.py +0 -0
  202. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/requirements.txt +0 -0
  203. {bertrend-0.4.7/bertrend/services/scheduling/models → bertrend-0.4.8/bertrend/services/embedding_server/routers}/__init__.py +0 -0
  204. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/authentication.py +0 -0
  205. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
  206. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/info.py +0 -0
  207. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/security.py +0 -0
  208. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/start.py +0 -0
  209. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/status.py +0 -0
  210. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_server/stop.py +0 -0
  211. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/embedding_service.py +0 -0
  212. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/key.pem +0 -0
  213. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/.dockerignore +0 -0
  214. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/Docker_setup.md +0 -0
  215. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/Dockerfile +0 -0
  216. {bertrend-0.4.7/bertrend/services/summary → bertrend-0.4.8/bertrend/services/scheduling}/__init__.py +0 -0
  217. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/dashboard_scheduling.py +0 -0
  218. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/docker-compose.yml +0 -0
  219. {bertrend-0.4.7/bertrend/services/summary_server → bertrend-0.4.8/bertrend/services/scheduling/job_utils}/__init__.py +0 -0
  220. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/job_utils/job_functions.py +0 -0
  221. {bertrend-0.4.7/bertrend/services/summary_server/config → bertrend-0.4.8/bertrend/services/scheduling/models}/__init__.py +0 -0
  222. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/models/scheduling_models.py +0 -0
  223. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/requirements.txt +0 -0
  224. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/routers/info.py +0 -0
  225. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/routers/scheduling.py +0 -0
  226. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/scheduling_service.py +0 -0
  227. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/scheduling/start_docker_scheduling_service.sh +0 -0
  228. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summarizer.py +0 -0
  229. {bertrend-0.4.7/bertrend/services/summary_server/routers → bertrend-0.4.8/bertrend/services/summary}/__init__.py +0 -0
  230. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary/abstractive_summarizer.py +0 -0
  231. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
  232. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary/extractive_summarizer.py +0 -0
  233. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary/lexrank.py +0 -0
  234. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary/prompts.py +0 -0
  235. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_client.py +0 -0
  236. {bertrend-0.4.7/bertrend/tests → bertrend-0.4.8/bertrend/services/summary_server}/__init__.py +0 -0
  237. {bertrend-0.4.7/bertrend/tests/apps → bertrend-0.4.8/bertrend/services/summary_server/config}/__init__.py +0 -0
  238. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/config/default_config.toml +0 -0
  239. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/config/settings.py +0 -0
  240. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/main.py +0 -0
  241. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/models.py +0 -0
  242. {bertrend-0.4.7/bertrend/tests/core → bertrend-0.4.8/bertrend/services/summary_server/routers}/__init__.py +0 -0
  243. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/routers/info.py +0 -0
  244. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/routers/summarize.py +0 -0
  245. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/services/summary_server/start.py +0 -0
  246. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/README_integration_tests.md +0 -0
  247. {bertrend-0.4.7/bertrend/tests/data_provider → bertrend-0.4.8/bertrend/tests}/__init__.py +0 -0
  248. {bertrend-0.4.7/bertrend/tests/demos → bertrend-0.4.8/bertrend/tests/apps}/__init__.py +0 -0
  249. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/apps/test_process_new_data.py +0 -0
  250. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/conftest.py +0 -0
  251. {bertrend-0.4.7/bertrend/tests/demos/summarization → bertrend-0.4.8/bertrend/tests/core}/__init__.py +0 -0
  252. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_bertrend.py +0 -0
  253. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_data_structure.py +0 -0
  254. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_representative_docs.py +0 -0
  255. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_temporal_metrics_embedding.py +0 -0
  256. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_topic_description.py +0 -0
  257. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_topic_metrics.py +0 -0
  258. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_topic_model.py +0 -0
  259. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_data_structure.py +0 -0
  260. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_prompts.py +0 -0
  261. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_visualizations.py +0 -0
  262. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_weak_signals.py +0 -0
  263. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/core/test_visualizations.py +0 -0
  264. {bertrend-0.4.7/bertrend/tests/llm → bertrend-0.4.8/bertrend/tests/data_provider}/__init__.py +0 -0
  265. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_arxiv_provider.py +0 -0
  266. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_bing_news_provider.py +0 -0
  267. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_utils.py +0 -0
  268. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_live.py +0 -0
  269. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_provider.py +0 -0
  270. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_google_news_provider.py +0 -0
  271. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_newscatcher_provider.py +0 -0
  272. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/data_provider/test_rss_atom_provider.py +0 -0
  273. {bertrend-0.4.7/bertrend/tests/services → bertrend-0.4.8/bertrend/tests/demos}/__init__.py +0 -0
  274. {bertrend-0.4.7/bertrend/tests/services/embedding → bertrend-0.4.8/bertrend/tests/demos/summarization}/__init__.py +0 -0
  275. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/demos/summarization/test_summarizer_app.py +0 -0
  276. {bertrend-0.4.7/bertrend/tests/services/embedding_server → bertrend-0.4.8/bertrend/tests/llm}/__init__.py +0 -0
  277. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_agent_utils.py +0 -0
  278. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring.py +0 -0
  279. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring_models.py +0 -0
  280. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_features.py +0 -0
  281. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_model.py +0 -0
  282. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/llm/test_openai_client.py +0 -0
  283. {bertrend-0.4.7/bertrend/tests/services/queue → bertrend-0.4.8/bertrend/tests/services}/__init__.py +0 -0
  284. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/__init__.py +0 -0
  285. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_bertrend_service.py +0 -0
  286. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_models.py +0 -0
  287. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_bertrend_app.py +0 -0
  288. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_info.py +0 -0
  289. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_newsletters.py +0 -0
  290. {bertrend-0.4.7/bertrend/tests/services/scheduling → bertrend-0.4.8/bertrend/tests/services/embedding}/__init__.py +0 -0
  291. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/embedding/test_embedding_client.py +0 -0
  292. {bertrend-0.4.7/bertrend/tests/services/summarizer → bertrend-0.4.8/bertrend/tests/services/embedding_server}/__init__.py +0 -0
  293. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_models.py +0 -0
  294. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_routers.py +0 -0
  295. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_security.py +0 -0
  296. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_settings.py +0 -0
  297. {bertrend-0.4.7/bertrend/tests/services/summary → bertrend-0.4.8/bertrend/tests/services/queue}/__init__.py +0 -0
  298. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/queue/test_bertrend_worker.py +0 -0
  299. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/queue/test_client.py +0 -0
  300. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/queue/test_queue_manager.py +0 -0
  301. {bertrend-0.4.7/bertrend/tests/utils → bertrend-0.4.8/bertrend/tests/services/scheduling}/__init__.py +0 -0
  302. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_job_exception_fix.py +0 -0
  303. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_scheduling_service.py +0 -0
  304. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_stress_test.py +0 -0
  305. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +0 -0
  306. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +0 -0
  307. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +0 -0
  308. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_summarizer.py +0 -0
  309. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_client.py +0 -0
  310. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_config.py +0 -0
  311. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_server.py +0 -0
  312. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/test_installation.py +0 -0
  313. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/test_integration.py +0 -0
  314. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_apscheduler_utils.py +0 -0
  315. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_cache_utils.py +0 -0
  316. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_config_utils.py +0 -0
  317. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_crontab_utils.py +0 -0
  318. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_data_loading.py +0 -0
  319. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_date_utils.py +0 -0
  320. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_lazy_scheduler.py +0 -0
  321. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_mail_utils.py +0 -0
  322. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_multiworker.py +0 -0
  323. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_scheduler_utils.py +0 -0
  324. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/tests/utils/test_utils_init.py +0 -0
  325. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/__init__.py +0 -0
  326. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/data_structure.py +0 -0
  327. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/prompts.py +0 -0
  328. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/representative_docs.py +0 -0
  329. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/topic_description.py +0 -0
  330. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/topic_analysis/visualizations.py +0 -0
  331. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/__init__.py +0 -0
  332. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/data_structure.py +0 -0
  333. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/prompts.py +0 -0
  334. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
  335. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
  336. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/visualizations.py +0 -0
  337. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/trend_analysis/weak_signals.py +0 -0
  338. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/utils/__init__.py +0 -0
  339. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/utils/cache_utils.py +0 -0
  340. {bertrend-0.4.7 → bertrend-0.4.8}/bertrend/utils/config_utils.py +0 -0
  341. {bertrend-0.4.7 → bertrend-0.4.8}/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.7
3
+ Version: 0.4.8
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
@@ -448,6 +448,11 @@ Provides various statistics about topics:
448
448
 
449
449
  ![llm_interpretation](docs/images/llm_interpretation.png)
450
450
 
451
+ ## Article Scoring Service
452
+
453
+ For service setup and API details, see:
454
+ [`docs/services/article_scoring_service.md`](docs/services/article_scoring_service.md).
455
+
451
456
  ## Support
452
457
 
453
458
  Please use the 'Issues' section to report and discuss any problems with BERTrend.
@@ -364,6 +364,11 @@ Provides various statistics about topics:
364
364
 
365
365
  ![llm_interpretation](docs/images/llm_interpretation.png)
366
366
 
367
+ ## Article Scoring Service
368
+
369
+ For service setup and API details, see:
370
+ [`docs/services/article_scoring_service.md`](docs/services/article_scoring_service.md).
371
+
367
372
  ## Support
368
373
 
369
374
  Please use the 'Issues' section to report and discuss any problems with BERTrend.
@@ -2,7 +2,6 @@
2
2
  # See AUTHORS.txt
3
3
  # SPDX-License-Identifier: MPL-2.0
4
4
  # This file is part of BERTrend.
5
- import asyncio
6
5
  import os
7
6
  from abc import ABC, abstractmethod
8
7
  from pathlib import Path
@@ -10,6 +9,7 @@ from pathlib import Path
10
9
  import jsonlines
11
10
  import langdetect
12
11
  import pandas as pd
12
+ import requests
13
13
  from dateutil import parser
14
14
  from goose3 import Goose
15
15
  from joblib import Parallel, delayed
@@ -17,12 +17,11 @@ from loguru import logger
17
17
  from newspaper import Article
18
18
 
19
19
  from bertrend.article_scoring.article_scoring import QualityLevel
20
- from bertrend.article_scoring.scoring_agent import score_articles
21
- from bertrend.utils.data_loading import TEXT_COLUMN
22
20
  from bertrend.bertrend_apps.data_provider.utils import (
23
21
  decode_google_news_url,
24
22
  wait_if_seen_url,
25
23
  )
24
+ from bertrend.utils.data_loading import TEXT_COLUMN
26
25
 
27
26
  # Ensures to write with +rw for both user and groups
28
27
  os.umask(0o002)
@@ -85,27 +84,53 @@ class DataProvider(ABC):
85
84
 
86
85
  @staticmethod
87
86
  def evaluate_quality(
88
- articles: list[dict], minimum_quality_level: QualityLevel
87
+ articles: list[dict], minimum_quality_level: QualityLevel = QualityLevel.AVERAGE
89
88
  ) -> list[dict]:
90
89
  texts = [article[TEXT_COLUMN] for article in articles]
90
+ article_scoring_service_url = os.getenv("ARTICLE_SCORING_SERVICE_URL")
91
+
92
+ if not article_scoring_service_url:
93
+ logger.warning(
94
+ "ARTICLE_SCORING_SERVICE_URL is not set; skipping article quality filtering."
95
+ )
96
+ return articles
97
+
98
+ try:
99
+ response = requests.post(
100
+ f"{article_scoring_service_url.rstrip('/')}/score",
101
+ json={"articles": texts},
102
+ timeout=300,
103
+ )
104
+ response.raise_for_status()
105
+ payload = response.json()
106
+ results = payload.get("results", [])
107
+ except requests.RequestException as exc:
108
+ logger.warning(
109
+ f"Article scoring service unavailable at {article_scoring_service_url}: {exc}. "
110
+ "Skipping article quality filtering."
111
+ )
112
+ return articles
91
113
 
92
- # Evaluate quality of articles using a LLM agent
93
- results = asyncio.run(score_articles(texts))
114
+ if len(results) != len(texts):
115
+ logger.warning(
116
+ "Article scoring service returned an unexpected number of results; "
117
+ "skipping article quality filtering."
118
+ )
119
+ return articles
94
120
 
95
- # Filter out articles with quality < minimum_quality
121
+ # Filter out articles with quality < minimum_quality_level
96
122
  filtered_articles = [
97
123
  {
98
124
  **article,
99
- "quality_metrics": results[i].output.model_dump(),
100
- "overall_quality": results[i].output.quality_level.name,
125
+ "quality_metrics": results[i]["quality_metrics"],
126
+ "overall_quality": results[i]["overall_quality"],
101
127
  }
102
- # 1. Ensure output is NOT None before proceeding
103
128
  for i, article in enumerate(articles)
104
- if results[i].output is not None
105
- # 2. Then, check the quality level
106
- and results[i].output.quality_level >= minimum_quality_level
129
+ if results[i].get("overall_quality") in QualityLevel.__members__
130
+ and QualityLevel[results[i]["overall_quality"]] >= minimum_quality_level
131
+ and not results[i].get("error")
107
132
  ]
108
- assert len(results) == len(texts)
133
+
109
134
  logger.info(
110
135
  f"Filtered out {len(articles) - len(filtered_articles)} articles with quality < {minimum_quality_level.name}"
111
136
  )
@@ -0,0 +1,3 @@
1
+ host = "0.0.0.0"
2
+ port = 8887
3
+ number_workers = 1
@@ -0,0 +1,32 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ import os
7
+ import tomllib
8
+ from pathlib import Path
9
+
10
+ from pydantic_settings import BaseSettings
11
+
12
+ DEFAULT_CONFIG_FILE = Path(__file__).parent / "default_config.toml"
13
+
14
+
15
+ class ArticleScoringAPIConfig(BaseSettings):
16
+ host: str
17
+ port: int
18
+ number_workers: int
19
+
20
+
21
+ def get_config() -> ArticleScoringAPIConfig:
22
+ """
23
+ Return the configuration for the summary API.
24
+ The configuration is loaded from a toml file.
25
+ The path to the toml file can be specified using the environment variable `SUMMARY_API_CONFIG_FILE`.
26
+ If the environment variable is not set, the default configuration file is used.
27
+ """
28
+ config_file = os.environ.get("ARTICLE_SCORING_API_CONFIG_FILE", None)
29
+ if config_file is None:
30
+ config_file = DEFAULT_CONFIG_FILE
31
+ with open(config_file, "rb") as f:
32
+ return ArticleScoringAPIConfig(**tomllib.load(f))
@@ -0,0 +1,21 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ from pydantic import BaseModel
7
+
8
+
9
+ class ScoreArticlesRequest(BaseModel):
10
+ articles: list[str]
11
+
12
+
13
+ class ScoredArticle(BaseModel):
14
+ article_index: int
15
+ quality_metrics: dict | None = None
16
+ overall_quality: str | None = None
17
+ error: str | None = None
18
+
19
+
20
+ class ScoreArticlesResponse(BaseModel):
21
+ results: list[ScoredArticle]
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ from fastapi import APIRouter
7
+ from starlette.responses import RedirectResponse
8
+
9
+ router = APIRouter()
10
+
11
+
12
+ @router.get("/health")
13
+ def health():
14
+ return {"status": "ok"}
15
+
16
+
17
+ @router.get("/", summary="Redirect to API documentation")
18
+ def root():
19
+ return RedirectResponse(url="/docs")
@@ -0,0 +1,43 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ from fastapi import APIRouter, HTTPException
7
+
8
+ from bertrend.article_scoring.scoring_agent import score_articles
9
+ from bertrend.services.article_scoring_server.models import (
10
+ ScoreArticlesRequest,
11
+ ScoreArticlesResponse,
12
+ ScoredArticle,
13
+ )
14
+
15
+ router = APIRouter()
16
+
17
+
18
+ @router.post("/score", response_model=ScoreArticlesResponse)
19
+ async def score(request: ScoreArticlesRequest):
20
+ try:
21
+ score_results = await score_articles(request.articles)
22
+ except Exception as e:
23
+ raise HTTPException(
24
+ status_code=500,
25
+ detail=f"Failed to score articles: {e}",
26
+ ) from e
27
+
28
+ results = []
29
+ for index, item in enumerate(score_results):
30
+ quality_metrics = item.output.serialize_model() if item.output else None
31
+ overall_quality = (
32
+ item.output.quality_level.name if item.output and not item.error else None
33
+ )
34
+ results.append(
35
+ ScoredArticle(
36
+ article_index=index,
37
+ quality_metrics=quality_metrics,
38
+ overall_quality=overall_quality,
39
+ error=item.error,
40
+ )
41
+ )
42
+
43
+ return ScoreArticlesResponse(results=results)
@@ -0,0 +1,12 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ from fastapi import FastAPI
7
+
8
+ from bertrend.services.article_scoring_server.routers import info, scoring
9
+
10
+ app = FastAPI(title="BERTrend Article Scoring Service")
11
+ app.include_router(info.router, tags=["Info"])
12
+ app.include_router(scoring.router, tags=["Article scoring"])
@@ -0,0 +1,18 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
5
+
6
+ import uvicorn
7
+
8
+ from bertrend.services.article_scoring_server.config.settings import get_config
9
+
10
+ CONFIG = get_config()
11
+
12
+ if __name__ == "__main__":
13
+ uvicorn.run(
14
+ "bertrend.services.article_scoring_server.scoring_service:app",
15
+ host=CONFIG.host,
16
+ port=CONFIG.port,
17
+ workers=CONFIG.number_workers,
18
+ )
@@ -6,6 +6,7 @@
6
6
  from unittest.mock import MagicMock, patch
7
7
 
8
8
  import pytest
9
+ import requests
9
10
 
10
11
  from bertrend.article_scoring.article_scoring import QualityLevel
11
12
  from bertrend.bertrend_apps.data_provider.data_provider import DataProvider
@@ -80,23 +81,34 @@ def test_get_text(mock_goose, provider):
80
81
  assert title == "Goose title"
81
82
 
82
83
 
83
- @patch("bertrend.bertrend_apps.data_provider.data_provider.asyncio.run")
84
- def test_evaluate_quality(mock_asyncio_run, provider):
84
+ @patch.dict(
85
+ "os.environ", {"ARTICLE_SCORING_SERVICE_URL": "http://localhost:8887"}, clear=False
86
+ )
87
+ @patch("bertrend.bertrend_apps.data_provider.data_provider.requests.post")
88
+ def test_evaluate_quality(mock_requests_post, provider):
85
89
  articles = [
86
90
  {"text": "high quality content", "id": 1},
87
91
  {"text": "low quality", "id": 2},
88
92
  ]
89
93
 
90
- # Mock score_articles result
91
- mock_result_high = MagicMock()
92
- mock_result_high.output.quality_level = QualityLevel.EXCELLENT
93
- mock_result_high.output.model_dump.return_value = {"score": 0.9}
94
-
95
- mock_result_low = MagicMock()
96
- mock_result_low.output.quality_level = QualityLevel.POOR
97
- mock_result_low.output.model_dump.return_value = {"score": 0.1}
98
-
99
- mock_asyncio_run.return_value = [mock_result_high, mock_result_low]
94
+ mock_response = MagicMock()
95
+ mock_response.json.return_value = {
96
+ "results": [
97
+ {
98
+ "article_index": 0,
99
+ "quality_metrics": {"score": 0.9},
100
+ "overall_quality": "EXCELLENT",
101
+ "error": None,
102
+ },
103
+ {
104
+ "article_index": 1,
105
+ "quality_metrics": {"score": 0.1},
106
+ "overall_quality": "POOR",
107
+ "error": None,
108
+ },
109
+ ]
110
+ }
111
+ mock_requests_post.return_value = mock_response
100
112
 
101
113
  filtered = provider.evaluate_quality(articles, QualityLevel.AVERAGE)
102
114
 
@@ -105,6 +117,22 @@ def test_evaluate_quality(mock_asyncio_run, provider):
105
117
  assert filtered[0]["overall_quality"] == "EXCELLENT"
106
118
 
107
119
 
120
+ @patch.dict(
121
+ "os.environ", {"ARTICLE_SCORING_SERVICE_URL": "http://localhost:8887"}, clear=False
122
+ )
123
+ @patch("bertrend.bertrend_apps.data_provider.data_provider.requests.post")
124
+ def test_evaluate_quality_service_unavailable(mock_requests_post, provider):
125
+ articles = [
126
+ {"text": "high quality content", "id": 1},
127
+ {"text": "low quality", "id": 2},
128
+ ]
129
+ mock_requests_post.side_effect = requests.ConnectionError("service unavailable")
130
+
131
+ filtered = provider.evaluate_quality(articles, QualityLevel.AVERAGE)
132
+
133
+ assert filtered == articles
134
+
135
+
108
136
  def test_process_entries(provider):
109
137
  entries = [{"title": "Entry 1"}, {"title": "Entry 2"}]
110
138
 
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
@@ -0,0 +1,4 @@
1
+ # Copyright (c) 2024-2026, RTE (https://www.rte-france.com)
2
+ # See AUTHORS.txt
3
+ # SPDX-License-Identifier: MPL-2.0
4
+ # This file is part of BERTrend.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bertrend"
3
- version = "0.4.7"
3
+ version = "0.4.8"
4
4
  description = "BERTrend analyses topic evolution over time using state-of-the-art transformer models: topic modelling and LLM"
5
5
  license = "LICENSE.md"
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes