OlympIA / app.py
johannoriel's picture
Initial relase. Tested. Working
f34a6fd
raw
history blame
7.89 kB
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()