Guide · IA & agents

Système multi-agents avec LangGraph

Installer LangGraph, choisir un motif officiel et envelopper des sous-agents en outils. Supervisor n’est plus maintenu. Non rejoué le 2026-10-18.

Un système multi-agents, dans la doc LangChain relue le 2026-10-18, n’est pas un graphe obligatoire. La page Multi-agent dit d’abord qu’un seul agent, avec les bons outils, suffit souvent. Elle range ensuite cinq motifs : sous-agents, handoffs, skills, routeur, workflow sur mesure avec LangGraph.

Le paquet langgraph-supervisor n’est plus maintenu, d’après la page de migration relue le même jour. Le remplacement indiqué est le motif sous-agents : un agent principal appelle des spécialistes comme des outils. Les commandes de cette page n’ont pas été rejouées le 2026-10-18. Aucun graphe n’a été compilé ici, et aucune sortie de modèle n’est collée.

Ce que la doc vous fait choisir

La page Multi-agent associe les sous-agents au développement séparé et à l’exécution en parallèle. Les handoffs servent quand un spécialiste doit parler directement à l’utilisateur. Le routeur classe une entrée puis synthétise. Les skills chargent un prompt à la demande, sans changer d’agent. Le workflow sur mesure est un StateGraph quand une étape doit rester du code fixe.

Pour une demande en un coup, la même page compte 4 appels de modèle avec les sous-agents, et 3 avec handoffs, skills ou routeur. L’exemple écrit est « Buy coffee ». Ce sont des comptes de la page, pas une facture, et pas une mesure faite ici.

Le quickstart LangGraph, lui, construit un agent calculatrice à un seul modèle. Ce n’est pas un système multi-agents. Il reste utile pour voir StateGraph, START, END et compile. Ne le présentez pas comme le tutoriel superviseur.

Prérequis

La page d’installation demande :

pip install -U langgraph
pip install -U langchain

Le commentaire sur la ligne LangChain dit Python 3.10 ou plus. uv add langgraph et uv add langchain sont l’autre onglet de la même page. Les paquets de fournisseur s’installent à part. La page renvoie vers les intégrations. Elle ne nomme pas, dans l’extrait relu, le paquet qui correspond à google_genai: ou à gpt-5.5. Ne l’inventez pas : copiez la commande de la fiche du modèle que vous allez vraiment appeler.

Le quickstart calculatrice demande une clé Anthropic dans ANTHROPIC_API_KEY, parce que son exemple appelle Claude. Le snippet sous-agents plus bas nomme un modèle Google. Ce n’est pas la même variable. Ne posez pas la clé Anthropic « pour que l’exemple multi-agents passe ».

Résultat attendu : pip se termine sans erreur. Les versions sont celles résolues ce jour-là, pas un numéro écrit dans cet article. Les commandes n’ont pas été rejouées le 2026-10-18.

1. Lire le motif avant le code

Sous-agents, page dédiée : le principal décide qui appeler, quoi lui passer, et comment combiner. Par défaut, le sous-agent ne se souvient pas des tours précédents. La mémoire de conversation reste chez le principal. Le sous-agent ne parle pas à l’utilisateur, sauf si vous ajoutez un interrupt, ce que la page distingue du cas de base.

La même page oppose ce superviseur à un routeur. Le superviseur garde le fil et rappelle des sous-agents sur plusieurs tours. Le routeur est en général une classification, sans conversation continue.

Si les spécialistes doivent enchaîner avec la personne, la page dit de prendre les handoffs, pas ce motif. Le guide OpenAI sur les handoffs n’est pas cette doc : les noms se ressemblent, les imports non.

2. Envelopper un sous-agent, comme la page

L’implémentation de base, recopiée depuis la page Subagents. Les crochets tools=[...] sont dans la doc. Ce bloc n’est donc pas un fichier exécutable tel quel. Le modèle écrit est google_genai:gemini-3.6-flash. Un autre exemple, plus bas sur la même page, écrit gpt-5.5. Ne substituez pas l’un à l’autre pour « moderniser » le premier snippet.

from langchain.tools import tool
from langchain.agents import create_agent

