Agent_V3 #3

Merged
Kevin merged 12 commits from Agent_V3 into master 2026-02-12 15:24:11 +01:00
6 changed files with 158 additions and 27 deletions
Showing only changes of commit 23e18d6a88 - Show all commits

View File

@@ -1,3 +1,5 @@
import json
# Classes utilisées pour représenter des données # Classes utilisées pour représenter des données
class TodoElement(): class TodoElement():
STATE_NOT_STARTED = 0 # Sorte d'enum qui représente l'état d'une tâche STATE_NOT_STARTED = 0 # Sorte d'enum qui représente l'état d'une tâche
@@ -7,10 +9,10 @@ class TodoElement():
name: str name: str
state: int state: int
def __init__(self, name:str, description:str=None): def __init__(self, name:str, description:str=None, state:int=0):
self.name = name self.name = name
self.description = description self.description = description
self.state = TodoElement.STATE_NOT_STARTED self.state = state
def __str__(self)->str: def __str__(self)->str:
""" """
@@ -33,8 +35,39 @@ class TodoElement():
else: else:
return "Inconnu" return "Inconnu"
def toJSON(self, indent:int=None)->str: # Vient de https://github.com/LJ5O/Assistant/blob/main/modules/Brain/src/Json/Types.py
"""
Exporter cet objet vers une String JSON. Permet de le passer dans le State
Returns:
str: String sérialisable via la méthode statique TodoElement.strImport(string)
"""
return '{"name":"'+ str(self.name) +'", "desc": "'+str(self.description)+'", "state": ' + str(self.state) +'}'
@staticmethod
def fromJSON(json_str: str|dict) -> 'InterruptPayload':
"""
Parse a JSON string to create a TodoElement instance
Args:
json_str (str|dict): JSON string to parse, or JSON shaped dict
Returns:
TodoElement: instance created from JSON data
"""
data = json.loads(json_str) if type(json_str) is str else json_str
nom_ = data.get("name", "undefined")
desc_ = data.get("desc", "undefined")
state_ = data.get("state", TodoElement.STATE_NOT_STARTED)
return TodoElement(nom_, desc_, state_)
if __name__ == "__main__": if __name__ == "__main__":
test = TodoElement("TEST tâche", "OUI") test = TodoElement("TEST tâche", "OUI")
test.state = TodoElement.STATE_STARTED test.state = TodoElement.STATE_STARTED
print(test) print(test)
print([str(test)]) print([str(test)])
print(test.toJSON())
print(TodoElement.fromJSON(test.toJSON()))

View File

@@ -14,6 +14,7 @@ import json
from .tools import getTools, getWeeklyReportTools from .tools import getTools, getWeeklyReportTools
from .state import CustomState from .state import CustomState
from .InterruptPayload import InterruptPayload from .InterruptPayload import InterruptPayload
from .StateElements.TodoElement import TodoElement
# Variables principales # Variables principales
TAILLE_CONTEXTE_MAX = 20000 #charactères TAILLE_CONTEXTE_MAX = 20000 #charactères
@@ -74,7 +75,7 @@ def LLM_central(state: CustomState):
if "todo" in state.keys(): # S'il y a des TODO, je l'ajoute avant le prompt au LLM if "todo" in state.keys(): # S'il y a des TODO, je l'ajoute avant le prompt au LLM
if len(state['todo'])>0: if len(state['todo'])>0:
sysmsg = SystemMessage(f"Voici la liste des tâches en cours : {str([f"{i}: {str(todo)}\n" for i,todo in enumerate(state['todo'])])}") sysmsg = SystemMessage(f"Voici la liste des tâches en cours : {str([f"{i}: {str(TodoElement.fromJSON(todo))}\n" for i,todo in enumerate(state['todo'])])}")
print(sysmsg.content) print(sysmsg.content)
return {"messages": [model.invoke(state["messages"] + [AIMessage('.'), sysmsg])]} # AIMessage pour que Msitrail ne refuse pas la requête avec un 400 return {"messages": [model.invoke(state["messages"] + [AIMessage('.'), sysmsg])]} # AIMessage pour que Msitrail ne refuse pas la requête avec un 400

View File

@@ -1,11 +1,9 @@
from langgraph.graph import StateGraph, MessagesState from langgraph.graph import StateGraph, MessagesState
from typing import List from typing import List
from .StateElements.TodoElement import TodoElement
class CustomState(MessagesState): class CustomState(MessagesState):
todo: List[TodoElement] # Les tâches en cours todo: List[str] # Les tâches en cours, au format JSON
ragQuery: str # Requête envoyée au RAG, pour le cross-encodeur 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 ragDocuments: List[str] # Documents retrouvés par le RAG, pour le cross-encodeur

View File

@@ -76,6 +76,7 @@ def editTodo(index:int, todoState:int, state: Annotated[dict, InjectedState], to
# Erreur, l'index est trop grand # Erreur, l'index est trop grand
return Command(update={"messages": [ToolMessage(content="Index en dehors de la liste, echec!", tool_call_id=tool_call_id)]}) return Command(update={"messages": [ToolMessage(content="Index en dehors de la liste, echec!", tool_call_id=tool_call_id)]})
state["todo"] = [TodoElement.fromJSON(e) for e in state["todo"]] # Convertion vers de vraies instances
state["todo"][index].state = todoState # Modification de l'état de cette tâche state["todo"][index].state = todoState # Modification de l'état de cette tâche
# Toutes les tâches complétées ? # Toutes les tâches complétées ?
@@ -88,7 +89,7 @@ def editTodo(index:int, todoState:int, state: Annotated[dict, InjectedState], to
if not found: state["todo"] = [] # Toutes les tâches terminées, je peux clear la TODO list du state if not found: state["todo"] = [] # Toutes les tâches terminées, je peux clear la TODO list du state
return Command(update={ return Command(update={
"messages": [ToolMessage(content="Réussite!", tool_call_id=tool_call_id)], "messages": [ToolMessage(content="Réussite!", tool_call_id=tool_call_id)],
"todo": [x for x in state["todo"]] # Update du state, # medium.com/@o39joey/a-comprehensive-guide-to-langgraph-managing-agent-state-with-tools-ae932206c7d7 "todo": [x.toJSON() for x in state["todo"]] # Update du state, # medium.com/@o39joey/a-comprehensive-guide-to-langgraph-managing-agent-state-with-tools-ae932206c7d7
}) })
@tool @tool
@@ -102,10 +103,11 @@ def addTodo(name:str, description:str, state: Annotated[dict, InjectedState], to
""" """
if "todo" not in state.keys(): state["todo"] = [] if "todo" not in state.keys(): state["todo"] = []
state["todo"] = [TodoElement.fromJSON(e) for e in state["todo"]] # Convertion vers de vraies instances
state["todo"].append(TodoElement(name, description)) state["todo"].append(TodoElement(name, description))
return Command(update={ return Command(update={
"messages": [ToolMessage(content="Réussite!", tool_call_id=tool_call_id)], "messages": [ToolMessage(content="Réussite!", tool_call_id=tool_call_id)],
"todo": [x for x in state["todo"]] # Update du state, # medium.com/@o39joey/a-comprehensive-guide-to-langgraph-managing-agent-state-with-tools-ae932206c7d7 "todo": [x.toJSON() for x in state["todo"]] # Update du state, # medium.com/@o39joey/a-comprehensive-guide-to-langgraph-managing-agent-state-with-tools-ae932206c7d7
}) })
@tool @tool