File size: 4,620 Bytes
d9e40cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49d4c37
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
from data_manager_bziiit import get_prompts
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:
            # 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:
                st.subheader(name)  # Display the context name as a subheader
                for i, row in group.iterrows():
                    col1, col2, col3, col4 = st.columns((1, 2, 2, 1))
                    col1.write(i)  # index
                    col2.write(row['name'])  # name
                    col3.write(row['text'])  # text
                    button_phold = col4.empty()  # create a placeholder
                    do_action = button_phold.button('Show More', key=i)
                    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)  # Display the full text
                        button_phold.empty()  # remove button
        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