diff --git a/AgentReact/agent.py b/AgentReact/agent.py index 9723362..1de10f6 100644 --- a/AgentReact/agent.py +++ b/AgentReact/agent.py @@ -2,7 +2,7 @@ from langgraph.graph import START, END from langgraph.graph.state import CompiledStateGraph from langgraph.checkpoint.memory import InMemorySaver -from utils.nodes import call_to_LLM, should_continue, task_ended, BasicToolNode, tool_node, preparation_docs, weekly_report_tools +from utils.nodes import * from utils.state import getState from utils.tools import getTools @@ -18,11 +18,13 @@ def getGraph()->CompiledStateGraph: # Définition des sommets du graphe workflow.add_node(call_to_LLM) workflow.add_node(preparation_docs) + workflow.add_node(inject_preparation_prompt) workflow.add_node("tool_node", tool_node)# BasicToolNode(tools=getTools())) # N'est pas une fonction, mais une classe instanciée, je dois précisier le nom du node workflow.add_node("weekly_report_tools", weekly_report_tools) # Arrêtes - workflow.set_entry_point("preparation_docs") + workflow.set_entry_point("inject_preparation_prompt") + workflow.add_edge("inject_preparation_prompt", "preparation_docs") workflow.add_conditional_edges("preparation_docs", should_continue, { "tools":"weekly_report_tools", "no_tools":"call_to_LLM" diff --git a/AgentReact/utils/nodes.py b/AgentReact/utils/nodes.py index 6513bae..a2fb619 100644 --- a/AgentReact/utils/nodes.py +++ b/AgentReact/utils/nodes.py @@ -4,9 +4,11 @@ from langgraph.prebuilt import ToolNode from langchain.chat_models import init_chat_model from langgraph.graph import START, END from langchain.messages import HumanMessage, AIMessage, SystemMessage +from langgraph.types import interrupt from .tools import getTools, getWeeklyReportTools from .state import CustomState +from .InterruptPayload import InterruptPayload # LLM principal llm = ChatMistralAI( # LLM sans outils @@ -16,21 +18,20 @@ llm = ChatMistralAI( # LLM sans outils ) # NODES +def inject_preparation_prompt(state: CustomState): + """ Noeud qui vise juste à insérer le message indiquant au LLM comment travailler sur les résumés de comptes-rendus """ + return {'messages': HumanMessage( + "Ton but est de lire les fichiers présents dans la base de données en utilisant l'outil 'search_in_files',\ + afin de générer des rapports sur chaque semaine du stage qui y est décrit. Pour enregistrer chaque semaine du stage, utilise l'outil 'write_week_report'.\ + Une fois terminé, fais une liste de tous les outils, logiciels, méthodes, entreprises, techniques, ect.. utilisés,\ + et fais en une liste avec quelques descriptions que tu devras enregistrer avec l'outil 'write_library_tools_details_on_internship'." + )} + def preparation_docs(state: CustomState): """Noeud en charge de préparer les résumés pour chaque semaine des rapports, et la liste des outils et méthodes utilisées""" model = llm.bind_tools(getWeeklyReportTools()) # LLM en charge de générer des rapports hebdomadaires sur le stage - print(len(state['messages'])) - messages = [m for m in state['messages']] # Tous les messages du stage - if 'documentsGenerationStarted' not in state.keys(): - # Si ce noeud en est à son premier lancement, je lui donne la consigne de départ - messages.append(HumanMessage("Ton but est de lire les fichiers présents dans la base de données en utilisant l'outil 'search_in_files',\ - afin de générer des rapports sur chaque semaine du stage qui y est décrit. Pour enregistrer chaque semaine du stage, utilise l'outil 'write_week_report'.\ - Une fois terminé, fais une liste de tous les outils, logiciels, méthodes, entreprises, techniques, ect.. utilisés,\ - et fais en une liste avec quelques descriptions que tu devras enregistrer avec l'outil 'write_library_tools_details_on_internship'.")) - - messages.append(model.invoke(messages)) # Invocation LLM - return {'messages': messages, 'documentsGenerationStarted':True} # Je passe une liste de messages, ce qui ne devrait pas ajouter un message mais redéfinir toute la liste + return {'messages': model.invoke(state['messages'])} def call_to_LLM(state: MessagesState): """Noeud qui s'occupe de gérer les appels au LLM""" diff --git a/AgentReact/utils/state.py b/AgentReact/utils/state.py index e91964a..3224440 100644 --- a/AgentReact/utils/state.py +++ b/AgentReact/utils/state.py @@ -10,8 +10,6 @@ class CustomState(MessagesState): ragQuery: str # Requête envoyée au RAG, pour le cross-encodeur ragDocuments: List[str] # Documents retrouvés par le RAG, pour le cross-encodeur - documentsGenerationStarted:bool# Permet d'indiquer que la consigne de génération des documents a été envoyée - # TODO: Ajouter la source des documents sélectionnés pour la fin du rapport ? diff --git a/imgs/agent.png b/imgs/agent.png index 1a00776..e24f8c4 100644 Binary files a/imgs/agent.png and b/imgs/agent.png differ