Agent_V2 #2

Merged
Kevin merged 12 commits from Agent_V2 into master 2026-02-09 19:25:11 +01:00
11 changed files with 292 additions and 12 deletions
Showing only changes of commit 82a5491188 - Show all commits

View File

@@ -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"

View File

@@ -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"""

View File

@@ -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 ?

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB