jwphantom commited on
Commit
ea62a8d
1 Parent(s): 3457b59

first commit

Browse files
Files changed (2) hide show
  1. app.py +232 -77
  2. requirements.txt +15 -0
app.py CHANGED
@@ -1,48 +1,73 @@
1
  import streamlit as st
2
  from streamlit_option_menu import option_menu
 
3
  from dataclasses import dataclass
4
 
5
  import google.generativeai as genai
6
- from gtts import gTTS
7
- from io import BytesIO
8
 
9
  from langdetect import detect
10
  import pycountry
11
  from deep_translator import GoogleTranslator
12
 
13
- import torchaudio
14
-
15
- from transformers import VitsModel, AutoTokenizer, pipeline
16
- import torch
17
-
18
- import scipy.io.wavfile
19
- import numpy as np
20
 
21
  import base64
22
 
23
  from PIL import Image
24
 
 
25
 
26
- model = VitsModel.from_pretrained("facebook/mms-tts-spa")
27
- tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-spa")
28
 
 
 
29
 
30
- model_name_zero_shot_classification = "openai/clip-vit-large-patch14-336"
31
- classifier_zero_shot_classification = pipeline(
32
- "zero-shot-image-classification", model=model_name_zero_shot_classification
33
- )
 
 
34
 
35
  # Configuration de la page
36
- st.set_page_config(page_title="Application Avancée", layout="wide")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
  # Options Menu
39
  with st.sidebar:
40
  menu = option_menu(
41
  "Onyx AI",
42
- ["Acceuil", "A propos"],
43
  icons=["play-btn", "info-circle"],
44
  menu_icon="intersect",
45
  default_index=0,
 
 
 
 
 
 
 
 
 
 
46
  )
47
 
48
 
@@ -50,12 +75,12 @@ with st.sidebar:
50
  if menu == "Acceuil":
51
  # Header
52
 
53
- # Contenu de la navbar avec des icônes appropriées
54
  selected = option_menu(
55
  menu_title=None, # Aucun titre pour le menu
56
  options=[
57
  "Chatbot",
58
- "Text to speech",
59
  "Classification",
60
  "Image to text",
61
  ],
@@ -68,6 +93,16 @@ if menu == "Acceuil":
68
  menu_icon="cast", # Icône du menu
69
  default_index=0, # Option par défaut
70
  orientation="horizontal",
 
 
 
 
 
 
 
 
 
 
71
  ) # Orientation du menu
72
 
73
  # Affichage du contenu basé sur le choix de la navbar avec st.markdown pour une meilleure intégration
@@ -78,14 +113,13 @@ if menu == "Acceuil":
78
  """
79
  <div class='content'>
80
  <h1>Chatbot intelligent</h1>
81
- <p>Bienvenue dans la section Chatbot intelligent.</p>
82
  </div>
 
 
83
  """,
84
  unsafe_allow_html=True,
85
  )
86
 
87
- genai.configure(api_key="AIzaSyDQ9e-O5oWqo-toEZN19y4zzp9A61oZpTU")
88
-
89
  model = genai.GenerativeModel("gemini-pro")
90
 
91
  @dataclass
@@ -120,19 +154,23 @@ if menu == "Acceuil":
120
  )
121
  st.chat_message(ASSISTANT).write(response)
122
 
123
- elif selected == "Text to speech":
124
 
125
  # Affichage du titre et du message de bienvenue
126
  st.markdown(
127
  """
128
  <div class='content'>
129
  <h1>Text to speech</h1>
130
- <p>Bienvenue dans la section Text to speech en espagnol.</p>
131
  </div>
 
 
 
132
  """,
133
  unsafe_allow_html=True,
134
  )
135
 
 
 
136
  @dataclass
137
  class Message:
138
  actor: str
@@ -150,6 +188,10 @@ if menu == "Acceuil":
150
  )
151
  ]
152
 
 
 
 
 
153
  # msg: Message
