Ilyas KHIAT commited on
Commit
fda58da
1 Parent(s): 438effa

model choice conseil IA

Browse files
Files changed (7) hide show
  1. .streamlit/.env +1 -0
  2. app.py +1 -1
  3. chat_te.py +1 -0
  4. chat_with_pps.py +75 -27
  5. high_chart.py +2 -5
  6. partie_prenante_carte.py +94 -32
  7. prompt.py +2 -1
.streamlit/.env CHANGED
@@ -1,3 +1,4 @@
1
  API_TOKEN_PERPLEXITYAI = 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
2
  OPENAI_API_KEY = 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
3
  FIRECRAWL_API_KEY = fc-381ecdb1175147aab5d2b48023961491
 
 
1
  API_TOKEN_PERPLEXITYAI = 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
2
  OPENAI_API_KEY = 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
3
  FIRECRAWL_API_KEY = fc-381ecdb1175147aab5d2b48023961491
4
+ MISTRAL_API_KEY = Hcm1IhfT38thMSaBIMt0t6L1SmrbgbXj
app.py CHANGED
@@ -20,7 +20,7 @@ from collaborons import display_company_selection_for_materiality,display_materi
20
  from documentations import display_documentation
21
  from RAG_PDF_WEB import rag_pdf_web
22
  from prompt import get_prompts_list,prompt_execution,execute_prompt
23
- from chat_with_pps import display_chat,display_container_chat
24
  from high_chart import test_chart
25
  from chat_te import display_chat_te
26
 
 
20
  from documentations import display_documentation
21
  from RAG_PDF_WEB import rag_pdf_web
22
  from prompt import get_prompts_list,prompt_execution,execute_prompt
23
+ from chat_with_pps import display_chat
24
  from high_chart import test_chart
25
  from chat_te import display_chat_te
26
 
chat_te.py CHANGED
@@ -62,6 +62,7 @@ def get_response(chain,user_query, chat_history):
62
 
63
  return chain.stream(question)
64
 
 
65
  @st.experimental_dialog("Cast your vote")
66
  def vote(item):
67
  st.write(f"Why is {item} your favorite?")
 
62
 
63
  return chain.stream(question)
64
 
65
+
66
  @st.experimental_dialog("Cast your vote")
67
  def vote(item):
68
  st.write(f"Why is {item} your favorite?")
chat_with_pps.py CHANGED
@@ -4,7 +4,9 @@ from langchain_community.chat_models import ChatOpenAI
4
  from dotenv import load_dotenv
5
  from langchain_core.output_parsers import StrOutputParser
6
  from langchain_core.prompts import ChatPromptTemplate
 
7
  from download_chart import construct_plot
 
8
 
9
 
10
  load_dotenv()
@@ -21,16 +23,16 @@ def format_context(partie_prenante_grouped,marque):
21
  - Gérer étroitement: le pouvoir est entre 50 et 100 et l'influence est entre 50 et 100
22
  - Suivre de près: le pouvoir est entre 0 et 50 et l'influence est entre 0 et 50
23
  - Tenir informé: le pouvoir est entre 0 et 50 et l'influence est entre 50 et 100
 
24
 
