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