154
  for msg in st.session_state[MESSAGES]:
155
  st.chat_message(msg.actor).write(msg.payload)
@@ -167,40 +209,37 @@ if menu == "Acceuil":
167
  translated = GoogleTranslator(source="auto", target="es").translate(prompt)
168
 
169
  st.chat_message(ASSISTANT).write(
170
- f"Langue détecté {lang_name} \n \n {translated.text} \n \n Génération de l'audio ..."
171
  )
172
 
173
- inputs = tokenizer(translated.text, return_tensors="pt")
174
-
175
- # Créer un buffer en mémoire
176
- buffer = BytesIO()
177
 
178
- with torch.no_grad():
179
- output = model(**inputs).waveform
180
 
181
- # Sauvegarder l'audio généré dans le buffer
182
- torchaudio.save(
183
- buffer,
184
- src=output,
185
- sample_rate=model.config.sampling_rate,
186
- format="wav", # Spécifiez explicitement le format si nécessaire
187
- )
188
-
189
- buffer.seek(0)
190
-
191
- st.chat_message(ASSISTANT).audio(data=buffer, format="audio/wav")
192
 
193
  elif selected == "Classification":
194
  st.markdown(
195
  """
196
  <div class='content'>
197
  <h1>Zero shot image classification</h1>
198
- <p>Découvrez la classification d'images avec zéro exemple.</p>
199
  </div>
 
 
 
200
  """,
201
  unsafe_allow_html=True,
202
  )
203
 
 
 
 
 
 
 
 
 
 
204
  @dataclass
205
  class Message:
206
  actor: str
@@ -209,37 +248,53 @@ if menu == "Acceuil":
209
  USER = "user"
210
  ASSISTANT = "ai"
211
 
212
- def classify_image(image, labels):
213
- image_to_classify = image
214
-
215
- labels = labels.split(",")
216
-
217
- labels_for_classification = labels
218
- scores = classifier_zero_shot_classification(
219
- image_to_classify, candidate_labels=labels_for_classification
220
  )
221
 
222
- return f"The highest score is {scores[0]['score']:.3f} for the label {scores[0]['label']}"
223
-
224
  # Interface utilisateur pour l'entrée de l'image et du libellé
225
  uploaded_image = st.file_uploader(
226
  "Upload an image", type=["jpg", "png", "jpeg"]
227
  )
228
 
229
- label = st.text_input(value="apple, banana, car, dog, elephant")
 
 
 
 
230
 
231
  # Bouton pour envoyer l'image et le libellé
232
- if st.button("Send"):
233
  if uploaded_image is not None and label:
234
  # Lire et stocker l'image temporairement
235
  image = Image.open(uploaded_image)
236
 
 
 
237
  st.chat_message(USER).image(image)
238
 
239
- st.chat_message(ASSISTANT).text(classify_image(image, label))
 
 
 
 
 
 
 
 
 
 
240
 
241
- # # Appeler la fonction add_message pour afficher l'image, le libellé et la réponse
242
- # add_message(image, label)
 
 
 
 
 
 
 
243
 
244
  else:
245
  st.write("Please upload an image and enter a label.")
@@ -247,39 +302,139 @@ if menu == "Acceuil":
247
  elif selected == "Image to text":
248
  st.markdown(
249
  """
250
- <div class='content'>
251
- <h1>Image to text</h1>
252
- <p>Convertissez des images en texte grâce à notre outil.</p>
253
- </div>
 
 
254
  """,
255
  unsafe_allow_html=True,
256
  )
257
 
 
258
 
259
- elif menu == "A propos":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
 
261
  # Lorsque "About" est sélectionné, afficher le contenu À propos dans le corps principal
