Intervention humaine pour LangGraph et LangChain
L’intervention humaine pour les agents LangGraph, avec réponse sur téléphone.
Votre nœud LangGraph interroge votre utilisateur sur son téléphone, puis attend ou se met en pause sur une interruption jusqu’à sa réponse.
Ce que propose LangGraph
interrupt() et le checkpointer
Avec un checkpointer et un identifiant de fil, interrupt() met le graphe en pause et rend le contrôle à votre code. Ensuite, Command(resume=...) fournit la réponse et réexécute le nœud interrompu. À vous de recueillir la réponse et de rendre les effets de bord sûrs en cas de double exécution.
def approval_node(state):
answer = interrupt({"question": "Approve the refund?"})
return {"approved": answer == "yes"}
# somewhere else, eventually:
graph.invoke(Command(resume="yes"), config)Le point de blocage
- interrupt() ne prévient personne. Le graphe est en pause et aucune notification n’est envoyée.
- Un composant doit appeler Command(resume=...). À vous de construire ce déclencheur et l’écran sur lequel la personne répond.
- MemorySaver perd la pause si le processus s’arrête. Toute attente réelle exige un checkpointer persistant.
- Le checkpoint indique que le graphe s’est arrêté. Il n’enregistre ni qui a décidé ni ce que cette personne a vu.
La solution
Pushary recueille la réponse de votre utilisateur.
interrupt() met le graphe en pause. Pushary envoie la question sur le téléphone de votre utilisateur, attend une approbation ou un refus, enregistre la réponse et la transmet à votre serveur par webhook signé. Votre code peut alors reprendre le bon fil.
connect() renvoie un lien que votre utilisateur ouvre une seule fois. Dans le nœud, ask_human envoie la question et attend la réponse, 55 secondes par défaut. Le nœud renvoie approved uniquement après un oui explicite : dirigez l’étape sensible vers cette branche.
pip install pushary-langgraphfrom pushary_langgraph import connect, ask_human
# Once per user: show them this link.
link = connect("user_123")
# Ask from inside a LangGraph node. No answer means no.
def approve_transfer(state):
d = ask_human("Approve this transfer?", external_id=state["user_id"], node="approval")
return {"approved": d["approved"]}- Configuration LangGraph : checkpoints, interruptions et reprise après approbation
- Répertorié dans les intégrations LangChain
Pour une longue attente, utilisez une interruption
Avec un callback_url, pushary_interrupt met le graphe en pause via interrupt() de LangGraph et rend la main immédiatement. Rien ne s’exécute pendant que votre utilisateur décide. Pushary transmet la réponse à votre serveur par webhook signé. Votre worker la vérifie et reprend le fil avec Command(resume=...).
from pushary_langgraph import pushary_interrupt
def review_order(state):
answer = pushary_interrupt(
f"Submit order {state['order_id']}, revision {state['revision']}?",
external_id=state["customer_id"],
idempotency_key=state["review_operation_id"],
type="confirm",
node="submit-order",
callback_url="https://your-app.example/pushary/callback",
)
return {"approved": answer == "yes"}Fonctionnement
De l’installation à la première réponse
Connectez votre utilisateur une seule fois. Exigez son approbation à l’étape sensible. Pushary envoie la question, attend la réponse et l’enregistre.
- 01
Installez l’adaptateur
Exécutez pip install pushary-langgraph pour Python, ou npm i @pushary/langgraph pour TypeScript. Placez votre clé API dans PUSHARY_API_KEY.
- 02
Connectez votre utilisateur une seule fois
connect() renvoie un lien. Votre utilisateur l’ouvre sur son téléphone avec l’application Pushary gratuite. Les questions oui/non affichent Approuver et Refuser sur l’écran verrouillé.
- 03
Posez la question dans le nœud avant l’étape sensible
Appelez ask_human pour une courte attente, ou pushary_interrupt avec une URL de rappel pour une attente longue. Ne dirigez l’exécution vers l’étape sensible qu’après un oui.
- 04
Agissez selon la réponse
Une approbation emprunte la branche sensible. Un refus, une expiration ou l’absence de réponse ne l’emprunte jamais. Un choix ou une réponse écrite fournit des données pour l’étape suivante, jamais une autorisation d’agir.
Une question peut demander un oui ou un non, un choix dans une liste ou une réponse écrite. Chaque réponse est enregistrée.
Avant la mise en production
Les pièges à éviter avec LangGraph
- À la reprise, le nœud entier est réexécuté
- C’est un piège fréquent. LangGraph réexécute le nœud depuis le début, pas depuis l’appel interrupt(). Tout effet de bord situé avant l’interruption se produit deux fois. Débitez une carte puis posez la question dans le même nœud : vous débitez deux fois. Rendez ce travail sûr en cas de répétition, ou déplacez-le dans son propre nœud.
- Deux interruptions dans un nœud sont associées par ordre
- Deux appels interrupt() dans le même nœud reçoivent leurs valeurs de reprise selon leur position, pas leur nom. Ajoutez une branche qui saute le premier : le second reçoit silencieusement la mauvaise réponse.
- Question bloquante et interruption impliquent des compromis différents
- ask_human maintient la requête ouverte et peut atteindre son délai limite. Une interruption exige un checkpointer persistant, un identifiant de fil enregistré et du code qui vérifie la réponse puis reprend le graphe. Une URL de rappel seule ne fournit rien de tout cela.
L’offre Partner
Votre agent interroge vos utilisateurs, pas seulement vous
Proposez votre agent à vos utilisateurs. Chacun approuve ses actions sensibles depuis son téléphone, sous votre marque.
Vos utilisateurs ne créent jamais de compte Pushary et ne nous paient rien.
Vos utilisateurs répondent sur leur propre téléphone
Connectez chaque utilisateur une seule fois avec un lien. Il installe l’application Pushary gratuite et répond depuis l’écran verrouillé, sans créer de compte.
Sans réponse, c’est non
Exécutez l’action uniquement après une approbation explicite. Une demande en attente, expirée ou annulée ne vaut jamais un oui. Pushary conserve chaque demande : votre code peut la reprendre après un redémarrage.
Joignez-les sur leur téléphone
L’application passe en premier, car elle seule affiche Approuver et Refuser sur l’écran verrouillé. Les notifications du navigateur viennent ensuite. Vous n’avez aucun système d’envoi à construire.
Chaque réponse est enregistrée
Chaque réponse est enregistrée avec son auteur et sa date. Vous pouvez effectuer des recherches et exporter les réponses. Avec une URL de rappel, chaque réponse est aussi envoyée à votre serveur par webhook signé.
FAQ
Les réponses à vos questions
Existe-t-il un package Pushary pour LangGraph ?
Faut-il utiliser ask_human ou pushary_interrupt ?
Que se passe-t-il si personne ne répond ?
Mes propres utilisateurs finaux peuvent-ils approuver sur leur téléphone ?
Cela fonctionne-t-il avec des agents LangChain classiques ?
Pourquoi mon interruption LangGraph ne fonctionne-t-elle pas ?
Laissez votre agent LangGraph demander avant d’agir.
Connectez un utilisateur une seule fois, posez une question en un appel et exécutez l’action uniquement après un oui. Chaque réponse est enregistrée.
Start freeOffre Partner, $99 par mois. Vos utilisateurs ne créent jamais de compte Pushary et ne nous paient rien.