File size: 5,532 Bytes
d9e40cd b3e5484 d9e40cd 2eff77d d9e40cd 28d07c2 68aa090 28d07c2 d9e40cd 28d07c2 d9e40cd 68aa090 d5511b8 68aa090 49d4c37 68aa090 d5511b8 68aa090 b3e5484 68aa090 d9e40cd fded6e8 d9e40cd 1bdb375 d9e40cd 49d4c37 1bdb375 fded6e8 1bdb375 fded6e8 1bdb375 49d4c37 1bdb375 fded6e8 1bdb375 d9e40cd 49d4c37 d9e40cd fded6e8 49d4c37 |
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 |
import streamlit as st
from st_copy_to_clipboard import st_copy_to_clipboard
import pandas as pd
from data_manager_bziiit import get_prompts
from langchain_core.messages import AIMessage, HumanMessage
from session import get_rag
prompts = []
def get_prompts_list():
st.header("Prompts")
prompts = get_prompts()
# Check if prompts is a list of dictionaries
if isinstance(prompts, list) and all(isinstance(i, dict) for i in prompts):
# Create a DataFrame
df = pd.DataFrame(prompts)
# Check if 'name', 'context', and 'text' are in df columns
if 'name' in df.columns and 'context' in df.columns and 'text' in df.columns:
# Filter prompts with id_context as 'rse' or 'transition'
df = df[df['id_context'].isin([
'identifier-parties-prenantes-organisation',
'animer-parties-prenantes-organisation',
'pour-accelerer-la-demarche-rse',
'pour-accelerer-la-demarche-transition-ecologique',
'ressources-humaines'
])]
# Extract 'name' from 'context' dictionary
df['context'] = df['context'].apply(lambda x: x.get('name') if isinstance(x, dict) else x)
# Get first 50 characters from 'text' and add "..." at the end
df['text'] = df['text'].apply(lambda x: x[:50] + "..." if isinstance(x, str) else x)
# Group by 'context'
grouped = df.groupby('context')
for name, group in grouped:
num = 1
with st.expander(name):
for i, row in group.iterrows():
col1, col3, col4 = st.columns((0.4, 4, 2))
col1.write(num) # index
# col2.write(row['name']) # name
col3.write(row['text']) # text
num += 1
button_phold = col4.empty() # create a placeholder
but1, but2 = button_phold.columns(2)
do_action = but1.button('Voir plus', key=f"v{i}")
execute = but2.button('Executer', key=f"e{i}")
if execute:
st.session_state.chat_history.append(HumanMessage(content=prompts[i]['text']))
return 1
if do_action:
prompt_html = prompts[i]['text'].replace('\n', '<br>')
prompt_metadata = extract_metadata(prompts[i])
for text in prompt_metadata:
prompt_html = prompt_html.replace(f"{text}", f"<span style='font-weight:bold'>{text}</span>")
st.html(prompt_html)
else:
st.write("Data does not contain 'name', 'context', and 'text' fields.")
else:
st.write("Data is not in the expected format (list of dictionaries).")
def prompt_execution():
prompts = get_prompts()
selected_prompt = st.selectbox("Choisissez un prompt", prompts, index=None, format_func=lambda prompt: prompt['name'])
if selected_prompt:
return selected_prompt
return None
def execute_prompt(prompt):
# Initialiser les composants
vectorstore, chain = get_rag()
prompt_metadata = extract_metadata(prompt)
prompt['metadata'] = prompt['text']
prompt['html'] = prompt['text'].replace('\n', '<br>')
if prompt_metadata:
st.info("Données à compléter")
# Demander à l'utilisateur de fournir des valeurs pour chaque métadonnée extraite
user_inputs = {}
for text in prompt_metadata:
prompt['html'] = prompt['html'].replace(f"{text}", f"<span style='font-weight:bold'>{text}</span>")
user_input = st.text_input(f"{text}")
user_inputs[text] = user_input # Stocker la valeur de l'entrée utilisateur
# Remplacer les valeurs par le texte correspondant dans prompt['text']
for key, value in user_inputs.items():
if value:
prompt['html'] = prompt['html'].replace(f"{key}", f"<span style='color:#63ABDF;font-weight:bold' title='{key}'>{value}</span>")
prompt['metadata'] = prompt['metadata'].replace(f"{key}", f"{value}")
# Afficher les informations du prompt
if prompt_metadata:
st.markdown("---")
st.html(prompt.get('html', 'No Text Provided'))
if vectorstore and chain:
if st.button("Exécuter le prompt"):
with st.spinner("Processing..."):
ambition = chain.invoke(prompt['metadata'])
st.markdown("### Réponse :")
st.markdown(ambition.content)
else:
st.error("RAG non configuré. Veuillez configurer votre RAG pour exécuter le prompt.")
# Extraire le texte entre crochets dans le prompt
def extract_metadata(prompt):
extracted_text = []
if 'text' in prompt:
extracted_text = [word for word in prompt['text'].split() if word.startswith("[") and word.endswith("]")]
# Supprimer les doublons et trier les métadonnées extraites
prompt_metadata = list(set(extracted_text))
prompt_metadata.sort(key=extracted_text.index) # Conserver l'ordre d'apparition initial
return prompt_metadata |