Produit Minimal Viable #1

Merged
Kevin merged 6 commits from Definition_Agent into master 2026-02-06 17:52:52 +01:00
6 changed files with 314 additions and 23 deletions
Showing only changes of commit 14b8664106 - Show all commits

View File

@@ -14,21 +14,18 @@ llm = ChatMistralAI( # LLM sans outils
) )
# NODES # NODES
def reponse_question(state: MessagesState): def call_to_LLM(state: MessagesState):
"""Noeud qui réponds à la question, en s'aidant si besoin des outils à disposition""" """Noeud qui s'occupe de gérer les appels au LLM"""
# Initialisation du LLM # Initialisation du LLM
model = llm.bind_tools(getTools()) model = llm.bind_tools(getTools())
# Appel du LLM # Appel du LLM
return {"messages": [model.invoke(state["messages"])]} return {"messages": [model.invoke(state["messages"])]}
tool_node = ToolNode(tools=getTools()) # Node gérant les outils # fonction de routage : Après reponse_question, si le LLM veut appeler un outil, on va au tool_node
# fonction de routage : Après reponse_question, si le LLM veut appeler un outil, on va au tool_node, sinon on termine
def should_continue(state: MessagesState): def should_continue(state: MessagesState):
""" """
Use in the conditional_edge to route to the ToolNode if the last message Vérifier s'il y a un appel aux outils dans le dernier message
has tool calls. Otherwise, route to the end.
""" """
if isinstance(state, list): if isinstance(state, list):
ai_message = state[-1] ai_message = state[-1]
@@ -39,4 +36,46 @@ def should_continue(state: MessagesState):
if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0: if hasattr(ai_message, "tool_calls") and len(ai_message.tool_calls) > 0:
return "tools" return "tools"
return END return "no_tools"
def task_ended(state: MessagesState):
"""
Vérifier si l'agent a terminé son cycle, ou s'il faut le relancer
"""
if isinstance(state, list):
ai_message = state[-1]
elif messages := state.get("messages", []):
ai_message = messages[-1]
else:
raise ValueError(f"No messages found in input state to tool_edge: {state}")
if "terminé" in ai_message.content.lower():
return END
return "continue"
class BasicToolNode: # De mon ancien projet, https://github.com/LJ5O/Assistant/blob/main/modules/Brain/src/LLM/graph/nodes/BasicToolNode.py
"""A node that runs the tools requested in the last AIMessage."""
def __init__(self, tools: list) -> None:
self.tools_by_name = {tool.name: tool for tool in tools}
def __call__(self, inputs: dict):
if messages := inputs.get("messages", []):
message = messages[-1]
else:
raise ValueError("No message found in input")
outputs = []
for tool_call in message.tool_calls:
#print(tool_call["args"])
tool_result = self.tools_by_name[tool_call["name"]].invoke(
tool_call["args"]
)
outputs.append(
ToolMessage(
content=json.dumps(tool_result),
name=tool_call["name"],
tool_call_id=tool_call["id"],
)
)
return {"messages": outputs}

View File

@@ -13,8 +13,9 @@
## Mise en place de l'agent ## Mise en place de l'agent
- [X] Préparation du `State` - [X] Préparation du `State`
- [X] Développement des outils de l'agent - [X] Développement des outils de l'agent
- [ ] Préparation des nœuds - [X] Préparation des nœuds
- [ ] Branchement des nœuds entre-eux - [ ] Branchement des nœuds entre-eux
- [ ] Human in the loop
## Amélioration de l'agent ## Amélioration de l'agent
- [ ] Cross-encoding sur la sortie du **RAG** - [ ] Cross-encoding sur la sortie du **RAG**