25
- '''
26
  context += segmentation
27
  return context
28
 
29
 
30
- def get_response(user_query, chat_history, context):
31
 
32
  template = """
33
- Fournir des réponses précises et contextuelles en agissant comme un expert en affaires, en utilisant le contexte des parties prenantes et leur pouvoir en pourcentage et leur influence en pourcentage pour expliquer les implications pour la marque. Le modèle doit connecter les informations du contexte et de l'historique de la conversation pour donner une réponse éclairée à la dernière question posée.
34
 
35
  Contexte: {context}
36
 
@@ -41,7 +43,13 @@ def get_response(user_query, chat_history, context):
41
 
42
  prompt = ChatPromptTemplate.from_template(template)
43
 
44
- llm = ChatOpenAI(model="gpt-4o")
 
 
 
 
 
 
45
 
46
  chain = prompt | llm | StrOutputParser()
47
 
@@ -58,32 +66,77 @@ def display_chart():
58
  plot = construct_plot()
59
  st.plotly_chart(plot)
60
 
61
- @st.experimental_dialog("Cast your vote")
62
- def vote(item):
63
- st.write(f"Why is {item} your favorite?")
64
- reason = st.text_input("Because...")
65
- if st.button("Submit"):
 
 
 
 
 
 
 
 
 
 
 
66
  st.rerun()
67
 
68
  def display_chat():
69
  # app config
70
  st.title("Chatbot")
71
 
 
 
 
 
 
72
  # session state
73
  if "chat_history" not in st.session_state:
74
  st.session_state.chat_history = [
75
  AIMessage(content="Salut, voici votre cartographie des parties prenantes. Que puis-je faire pour vous?"),
76
  ]
77
- if "user_query" not in st.session_state:
78
- st.session_state.user_query = "test"
79
 
80
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  # conversation
82
  for message in st.session_state.chat_history:
83
  if isinstance(message, AIMessage):
84
  with st.chat_message("AI"):
85
  st.write(message.content)
86
- if "cartographie des parties prenantes" in message.content:
87
  display_chart()
88
  elif isinstance(message, HumanMessage):
89
  with st.chat_message("Moi"):
@@ -92,11 +145,15 @@ def display_chat():
92
  #check if the last message is from the user , that means execute button has been clicked
93
  last_message = st.session_state.chat_history[-1]
94
  if isinstance(last_message, HumanMessage):
95
- response = st.write_stream(get_response(last_message.content, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque'])))
96
- st.session_state.chat_history.append(AIMessage(content=response))
 
 
 
97
 
98
  if "pp_grouped" not in st.session_state or st.session_state['pp_grouped'] is None or len(st.session_state['pp_grouped']) == 0:
99
- return None
 
100
  # user input
101
  user_query = st.chat_input("Par ici...")
102
  if user_query is not None and user_query != "":
@@ -104,18 +161,9 @@ def display_chat():
104
  with st.chat_message("Moi"):
105
  st.markdown(user_query)
106
  with st.chat_message("AI"):
107
- response = st.write_stream(get_response(user_query, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque'])))
 
108
  if "cartographie des parties prenantes" in message.content:
109
  display_chart()
110
 
111
  st.session_state.chat_history.append(AIMessage(content=response))
112
-
113
-
114
- def display_container_chat():
115
- st.markdown(":point_left: Cliquez pour discuter avec le Chatbot", unsafe_allow_html=True)
116
- col1, col2 = st.columns([1, 10])
117
- with col1:
118
- if st.button("display_prompts"):
119
- vote("D")
120
- with col2:
121
- display_chat()
 
4
  from dotenv import load_dotenv
5
  from langchain_core.output_parsers import StrOutputParser
6
  from langchain_core.prompts import ChatPromptTemplate
7
+ from langchain_mistralai.chat_models import ChatMistralAI
8
  from download_chart import construct_plot
9
+ from prompt import get_prompts_list
10
 
11
 
12
  load_dotenv()
 
23
  - Gérer étroitement: le pouvoir est entre 50 et 100 et l'influence est entre 50 et 100
24
  - Suivre de près: le pouvoir est entre 0 et 50 et l'influence est entre 0 et 50
25
  - Tenir informé: le pouvoir est entre 0 et 50 et l'influence est entre 50 et 100
26
+ '''
27
 
 
28
  context += segmentation
29
  return context
30
 
31
 
32
+ def get_response(user_query, chat_history, context,llm=None):
33
 
