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