import streamlit as st import uuid from db.db import DatabaseHandler from langchain_core.messages import AIMessage, HumanMessage, SystemMessage from model import selector from st_copy_to_clipboard import st_copy_to_clipboard # Instanciation de la base de données db = DatabaseHandler() chapter_num = 0 chapter_session_key = f"chapter_{chapter_num}" def setChapter(num: int): global chapter_num, chapter_session_key chapter_num = num chapter_session_key = f"chapter_{chapter_num}" def display_messages(): for i, message in enumerate(st.session_state[chapter_session_key]["messages"]): if isinstance(message, AIMessage): with st.chat_message("AI"): # Display the model from the kwargs model = message.kwargs.get("model", "Unknown Model") # Get the model, default to "Unknown Model" st.write(f"**Model :** {model}") st.markdown(message.content) st_copy_to_clipboard(message.content,key=f"message_{chapter_num}_{i}_{uuid.uuid4()}") elif isinstance(message, HumanMessage): with st.chat_message("Moi"): st.write(message.content) elif isinstance(message, SystemMessage): with st.chat_message("System"): st.write(message.content) def show_prompts(prompts: list[str]): expander = st.expander("Prompts pré-définis") for i, p in enumerate(prompts): button_key = f"button_{chapter_session_key}_{i}" # Réinitialisation si la clé existe déjà (quand on change de page) if button_key in st.session_state: del st.session_state[button_key] expander.button(p, key=button_key, on_click=promptSubmit, args=(p,)) def promptSubmit(key,): inputSubmut(key) def inputSubmut(query: str = None): # Get query or find in session state user_query = query if query is not None else st.session_state[f"input_{chapter_session_key}"] if user_query is not None and user_query != "": st.session_state[chapter_session_key]["messages"].append(HumanMessage(content=user_query)) # Stream and display response launchQuery(user_query) def page(): chapters = [] for chapter in st.session_state["chapters"]: chapters.append(st.session_state[f"chapter_{chapter['num']}"]) ############################################### # Récupération du chapitre depuis YAML Config # ############################################### chapter_num = st.session_state.get('current_page', 0) if chapter_num == 0: return setChapter(int(chapter_num)) chapter = next((ch for ch in chapters if ch['num'] == chapter_num), None) if not chapter: st.text("Chapitre non trouvé") return # Chargement de l'enregistrement correspondant aux filtres chapterDB = db.get_prompt_by_filters(num=chapter_num) if len(chapterDB) == 0: st.text("Chapitre non trouvé") return chapterDB = chapterDB[0] ################# # Some controls # ################# if "assistant" not in st.session_state: st.text("Assistant non initialisé") if "messages" not in st.session_state[chapter_session_key]: st.session_state[chapter_session_key]["messages"] = [ ] if len(st.session_state[chapter_session_key]["messages"]) < 2 : st.session_state[chapter_session_key]["messages"] = [ SystemMessage(content=chapterDB['prompt_system']) ] ############ #### UI #### ############ st.subheader(chapter['title']) st.markdown("", unsafe_allow_html=True) # Collpase for default prompts show_prompts(chapter['prompts']) # Models selector selector.ModelSelector() if(len(st.session_state[chapter_session_key]["messages"]) > 1): if st.button("Effacer l'historique"): st.session_state[chapter_session_key]["messages"] = [ SystemMessage(content=chapterDB['prompt_system']) ] # Displaying messages display_messages() chat_input_key = f"input_{chapter_session_key}" # Réinitialisation si la clé existe déjà (quand on change de page) if chat_input_key in st.session_state: del st.session_state[chat_input_key] st.chat_input("", key=chat_input_key, on_submit=inputSubmut) global response_placeholder response_placeholder = st.empty() # Check if we need to rerun the app if st.session_state.get('rerun', False): st.session_state['rerun'] = False st.rerun() def launchQuery(query: str = None): # Initialize the assistant's response full_response = response_placeholder.write_stream( st.session_state["assistant"].ask( query, prompt_system=st.session_state.prompt_system, messages=st.session_state[chapter_session_key]["messages"] if "messages" in st.session_state[chapter_session_key] else [], ) ) # Temporary placeholder AI message in chat history st.session_state[chapter_session_key]["messages"].append(AIMessage(content=full_response, kwargs={"model": st.session_state["assistant"].getReadableModel()})) st.session_state['rerun'] = True page()