34
  template = """
35
+ Fournir des réponses, en francais, précises et contextuelles en agissant comme un expert en affaires, en utilisant le contexte des parties prenantes et leur pouvoir en pourcentage et leur influence en pourcentage pour expliquer les implications pour la marque. Le modèle doit connecter les informations du contexte et de l'historique de la conversation pour donner une réponse éclairée à la dernière question posée.
36
 
37
  Contexte: {context}
38
 
 
43
 
44
  prompt = ChatPromptTemplate.from_template(template)
45
 
46
+ #llm = ChatOpenAI(model="gpt-4o")
47
+ if not llm:
48
+ llm = ChatOpenAI(model="gpt-4o")
49
+ elif llm == "GPT-4o":
50
+ llm = ChatOpenAI(model="gpt-4o")
51
+ elif llm == "Mistral (FR)":
52
+ llm = ChatMistralAI(model_name="mistral-large-latest")
53
 
54
  chain = prompt | llm | StrOutputParser()
55
 
 
66
  plot = construct_plot()
67
  st.plotly_chart(plot)
68
 
69
+ @st.experimental_dialog("Choisissez un prompt",width="large")
70
+ def show_prompts():
71
+ if get_prompts_list() == 1:
72
+ st.rerun()
73
+ if st.button("Fermer"):
74
+ st.rerun()
75
+
76
+ @st.experimental_dialog("Choisissez votre IA",width="small")
77
+ def choose_model(index):
78
+
79
+ model = st.radio("Choisissez votre IA", ["(US) ChatGpt 4.o","(FR) Mistral AI - Large (open source)"],index=index)
80
+ if model == "(FR) Mistral AI - Large (open source)":
81
+ st.session_state.model = "Mistral (FR)"
82
+ if model == "(US) ChatGpt 4.o":
83
+ st.session_state.model = "GPT-4o"
84
+ if st.button("Valider"):
85
  st.rerun()
86
 
87
  def display_chat():
88
  # app config
89
  st.title("Chatbot")
90
 
91
+ models_name = {
92
+ "Mistral (FR)":1,
93
+ "GPT-4o":0
94
+ }
95
+
96
  # session state
97
  if "chat_history" not in st.session_state:
98
  st.session_state.chat_history = [
99
  AIMessage(content="Salut, voici votre cartographie des parties prenantes. Que puis-je faire pour vous?"),
100
  ]
 
 
101
 
102
+ if "model" not in st.session_state:
103
+ st.session_state.model = "GPT-4o"
104
+
105
+ #sticky bar at the top
106
+ header = st.container()
107
+ col1,col2,col3 = header.columns([1,2,4])
108
+
109
+ if col1.button("Prompts"):
110
+ show_prompts()
111
+ if col2.button(f"Modèle: {st.session_state.model}"):
112
+ index = models_name[st.session_state.model]
113
+ choose_model(index)
114
+ header.write("""<div class='fixed-header'/>""", unsafe_allow_html=True)
115
+
116
+ # Custom CSS for the sticky header
117
+ st.markdown(
118
+ """
119
+ <style>
120
+ div[data-testid="stVerticalBlock"] div:has(div.fixed-header) {
121
+ position: sticky;
122
+ top: 2.875rem;
123
+ background-color: white;
124
+ z-index: 999;
125
+ }
126
+ .fixed-header {
127
+ border-bottom: 0px solid black;
128
+ }
129
+ </style>
130
+ """,
131
+ unsafe_allow_html=True
132
+ )
133
+
134
  # conversation
135
  for message in st.session_state.chat_history:
136
  if isinstance(message, AIMessage):
137
  with st.chat_message("AI"):
138
  st.write(message.content)
139
+ if "cartographie" in message.content:
140
  display_chart()
141
  elif isinstance(message, HumanMessage):
142
  with st.chat_message("Moi"):
 
145
  #check if the last message is from the user , that means execute button has been clicked
146
  last_message = st.session_state.chat_history[-1]
147
  if isinstance(last_message, HumanMessage):
148
+ with st.chat_message("AI"):
149
+ response = st.write_stream(get_response(last_message.content, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model))
150
+ st.session_state.chat_history.append(AIMessage(content=response))
151
+
152
+
153
 
154
  if "pp_grouped" not in st.session_state or st.session_state['pp_grouped'] is None or len(st.session_state['pp_grouped']) == 0:
155
+ st.session_state['pp_grouped'] = []
156
+
157
  # user input
158
  user_query = st.chat_input("Par ici...")
159
  if user_query is not None and user_query != "":
 
161
  with st.chat_message("Moi"):
162
  st.markdown(user_query)
163
  with st.chat_message("AI"):
164
+ st.markdown(f"**{st.session_state.model}**")
165
+ response = st.write_stream(get_response(user_query, st.session_state.chat_history,format_context(st.session_state['pp_grouped'],st.session_state['Nom de la marque']),st.session_state.model))
166
  if "cartographie des parties prenantes" in message.content:
167
  display_chart()
168
 
169
  st.session_state.chat_history.append(AIMessage(content=response))
 
 
 
 
 
 
 
 
 
 
high_chart.py CHANGED
@@ -190,21 +190,18 @@ def test_chart():
190
  chart = hct.streamlit_highcharts(cd2,640) #640 is the chart height
191
  # if chart:
192
  # st.session_state['pp_grouped'] = chart
193
- if st.session_state['save']:
194
- st.session_state['save'] = False
195
- st.session_state['pp_grouped'] = chart.copy()
196
  emp = st.empty()
197
 
198
 
199
 
200
  col0, col1, col2, col3 = st.columns([1,1,1,1])
201
 
202
- if col1.button("Sauvegarder"):
203
  st.session_state['pp_grouped'] = chart.copy()
204
  emp.success("Saved")
205
  st.experimental_rerun()
206
 
207
- if col2.button("Télécharger"):
208
  if not chart:
209
  st.error("Un truc ne va pas. Veuillez réessayer")
210
  else:
 
190
  chart = hct.streamlit_highcharts(cd2,640) #640 is the chart height
191
  # if chart:
192
  # st.session_state['pp_grouped'] = chart
 
 
 
193
  emp = st.empty()
194
 
195
 
196
 
197
  col0, col1, col2, col3 = st.columns([1,1,1,1])
198
 
199
+ if col1.button("Sauvegarder",key="save"):
200
  st.session_state['pp_grouped'] = chart.copy()
201
  emp.success("Saved")
202
  st.experimental_rerun()
203
 
204
+ if col2.button("Télécharger",key="download"):
205
  if not chart:
206
  st.error("Un truc ne va pas. Veuillez réessayer")
207
  else:
partie_prenante_carte.py CHANGED
@@ -2,6 +2,7 @@ import streamlit as st
2
  import pandas as pd
3
  import numpy as np
4
  import re
 
5
 
6
  import streamlit as st
7
  from dotenv import load_dotenv
@@ -124,8 +125,6 @@ def display_list_urls():
124
 
125
  # Button to delete the entry, placed in the second column
126
  if col2.button("❌", key=f"but{index}"):
127
-
128
- st.session_state["save"] = True
129
  temp = st.session_state['parties_prenantes'][index]
130
  delete_pp(temp)
131
  del st.session_state.urls[index]
@@ -164,13 +163,25 @@ def display_list_pps():
164
 
165
 
166
  def extract_pp(docs,input_variables):
167
- template_extraction_PP = '''
168
- Objectif : identifiez tout les parties prenantes de la marque suivante:
 
 
 
 
169
 
170
- Le nom de la marque de référence est le suivant : {BRAND_NAME}
 
 
 
171
 
172
- TA REPONSE DOIT ETRE SOUS FORME DE LISTE DE NOMS DE MARQUES SANS INCLURE LE NOM DE LA MARQUE DE REFERENCE SANS NUMEROTATION ET SEPARES PAR DES RETOURS A LA LIGNE
173
- '''
 
 
 
 
 
174
  #don't forget to add the input variables from the maim function
175
 
176
  if docs == None:
@@ -191,6 +202,8 @@ def extract_pp(docs,input_variables):
191
  # version plus poussée a considérer
192
  # each item in the list is a list with the name of the brand and the similarity percentage
193
  # partie_prenante = text_to_list(response.content)
 
 
194
 
195
  #version simple
196
  partie_prenante = response.content.replace("- ","").split('\n')
@@ -233,22 +246,28 @@ def add_pp(new_pp, default_value=50):
233
 
234
  def add_pp_input_text():
235
  new_pp = st.text_input("Ajouter une partie prenante")
236
- if st.button("Ajouter"):
237
- st.session_state["save"] = True
238
  format_pp_add_viz(new_pp)
239
 
240
- import re
241
- import random
242
 
243
  def complete_and_verify_url(partial_url):
244
  # Regex pattern for validating a URL
245
  regex = re.compile(
246
  r'^(?:http|ftp)s?://' # http:// or https://
247
- r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain
248
  r'localhost|' # localhost...
249
  r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
250
  r'(?::\d+)?' # optional port
251
  r'(?:/?|[/?]\S+)$', re.IGNORECASE)
 
 
 
 
 
 
 
 
 
252
 
253
  # Complete the URL if it doesn't have http:// or https://
254
  if not partial_url.startswith(('http://', 'https://', 'www.')):
@@ -268,6 +287,31 @@ def complete_and_verify_url(partial_url):
268
  return (True, complete_url)
269
  else:
270
  return (False, complete_url)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271
 
272
 
273
  def display_pp():
@@ -285,9 +329,11 @@ def display_pp():
285
  st.session_state['parties_prenantes'] = []
286
  if "pp_grouped" not in st.session_state: #servira pour le plot et la cartographie des parties prenantes, regroupe sans doublons
287
  st.session_state['pp_grouped'] = []
 
 
 
 
288
 
289
- if "save" not in st.session_state:
290
- st.session_state["save"] = False
291
 
292
  st.header("Parties prenantes de la marque")
293
  #set brand name and description
@@ -300,11 +346,12 @@ def display_pp():
300
  if option == "A partir de votre site web":
301
 
302
  url = st.text_input("Ajouter une URL")
303
-
304
- scraping_option = st.radio("Mode", ("Analyse rapide", "Analyse profonde"),horizontal=True)
 
305
  #if the user clicks on the button
306
- if st.button("ajouter"):
307
- st.session_state["save"] = True
308
  #complete and verify the url
309
  is_valid,url = complete_and_verify_url(url)
310
  if not is_valid:
@@ -326,14 +373,11 @@ def display_pp():
326
  docs = get_docs_from_website([url])
327
 
328
  if docs is None:
329
- st.error("Erreur lors de la collecte des données")
 
330
  else:
331
  # Création de l'expander
332
- with st.expander("Cliquez ici pour éditer et voir le document"):
333
- cleaned_text = re.sub(r'\n\n+', '\n\n', docs[0].page_content.strip())
334
- text_value = st.text_area("Modifier le texte ci-dessous:", value=cleaned_text, height=300)
335
- if st.button('Sauvegarder'):
336
- st.success("Texte sauvegardé avec succès!")
337
 
338
  with st.spinner("Processing..."):
339
 
@@ -341,14 +385,17 @@ def display_pp():
341
  input_variables = {"BRAND_NAME": brand_name, "BRAND_DESCRIPTION": ""}
342
  partie_prenante = extract_pp(docs, input_variables)
343
 
344
- if "444" in partie_prenante: #444 is the code for no brand found , chosen
345
- st.error("Aucune partie prenante trouvée")
346
- elif "445" in partie_prenante: #445 is the code for no website found with the given url
347
- st.error("Aucun site web trouvé avec l'url donnée")
348
- else:
349
- partie_prenante = sorted(partie_prenante)
350
- st.session_state["urls"].append(url)
351
- add_pp(partie_prenante)
 
 
 
352
 
353
  # alphabet = [ pp[0] for pp in partie_prenante]
354
  # pouvoir = [ 50 for _ in range(len(partie_prenante))]
@@ -366,6 +413,21 @@ def display_pp():
366
 
367
  # disp_vertical_slider(partie_prenante)
368
  # st.altair_chart(c, use_container_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
369
  display_list_urls()
370
  with st.expander("Liste des parties prenantes"):
371
  add_pp_input_text()
 
2
  import pandas as pd
3
  import numpy as np
4
  import re
5
+ import random
6
 
7
  import streamlit as st
8
  from dotenv import load_dotenv
 
125
 
126
  # Button to delete the entry, placed in the second column
127
  if col2.button("❌", key=f"but{index}"):
 
 
128
  temp = st.session_state['parties_prenantes'][index]
129
  delete_pp(temp)
130
  del st.session_state.urls[index]
 
163
 
164
 
165
  def extract_pp(docs,input_variables):
166
+ template_extraction_PP = """
167
+ Objectif : Identifiez toutes les parties prenantes de la marque suivante :
168
+
169
+ Le nom de la marque de référence est le suivant : {BRAND_NAME}
170
+
171
+ TA RÉPONSE DOIT ÊTRE SOUS FORME DE LISTE DE NOMS DE MARQUES, CHAQUE NOM SUR UNE LIGNE SÉPARÉE, ET NE DOIT PAS INCLURE D'OBJETS OU DE NOMS COMMUNS.
172
 
