agentic with langgraph
This commit is contained in:
94
agent.py
94
agent.py
@@ -1,49 +1,61 @@
|
||||
import asyncio
|
||||
import os
|
||||
from typing import Annotated
|
||||
from typing_extensions import TypedDict # Plus robuste pour le State
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from langgraph.graph import StateGraph, START, END
|
||||
from langgraph.graph.message import add_messages
|
||||
from langchain_google_vertexai import ChatVertexAI
|
||||
from langchain_google_genai import ChatGoogleGenerativeAI
|
||||
from langchain_mcp_adapters.client import MultiServerMCPClient
|
||||
from langgraph.prebuilt import create_react_agent
|
||||
from langchain_core.messages import HumanMessage
|
||||
|
||||
# Chargement de la clé API
|
||||
load_dotenv()
|
||||
|
||||
# 1. Configuration du modèle (Syntaxe actuelle)
|
||||
# Assure-hui que GOOGLE_APPLICATION_CREDENTIALS ou GOOGLE_CLOUD_PROJECT est dans ton .env
|
||||
llm = ChatVertexAI(
|
||||
model="gemini-1.5-flash",
|
||||
temperature=0,
|
||||
)
|
||||
async def lancer_agent():
|
||||
print("🤖 Initialisation de l'Agent Gemini...")
|
||||
llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash")
|
||||
|
||||
# 2. Définition de l'état
|
||||
# add_messages permet d'accumuler l'historique au lieu de l'écraser
|
||||
class State(TypedDict):
|
||||
messages: Annotated[list, add_messages]
|
||||
|
||||
# 3. Le nœud de l'agent
|
||||
def call_model(state: State):
|
||||
response = llm.invoke(state["messages"])
|
||||
# On retourne un dictionnaire qui sera mergé avec l'état actuel
|
||||
return {"messages": [response]}
|
||||
|
||||
# 4. Construction du graphe (Architecture actuelle)
|
||||
builder = StateGraph(State)
|
||||
|
||||
builder.add_node("agent", call_model)
|
||||
|
||||
builder.add_edge(START, "agent")
|
||||
builder.add_edge("agent", END)
|
||||
|
||||
# Compilation
|
||||
graph = builder.compile()
|
||||
|
||||
# 5. Exécution propre
|
||||
if __name__ == "__main__":
|
||||
initial_state = {"messages": [("user", "Salut, tu tournes sur quelle version de Gemini ?")]}
|
||||
print("🔌 Configuration de la connexion au serveur MCP local...")
|
||||
|
||||
# Utilisation de .stream() pour voir ce qui se passe
|
||||
for chunk in graph.stream(initial_state):
|
||||
for node, values in chunk.items():
|
||||
print(f"--- Node: {node} ---")
|
||||
print(values["messages"][-1].content)
|
||||
# NOUVELLE SYNTAXE : On passe la configuration directement dans le client
|
||||
client = MultiServerMCPClient({
|
||||
"serveur_taches": {
|
||||
"command": sys.executable, # 🌟 LA MODIFICATION EST ICI
|
||||
"args": ["serveur_mcp.py"],
|
||||
"transport": "stdio"
|
||||
}
|
||||
})
|
||||
|
||||
# On récupère les outils (attention, c'est maintenant une fonction asynchrone qui nécessite 'await')
|
||||
outils = await client.get_tools()
|
||||
print(f"✅ Outils détectés : {[outil.name for outil in outils]}")
|
||||
|
||||
# 🌟 Création de l'Agent LangGraph
|
||||
agent = create_react_agent(llm, tools=outils)
|
||||
|
||||
# --- LE TEST DE L'AGENT ---
|
||||
consigne = (
|
||||
"1. Ajoute la tâche 'Acheter du pain'. "
|
||||
"2. Ajoute la tâche 'Appeler le client'. "
|
||||
"3. Fais-moi un résumé de toutes mes tâches actuelles."
|
||||
)
|
||||
|
||||
print(f"\n🗣️ Consigne donnée à l'Agent : {consigne}\n")
|
||||
print("⏳ L'Agent réfléchit et travaille en autonomie (patientez un peu)...\n")
|
||||
|
||||
# On lance l'agent avec notre message
|
||||
resultat = await agent.ainvoke({
|
||||
"messages": [HumanMessage(content=consigne)]
|
||||
})
|
||||
|
||||
# On affiche uniquement la réponse finale de l'agent
|
||||
reponse_finale = resultat["messages"][-1].content
|
||||
print("✅ RÉPONSE FINALE DE L'AGENT :")
|
||||
print("-" * 40)
|
||||
print(reponse_finale)
|
||||
print("-" * 40)
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(lancer_agent())
|
||||
Reference in New Issue
Block a user