File size: 7,121 Bytes
56a3465
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import streamlit as st
from utils.audit.response_llm import generate_response_via_langchain
from textwrap import dedent
import streamlit as st
from langchain_openai import ChatOpenAI
from langchain_mistralai import ChatMistralAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.messages import AIMessage, HumanMessage

#st.set_page_config(page_title="Agents recommandés", page_icon="", layout="wide")
def remove_images_from_content(content):
    filtered_content = {}
    
    for page, data in content.items():
        # Create a new dictionary excluding the "images" key
        filtered_data = {key: value for key, value in data.items() if key != "images"}
        filtered_content[page] = filtered_data
    
    return filtered_content

def get_response(user_query, chat_history, db,llm=None,history_limit=10,stream=True):
    retriever = db.as_retriever()
    context = retriever.invoke(user_query)
    template = """
    Étant donné l'historique de la conversation : {chat_history}, le contexte qui est le document  : {context}, et la question de l'utilisateur : {user_question}, repond comme un expert en agent IA.
    Assurez-vous que la réponse soit adaptée au niveau d'expertise de l'utilisateur et aux spécificités du contexte fourni.

    """

    prompt = ChatPromptTemplate.from_template(template)

    #llm = ChatOpenAI(model="gpt-4o")
    if not llm:
        llm = ChatOpenAI(model="gpt-4o-mini")
    elif llm == "GPT-4o":
        llm = ChatOpenAI(model="gpt-4o")
    elif llm == "Mistral Large 2 (FR)":
        llm = ChatMistralAI(model_name="mistral-large-2407")
    elif llm == "GPT-4o-mini":
        llm = ChatOpenAI(model="gpt-4o-mini")
    elif llm == "Mistral Nemo (FR)":
        llm = ChatMistralAI(model_name="open-mistral-nemo-2407")
    
        
    chain = prompt | llm

    if not stream:
        return chain.invoke({
            "context": context,
            "chat_history": chat_history[-history_limit:],
            "user_question": user_query,
        })
    
    chain = chain | StrOutputParser()

    if history_limit:
        return chain.stream({
            "context": context,
            "chat_history": chat_history[-history_limit:],
            "user_question": user_query,
        })
    
    return chain.stream({
        "context": context,
        "chat_history": chat_history,
        "user_question": user_query,
    })

def handle_display_models(index, models_names):
    model = st.radio("Choisir un modèle",models_names, index=index)
    return model

def recommended_agent_main():
    st.title("Agents recommandés")
    models_names = ["GPT-4o", "GPT-4o-mini","Mistral Nemo (FR)","Mistral Large 2 (FR)"]

    if "chat_history" not in st.session_state:
        st.session_state.chat_history = [
        ]

    if "model" not in st.session_state:
        st.session_state.model = "GPT-4o-mini"

    header = st.container()
    col1, col2 = header.columns([1, 2])

    with col1.popover("Modèles disponibles"):
        new_model = handle_display_models(models_names.index(st.session_state.model), models_names)

    st.session_state.model = new_model
    
    st.markdown(f"- **{st.session_state.model}**")

    if "audit" not in st.session_state or st.session_state.audit == {}:
        st.error("Veuillez d'abord effectuer un audit pour obtenir des recommandations d'agents.")
        return
    
    audit = st.session_state.audit_simplified
    content = st.session_state.audit["content"]

    if "response_llm" not in st.session_state:
        st.session_state.response_llm = ""


    #filter content, delete images if type is pdf
    if audit["type de fichier"] == "pdf":
        content = remove_images_from_content(content)
    #delete audio if type is audio and keep transcript
    elif audit["type de fichier"] == "audio":
        content = content["transcription"]

    ressources = content

    prompt = '''
    Tu es designer en intelligence artificielle (IA) spécialisé dans la création d'agents IA autonomes et performants.

    A partir de ressources fournies par l'utilisateur (texte, documents, images, audio), tu es chargé de réaliser les tâches suivantes :

    A/ Faire un résumé des ressources fournies en 500 caractères maximum

    B/ Suggérer la création d'agents autonomes pour mettre en pratique les informations contenues dans les ressources fournies.

    Tu proposes deux solutions :

    Sol. A : 1 seul agent IA dont tu suggéreras :
            * Nom
            * Rôle
            * Objectifs
            * Outils utilisés par l'agent
            * Tâches réalisées par l'agents
            * Compétences de l'agent (backstory)

    Sol. B : 1 équipe d'agents tu suggéreras :
            * Le nombre d'agents
            * Pour chacune d'eux [Nom, Rôle, Objectifs, Outils utilisés par l'agent, Tâches réalisées par l'agents, Compétences de l'agent (backstory)]

    Une fois ce travail réalisé, tu proposes une série de 3 missions avec objectifs SMART pour chacun des agents  Sol. A et Sol. B en présentation les résultats dans un tableau contenant :
            * Nom de l’agent
            * Objectifs à atteindre

        '''
    
    #display prompt and modify it 
    prompt_modified = st.text_area("Prompt par défaut (que vous pouvez modifier, compléter)", prompt, height=300)
    prompt_modified = dedent(prompt_modified)

    if st.button("Générer les recommandations"):
        resource_prompt = f'''Ressources fournies par l'utilisateur :{ressources}'''
        prompt_modified = f"{prompt_modified}\n{resource_prompt}"
        st.session_state.chat_history = []
        with st.chat_message("AI"):
            st.session_state.response_llm = st.write_stream(generate_response_via_langchain(query=prompt_modified,stream=True))
        
        st.session_state.chat_history.append(AIMessage(content=st.session_state.response_llm))
    
    elif st.session_state.response_llm:
        st.info("la dernière réponse générée est affichée ci-dessous")
        with st.chat_message("AI"):
            st.write(st.session_state.response_llm)
    
    for message in st.session_state.chat_history[1:]:
        if isinstance(message, AIMessage):
            with st.chat_message("AI"):
                st.markdown(message.content)
        elif isinstance(message, HumanMessage):
            with st.chat_message("Moi"):
                st.write(message.content)

    user_query = st.chat_input("Par ici ...")
    if user_query is not None and user_query != "":
        st.session_state.chat_history.append(HumanMessage(content=user_query))

        with st.chat_message("Moi"):
            st.markdown(user_query)
        
        with st.chat_message("AI"):
            st.markdown(f"**{st.session_state.model}**")
    

            response = st.write_stream(get_response(user_query, st.session_state.chat_history,db=st.session_state.vectorstore, llm=st.session_state.model, stream=True))
            st.session_state.chat_history.append(AIMessage(content=response))




recommended_agent_main()