Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| import importlib | |
| import streamlit as st | |
| from typing import List, Dict, Any | |
| from dotenv import load_dotenv | |
| from global_vars import translations, t | |
| # Constantes | |
| CONFIG_FILE = "config.json" | |
| def load_config() -> Dict[str, Any]: | |
| if os.path.exists(CONFIG_FILE): | |
| with open(CONFIG_FILE, 'r') as f: | |
| return json.load(f) | |
| return {} | |
| def save_config(config: Dict[str, Any]): | |
| with open(CONFIG_FILE, 'w') as f: | |
| json.dump(config, f, indent=2) | |
| # Fonction pour mettre à jour la langue | |
| def set_lang(language): | |
| st.session_state.lang = language | |
| # Fonction de traduction | |
| def t(key: str) -> str: | |
| return translations[st.session_state.lang].get(key, key) | |
| class Plugin: | |
| def __init__(self, name, plugin_manager): | |
| self.name = name | |
| self.plugin_manager = plugin_manager | |
| def get_config_fields(self) -> Dict[str, Any]: | |
| return {} | |
| def get_config_ui(self, config): | |
| updated_config = {} | |
| for field, params in self.get_config_fields().items(): | |
| if params['type'] == 'select': | |
| updated_config[field] = st.selectbox( | |
| params['label'], | |
| options=[option[0] for option in params['options']], | |
| format_func=lambda x: dict(params['options'])[x], | |
| index=[option[0] for option in params['options']].index(config.get(field, params['default'])) | |
| ) | |
| elif params['type'] == 'textarea': | |
| updated_config[field] = st.text_area( | |
| params['label'], | |
| value=config.get(field, params['default']) | |
| ) | |
| else: | |
| updated_config[field] = st.text_input( | |
| params['label'], | |
| value=config.get(field, params['default']), | |
| type="password" if field.startswith("pass") else "default" | |
| ) | |
| return updated_config | |
| def get_tabs(self) -> List[Dict[str, Any]]: | |
| return [] | |
| def run(self, config: Dict[str, Any]): | |
| pass | |
| def get_sidebar_config_ui(self, config: Dict[str, Any]) -> Dict[str, Any]: | |
| return {} | |
| class PluginManager: | |
| def __init__(self): | |
| self.plugins: Dict[str, Plugin] = {} | |
| self.starred_plugins: Set[str] = set() | |
| def load_plugins(self): | |
| plugins_dir = 'plugins' | |
| for filename in os.listdir(plugins_dir): | |
| if filename.endswith('.py'): | |
| module_name = filename[:-3] | |
| module = importlib.import_module(f'plugins.{module_name}') | |
| plugin_class = getattr(module, f'{module_name.capitalize()}Plugin') | |
| self.plugins[module_name] = plugin_class(module_name, self) | |
| def get_plugin(self, plugin_name: str) -> Plugin: | |
| return self.plugins.get(plugin_name) | |
| def get_all_config_ui(self, config: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: | |
| all_ui = {} | |
| for plugin_name, plugin in sorted(self.plugins.items()): | |
| with st.expander(f"{'⭐ ' if plugin_name in self.starred_plugins else ''}{t('configurations')} {plugin_name}"): | |
| all_ui[plugin_name] = plugin.get_config_ui(config.get(plugin_name, {})) | |
| if st.button(f"{'Unstar' if plugin_name in self.starred_plugins else 'Star'} {plugin_name}"): | |
| if plugin_name in self.starred_plugins: | |
| self.starred_plugins.remove(plugin_name) | |
| else: | |
| self.starred_plugins.add(plugin_name) | |
| self.save_starred_plugins(config) | |
| st.rerun() | |
| return all_ui | |
| def get_all_tabs(self) -> List[Dict[str, Any]]: | |
| all_tabs = [] | |
| for plugin_name, plugin in sorted(self.plugins.items()): | |
| tabs = plugin.get_tabs() | |
| for tab in tabs: | |
| tab['id'] = plugin_name | |
| tab['starred'] = plugin_name in self.starred_plugins | |
| all_tabs.extend(tabs) | |
| return all_tabs | |
| def load_starred_plugins(self, config: Dict[str, Any]): | |
| self.starred_plugins = set(config.get('starred_plugins', [])) | |
| def save_starred_plugins(self, config: Dict[str, Any]): | |
| config['starred_plugins'] = list(self.starred_plugins) | |
| save_config(config) | |
| def run_plugin(self, plugin_name: str, config: Dict[str, Any]): | |
| if plugin_name in self.plugins: | |
| self.plugins[plugin_name].run(config) | |
| def save_config(self, config): | |
| save_config(config) | |
| def main(): | |
| st.set_page_config(page_title="Veille", layout="wide") | |
| # Initialisation du gestionnaire de plugins | |
| plugin_manager = PluginManager() | |
| plugin_manager.load_plugins() | |
| # Chargement de la configuration | |
| config = load_config() | |
| plugin_manager.load_starred_plugins(config) | |
| # Initialisation de la langue dans st.session_state | |
| if 'lang' not in st.session_state: | |
| st.session_state.lang = config['common']['language'] | |
| st.title(t("page_title")) | |
| load_dotenv() | |
| LLM_KEY = os.getenv("LLM_API_KEY") | |
| config['llm_key'] = LLM_KEY | |
| # Création des onglets avec des identifiants uniques | |
| tabs = [{"id": "configurations", "name": t("configurations")}] + [{"id": tab['plugin'], "name": tab['name'], "starred" : tab['starred']} for tab in plugin_manager.get_all_tabs()] | |
| # Gestion de la langue | |
| if 'lang' not in st.session_state: | |
| st.session_state.lang = "fr" | |
| new_lang = st.sidebar.selectbox("Choose your language / Choisissez votre langue", options=["en", "fr"], index=["en", "fr"].index(st.session_state.lang), key="lang_selector") | |
| if new_lang != st.session_state.lang: | |
| st.session_state.lang = new_lang | |
| st.rerun() | |
| # Ajout des éléments de configuration de la sidebar pour chaque plugin | |
| for plugin_name, plugin in plugin_manager.plugins.items(): | |
| sidebar_config = plugin.get_sidebar_config_ui(config.get(plugin_name, {})) | |
| if sidebar_config: | |
| #st.sidebar.markdown(f"**{plugin_name} Configuration**") | |
| for key, value in sidebar_config.items(): | |
| config.setdefault(plugin_name, {})[key] = value | |
| # Gestion de l'onglet sélectionné | |
| if 'selected_tab_id' not in st.session_state: | |
| st.session_state.selected_tab_id = "configurations" | |
| # Sort tabs alphabetically, with starred tabs first | |
| sorted_tabs = sorted(tabs, key=lambda x: (not x.get('starred', False), x['name'])) | |
| tab_names = [f"{'⭐ ' if tab.get('starred', False) else ''}{tab['name']}" for tab in sorted_tabs] | |
| selected_tab_index = [tab["id"] for tab in sorted_tabs].index(st.session_state.selected_tab_id) | |
| selected_tab = st.sidebar.radio(t("navigation"), tab_names, index=selected_tab_index, key="tab_selector") | |
| new_selected_tab_id = next(tab["id"] for tab in sorted_tabs if f"{'⭐ ' if tab.get('starred', False) else ''}{tab['name']}" == selected_tab) | |
| if new_selected_tab_id != st.session_state.selected_tab_id: | |
| st.session_state.selected_tab_id = new_selected_tab_id | |
| st.rerun() | |
| if st.session_state.selected_tab_id == "configurations": | |
| st.header(t("configurations")) | |
| all_config_ui = plugin_manager.get_all_config_ui(config) | |
| for plugin_name, ui_config in all_config_ui.items(): | |
| with st.expander(f"{t('configurations')} {plugin_name}"): | |
| config[plugin_name] = ui_config | |
| if st.button(t("save_button")): | |
| save_config(config) | |
| st.success(t("success_message")) | |
| else: | |
| # Exécution du plugin correspondant à l'onglet sélectionné | |
| for tab in plugin_manager.get_all_tabs(): | |
| if tab['plugin'] == st.session_state.selected_tab_id: | |
| plugin_manager.run_plugin(tab['plugin'], config) | |
| break | |
| if __name__ == "__main__": | |
| main() | |