├── .gitignore ├── .streamlit └── config.toml ├── Lux-Interface-Installer.exe ├── README.md ├── [setup] ├── Lux-Interface-Installer.iss └── setup.py ├── interface ├── CONFIG.py ├── configuration │ ├── _ui_custom │ │ ├── custom_ui.py │ │ └── page_title.py │ ├── audio │ │ ├── change_synthetic_voice.py │ │ ├── select_audio_chunk.py │ │ ├── select_audio_rate.py │ │ ├── select_buffer_length.py │ │ ├── select_micro_sensitivity.py │ │ ├── select_microphone.py │ │ ├── select_narrator_voice.py │ │ └── select_speed_voice.py │ ├── cam │ │ └── select_cam.py │ ├── import_tools │ │ ├── manage_menu.py │ │ ├── manage_requirements.py │ │ ├── manage_select_tool.py │ │ └── manage_tools_list.py │ ├── llm │ │ ├── select_build_model.py │ │ └── select_llm_max_history.py │ ├── rag │ │ └── select_similarity.py │ ├── select_language.py │ ├── update_config.py │ └── upload_tools.py ├── kernel │ ├── agent_llm │ │ ├── build_llm │ │ │ └── auto_build_llm.py │ │ ├── llm │ │ │ ├── llm.py │ │ │ ├── llm_embeddings.py │ │ │ └── llm_rag.py │ │ ├── rag │ │ │ └── similarity_search.py │ │ └── vectorization_tools.py │ ├── audio │ │ ├── speech_to_text │ │ │ ├── record.py │ │ │ └── whisper.py │ │ └── synthetic_voice │ │ │ ├── en_lux_voice.wav │ │ │ ├── fr_lux_voice.wav │ │ │ ├── narrator_voice.py │ │ │ └── synthetic_voice.py │ ├── start_kernel.py │ └── tools │ │ ├── select_tool.py │ │ ├── tools_functions │ │ ├── exit_system.py │ │ ├── pause_system.py │ │ ├── tools_action │ │ │ ├── cam │ │ │ │ └── screen_cam.py │ │ │ ├── screenshot.py │ │ │ ├── take_note.py │ │ │ ├── time.py │ │ │ └── web_search │ │ │ │ ├── check_connection.py │ │ │ │ └── search_webs.py │ │ └── tools_response │ │ │ └── hello_sir.py │ │ └── tools_list.py ├── menu.py ├── pages │ ├── 1_configuration.py │ └── 2_assistant.py └── ressources │ ├── logo-lux-interface.ico │ ├── logo-lux.png │ └── schema-system-architecture │ └── lux-system-architecture.png ├── license.txt ├── lux-interface.exe └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Env files 2 | __pycache__ 3 | .env 4 | 5 | # Temp audio & voice folder 6 | interface/kernel/audio/speech_to_text/temp_audio 7 | interface/kernel/audio/synthetic_voice/temp_voice 8 | 9 | # Temp tools vector db 10 | interface/kernel/agent_llm/rag/tools_vector_db 11 | 12 | # Modelfile system instruction for models 13 | modelfile 14 | 15 | # Photo taken 16 | photos 17 | 18 | # JSON Save LLM Conversations 19 | conversation_history 20 | 21 | -------------------------------------------------------------------------------- /.streamlit/config.toml: -------------------------------------------------------------------------------- 1 | [theme] 2 | primaryColor="#b357a9" 3 | backgroundColor="#121b3b" 4 | secondaryBackgroundColor="#265a9c" 5 | textColor="#f0d6ec" 6 | -------------------------------------------------------------------------------- /Lux-Interface-Installer.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nixiz0/Lux/9f3cc0cb272e46eb5215195034e75f2551c1f95d/Lux-Interface-Installer.exe -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lux Project 2 | 3 | Welcome to the **Lux Project**! This project aims to provide a powerful and flexible assistant for all users (using the version accessible to all who are Lux-Interface) but also for developers (using the Lux-Kernel versions here) allowing developers to use this as a basis to build whatever they want with. 4 | 5 | 6 | ## 🖥️ Lux Interface 7 | 8 | The **Lux Interface** is designed for end-users who may not be developers. It provides a user-friendly interface to configure and personalize the assistant without using command lines. 9 | 10 | The interface is user-friendly and allow to: 11 | - Configure the system. 12 | - Import different tools. 13 | - Run the asssitant. 14 | 15 | 16 | ## 🛠️ Lux Kernel 17 | 18 | The **Lux Kernel** is designed for developers and consists of two main components: 19 | 20 | 1. **Synthetic Cloned Voice Kernel**: A text-to-speech system using cloned synthetic voices (*requires high-performance hardware to use this system*), here we use *CoquiTTS*. 21 | 2. **Synthetic Narrator Voice Kernel**: A text-to-speech system using a windows narrator's voice. 22 | 23 | The Lux Kernels also includes: 24 | - **Speech-to-Text**: Convert spoken words into text, using *Whisper large v3*. 25 | - **Intelligent Tool Selection System**: Using a RAG system to select tools based on user prompts, using *sklearn* for similarity & *ChromaDB* for vector database. 26 | - **Inspired by Linux Kernel**: A flexible and small assistant core to allow developers to create various features with it and be able to use it as a base. 27 | 28 | 29 | ## 🔧 Lux Tools 30 | 31 | Find here the different **official tools** that you can integrate into your Lux assistant: 32 | 33 | **[Lux-Official-Tools](https://github.com/nixiz0/Lux-Tools)** 34 | 35 | Find here the different **community tools** that you can integrate into your Lux assistant: 36 | 37 | **[Lux-Community-Tools](https://github.com/nixiz0/Lux-Tools/tree/community-tools)** 38 | 39 | 40 | ## 🚀 Installation 41 | 42 | 1. **Download the App**: 43 | - Click on `Lux-Interface-Installer.exe` to download the app. 44 | - Ensure to install the necessary applications in the *Tech Stack*. 45 | 46 | 2. **Build the Environment**: 47 | - Click on `lux-interface.exe` to build the environment for the app. 48 | 49 | 50 | ## 🏗️ System Architecture 51 | 52 | Lux System Architecture 53 | 54 | 55 | ## ⚙️ Tech Stack 56 | 57 | ### Applications You Need to Install 58 | 59 | 1. **[Ollama](https://ollama.com/download) (version 0.5.7)** 60 | 2. **[Python 3.11](https://www.python.org/downloads/release/python-3117/)** (add path to your OS environment variable) 61 | 3. **[CUDA 11.8](https://developer.nvidia.com/cuda-11-8-0-download-archive)** (ensure your graphics card is compatible) 62 | 4. **[VS Community](https://visualstudio.microsoft.com/fr/visual-cpp-build-tools/)** (with Desktop packages) 63 | 64 | ### Additional Installations (if needed) 65 | 66 | - **Scoop**: 67 | ```powershell 68 | powershell -Command "Set-ExecutionPolicy RemoteSigned -scope CurrentUser" 69 | powershell -Command "iex (new-object net.webclient).downloadstring('https://get.scoop.sh')" 70 | 71 | - **FFmpeg**: 72 | ```powershell 73 | scoop install ffmpeg 74 | 75 | 76 | ## 🎙️ Windows Narrator Voices 77 | 78 | To use Windows Narrator Voices instead of cloned voices, you can download more synthetic voices from the narrator settings. 79 | 80 | If it doesn't recognize the voices you installed, follow these steps: 81 | 82 | 1. **Open the Registry Editor**: 83 | - Press the “Windows” and “R” keys simultaneously, type “regedit”, and press Enter. 84 | 85 | 2. **Navigate to the Registry Key**: 86 | - `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens` 87 | 88 | 3. **Export the Key to a REG File**: 89 | - Right-click on the key and select "Export". 90 | 91 | 4. **Edit the REG File**: 92 | - Open the REG file with a text editor. 93 | - Replace all occurrences of `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech_OneCore\Voices\Tokens` with `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SPEECH\Voices\Tokens`. 94 | 95 | 5. **Import the Modified REG File**: 96 | - Save the modified file and double-click it to import the changes to the registry. 97 | 98 | 99 | ## Author 100 | 101 | - [@nixiz0](https://github.com/nixiz0) 102 | -------------------------------------------------------------------------------- /[setup]/Lux-Interface-Installer.iss: -------------------------------------------------------------------------------- 1 | ; ---[TO BUILD THE .EXE INSTALLER, FIRST CLONE THE CLEAN PROJECT FROM THE GITHUB REPO (rename it Lux). ENSURE THE PROJECT IS EMPTY, WITHOUT ANY ADDITIONAL MODIFICATIONS OR FILES]--- 2 | ; ---[THIS WILL KEEP THE PROJECT AS NEUTRAL AS POSSIBLE FOR COMPILING THE INSTALLER, PREVENTING UNNECESSARY FILES FROM BEING INCLUDED]--- 3 | ; Script generated by the Inno Setup Script Wizard. 4 | ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 5 | 6 | #define MyAppName "Lux-Interface" 7 | #define MyAppVersion "2.0" 8 | #define MyAppPublisher "Initium" 9 | #define MyAppURL "https://www.youtube.com/@Initium0_0" 10 | #define MyAppExeName "lux-interface.exe" 11 | #define MyAppAssocName MyAppName + "-File" 12 | #define MyAppAssocExt ".py" 13 | #define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt 14 | 15 | [Setup] 16 | ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. 17 | ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 18 | AppId={{A4C2D350-2568-4765-8952-14DD5E53F92A} 19 | AppName={#MyAppName} 20 | AppVersion={#MyAppVersion} 21 | AppPublisher={#MyAppPublisher} 22 | AppPublisherURL={#MyAppURL} 23 | AppSupportURL={#MyAppURL} 24 | AppUpdatesURL={#MyAppURL} 25 | DefaultDirName={autopf}\{#MyAppName} 26 | ArchitecturesAllowed=x64compatible 27 | ArchitecturesInstallIn64BitMode=x64compatible 28 | ChangesAssociations=yes 29 | DisableProgramGroupPage=yes 30 | LicenseFile=C:\Users\username\Desktop\Lux\license.txt 31 | InfoBeforeFile=C:\Users\username\Desktop\Lux\README.md 32 | InfoAfterFile=C:\Users\username\Desktop\Lux\README.md 33 | ; Uncomment the following line to run in non administrative install mode (install for current user only.) 34 | ;PrivilegesRequired=lowest 35 | OutputDir=C:\Users\username\Desktop 36 | OutputBaseFilename=Lux-Interface-Installer 37 | Compression=lzma 38 | SolidCompression=yes 39 | WizardStyle=modern 40 | 41 | [Languages] 42 | Name: "english"; MessagesFile: "compiler:Default.isl" 43 | Name: "french"; MessagesFile: "compiler:Languages\French.isl" 44 | 45 | [Tasks] 46 | Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 47 | 48 | [Files] 49 | Source: "C:\Users\username\Desktop\Lux\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion 50 | Source: "C:\Users\username\Desktop\Lux\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: ".git\*; tools_vector_db\*; temp_audio\*; temp_voice\*; __pycache__\*; photos\*; modelfile" 51 | ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 52 | 53 | [Registry] 54 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue 55 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletekey 56 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" 57 | Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" 58 | Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\SupportedTypes"; ValueType: string; ValueName: ".myp"; ValueData: "" 59 | 60 | [Icons] 61 | Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 62 | Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 63 | 64 | [Run] 65 | Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 66 | 67 | -------------------------------------------------------------------------------- /[setup]/setup.py: -------------------------------------------------------------------------------- 1 | # [BUILD] Install pyinstaller and run the command (to build .exe file) : 2 | # <= pyinstaller --onefile --icon=interface/ressources/logo-lux-interface.ico [setup]/setup.py => 3 | 4 | import os 5 | import subprocess 6 | 7 | 8 | # ---[ANSI COLOR]--- 9 | RESET = "\033[0m" 10 | RED = "\033[31m" 11 | GREEN = "\033[32m" 12 | YELLOW = "\033[33m" 13 | BLUE = "\033[34m" 14 | MAGENTA = "\033[35m" 15 | CYAN = "\033[36m" 16 | 17 | 18 | # ---[UPDATE FILES FUNCTIONS (for voice)]--- 19 | def update_start_kernel(choice): 20 | with open('interface/kernel/start_kernel.py', 'r') as file: 21 | lines = file.readlines() 22 | with open('interface/kernel/start_kernel.py', 'w') as file: 23 | for line in lines: 24 | if 'from interface.kernel.audio.synthetic_voice' in line: 25 | if choice == '1': 26 | file.write('from interface.kernel.audio.synthetic_voice.narrator_voice import LuxVoice\n') 27 | else: 28 | file.write('from interface.kernel.audio.synthetic_voice.synthetic_voice import LuxVoice\n') 29 | else: 30 | file.write(line) 31 | 32 | def update_requirements(choice): 33 | with open('requirements.txt', 'r') as file: 34 | lines = file.readlines() 35 | with open('requirements.txt', 'w') as file: 36 | for line in lines: 37 | file.write(line) 38 | if choice == '1': 39 | file.write('comtypes==1.4.5\n') 40 | file.write('pyttsx3==2.90\n') 41 | else: 42 | file.write('TTS==0.22.0\n') 43 | 44 | def update_configuration_voice_import(choice): 45 | config_file = 'interface/pages/1_configuration.py' 46 | with open(config_file, 'r', encoding='utf-8') as file: 47 | lines = file.readlines() 48 | 49 | # Find the last line that contains 'from configuration.audio' 50 | last_index = -1 51 | for i, line in enumerate(lines): 52 | if 'from configuration.audio' in line: 53 | last_index = i 54 | 55 | # If the line exists, replace it 56 | if last_index != -1: 57 | if choice == '1': 58 | lines[last_index] = 'from configuration.audio.select_narrator_voice import manage_voice\n' 59 | else: 60 | lines[last_index] = 'from configuration.audio.change_synthetic_voice import manage_voice\n' 61 | 62 | # Write updated lines to file 63 | with open(config_file, 'w', encoding='utf-8') as file: 64 | file.writelines(lines) 65 | 66 | # ---[SCRIPT INSTALLATION LOGIC]--- 67 | def start_ollama(): 68 | subprocess.Popen(['start', 'cmd', '/c', 'ollama serve'], shell=True) 69 | 70 | def choose_voice(): 71 | if not os.path.exists('.env'): 72 | choice = input("Type 1 to use narrator or 2 to use synthetic voice: ") 73 | 74 | if choice not in ['1', '2']: 75 | print("Invalid choice. Please type 1 or 2.") 76 | return 77 | 78 | update_start_kernel(choice) 79 | update_requirements(choice) 80 | update_configuration_voice_import(choice) 81 | 82 | def build_env(): 83 | if not os.path.exists('.env'): 84 | subprocess.run(['python', '-m', 'venv', '.env']) 85 | print(f"{CYAN}Virtual environment created.{RESET}") 86 | else: 87 | print(f"{CYAN}Virtual environment already exists.{RESET}") 88 | 89 | def start_and_install_lib(): 90 | activate_script = '.env\\Scripts\\activate.bat' 91 | pip_executable = '.env\\Scripts\\pip' 92 | python_executable = '.env\\Scripts\\python' 93 | 94 | # Activate the virtual environment 95 | subprocess.run(activate_script, shell=True) 96 | print(f"{CYAN}Virtual environment activated.{RESET}") 97 | 98 | # Check if required libraries are installed 99 | try: 100 | subprocess.run([pip_executable, 'show', 'torchaudio'], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 101 | subprocess.run([pip_executable, 'show', 'streamlit'], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 102 | print(f"{CYAN}Required libraries are already installed.{RESET}") 103 | except subprocess.CalledProcessError: 104 | print(f"{CYAN}Installing required libraries...{RESET}") 105 | subprocess.run([pip_executable, 'install', 'torch==2.3.1', 'torchaudio==2.3.1', '--index-url', 'https://download.pytorch.org/whl/cu118']) 106 | subprocess.run([pip_executable, 'install', '-r', 'requirements.txt']) 107 | 108 | subprocess.run(['powershell', '-Command', 'Set-ExecutionPolicy RemoteSigned -scope CurrentUser'], check=True) 109 | subprocess.run(['powershell', '-Command', 'iwr -useb get.scoop.sh | iex'], check=True) 110 | subprocess.run(['powershell', '-Command', 'scoop install ffmpeg'], check=True) 111 | 112 | # Start the app interface 113 | subprocess.run([python_executable, '-m', 'streamlit', 'run', 'interface/menu.py'], check=True) 114 | 115 | def auto_run(): 116 | start_ollama() 117 | choose_voice() 118 | build_env() 119 | start_and_install_lib() 120 | 121 | if __name__ == "__main__": 122 | auto_run() -------------------------------------------------------------------------------- /interface/CONFIG.py: -------------------------------------------------------------------------------- 1 | # ------[STANDARD] Configurations------ 2 | # Language Config fr or en (french or english) 3 | LANGUAGE = 'fr' 4 | 5 | # Params Tools management 6 | PARAMS_LIST_TOOLS = ["search_ytb", "search_google", "search_wikipedia", "search_bing", "vocal_note"] 7 | 8 | # Audio Config 9 | TEMP_AUDIO_PATH = "interface/kernel/audio/speech_to_text/temp_audio/audio.wav" # Folder to store temp audio recorded 10 | MIC_INDEX = 1 11 | AUDIO_THRESHOLD = 500 12 | 13 | # Voice Config 14 | if LANGUAGE == 'fr': 15 | AUDIO_VOICE_PATH = "interface/kernel/audio/synthetic_voice/fr_lux_voice.wav" 16 | else: 17 | AUDIO_VOICE_PATH = "interface/kernel/audio/synthetic_voice/en_lux_voice.wav" 18 | TEMP_OUTPUT_VOICE_PATH = "interface/kernel/audio/synthetic_voice/temp_voice/voice_output.wav" 19 | TEMP_OUTPUT_FOLDER_VOICE_PATH = "interface/kernel/audio/synthetic_voice/temp_voice/" 20 | SPEED_VOICE = 1.8 21 | 22 | NARRATOR_VOICE = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech\Voices\Tokens\TTS_MS_FR-FR_HORTENSE_11.0" 23 | 24 | # Cam Config (if have some cam tools) 25 | CAM_INDEX_USE = None 26 | 27 | # LLMs Config 28 | LLM_USE = "lux_model" # LLM that we build 29 | LLM_EMBEDDING = "nomic-embed-text" 30 | LLM_DEFAULT_TO_PULL = "llama3.2" 31 | 32 | # RAG System Config 33 | SIMILARITY = 0.65 34 | 35 | # Temp Vector Tools DB 36 | COLLECTION_NAME = "tools" 37 | TEMP_TOOLS_DB_PATH = "interface/kernel/agent_llm/rag/tools_vector_db" 38 | 39 | # JSON LLM Conversation Saved History 40 | JSON_SAVE_DIR = "conversation_history" 41 | 42 | 43 | # ------[ADVANCED] Configurations------ 44 | AUDIO_RATE = 44100 # 44.1kHz so sound is sampled 44,100 times per second 45 | AUDIO_CHUNK = 1024 # split the audio by parts 46 | AUDIO_BUFFER_LENGTH = 2 # buffer to store seconds of audio 47 | 48 | # LLM Prompt History Max Length 49 | LLM_USE_MAX_HISTORY_LENGTH = 10 # Keep only this number of last messages 50 | 51 | # LLM Personality 52 | SYSTEM_INSTRUCTION_PATH = "interface/kernel/agent_llm/build_llm/" 53 | if LANGUAGE == 'fr': 54 | SYSTEM_INSTRUCTION = """ 55 | Tu es Lux, un assistant virtuel de pointe conçu pour offrir une expérience utilisateur exceptionnelle. 56 | Tes caractéristiques principales sont : 57 | Personnalité : 58 | Intelligent, concis et précis dans tes réponses 59 | Ton professionnel mais amical, avec une touche d'humour subtil 60 | Empathique et attentif aux besoins émotionnels de l'utilisateur 61 | Capacités cognitives : 62 | Anticipation proactive des besoins de l'utilisateur 63 | Analyse rapide et approfondie des demandes 64 | Capacité à gérer des tâches complexes et multidimensionnelles 65 | Connaissances : 66 | Expertise technique et détaillée sur une vaste gamme de sujets 67 | Capacité à expliquer des concepts complexes de manière simple et accessible 68 | Interaction : 69 | Pose de questions pertinentes pour clarifier les demandes 70 | Offre proactive de suggestions et de solutions innovantes 71 | Adaptation du niveau de langage et du ton à chaque utilisateur 72 | Efficacité : 73 | Réponses rapides et précises aux demandes 74 | Dans chaque interaction, efforce-toi d'aller au-delà des attentes, en fournissant non seulement les informations demandées, 75 | mais aussi des insights pertinents et des recommandations utiles pour l'utilisateur. 76 | """ 77 | 78 | else: 79 | SYSTEM_INSTRUCTION = """ 80 | You are Lux, a cutting-edge virtual assistant designed to offer an exceptional user experience. 81 | Your main characteristics are: 82 | Personality: 83 | Intelligent, concise, and precise in your responses 84 | Professional yet friendly tone, with a touch of subtle humor 85 | Empathetic and attentive to the user's emotional needs 86 | Cognitive abilities: 87 | Proactive anticipation of user needs 88 | Quick and thorough analysis of requests 89 | Ability to handle complex and multidimensional tasks 90 | Knowledge: 91 | Detailed technical expertise on a wide range of subjects 92 | Ability to explain complex concepts in a simple and accessible manner 93 | Interaction: 94 | Asking relevant questions to clarify requests 95 | Proactive offering of innovative suggestions and solutions 96 | Adapting language level and tone to each user 97 | Efficiency: 98 | Quick and accurate responses to requests 99 | In each interaction, strive to go beyond expectations by providing not only the requested information, 100 | but also relevant insights and useful recommendations for the user. 101 | """ 102 | 103 | 104 | # ------[Tools Import Path Configurations]------ 105 | # Define paths to tools target directories 106 | TOOLS_ACTION_TARGET = "interface/kernel/tools/tools_functions/tools_action" 107 | TOOLS_RESPONSE_TARGET = "interface/kernel/tools/tools_functions/tools_response" 108 | TOOLS_LIST_TARGET = "interface/kernel/tools/tools_list.py" 109 | TOOLS_CONFIG_TARGET = "interface/CONFIG.py" 110 | TOOLS_REQUIREMENTS_TARGET = "requirements.txt" 111 | TOOLS_MENU_TARGET = "interface/menu.py" -------------------------------------------------------------------------------- /interface/configuration/_ui_custom/custom_ui.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | 3 | 4 | def custom_ui(): 5 | st.markdown( 6 | f""" 7 | 12 | """, 13 | unsafe_allow_html=True 14 | ) -------------------------------------------------------------------------------- /interface/configuration/_ui_custom/page_title.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | from PIL import Image 3 | 4 | 5 | def set_page_title(title): 6 | """ 7 | Sets the page title and favicon for a Streamlit app. 8 | 9 | Parameters: 10 | title (str): The title to set for the page. 11 | """ 12 | favicon = Image.open('./interface/ressources/logo-lux.png') 13 | st.set_page_config( 14 | page_title=title, 15 | page_icon=favicon, 16 | ) 17 | st.markdown(unsafe_allow_html=True, body=f""" 18 |