262
  st.markdown(
263
  """
264
  # À propos de cette application
265
-
266
- Cette application est conçue pour démontrer diverses fonctionnalités intéressantes telles que le chatbot intelligent, la conversion de texte en parole, la classification d'images sans exemples et la conversion d'images en texte. Elle est construite en utilisant Streamlit, une bibliothèque incroyable pour créer des applications web en Python facilement et rapidement.
267
-
268
  ## Créateur
269
-
270
  - [James Olongo](https://jamesolongo.vercel.app/)
271
-
272
  ## Technologies utilisées
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
273
 
274
- - Streamlit
275
- - PyTorch
276
- - Transformers
277
- - torchaudio
278
- - gTTS
279
- - Langdetect
280
- - Googletrans
281
- - Pycountry
282
- - Google Generative AI
 
 
 
 
 
 
 
283
  """,
284
  unsafe_allow_html=True,
285
  )
 
1
  import streamlit as st
2
  from streamlit_option_menu import option_menu
3
+
4
  from dataclasses import dataclass
5
 
6
  import google.generativeai as genai
 
 
7
 
8
  from langdetect import detect
9
  import pycountry
10
  from deep_translator import GoogleTranslator
11
 
 
 
 
 
 
 
 
12
 
13
  import base64
14
 
15
  from PIL import Image
16
 
17
+ import requests
18
 
19
+ from dotenv import load_dotenv
20
+ import os
21
 
22
+ # Charger les variables d'environnement
23
+ load_dotenv()
24
 
25
+ HUGGINGFACE_API_KEY = os.getenv("HUGGINGFACE_API_KEY")
26
+ GOOGLE_GENAI_API_KEY = os.getenv("GOOGLE_GENAI_API_KEY")
27
+
28
+ headers = {"Authorization": f"Bearer {HUGGINGFACE_API_KEY}"}
29
+
30
+ genai.configure(api_key=GOOGLE_GENAI_API_KEY)
31
 
32
  # Configuration de la page
33
+ st.set_page_config(page_title="Application IA", layout="wide")
34
+
35
+
36
+ st.markdown(
37
+ """
38
+ <style>
39
+ .content{
40
+ border-radius: 8px;
41
+ box-shadow: 0 1px 3px rgba(65,65,65,.492);
42
+ background: #fbfafa;
43
+ padding : 0 10px 0 20px
44
+ }
45
+ .stChatMessage .markdown-text-container {
46
+ word-wrap: break-word;
47
+ }
48
+ </style>
49
+ """,
50
+ unsafe_allow_html=True,
51
+ )
52
 
53
  # Options Menu
54
  with st.sidebar:
55
  menu = option_menu(
56
  "Onyx AI",
57
+ ["Acceuil", "Documentation"],
58
  icons=["play-btn", "info-circle"],
59
  menu_icon="intersect",
60
  default_index=0,
61
+ styles={
62
+ "icon": {"color": "#374151", "font-size": "17px"},
63
+ "nav-link": {
64
+ "font-size": "17px",
65
+ "text-align": "left",
66
+ "margin": "0px",
67
+ "--hover-color": "#eee",
68
+ },
69
+ "nav-link-selected": {"background-color": "#519ba7"},
70
+ },
71
  )
72
 
73
 
 
75
  if menu == "Acceuil":
76
  # Header
77
 
78
+ # # Contenu de la navbar avec des icônes appropriées
79
  selected = option_menu(
80
  menu_title=None, # Aucun titre pour le menu
81
  options=[
82
  "Chatbot",
83
+ "TextToSpeech",
84
  "Classification",
85
  "Image to text",
86
  ],
 
93
  menu_icon="cast", # Icône du menu
94
  default_index=0, # Option par défaut
95
  orientation="horizontal",
96
+ styles={
97
+ "container": {"background-color": "#fafafa"},
98
+ "icon": {"color": "#374151", "font-size": "17px"},
99
+ "nav-link": {
100
+ "font-size": "17px",
101
+ "text-align": "left",
102
+ "--hover-color": "#eee",
103
+ },
104
+ "nav-link-selected": {"background-color": "#519ba7"},
105
+ },
106
  ) # Orientation du menu
