Intervention humaine pour LangChain

L’intervention humaine pour les agents LangChain, sur téléphone.

Ajoutez un appel dans votre outil LangChain sensible : il attendra l’approbation de votre utilisateur sur son téléphone.

Ce que propose LangChain

Un middleware qui interrompt avant un outil

LangChain 1.0 gère les approbations dans un middleware. Vous listez les outils qui exigent une approbation ; l’agent interrompt avant ces appels avec une demande que votre code approuve, modifie ou rejette. Le mécanisme utilise interrupt de LangGraph.

natif
agent = create_agent(
    model=model,
    tools=[issue_refund],
    middleware=[
        HumanInTheLoopMiddleware(
            interrupt_on={"issue_refund": True},
        ),
    ],
    checkpointer=checkpointer,
)

Le point de blocage

  • Il exige un checkpointer : vous exécutez donc le moteur de graphe, que vous le souhaitiez ou non.
  • L’interruption arrive à votre code, pas à une personne. À vous de la transmettre à quelqu’un.
  • Rien n’est consigné. Aucun historique ne recense ce que le middleware a arrêté.

La solution

Pushary recueille la réponse de votre utilisateur.

Le middleware arrête l’outil et transmet une demande en attente à votre code. decisions.ask() envoie la question sur le téléphone de votre utilisateur, attend une approbation ou un refus et enregistre la réponse.

L’outil ask_human appelle decisions.ask(), qui envoie la question sur le téléphone de votre utilisateur et attend sa réponse jusqu’à 55 secondes. Il renvoie approved uniquement après un oui explicite. Utilisez pushary en Python ou @pushary/server en TypeScript ; aucun wrapper n’est à installer.

bash
pip install pushary
deux appels
import os
from langchain_core.tools import tool
from pushary import PusharyServer

px = PusharyServer(api_key=os.environ["PUSHARY_API_KEY"])

# Once per user: show them this link to connect their phone.
link = px.enroll("user_123")["universalLink"]

@tool
def ask_human(question: str) -> str:
    """Ask a real person to approve before acting."""
    d = px.decisions.ask(question=question, external_id="user_123", type="confirm")
    return "approved" if d["approved"] else f"not approved ({d['status']})"

# agent = create_agent(model, tools=[ask_human])

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.

  1. 01

    Installez le SDK

    Exécutez pip install pushary pour Python, ou npm i @pushary/server pour TypeScript. Placez votre clé API dans PUSHARY_API_KEY.

  2. 02

    Connectez votre utilisateur une seule fois

    Un appel SDK par utilisateur renvoie un lien de connexion. Votre utilisateur l’ouvre une fois sur son téléphone avec l’application Pushary gratuite. Sans compte ni paiement.

  3. 03

    Encapsulez decisions.ask dans un @tool

    Définissez un @tool dont le corps appelle px.decisions.ask(), puis ajoutez-le aux outils de votre agent. La docstring indique au modèle quand l’utiliser.

  4. 04

    Agissez selon la réponse

    L’outil renvoie approved uniquement après un oui explicite. Un non, une demande expirée ou l’absence de réponse signifie que l’agent n’effectue pas l’action.

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 LangChain

Un outil que le modèle peut ignorer ne bloque rien
ask_human est un outil que le modèle choisit d’appeler : il reste facultatif. Une consigne « demander d’abord » ne bloque pas un remboursement. Appelez decisions.ask() dans l’outil de remboursement lui-même, ou protégez-le avec interrupt_on du middleware.
Sans checkpointer, aucune interruption
Sans checkpointer, le middleware ne peut rien faire d’utile, car aucun état ne peut être conservé pour la pause. Les outils s’exécutent sans s’arrêter, comme si la configuration était ignorée.
La modification permet à une personne de réécrire les arguments
Approuver est simple. Modifier signifie qu’une personne change les arguments avant l’exécution de l’outil : c’est une entrée directe dans l’outil via du texte saisi. Vérifiez ces arguments comme vous vérifiez la sortie du modèle.
Les clés des noms d’outils sont des chaînes exactes
interrupt_on utilise le nom de l’outil comme clé. Renommez l’outil : le contrôle cesse silencieusement de s’appliquer, sans erreur ni avertissement. Écrivez un test qui vérifie que l’outil protégé interrompt réellement l’exécution.

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.

$99/ mois, tous les frameworks inclus
Start free

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

Ai-je besoin d’un package spécial pour LangChain ?
Non. Un outil LangChain est une fonction ordinaire : appeler decisions.ask() depuis pip install pushary, ou @pushary/server en TypeScript, suffit pour l’intégration. Si vous construisez aussi des graphes LangGraph, pushary-langgraph ajoute un ask_human prêt à l’emploi et une interruption qui suspend le graphe jusqu’à la réponse de votre utilisateur.
Cela fonctionne-t-il avec create_agent et les anciens moteurs d’agents ?
Oui. ask_human est un outil LangChain standard : il fonctionne partout où ces outils sont acceptés, notamment create_agent, les agents préconstruits LangGraph et les exécuteurs personnalisés. Son appel interne ne dépend pas du moteur.
Que se passe-t-il si personne ne répond ?
L’action ne s’exécute pas. decisions.ask() considère tout résultat autre qu’un oui explicite comme non approuvé. Pushary conserve la demande après la fin de l’attente : une réponse tardive reste enregistrée, un redémarrage ne la perd pas et votre code peut la lire plus tard.
Mes utilisateurs finaux peuvent-ils répondre à ma place ?
Oui. À chaque appel, passez votre propre identifiant pour la personne concernée. Chaque utilisateur connecte son téléphone une fois avec un lien et l’application Pushary gratuite, puis répond pour ses propres actions.
Existe-t-il une option TypeScript ?
Oui. Utilisez @pushary/server et appelez pushary.decisions.ask() dans un outil LangChain.js de la même façon. La structure de l’appel correspond au SDK Python. Pour LangGraph.js, @pushary/langgraph ajoute createAskHumanTool et pusharyInterrupt.
Comment cela se compare-t-il au middleware d’intervention humaine de LangChain ?
Utilisez les deux. Le middleware décide quels outils s’arrêtent, ce que LangChain fait bien, puis transmet la demande en attente à votre code. Pushary prend la suite : il joint votre utilisateur sur son téléphone, attend sa réponse, traite l’absence de réponse comme un non et conserve l’historique.

Laissez votre agent LangChain 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 free

Offre Partner, $99 par mois. Vos utilisateurs ne créent jamais de compte Pushary et ne nous paient rien.