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