107
 
108
  # Affichage du contenu basé sur le choix de la navbar avec st.markdown pour une meilleure intégration
 
113
  """
114
  <div class='content'>
115
  <h1>Chatbot intelligent</h1>
 
116
  </div>
117
+ <br/>
118
+ <p>Bienvenue dans la section Chatbot intelligent.</p>
119
  """,
120
  unsafe_allow_html=True,
121
  )
122
 
 
 
123
  model = genai.GenerativeModel("gemini-pro")
124
 
125
  @dataclass
 
154
  )
155
  st.chat_message(ASSISTANT).write(response)
156
 
157
+ elif selected == "TextToSpeech":
158
 
159
  # Affichage du titre et du message de bienvenue
160
  st.markdown(
161
  """
162
  <div class='content'>
163
  <h1>Text to speech</h1>
 
164
  </div>
165
+ <br/>
166
+ <p>Bienvenue dans la section Text to speech en espagnol.</p>
167
+
168
  """,
169
  unsafe_allow_html=True,
170
  )
171
 
172
+ API_URL = "https://api-inference.huggingface.co/models/facebook/mms-tts-spa"
173
+
174
  @dataclass
175
  class Message:
176
  actor: str
 
188
  )
189
  ]
190
 
191
+ def query(payload):
192
+ response = requests.post(API_URL, headers=headers, json=payload)
193
+ return response.content
194
+
195
  # msg: Message
196
  for msg in st.session_state[MESSAGES]:
197
  st.chat_message(msg.actor).write(msg.payload)
 
209
  translated = GoogleTranslator(source="auto", target="es").translate(prompt)
210
 
211
  st.chat_message(ASSISTANT).write(
212
+ f"Langue détecté {lang_name} \n \n {translated} \n \n Génération de l'audio ..."
213
  )
214
 
215
+ parameters = {"inputs": translated}
 
 
 
216
 
217
+ audio = query(parameters)
 
218
 
219
+ st.chat_message(ASSISTANT).audio(data=audio)
 
 
 
 
 
 
 
 
 
 
220
 
221
  elif selected == "Classification":
222
  st.markdown(
223
  """
224
  <div class='content'>
225
  <h1>Zero shot image classification</h1>
 
226
  </div>
227
+ <br/>
228
+ <p>Découvrez la classification d'images avec zerp shot.</p>
229
+
230
  """,
231
  unsafe_allow_html=True,
232
  )
233
 
234
+ API_URL = "https://api-inference.huggingface.co/models/openai/clip-vit-large-patch14-336"
235
+
236
+ def query(image_bytes, parameters):
237
+ # Encode the image bytes in base64
238
+ encoded_image = base64.b64encode(image_bytes).decode("utf-8")
239
+ payload = {"parameters": parameters, "inputs": encoded_image}
240
+ response = requests.post(API_URL, headers=headers, json=payload)
241
+ return response.json()
242
+
243
  @dataclass
244
  class Message:
245
  actor: str
 
248
  USER = "user"
249
  ASSISTANT = "ai"
250
 
251
+ if "default_label" not in st.session_state:
252
+ st.session_state["default_label"] = (
253
+ "voiture,ananas,pastèque,tomate,bouteille"
 
 
 
 
 
254
  )
255
 
 
 
256
  # Interface utilisateur pour l'entrée de l'image et du libellé
257
  uploaded_image = st.file_uploader(
258
  "Upload an image", type=["jpg", "png", "jpeg"]
259
  )
260
 
261
+ st.markdown(
262
+ "Veuillez entrer les labels séparés par des virgules (exemple : voiture,ananas,pastèque,tomate,bouteille):"
263
+ )
264
+
265
+ label = st.chat_input("Entrez le label séparé des virgules")
266
 
267
  # Bouton pour envoyer l'image et le libellé
268
+ if label:
269
  if uploaded_image is not None and label:
270
  # Lire et stocker l'image temporairement
