From 60df5d8d9ed5373267dafb16a08a8d833a1a947c Mon Sep 17 00:00:00 2001 From: vincent Date: Sun, 12 Apr 2026 20:54:41 +0000 Subject: [PATCH] agentic worflow --- multi_agent.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 multi_agent.py diff --git a/multi_agent.py b/multi_agent.py new file mode 100644 index 0000000..1fefaac --- /dev/null +++ b/multi_agent.py @@ -0,0 +1,73 @@ +import os +from dotenv import load_dotenv + +import sys +import asyncio +from typing import Annotated, Literal, TypedDict +from langchain_google_genai import ChatGoogleGenerativeAI +from langgraph.graph import StateGraph, END, START +from langchain_core.messages import HumanMessage, SystemMessage, BaseMessage +from langgraph.prebuilt import create_react_agent + +load_dotenv() + + +# 1. Définition de l'état du graphe (ce que les agents se partagent) +class AgentState(TypedDict): + messages: Annotated[list[BaseMessage], "L'historique des échanges"] + +# 2. Création des Spécialistes +llm = ChatGoogleGenerativeAI(model="gemini-2.5-flash") + +# Agent Verlant +agent_verlant = create_react_agent( + llm, tools=[], + prompt="Tu es un expert en verlan. Ta seule mission est de traduire les textes qu'on te donne en verlan (ex: bizarre -> zarbi). Sois bref." +) + +# Agent Argo +agent_argo = create_react_agent( + llm, tools=[], + prompt="Tu es un expert en argot parisien. Traduis les textes en utilisant un langage très fleuri et argotique. Sois bref." +) + +# 3. Logique du Coordinateur (Le Routeur) +def routeur_coordinateur(state: AgentState) -> Literal["agent_verlant", "agent_argo", "__end__"]: + dernier_message = state["messages"][-1].content.lower() + + if "verlan" in dernier_message: + return "agent_verlant" + elif "argo" in dernier_message or "argot" in dernier_message: + return "agent_argo" + else: + return "__end__" # Il répond directement s'il ne comprend pas la consigne + +# 4. Construction du Graphe +workflow = StateGraph(AgentState) + +# Ajout des nœuds +#workflow.add_node("agent_verlant", lambda state: agent_verlant.ainvoke(state)) +#workflow.add_node("agent_argo", lambda state: agent_argo.ainvoke(state)) + +# ✅ LangGraph va automatiquement comprendre qu'il doit faire un "await" sur ces agents +workflow.add_node("agent_verlant", agent_verlant) +workflow.add_node("agent_argo", agent_argo) + +# Logique de départ +workflow.add_conditional_edges(START, routeur_coordinateur) + +# Une fois qu'un spécialiste a répondu, on va vers la fin +workflow.add_edge("agent_verlant", END) +workflow.add_edge("agent_argo", END) + +# Compilation +app = workflow.compile() + +# --- TEST --- +async def main(): + consigne = "Dis moi que cette fête est folle en verlan" + async for event in app.astream({"messages": [HumanMessage(content=consigne)]}): + print(event) + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file