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() | |