271
  image = Image.open(uploaded_image)
272
 
273
+ image_bytes = uploaded_image.getvalue()
274
+
275
  st.chat_message(USER).image(image)
276
 
277
+ st.chat_message(ASSISTANT).text("Classification en cours...")
278
+
279
+ convert_label_to_english = GoogleTranslator(
280
+ source="auto", target="en"
281
+ ).translate(label)
282
+
283
+ labels = convert_label_to_english.split(
284
+ ","
285
+ ) # Splitting the input label string into a list
286
+
287
+ print(labels)
288
 
289
+ parameters = {"candidate_labels": labels}
290
+
291
+ response = query(image_bytes, parameters)
292
+
293
+ translated = GoogleTranslator(source="auto", target="fr").translate(
294
+ f"The highest score is {response[0]['score']:.3f} for the label {response[0]['label']}"
295
+ )
296
+
297
+ st.chat_message(ASSISTANT).text(translated)
298
 
299
  else:
300
  st.write("Please upload an image and enter a label.")
 
302
  elif selected == "Image to text":
303
  st.markdown(
304
  """
305
+ <div class='content'>
306
+ <h1>Image to text</h1>
307
+ </div>
308
+ <br/>
309
+ <p>Convertissez des images en texte grâce à notre outil.</p>
310
+
311
  """,
312
  unsafe_allow_html=True,
313
  )
314
 
315
+ model_pro_vision = genai.GenerativeModel("gemini-pro-vision")
316
 
317
+ @dataclass
318
+ class Message:
319
+ actor: str
320
+ payload: str
321
+
322
+ USER = "user"
323
+ ASSISTANT = "ai"
324
+
325
+ # Interface utilisateur pour l'entrée de l'image et du libellé
326
+ uploaded_image_ImgTText = st.file_uploader(
327
+ "Upload an image", type=["jpg", "png", "jpeg"]
328
+ )
329
+
330
+ # Bouton pour envoyer l'image et le libellé
331
+ if st.button("Send"):
332
+ if uploaded_image_ImgTText is not None:
333
+ # Lire et stocker l'image temporairement
334
+ image = Image.open(uploaded_image_ImgTText)
335
+
336
+ st.chat_message(USER).image(image)
337
+
338
+ st.chat_message(ASSISTANT).text("Génération en cours...")
339
+
340
+ response = model_pro_vision.generate_content(
341
+ ["Write a short description of the image", image],
342
+ stream=True,
343
+ )
344
+
345
+ response.resolve()
346
+
347
+ print(response.text)
348
+
349
+ translated = GoogleTranslator(source="auto", target="fr").translate(
350
+ response.text
351
+ )
352
+
353
+ st.chat_message(ASSISTANT).text(translated)
354
+
355
+ else:
356
+ st.write("Please upload an image and enter a label.")
357
+
358
+
359
+ elif menu == "Documentation":
360
 
361
  # Lorsque "About" est sélectionné, afficher le contenu À propos dans le corps principal
