Spaces:
Sleeping
Sleeping
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() |