Spaces:
Running
Running
File size: 5,308 Bytes
a3d26e6 415e2c4 1d77a32 0499a47 edc0684 ea077e1 0e34878 a3d26e6 1d77a32 415e2c4 a3d26e6 415e2c4 0e34878 1d4c573 0e34878 a3d26e6 edc0684 a3d26e6 72cdb72 a3d26e6 415e2c4 72cdb72 415e2c4 d1ca5e8 72cdb72 d1ca5e8 87fc54f a3d26e6 1d4c573 415e2c4 1d4c573 415e2c4 1d77a32 415e2c4 a3d26e6 415e2c4 edc0684 1d4c573 1d77a32 415e2c4 1d4c573 0e34878 72cdb72 d1ca5e8 a3d26e6 72cdb72 720c02e 0e34878 b2f6734 72cdb72 a3d26e6 720c02e 87fc54f 0e34878 87fc54f 0499a47 87fc54f a3d26e6 72cdb72 a3d26e6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
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("<style>iframe{height:50px;}</style>", 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() |