362
  st.markdown(
363
  """
364
  # À propos de cette application
365
+
366
+ Cette application Streamlit démontre l'utilisation avancée de l'intelligence artificielle pour fournir une variété de services, y compris un chatbot intelligent, la conversion de texte en parole, la classification d'images sans exemples préalables, et la conversion d'images en texte. Cette application est un exemple de comment les technologies de pointe peuvent être intégrées dans des applications web modernes.
367
+
368
  ## Créateur
369
+
370
  - [James Olongo](https://jamesolongo.vercel.app/)
371
+
372
  ## Technologies utilisées
373
+
374
+ - **Streamlit**: Un framework pour la création rapide d'applications web pour la science des données et le machine learning.
375
+ - **PyTorch & Transformers**: Utilisés pour les opérations de traitement du langage naturel et de génération de texte.
376
+ - **torchaudio & gTTS**: Pour la génération de parole et le traitement audio.
377
+ - **Langdetect & Pycountry**: Pour la détection de la langue et le traitement basé sur la langue.
378
+ - **Deep Translator**: Un puissant outil de traduction, utilisé en remplacement de Googletrans.
379
+ - **Google Generative AI**: Pour le chatbot intelligent, utilisant le modèle "gemini-pro" pour générer des réponses textuelles.
380
+ - **VITS**: Un modèle de synthèse vocale de pointe de Facebook pour la conversion de texte en parole en espagnol.
381
+ - **OpenAI CLIP**: Pour la classification d'images sans exemples, utilisant le modèle "clip-vit-large-patch14-336" pour la classification d'image en zero-shot.
382
+
383
+ ## Détails des Applications
384
+
385
+ ### Chatbot Intelligent
386
+ Utilise le modèle "gemini-pro" de Google Generative AI pour répondre aux requêtes des utilisateurs. Ce modèle est capable de comprendre et de générer des réponses à une grande variété de questions.
387
+ ```python
388
+ import google.generativeai as genai
389
+
390
+ genai.configure(api_key="API_KEY")
391
+
392
+ model = genai.GenerativeModel("gemini-pro")
393
+
394
+ generate = model.generate_content("Comment déclarer une variable python")
395
+
396
+ response = generate.text
397
+
398
+ ```
399
+
400
+
401
+ ### Texte en Parole
402
+ Emploie le modèle "facebook/mms-tts-spa" pour convertir du texte en parole en espagnol, démontrant la capacité de transformer le texte en un fichier audio naturel.
403
+ ```python
404
+ model = VitsModel.from_pretrained("facebook/mms-tts-spa")
405
+
406
+ tokenizer = AutoTokenizer.from_pretrained("facebook/mms-tts-spa")
407
+
408
+ inputs = tokenizer(translated, return_tensors="pt")
409
+
410
+ with torch.no_grad():
411
+ output = model(**inputs).waveform
412
+ ```
413
+
414
+
415
+ ### Zero shot image classification
416
+ Utilise le modèle "openai/clip-vit-large-patch14-336" d'OpenAI pour classifier des images sans exemples préalables, illustrant comment une IA peut comprendre et catégoriser le contenu visuel.
417
+ ```python
418
+
419
+
420
+ model_name_zero_shot_classification = "openai/clip-vit-large-patch14-336"
421
 
422
+ classifier_zero_shot_classification = pipeline(
423
+ "zero-shot-image-classification", model=model_name_zero_shot_classification
424
+ )
425
+
426
+ scores = classifier_zero_shot_classification(
427
+ image_to_classify, candidate_labels="YOUR_LABEL"
428
+ )
429
+
430
+ print f"The highest score is {scores[0]['score']:.3f} for the label {scores[0]['label']}"
431
+
432
+ ```
433
+
434
+ ### Conversion d'Images en Texte
435
+
436
+
437
+
438
  """,
439
  unsafe_allow_html=True,
440
  )
requirements.txt CHANGED
@@ -1,5 +1,6 @@
1
  altair==5.2.0
2
  annotated-types==0.6.0
 
3
  attrs==23.2.0
4
  beautifulsoup4==4.12.3
5
  blinker==1.7.0
@@ -8,7 +9,9 @@ certifi==2024.2.2
8
  chardet==3.0.4
9
  charset-normalizer==3.3.2
10
  click==8.1.7
 
11
  deep-translator==1.11.4
 
12
  filelock==3.13.1
13
  fsspec==2024.2.0
14
  gitdb==4.0.11
@@ -31,6 +34,8 @@ httpx==0.13.3
31
  huggingface-hub==0.21.4
32
  hyperframe==5.2.0
33
  idna==2.10
 
 
34
  Jinja2==3.1.3
35
  jsonschema==4.21.1
36
  jsonschema-specifications==2023.12.1
@@ -38,15 +43,21 @@ langcodes==3.3.0
38
  langdetect==1.0.9
