Spaces:
Running
Running
Ilyas KHIAT
commited on
Commit
•
fda58da
1
Parent(s):
438effa
model choice conseil IA
Browse files- .streamlit/.env +1 -0
- app.py +1 -1
- chat_te.py +1 -0
- chat_with_pps.py +75 -27
- high_chart.py +2 -5
- partie_prenante_carte.py +94 -32
- 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
|
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("
|
62 |
-
def
|
63 |
-
|
64 |
-
|
65 |
-
if st.button("
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
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 |
-
|
96 |
-
|
|
|
|
|
|
|
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 |
-
|
|
|
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 |
-
|
|
|
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 |
-
|
|
|
|
|
|
|
|
|
169 |
|
170 |
-
|
|
|
|
|
|
|
171 |
|
172 |
-
|
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,
|
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 |
-
|
|
|
305 |
#if the user clicks on the button
|
306 |
-
if st.button("ajouter"):
|
307 |
-
st.session_state["
|
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 |
-
|
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 |
-
|
345 |
-
|
346 |
-
|
347 |
-
|
348 |
-
|
349 |
-
|
350 |
-
|
351 |
-
|
|
|
|
|
|
|
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])
|