bertrend 0.4.6__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.
- {bertrend-0.4.6 → bertrend-0.4.8}/PKG-INFO +27 -2
- {bertrend-0.4.6 → bertrend-0.4.8}/README.md +25 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/BERTrend.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/apscheduler_utils.py +41 -8
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider.py +39 -14
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab1.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab3.py +2 -2
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/authentication.py +18 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_config.py +3 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n_translations.py +10 -2
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/models_info.py +21 -10
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/process_new_data.py +38 -28
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/logging_utils.py +1 -1
- {bertrend-0.4.6/bertrend/services/summary_server → bertrend-0.4.8/bertrend/services/article_scoring_server}/config/default_config.toml +1 -1
- bertrend-0.4.8/bertrend/services/article_scoring_server/config/settings.py +32 -0
- bertrend-0.4.8/bertrend/services/article_scoring_server/models.py +21 -0
- bertrend-0.4.8/bertrend/services/article_scoring_server/routers/info.py +19 -0
- bertrend-0.4.8/bertrend/services/article_scoring_server/routers/scoring.py +43 -0
- bertrend-0.4.8/bertrend/services/article_scoring_server/scoring_service.py +12 -0
- bertrend-0.4.8/bertrend/services/article_scoring_server/start.py +18 -0
- bertrend-0.4.8/bertrend/services/summary_server/config/default_config.toml +3 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/routers/info.py +7 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_bing_news_provider.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_base.py +40 -15
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_provider.py +1 -2
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_newscatcher_provider.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/demos/summarization/test_summarizer_app.py +0 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_openai_client.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_security.py +1 -2
- bertrend-0.4.8/bertrend/tests/services/summarizer/__init__.py +4 -0
- bertrend-0.4.8/bertrend/tests/services/summary/__init__.py +4 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_client.py +1 -1
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_config.py +1 -1
- bertrend-0.4.8/bertrend/tests/utils/__init__.py +4 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/pyproject.toml +6 -3
- {bertrend-0.4.6 → bertrend-0.4.8}/AUTHORS.txt +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/LICENSE.md +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/BERTopicModel.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/article_scoring.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/article_scoring/scoring_agent.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/crontab_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/date_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/mail_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/common/scheduler_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/arxiv_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/decarbonation_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/feed_deep_research_example.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_en_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/llm_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/nlp_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/feeds/rte_feed.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/arxiv_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/decarbonation_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_en_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/llm_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/nlp_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/config/newsletters/rte_newsletter_from_last.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/__main__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/arxiv_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/atom_feed_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/bing_news_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/data_provider_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/deep_research_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/google_news_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/newscatcher_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/rss_feed_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/data_provider/utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/app_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/import_extraction_article.ipynb +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/start_newsletter_generator.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/curebot/tabs/tab2.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/geoviz/backend.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/start_apps.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/exploration/stop_apps.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/install_feeds_and_newsletters.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/__main__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/newsletter_generation.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/newsletters/utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/.streamlit/secrets.toml.example +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/automated_report_generation.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_analysis.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_common.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_comparative.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/dashboard_signals.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/data_model.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/detailed_report_template.html +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_common.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/feeds_data.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/llm_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/perf_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/report_generation_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/start_demo.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/bertrend_service.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/default_config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/config/settings.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/bertrend_app_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/data_provider_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/models/newsletters_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/bertrend_app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/data_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/info.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/routers/newsletters.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/start.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/status.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/bertrend/stop.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/bertrend_worker.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/client.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/docker-compose-rabbitmq.yml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/queue_manager.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/rabbitmq_config.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_management/start_rabbitmq.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/queue_monitor/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/services/utils/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/bertopic_default_config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/bertrend_default_config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/parameters.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/config/services_default_config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/data_loading_component.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/embed_documents_component.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/i18n_translations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/icons.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/parameters_component.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/demos_utils/state_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_summarizer_app.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_topic_analysis_app.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/start_weak_signals_app.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/clickable_df_component.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/streamlit_components/input_with_pills_component.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/summarization/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/summarization/summarizer_app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/app_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/explore_topics.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/newsletters_generation.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/temporal_visualizations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/topic_visualizations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/demo_pages/training_page.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/topic_analysis/i18n_translations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/.streamlit/config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/i18n_translations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/demos/weak_signals/visualizations_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/agent_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter.css +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_features.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_model.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_outlook_template.html +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/newsletter_template.html +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/openai_client.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/llm_utils/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/temporal_metrics_embedding.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/metrics/topic_metrics.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/common_ngrams.json +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-en.json +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-fr.json +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/resources/stopwords-rte.json +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/services/embedding_server → bertrend-0.4.8/bertrend/services/article_scoring_server}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/services/embedding_server/routers → bertrend-0.4.8/bertrend/services/article_scoring_server/config}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/services/scheduling → bertrend-0.4.8/bertrend/services/article_scoring_server/routers}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/authentication.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/cert.pem +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_client.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/README.md +0 -0
- {bertrend-0.4.6/bertrend/services/scheduling/job_utils → bertrend-0.4.8/bertrend/services/embedding_server}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/bertrend_client_registry.json +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/config/default_config.toml +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/config/settings.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/main.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/requirements.txt +0 -0
- {bertrend-0.4.6/bertrend/services/scheduling/models → bertrend-0.4.8/bertrend/services/embedding_server/routers}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/authentication.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/embeddings.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/routers/info.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/security.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/start.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/status.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_server/stop.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/embedding_service.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/key.pem +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/.dockerignore +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/Docker_setup.md +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/Dockerfile +0 -0
- {bertrend-0.4.6/bertrend/services/summary → bertrend-0.4.8/bertrend/services/scheduling}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/dashboard_scheduling.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/docker-compose.yml +0 -0
- {bertrend-0.4.6/bertrend/services/summary_server → bertrend-0.4.8/bertrend/services/scheduling/job_utils}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/job_utils/job_functions.py +0 -0
- {bertrend-0.4.6/bertrend/services/summary_server/config → bertrend-0.4.8/bertrend/services/scheduling/models}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/models/scheduling_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/requirements.txt +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/routers/info.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/routers/scheduling.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/scheduling_service.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/scheduling/start_docker_scheduling_service.sh +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summarizer.py +0 -0
- {bertrend-0.4.6/bertrend/services/summary_server/routers → bertrend-0.4.8/bertrend/services/summary}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/abstractive_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/chatgpt_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/extractive_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/lexrank.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_client.py +0 -0
- {bertrend-0.4.6/bertrend/tests → bertrend-0.4.8/bertrend/services/summary_server}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/tests/apps → bertrend-0.4.8/bertrend/services/summary_server/config}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/config/settings.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/main.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/models.py +0 -0
- {bertrend-0.4.6/bertrend/tests/core → bertrend-0.4.8/bertrend/services/summary_server/routers}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/routers/summarize.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/services/summary_server/start.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/README_integration_tests.md +0 -0
- {bertrend-0.4.6/bertrend/tests/data_provider → bertrend-0.4.8/bertrend/tests}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/tests/demos → bertrend-0.4.8/bertrend/tests/apps}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/apps/test_process_new_data.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/conftest.py +0 -0
- {bertrend-0.4.6/bertrend/tests/demos/summarization → bertrend-0.4.8/bertrend/tests/core}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_bertrend.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_data_structure.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_representative_docs.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_temporal_metrics_embedding.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_description.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_metrics.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_topic_model.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_data_structure.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_visualizations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_trend_analysis_weak_signals.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/core/test_visualizations.py +0 -0
- {bertrend-0.4.6/bertrend/tests/llm → bertrend-0.4.8/bertrend/tests/data_provider}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_arxiv_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_data_provider_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_deep_research_live.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_google_news_provider.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/data_provider/test_rss_atom_provider.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services → bertrend-0.4.8/bertrend/tests/demos}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/embedding → bertrend-0.4.8/bertrend/tests/demos/summarization}/__init__.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/embedding_server → bertrend-0.4.8/bertrend/tests/llm}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_agent_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_article_scoring_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_features.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/llm/test_newsletter_model.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/queue → bertrend-0.4.8/bertrend/tests/services}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_bertrend_service.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_bertrend_app.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_info.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/bertrend/test_routers_newsletters.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/scheduling → bertrend-0.4.8/bertrend/tests/services/embedding}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding/test_embedding_client.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/summarizer → bertrend-0.4.8/bertrend/tests/services/embedding_server}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_models.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_routers.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/embedding_server/test_settings.py +0 -0
- {bertrend-0.4.6/bertrend/tests/services/summary → bertrend-0.4.8/bertrend/tests/services/queue}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_bertrend_worker.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_client.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/queue/test_queue_manager.py +0 -0
- {bertrend-0.4.6/bertrend/tests/utils → bertrend-0.4.8/bertrend/tests/services/scheduling}/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_job_exception_fix.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_scheduling_service.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/scheduling/test_stress_test.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_abstractive_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_chatgpt_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_extractive_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summarizer/test_summarizer.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/services/summary/test_summary_server.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/test_installation.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/test_integration.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_apscheduler_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_cache_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_config_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_crontab_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_data_loading.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_date_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_lazy_scheduler.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_mail_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_multiworker.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_scheduler_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/tests/utils/test_utils_init.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/data_structure.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/representative_docs.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/topic_description.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/topic_analysis/visualizations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/data_structure.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/prompts.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_en.html +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/signal_llm_template_fr.html +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/visualizations.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/trend_analysis/weak_signals.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/__init__.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/cache_utils.py +0 -0
- {bertrend-0.4.6 → bertrend-0.4.8}/bertrend/utils/config_utils.py +0 -0
- {bertrend-0.4.6 → 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.
|
|
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
|
|
@@ -12,6 +12,7 @@ Maintainer: Jérôme Picault
|
|
|
12
12
|
Maintainer-email: jerome.picault@rte-france.com
|
|
13
13
|
Requires-Python: >=3.12,<4.0
|
|
14
14
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
15
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
16
|
Requires-Dist: APScheduler (>=3.11.2)
|
|
16
17
|
Requires-Dist: PyJWT (>=2.11.0)
|
|
17
18
|
Requires-Dist: SQLAlchemy (>=2.0.46)
|
|
@@ -91,6 +92,7 @@ Description-Content-Type: text/markdown
|
|
|
91
92
|
[](https://pypi.org/project/bertrend/)
|
|
92
93
|

|
|
93
94
|

|
|
95
|
+
[](https://tokei.kojix2.net/github/rte-france/BERTrend)
|
|
94
96
|
|
|
95
97
|
## News
|
|
96
98
|
|
|
@@ -122,7 +124,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
|
|
|
122
124
|
topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
|
|
123
125
|
topics and trends over time.
|
|
124
126
|
|
|
125
|
-
The code base is illustrated via
|
|
127
|
+
The code base is illustrated via three main demos:
|
|
126
128
|
|
|
127
129
|
### Dynamic Topic Modeling Analysis
|
|
128
130
|
|
|
@@ -168,6 +170,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
168
170
|
- Interpretation of these signals using LLMs
|
|
169
171
|
- Inspection of the topic merging process using Sankey diagram
|
|
170
172
|
|
|
173
|
+
### Prospective Analysis
|
|
174
|
+
|
|
175
|
+
- [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
|
|
176
|
+
Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
|
|
177
|
+
|
|
178
|
+
#### Prospective Analysis Demonstrator Video
|
|
179
|
+
|
|
180
|
+
(Coming soon)
|
|
181
|
+
|
|
182
|
+
#### Demonstrator Features
|
|
183
|
+
|
|
184
|
+
- Data flow configuration and collection status monitoring
|
|
185
|
+
- Model status and monitoring by information source
|
|
186
|
+
- Real-time signal analysis and trend exploration
|
|
187
|
+
- Detailed topic analysis and interpretation
|
|
188
|
+
- Automated report and newsletter generation
|
|
189
|
+
- Comparative analysis between different periods
|
|
190
|
+
|
|
171
191
|
## Installation
|
|
172
192
|
|
|
173
193
|
### Environment Setup (.env and .venv)
|
|
@@ -428,6 +448,11 @@ Provides various statistics about topics:
|
|
|
428
448
|
|
|
429
449
|

|
|
430
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
|
+
|
|
431
456
|
## Support
|
|
432
457
|
|
|
433
458
|
Please use the 'Issues' section to report and discuss any problems with BERTrend.
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
[](https://pypi.org/project/bertrend/)
|
|
9
9
|

|
|
10
10
|

|
|
11
|
+
[](https://tokei.kojix2.net/github/rte-france/BERTrend)
|
|
11
12
|
|
|
12
13
|
## News
|
|
13
14
|
|
|
@@ -39,7 +40,7 @@ The BERTrend repository provides a set of metrics, methods, and visualization to
|
|
|
39
40
|
topic modeling in large text corpora. The tools are designed to help users detect, analyze, and visualize emerging
|
|
40
41
|
topics and trends over time.
|
|
41
42
|
|
|
42
|
-
The code base is illustrated via
|
|
43
|
+
The code base is illustrated via three main demos:
|
|
43
44
|
|
|
44
45
|
### Dynamic Topic Modeling Analysis
|
|
45
46
|
|
|
@@ -85,6 +86,24 @@ https://github.com/user-attachments/assets/d79368d9-d4e0-4324-8a98-a888f0ab3b65
|
|
|
85
86
|
- Interpretation of these signals using LLMs
|
|
86
87
|
- Inspection of the topic merging process using Sankey diagram
|
|
87
88
|
|
|
89
|
+
### Prospective Analysis
|
|
90
|
+
|
|
91
|
+
- [bertrend/bertrend_apps/prospective_demo](bertrend/bertrend_apps/prospective_demo): A comprehensive "Prospective
|
|
92
|
+
Analysis Demo" application for monitoring, analysis, and trend detection in real time (works with live data).
|
|
93
|
+
|
|
94
|
+
#### Prospective Analysis Demonstrator Video
|
|
95
|
+
|
|
96
|
+
(Coming soon)
|
|
97
|
+
|
|
98
|
+
#### Demonstrator Features
|
|
99
|
+
|
|
100
|
+
- Data flow configuration and collection status monitoring
|
|
101
|
+
- Model status and monitoring by information source
|
|
102
|
+
- Real-time signal analysis and trend exploration
|
|
103
|
+
- Detailed topic analysis and interpretation
|
|
104
|
+
- Automated report and newsletter generation
|
|
105
|
+
- Comparative analysis between different periods
|
|
106
|
+
|
|
88
107
|
## Installation
|
|
89
108
|
|
|
90
109
|
### Environment Setup (.env and .venv)
|
|
@@ -345,6 +364,11 @@ Provides various statistics about topics:
|
|
|
345
364
|
|
|
346
365
|

|
|
347
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
|
+
|
|
348
372
|
## Support
|
|
349
373
|
|
|
350
374
|
Please use the 'Issues' section to report and discuss any problems with BERTrend.
|
|
@@ -364,7 +364,7 @@ class BERTrend:
|
|
|
364
364
|
# Check if both timestamps exist in topic models
|
|
365
365
|
if new_model is None or self.last_topic_model is None:
|
|
366
366
|
raise ValueError(
|
|
367
|
-
|
|
367
|
+
"At least one topic model is not valid. You must fit the BERTrend model before merging models."
|
|
368
368
|
)
|
|
369
369
|
|
|
370
370
|
# Get default BERTrend config if argument is not provided
|
|
@@ -7,6 +7,7 @@ from __future__ import annotations
|
|
|
7
7
|
|
|
8
8
|
import hashlib
|
|
9
9
|
import os
|
|
10
|
+
import re
|
|
10
11
|
from contextlib import contextmanager
|
|
11
12
|
from datetime import datetime
|
|
12
13
|
from pathlib import Path
|
|
@@ -293,11 +294,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
293
294
|
|
|
294
295
|
def remove_scrapping_for_user(self, feed_id: str, user: str | None = None):
|
|
295
296
|
"""Removes from the scheduler service the job matching the provided feed_id"""
|
|
297
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
296
298
|
try:
|
|
297
299
|
job_ids = self.find_jobs(
|
|
298
300
|
patterns={
|
|
299
301
|
"url": ".*/scrape-feed.*",
|
|
300
|
-
"json_data": {
|
|
302
|
+
"json_data": {
|
|
303
|
+
"user": re.escape(user),
|
|
304
|
+
"model_id": re.escape(feed_id),
|
|
305
|
+
},
|
|
301
306
|
}
|
|
302
307
|
)
|
|
303
308
|
self.remove_jobs(job_ids)
|
|
@@ -308,11 +313,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
308
313
|
|
|
309
314
|
def remove_scheduled_training_for_user(self, model_id: str, user: str):
|
|
310
315
|
"""Removes from the crontab the training job matching the provided model_id"""
|
|
316
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
311
317
|
try:
|
|
312
318
|
job_ids = self.find_jobs(
|
|
313
319
|
patterns={
|
|
314
320
|
"url": ".*/train-new-model.*",
|
|
315
|
-
"json_data": {
|
|
321
|
+
"json_data": {
|
|
322
|
+
"user": re.escape(user),
|
|
323
|
+
"model_id": re.escape(model_id),
|
|
324
|
+
},
|
|
316
325
|
}
|
|
317
326
|
)
|
|
318
327
|
self.remove_jobs(job_ids)
|
|
@@ -325,11 +334,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
325
334
|
self, model_id: str, user: str
|
|
326
335
|
) -> bool:
|
|
327
336
|
"""Removes from the crontab the report generation job matching the provided model_id"""
|
|
337
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
328
338
|
try:
|
|
329
339
|
job_ids = self.find_jobs(
|
|
330
340
|
patterns={
|
|
331
341
|
"url": ".*/generate-report.*",
|
|
332
|
-
"json_data": {
|
|
342
|
+
"json_data": {
|
|
343
|
+
"user": re.escape(user),
|
|
344
|
+
"model_id": re.escape(model_id),
|
|
345
|
+
},
|
|
333
346
|
}
|
|
334
347
|
)
|
|
335
348
|
self.remove_jobs(job_ids)
|
|
@@ -342,11 +355,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
342
355
|
self, feed_id: str, user: str | None = None
|
|
343
356
|
) -> bool:
|
|
344
357
|
"""Checks if a given scrapping feed is active (registered with the service)."""
|
|
358
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
345
359
|
try:
|
|
346
360
|
job_ids = self.find_jobs(
|
|
347
361
|
patterns={
|
|
348
362
|
"url": ".*/scrape-feed.*",
|
|
349
|
-
"json_data": {
|
|
363
|
+
"json_data": {
|
|
364
|
+
"user": re.escape(user),
|
|
365
|
+
"model_id": re.escape(feed_id),
|
|
366
|
+
},
|
|
350
367
|
}
|
|
351
368
|
)
|
|
352
369
|
return len(job_ids) > 0
|
|
@@ -358,11 +375,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
358
375
|
|
|
359
376
|
def check_if_learning_active_for_user(self, model_id: str, user: str) -> bool:
|
|
360
377
|
"""Checks if a given scrapping feed is active (registered in the crontab"""
|
|
378
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
361
379
|
try:
|
|
362
380
|
job_ids = self.find_jobs(
|
|
363
381
|
patterns={
|
|
364
382
|
"url": ".*/train-new-model.*",
|
|
365
|
-
"json_data": {
|
|
383
|
+
"json_data": {
|
|
384
|
+
"user": re.escape(user),
|
|
385
|
+
"model_id": re.escape(model_id),
|
|
386
|
+
},
|
|
366
387
|
}
|
|
367
388
|
)
|
|
368
389
|
return len(job_ids) > 0
|
|
@@ -376,11 +397,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
376
397
|
self, model_id: str, user: str
|
|
377
398
|
) -> bool:
|
|
378
399
|
"""Checks if automated report generation is active (registered in the crontab)"""
|
|
400
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
379
401
|
try:
|
|
380
402
|
job_ids = self.find_jobs(
|
|
381
403
|
patterns={
|
|
382
404
|
"url": ".*/generate-report.*",
|
|
383
|
-
"json_data": {
|
|
405
|
+
"json_data": {
|
|
406
|
+
"user": re.escape(user),
|
|
407
|
+
"model_id": re.escape(model_id),
|
|
408
|
+
},
|
|
384
409
|
}
|
|
385
410
|
)
|
|
386
411
|
return len(job_ids) > 0
|
|
@@ -394,11 +419,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
394
419
|
self, feed_id: str, user: str | None = None
|
|
395
420
|
) -> datetime | None:
|
|
396
421
|
"""Return the next scrapping date for the given feed_id and user"""
|
|
422
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
397
423
|
try:
|
|
398
424
|
jobs = self.find_jobs_description(
|
|
399
425
|
patterns={
|
|
400
426
|
"url": ".*/scrape-feed.*",
|
|
401
|
-
"json_data": {
|
|
427
|
+
"json_data": {
|
|
428
|
+
"user": re.escape(user),
|
|
429
|
+
"model_id": re.escape(feed_id),
|
|
430
|
+
},
|
|
402
431
|
}
|
|
403
432
|
)
|
|
404
433
|
if len(jobs) == 0:
|
|
@@ -414,11 +443,15 @@ class APSchedulerUtils(SchedulerUtils):
|
|
|
414
443
|
self, model_id: str, user: str | None = None
|
|
415
444
|
) -> datetime | None:
|
|
416
445
|
"""Return the next scrapping date for the given feed_id and user"""
|
|
446
|
+
# NB. user and model_id are escaped in case they contain special characters that can be interpreted in the regex search
|
|
417
447
|
try:
|
|
418
448
|
jobs = self.find_jobs_description(
|
|
419
449
|
patterns={
|
|
420
450
|
"url": ".*/train-new-model.*",
|
|
421
|
-
"json_data": {
|
|
451
|
+
"json_data": {
|
|
452
|
+
"user": re.escape(user),
|
|
453
|
+
"model_id": re.escape(model_id),
|
|
454
|
+
},
|
|
422
455
|
}
|
|
423
456
|
)
|
|
424
457
|
if len(jobs) == 0:
|
|
@@ -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
|
-
|
|
93
|
-
|
|
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 <
|
|
121
|
+
# Filter out articles with quality < minimum_quality_level
|
|
96
122
|
filtered_articles = [
|
|
97
123
|
{
|
|
98
124
|
**article,
|
|
99
|
-
"quality_metrics": results[i]
|
|
100
|
-
"overall_quality": results[i]
|
|
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].
|
|
105
|
-
|
|
106
|
-
and results[i].
|
|
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
|
-
|
|
133
|
+
|
|
109
134
|
logger.info(
|
|
110
135
|
f"Filtered out {len(articles) - len(filtered_articles)} articles with quality < {minimum_quality_level.name}"
|
|
111
136
|
)
|
|
@@ -31,7 +31,7 @@ def show() -> None:
|
|
|
31
31
|
except Exception as e:
|
|
32
32
|
logger.error(e)
|
|
33
33
|
st.error(
|
|
34
|
-
|
|
34
|
+
"Erreur lors du chargement des données. Vérifiez que vos données respectent le format Curebot attendu."
|
|
35
35
|
)
|
|
36
36
|
|
|
37
37
|
# If data is loaded
|
|
@@ -45,7 +45,7 @@ def show() -> None:
|
|
|
45
45
|
st.button(
|
|
46
46
|
"Éditer",
|
|
47
47
|
on_click=edit_newsletter,
|
|
48
|
-
disabled=
|
|
48
|
+
disabled="newsletter_text" not in st.session_state,
|
|
49
49
|
)
|
|
50
50
|
|
|
51
51
|
# Show newsletter download button
|
|
@@ -65,7 +65,7 @@ def show() -> None:
|
|
|
65
65
|
file_name="newsletters.html",
|
|
66
66
|
mime="text/html",
|
|
67
67
|
data=data,
|
|
68
|
-
disabled=
|
|
68
|
+
disabled="newsletter_text" not in st.session_state,
|
|
69
69
|
)
|
|
70
70
|
|
|
71
71
|
# Show newsletter
|
|
@@ -3,14 +3,17 @@
|
|
|
3
3
|
# SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
# This file is part of BERTrend.
|
|
5
5
|
import hmac
|
|
6
|
+
import os
|
|
6
7
|
|
|
7
8
|
import streamlit as st
|
|
8
9
|
|
|
9
|
-
from bertrend.
|
|
10
|
+
from bertrend.bertrend_apps.prospective_demo.i18n import translate
|
|
11
|
+
from bertrend.demos.demos_utils.icons import EMAIL_ICON, UNHAPPY_ICON
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
def login_form():
|
|
13
15
|
"""Form with widgets to collect user information"""
|
|
16
|
+
st.header("")
|
|
14
17
|
with st.form("Credentials"):
|
|
15
18
|
st.text_input("Username", key="username")
|
|
16
19
|
st.text_input("Password", type="password", key="password")
|
|
@@ -38,6 +41,16 @@ def logout():
|
|
|
38
41
|
del st.session_state["username"]
|
|
39
42
|
|
|
40
43
|
|
|
44
|
+
def show_contact_info():
|
|
45
|
+
contact = os.getenv("BERTREND_CONTACT_EMAIL", "contact@bertrend.com")
|
|
46
|
+
st.link_button(translate("contact_msg"), f"mailto:{contact}", icon=EMAIL_ICON)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def show_project_info():
|
|
50
|
+
st.write("")
|
|
51
|
+
st.markdown(translate("project_info_msg"))
|
|
52
|
+
|
|
53
|
+
|
|
41
54
|
def check_password() -> str | None:
|
|
42
55
|
"""Returns the user name if the user had a correct password, otherwise None."""
|
|
43
56
|
|
|
@@ -49,4 +62,8 @@ def check_password() -> str | None:
|
|
|
49
62
|
login_form()
|
|
50
63
|
if "password_correct" in st.session_state:
|
|
51
64
|
st.error(f"{UNHAPPY_ICON} User not known or password incorrect")
|
|
65
|
+
|
|
66
|
+
show_contact_info()
|
|
67
|
+
|
|
68
|
+
show_project_info()
|
|
52
69
|
return None
|
|
@@ -20,6 +20,7 @@ from bertrend.bertrend_apps.prospective_demo.feeds_common import (
|
|
|
20
20
|
read_user_feeds,
|
|
21
21
|
)
|
|
22
22
|
from bertrend.bertrend_apps.prospective_demo.i18n import translate
|
|
23
|
+
from bertrend.bertrend_apps.prospective_demo.models_info import delete_model_config
|
|
23
24
|
from bertrend.config.parameters import LANGUAGES
|
|
24
25
|
from bertrend.demos.demos_utils.icons import (
|
|
25
26
|
ADD_ICON,
|
|
@@ -337,7 +338,6 @@ def handle_delete(row_dict: dict):
|
|
|
337
338
|
feed_id=feed_id, user=st.session_state.username
|
|
338
339
|
)
|
|
339
340
|
delete_feed_config(feed_id)
|
|
340
|
-
logger.info(f"Flux {feed_id} supprimé !")
|
|
341
341
|
# Remove from crontab associated training
|
|
342
342
|
SCHEDULER_UTILS.remove_scheduled_training_for_user(
|
|
343
343
|
model_id=feed_id, user=st.session_state.username
|
|
@@ -349,6 +349,8 @@ def handle_delete(row_dict: dict):
|
|
|
349
349
|
SCHEDULER_UTILS.remove_scheduled_report_generation_for_user(
|
|
350
350
|
model_id=feed_id, user=st.session_state.username
|
|
351
351
|
)
|
|
352
|
+
delete_model_config(feed_id)
|
|
353
|
+
logger.info(f"Flux {feed_id} supprimé !")
|
|
352
354
|
time.sleep(0.2)
|
|
353
355
|
st.rerun()
|
|
354
356
|
with col2:
|
{bertrend-0.4.6 → bertrend-0.4.8}/bertrend/bertrend_apps/prospective_demo/i18n_translations.py
RENAMED
|
@@ -3,10 +3,18 @@
|
|
|
3
3
|
# SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
# This file is part of BERTrend.
|
|
5
5
|
TRANSLATIONS = {
|
|
6
|
+
"project_info_msg": {
|
|
7
|
+
"fr": "BERTrend est un projet open-source développé par RTE. Visitez notre github pour plus d'informations: https://github.com/rte-france/BERTrend",
|
|
8
|
+
"en": "BERTrend is an open-source project developed by RTE. Visit our github for more information: https://github.com/rte-france/BERTrend",
|
|
9
|
+
},
|
|
10
|
+
"contact_msg": {
|
|
11
|
+
"en": "Questions, new account or bug reports? Contact us !",
|
|
12
|
+
"fr": "Des questions, un nouveau compte ou des rapports de bugs ? Contactez-nous !",
|
|
13
|
+
},
|
|
6
14
|
# App.py translations
|
|
7
15
|
"app_title": {
|
|
8
|
-
"fr": "BERTrend -
|
|
9
|
-
"en": "BERTrend - Monitoring &
|
|
16
|
+
"fr": "BERTrend - IA pour la Veille (Analyses & Tendances)",
|
|
17
|
+
"en": "BERTrend - AI for Monitoring, Analysis & Trends",
|
|
10
18
|
},
|
|
11
19
|
"check_data_button_label": {"fr": "Vérifier les données", "en": "Check data"},
|
|
12
20
|
"tab_monitoring": {"fr": "Veilles", "en": "Monitoring"},
|
|
@@ -13,6 +13,16 @@ import toml
|
|
|
13
13
|
from loguru import logger
|
|
14
14
|
|
|
15
15
|
from bertrend import load_toml_config
|
|
16
|
+
from bertrend.bertrend_apps import SCHEDULER_UTILS
|
|
17
|
+
from bertrend.bertrend_apps.prospective_demo import (
|
|
18
|
+
DEFAULT_ANALYSIS_CFG,
|
|
19
|
+
get_model_cfg_path,
|
|
20
|
+
get_user_models_path,
|
|
21
|
+
)
|
|
22
|
+
from bertrend.bertrend_apps.prospective_demo.i18n import translate
|
|
23
|
+
from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
|
|
24
|
+
from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
|
|
25
|
+
from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
|
|
16
26
|
from bertrend.config.parameters import LANGUAGES
|
|
17
27
|
from bertrend.demos.demos_utils.icons import (
|
|
18
28
|
DELETE_ICON,
|
|
@@ -28,16 +38,6 @@ from bertrend.demos.streamlit_components.clickable_df_component import clickable
|
|
|
28
38
|
from bertrend.demos.streamlit_components.input_with_pills_component import (
|
|
29
39
|
input_with_pills,
|
|
30
40
|
)
|
|
31
|
-
from bertrend.bertrend_apps import SCHEDULER_UTILS
|
|
32
|
-
from bertrend.bertrend_apps.prospective_demo import (
|
|
33
|
-
DEFAULT_ANALYSIS_CFG,
|
|
34
|
-
get_model_cfg_path,
|
|
35
|
-
get_user_models_path,
|
|
36
|
-
)
|
|
37
|
-
from bertrend.bertrend_apps.prospective_demo.i18n import translate
|
|
38
|
-
from bertrend.bertrend_apps.prospective_demo.perf_utils import get_least_used_gpu
|
|
39
|
-
from bertrend.bertrend_apps.prospective_demo.process_new_data import regenerate_models
|
|
40
|
-
from bertrend.bertrend_apps.prospective_demo.utils import is_valid_email
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
@st.cache_data(ttl=60)
|
|
@@ -302,6 +302,17 @@ def save_model_config(model_id: str, config: dict):
|
|
|
302
302
|
logger.debug(f"Saved model analysis config {config} to {model_cfg_path}")
|
|
303
303
|
|
|
304
304
|
|
|
305
|
+
def delete_model_config(model_id: str):
|
|
306
|
+
model_cfg_path = get_model_cfg_path(
|
|
307
|
+
user_name=st.session_state.username, model_id=model_id
|
|
308
|
+
)
|
|
309
|
+
if os.path.exists(model_cfg_path):
|
|
310
|
+
os.remove(model_cfg_path)
|
|
311
|
+
logger.info(f"Model config {model_id} removed")
|
|
312
|
+
else:
|
|
313
|
+
logger.warning(f"Model config {model_id} not found")
|
|
314
|
+
|
|
315
|
+
|
|
305
316
|
@st.dialog(translate("dialog_confirmation"))
|
|
306
317
|
def handle_delete_models(row_dict: dict):
|
|
307
318
|
"""Function to handle remove models from cache"""
|