39
  markdown-it-py==3.0.0
40
  MarkupSafe==2.1.5
 
41
  mdurl==0.1.2
42
  mpmath==1.3.0
43
  networkx==3.2.1
44
  numpy==1.26.4
45
  packaging==23.2
46
  pandas==2.2.1
 
 
47
  pillow==10.2.0
 
48
  proto-plus==1.23.0
49
  protobuf==4.25.3
 
 
50
  pyarrow==15.0.1
51
  pyasn1==0.5.1
52
  pyasn1-modules==0.3.0
@@ -56,6 +67,7 @@ pydantic_core==2.16.3
56
  pydeck==0.8.1b0
57
  Pygments==2.17.2
58
  python-dateutil==2.9.0.post0
 
59
  pytz==2024.1
60
  PyYAML==6.0.1
61
  referencing==0.33.0
@@ -71,6 +83,7 @@ six==1.16.0
71
  smmap==5.0.1
72
  sniffio==1.3.1
73
  soupsieve==2.5
 
74
  streamlit==1.32.0
75
  streamlit-option-menu==0.3.12
76
  sympy==1.12
@@ -82,7 +95,9 @@ torch==2.2.1
82
  torchaudio==2.2.1
83
  tornado==6.4
84
  tqdm==4.66.2
 
85
  transformers==4.38.2
86
  typing_extensions==4.10.0
87
  tzdata==2024.1
88
  urllib3==2.2.1
 
 
1
  altair==5.2.0
2
  annotated-types==0.6.0
3
+ asttokens==2.4.1
4
  attrs==23.2.0
5
  beautifulsoup4==4.12.3
6
  blinker==1.7.0
 
9
  chardet==3.0.4
10
  charset-normalizer==3.3.2
11
  click==8.1.7
12
+ decorator==5.1.1
13
  deep-translator==1.11.4
14
+ executing==2.0.1
15
  filelock==3.13.1
16
  fsspec==2024.2.0
17
  gitdb==4.0.11
 
34
  huggingface-hub==0.21.4
35
  hyperframe==5.2.0
36
  idna==2.10
37
+ ipython==8.22.2
38
+ jedi==0.19.1
39
  Jinja2==3.1.3
40
  jsonschema==4.21.1
41
  jsonschema-specifications==2023.12.1
 
43
  langdetect==1.0.9
44
  markdown-it-py==3.0.0
45
  MarkupSafe==2.1.5
46
+ matplotlib-inline==0.1.6
47
  mdurl==0.1.2
48
  mpmath==1.3.0
49
  networkx==3.2.1
50
  numpy==1.26.4
51
  packaging==23.2
52
  pandas==2.2.1
53
+ parso==0.8.3
54
+ pexpect==4.9.0
55
  pillow==10.2.0
56
+ prompt-toolkit==3.0.43
57
  proto-plus==1.23.0
58
  protobuf==4.25.3
59
+ ptyprocess==0.7.0
60
+ pure-eval==0.2.2
61
  pyarrow==15.0.1
62
  pyasn1==0.5.1
63
  pyasn1-modules==0.3.0
 
67
  pydeck==0.8.1b0
68
  Pygments==2.17.2
69
  python-dateutil==2.9.0.post0
70
+ python-dotenv==1.0.1
71
  pytz==2024.1
72
  PyYAML==6.0.1
73
  referencing==0.33.0
 
83
  smmap==5.0.1
84
  sniffio==1.3.1
85
  soupsieve==2.5
86
+ stack-data==0.6.3
87
  streamlit==1.32.0
88
  streamlit-option-menu==0.3.12
89
  sympy==1.12
 
95
  torchaudio==2.2.1
96
  tornado==6.4
97
  tqdm==4.66.2
98
+ traitlets==5.14.2
99
  transformers==4.38.2
100
  typing_extensions==4.10.0
101
  tzdata==2024.1
102
  urllib3==2.2.1
103
+ wcwidth==0.2.13