File size: 5,542 Bytes
54cf99f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Chargement des librairies

# Pour créer et exécuter des applications Web interactives directement via des scripts Python.
import streamlit as st


# Pour charger des variables d'environnement à partir d'un fichier .env dans l'environnement du système pour un accès sécurisé et facile.
# Pour interagir avec l'API de Groq pour exécuter des modèles d'apprentissage automatique et gérer les opérations sur les données.
from groq import Groq



# Changement du logo et du titre de l'application
st.set_page_config(page_title="myChatbot", page_icon="left_speech_bubble", layout="centered", menu_items=None)


# # Load environment variables from .env at the project root
# project_root = Path(__file__).resolve().parent
# load_dotenv(project_root / ".env")

# Pour les parametres du menu
with st.sidebar:
    # Pour selectionner votre volet
    radio_option = st.radio("Select your pane", options=("Chatbot", "Text to Speech", "Speech to Text"))
    
    if radio_option == "Chatbot":
        # Pour les parametres du menu
        with st.sidebar:
            st.sidebar.subheader("🛠️Settings")
            temperature = st.slider("Temperature", 0.0, 5.0, 1.0)
            tokens =  st.slider("Max Tokens", 0, 8192, 900)
            stream = st.toggle("Stream", value=True)
            if stream:
                etat = True
            else:
                etat = False
                

        class GroqAPI:
            # Gère les opérations API avec Groq pour générer des réponses de chat
            def __init__(self, model_name: str):
                self.client = Groq(api_key="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")
                self.model_name = model_name

        # Méthode interne pour récupérer les réponses de l'API Groq
            def _response(self, message): 
                return self.client.chat.completions.create(
                    model=self.model_name,
                    messages=message,
                    temperature=temperature,
                    max_tokens=tokens,
                    stream=etat,
                    stop=None,
                )

        # Générateur pour diffuser les réponses de l'API
            def response_stream(self, message):        
                for chunk in self._response(message):
                    if chunk.choices[0].delta.content:
                        yield chunk.choices[0].delta.content


        class Message:
            # Gère les messages de discussion dans l'interface utilisateur Streamlit
            system_prompt = "You are a professional AI. Please generate responses in English to all user inputs."

        # Initialise l'historique des discussions s'il n'existe pas dans l'état de session
            def __init__(self):
                if "messages" not in st.session_state:
                    st.session_state.messages = [{"role": "system", "content": self.system_prompt}]

        # Ajoute un nouveau message à l'état de la session
            def add(self, role: str, content: str):
                st.session_state.messages.append({"role": role, "content": content})

        # Affiche tous les messages passés dans l'interface utilisateur, en ignorant les messages système
            def display_chat_history(self):
                for message in st.session_state.messages:
                    if message["role"] == "system":
                        continue
                    with st.chat_message(message["role"]):
                        st.markdown(message["content"])

        # Réponses de l'API Stream à l'interface utilisateur des messages de discussion Streamlit
            def display_stream(self, generater):
                with st.chat_message("assistant"):
                    return st.write(generater)


        class ModelSelector:
            # Permet à l'utilisateur de sélectionner un modèle dans une liste prédéfinie
            def __init__(self):
                # Liste des modèles disponibles au choix
                self.models = ["llama3-70b-8192", "llama3-8b-8192", "gemma-7b-it", "mixtral-8x7b-32768"]

        # Affiche la sélection de modèles dans une barre latérale avec un titre
            def select(self):
                with st.sidebar:
                    return st.selectbox("Model", self.models)


        # Point d'entrée de l'utilisateur pour l'application streamlit "myChatbot"
        def main():
            user_input = st.chat_input("Chat whit me...")
            model = ModelSelector()
            selected_model = model.select()
            message = Message()
            
        # S'il y a une entrée utilisateur, la traiter via le modèle sélectionné
            if user_input:
                llm = GroqAPI(selected_model)
                message.add("user", user_input)
                message.display_chat_history()
                response = message.display_stream(llm.response_stream(st.session_state.messages))
                message.add("assistant", response)
                
            with st.sidebar:
                st.markdown('''<br/>

                            <h6 style='text-align:center;color:grey;font-size:10px;'>

                            © myChatbot - TOUNDE - 2024

                            </h6>''',  
                            unsafe_allow_html=True
                )  
    
    
    
    
    

        
if __name__ == "__main__":
    main()