173
+ Exemples de bonnes réponses :
174
+ - Nike
175
+ - Adidas
176
+ - Puma
177
 
178
+ Exemples de mauvaises réponses éviter) :
179
+ - Chaussures
180
+ - Ballon
181
+ - Vêtements
182
+
183
+ LISTE DE MARQUES :
184
+ """
185
  #don't forget to add the input variables from the maim function
186
 
187
  if docs == None:
 
202
  # version plus poussée a considérer
203
  # each item in the list is a list with the name of the brand and the similarity percentage
204
  # partie_prenante = text_to_list(response.content)
205
+ if "ne sais pas" in response.content:
206
+ return "444"
207
 
208
  #version simple
209
  partie_prenante = response.content.replace("- ","").split('\n')
 
246
 
247
  def add_pp_input_text():
248
  new_pp = st.text_input("Ajouter une partie prenante")
249
+ if st.button("Ajouter",key="add_single_pp"):
 
250
  format_pp_add_viz(new_pp)
251
 
 
 
252
 
253
  def complete_and_verify_url(partial_url):
254
  # Regex pattern for validating a URL
255
  regex = re.compile(
256
  r'^(?:http|ftp)s?://' # http:// or https://
257
+ r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,8}\.?|' # domain
258
  r'localhost|' # localhost...
259
  r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
260
  r'(?::\d+)?' # optional port
261
  r'(?:/?|[/?]\S+)$', re.IGNORECASE)
262
+
263
+ regex = re.compile(
264
+ r'^(?:http|ftp)s?://' # http:// or https://
265
+ r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,8}\.?|' # domain name
266
+ r'localhost|' # or localhost
267
+ r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # or IPv4 address
268
+ r'(?::\d+)?' # optional port
269
+ r'(?:[/?#][^\s]*)?$', # optional path, query, or fragment
270
+ re.IGNORECASE)
271
 
272
  # Complete the URL if it doesn't have http:// or https://
273
  if not partial_url.startswith(('http://', 'https://', 'www.')):
 
287
  return (True, complete_url)
288
  else:
289
  return (False, complete_url)
290
+
291
+ @st.experimental_dialog("Conseil IA",width="large")
292
+ def show_conseil_ia():
293
+ st.markdown("**Prenant compte les données de l'entreprise (activité, produits, services ...), quelles sont les principales parties prenantes à animer pour une démarche RSE réussie ?**")
294
+ markdown_text = f"""
295
+ Compte tenu des informations fournies sur l'entreprise {st.session_state["Nom de la marque"]}, une boutique en ligne de nutrition sportive, voici les principales parties prenantes à animer pour une démarche RSE réussie :
296
+
297
+ 1. **Les clients et consommateurs** :
298
+ - Comprendre leurs attentes en matière de nutrition responsable et durable.
299
+ - Communiquer de manière transparente sur les engagements RSE de l'entreprise (origine des ingrédients, impact environnemental, etc.).
300
+ - Impliquer les clients dans des initiatives RSE (collectes de dons, campagnes de sensibilisation, etc.).
301
+
302
+ 2. **Les fournisseurs** :
303
+ - Évaluer et sélectionner les fournisseurs selon des critères RSE (pratiques de production, conditions de travail, etc.).
304
+ - Accompagner les fournisseurs dans l'amélioration de leurs propres démarches RSE.
305
+ - Co-construire des solutions innovantes et durables pour la filière.
306
+
307
+ 3. **Les employés** :
308
+ - Sensibiliser et former les employés aux enjeux RSE liés aux produits et services.
309
+ - Encourager leurs initiatives et leur engagement personnel dans la démarche RSE.
310
+ - Valoriser les bonnes pratiques et le rôle des employés dans la réussite de la démarche.
311
+ """
312
+ st.markdown(markdown_text)
313
+ if st.button("Saisissez une autre URL"):
314
+ st.rerun()
315
 
316
 
317
  def display_pp():
 
329
  st.session_state['parties_prenantes'] = []
330
  if "pp_grouped" not in st.session_state: #servira pour le plot et la cartographie des parties prenantes, regroupe sans doublons
331
  st.session_state['pp_grouped'] = []
332
+ if "latest_doc" not in st.session_state:
333
+ st.session_state['latest_doc'] = ""
334
+ if "not_pp" not in st.session_state:
335
+ st.session_state["not_pp"] = ""
336
 
 
 
337
 
338
  st.header("Parties prenantes de la marque")
339
  #set brand name and description
 
346
  if option == "A partir de votre site web":
347
 
348
  url = st.text_input("Ajouter une URL")
349
+
350
+ captions = ["L’IA prend en compte uniquement les textes contenus dans les pages web analysées","L’IA prend en compte les textes, les images et les liens URL contenus dans les pages web analysées"]
351
+ scraping_option = st.radio("Mode", ("Analyse rapide", "Analyse profonde"),horizontal=True,captions = captions)
352
  #if the user clicks on the button
353
+ if st.button("ajouter",key="add_pp"):
354
+ st.session_state["not_pp"] = ""
355
  #complete and verify the url
356
  is_valid,url = complete_and_verify_url(url)
357
  if not is_valid:
 
373
  docs = get_docs_from_website([url])
374
 
375
  if docs is None:
376
+ st.error("Erreur lors de la collecte des données, URL unvalide")
377
+ st.session_state["latest_doc"] = ""
378
  else:
379
  # Création de l'expander
380
+ st.session_state["latest_doc"] = docs
 
 
 
 
381
 
382
  with st.spinner("Processing..."):
383
 
 
385
  input_variables = {"BRAND_NAME": brand_name, "BRAND_DESCRIPTION": ""}
386
  partie_prenante = extract_pp(docs, input_variables)
387
 
388
+ if "444" in partie_prenante: #444 is the code for no brand found , chosen
389
+ st.session_state["not_pp"] = "444"
390
+
391
+ elif "445" in partie_prenante: #445 is the code for no website found with the given url
392
+ st.error("Aucun site web trouvé avec l'url donnée")
393
+ st.session_state["not_pp"] = ""
394
+ else:
395
+ st.session_state["not_pp"] = ""
396
+ partie_prenante = sorted(partie_prenante)
397
+ st.session_state["urls"].append(url)
398
+ add_pp(partie_prenante)
399
 
400
  # alphabet = [ pp[0] for pp in partie_prenante]
401
  # pouvoir = [ 50 for _ in range(len(partie_prenante))]
 
413
 
414
  # disp_vertical_slider(partie_prenante)
415
  # st.altair_chart(c, use_container_width=True)
416
+
417
+ if st.session_state["not_pp"] == "444":
418
+ st.warning("Aucune parties prenantes n'est identifiable sur l'URL fournie. Fournissez une autre URL ou bien cliquez sur le boutton ci-dessous pour un Conseils IA")
419
+
420
+ if st.button("Conseil IA"):
421
+ show_conseil_ia()
422
+ #display docs
423
+ if st.session_state["latest_doc"] != "":
424
+ with st.expander("Cliquez ici pour éditer et voir le document"):
425
+ docs = st.session_state["latest_doc"]
426
+ cleaned_text = re.sub(r'\n\n+', '\n\n', docs[0].page_content.strip())
427
+ text_value = st.text_area("Modifier le texte ci-dessous:", value=cleaned_text, height=300)
428
+ if st.button('Sauvegarder',key="save_doc_fake"):
429
+ st.success("Texte sauvegardé avec succès!")
430
+
431
  display_list_urls()
432
  with st.expander("Liste des parties prenantes"):
433
  add_pp_input_text()
prompt.py CHANGED
@@ -41,10 +41,11 @@ def get_prompts_list():
41
  button_phold = col4.empty() # create a placeholder
42
  but1, but2 = button_phold.columns(2)
43
 
44
- do_action = but1.button('Voir plus', key=i)
45
  execute = but2.button('Executer', key=f"e{i}")
46
  if execute:
47
  st.session_state.chat_history.append(HumanMessage(content=prompts[i]['text']))
 
48
  if do_action:
49
  prompt_html = prompts[i]['text'].replace('\n', '<br>')
50
  prompt_metadata = extract_metadata(prompts[i])
 
41
  button_phold = col4.empty() # create a placeholder
42
  but1, but2 = button_phold.columns(2)
43
 
44
+ do_action = but1.button('Voir plus', key=f"v{i}")
45
  execute = but2.button('Executer', key=f"e{i}")
46
  if execute:
47
  st.session_state.chat_history.append(HumanMessage(content=prompts[i]['text']))
48
+ return 1
49
  if do_action:
50
  prompt_html = prompts[i]['text'].replace('\n', '<br>')
51
  prompt_metadata = extract_metadata(prompts[i])