subagent = create_agent(model="google_genai:gemini-3.6-flash", tools=[...])

@tool("research", description="Research a topic and return findings")
def call_research_agent(query: str):
    result = subagent.invoke({"messages": [{"role": "user", "content": query}]})
    return result["messages"][-1].content

main_agent = create_agent(model="google_genai:gemini-3.6-flash", tools=[call_research_agent])

La page dit que le principal ne voit que le texte final, sauf si vous reformatez la sortie. Un échec décrit : le sous-agent fait des appels d’outils et oublie de mettre le résultat dans son dernier message. Le superviseur ne voit alors pas le travail.

Résultat attendu : la page ne montre pas de transcript pour ce snippet. N’en publiez pas un. Les commandes n’ont pas été rejouées le 2026-10-18.

Erreur fréquente : donner au principal les outils du spécialiste en plus de l’outil research. La page sur l’assistant personnel dit l’inverse : le superviseur doit voir schedule_event, pas create_calendar_event.

3. Ne pas installer langgraph-supervisor pour un nouveau système

La page de migration, relue le 2026-10-18, dit que langgraph-supervisor n’est plus maintenu activement. Elle montre l’ancien create_supervisor avec create_react_agent, puis le remplacement : create_agent, un @tool par travailleur, InMemorySaver seulement sur le superviseur.

Deux règles de cette page, si vous utilisez interrupt dans un outil de sous-agent :

  1. Le checkpointer se compile sur le graphe extérieur. Les sous-agents ne reçoivent pas checkpointer=..., pour hériter de celui du parent.
  2. L’appel invoke extérieur passe un thread_id dans configurable.

La reprise documentée est Command(resume=result) avec le même config. Nous ne l’avons pas exécutée.

Si vous avez déjà un dépôt sur create_supervisor, suivez cette page de migration plutôt que ce résumé. Les noms output_mode (full_history, last_message) se règlent désormais dans le wrapper d’outil, pas dans un argument du superviseur.

4. Garder LangGraph pour le workflow fixe

La page de migration envoie vers un StateGraph quand il faut mélanger des pas déterministes et des agents : routage fixe, validation, appel d’API, nœud create_agent. Le quickstart calculatrice montre la forme, avec un seul agent :

  • des outils @tool (add, multiply, divide) ;
  • un état MessagesState dont les messages s’ajoutent via operator.add ;
  • un nœud modèle, un nœud outil, une arête conditionnelle should_continue ;
  • StateGraph, puis compile, obligatoire avant l’usage.

Le texte du quickstart dit utiliser Claude Sonnet 4.5. Le code de la même page, relu le 2026-10-18, passe claude-sonnet-4-6 à init_chat_model. Ne corrigez pas l’un avec l’autre. Copiez le bloc de la page le jour où vous le lancez, ou la fiche du fournisseur.

L’invocation documentée est agent.invoke avec un HumanMessage dont le contenu est Add 3 and 4., puis pretty_print sur chaque message. La page ne colle pas la sortie. 3 + 4 = 7 est l’arithmétique de l’outil add, pas une preuve que le modèle l’a appelé. Cette page n’a pas lancé l’invoke.

L’affichage draw_mermaid_png dépend d’IPython, dans le quickstart. Si vous n’êtes pas dans un notebook, ce n’est pas l’étape qui valide le graphe. compile puis un invoke dans un script ordinaire est le chemin décrit juste au-dessus de cet affichage.

Assistant de code et MCP

Le quickstart LangGraph propose d’installer les serveurs MCP de la doc LangChain si vous utilisez un assistant de code. Ce n’est pas le graphe multi-agents. Pour le protocole : MCP, c’est quoi ?. Pour un serveur minimal en TypeScript : créer un serveur MCP. Claude Code et Cursor aident à choisir un éditeur. Ils ne choisissent pas entre sous-agents et handoffs.

Sources et limites

Les commandes n’ont pas été rejouées le 2026-10-18. Les identifiants de modèle sont ceux imprimés sur les pages ce jour-là. S’ils ont bougé, le snippet de cet article est périmé : relisez la page, ne le « mettez pas à jour » de mémoire.