DIRTY STATIC / DÉPÊCHE Tutoriels31 OCT. 2026 • 12 MIN DE LECTURE
Un grand moniteur montrant une fenêtre de navigateur entourée en jaune avertissement sur un bureau en béton dans une pièce sombre en béton, avec deux chaises en métal face à lui et des bandes de danger au sol.
TutorielsL'INTELLIGENCE POUR L'ÈRE DES MACHINES

Faire fonctionner un agent profond géré avec passation humaine

LangChain Managed Deep Agents v0.10 ajoute un navigateur hébergé que l'agent pilote lui même et une passation qui donne la fenêtre à une personne devant un mur de connexion. Ce tutoriel monte un agent Python, déclare le navigateur dans browser.py, règle la portée fil et utilisateur et parcourt la passation de la demande jusqu'au retour.

Commencer la lecture ↓

Un mot de passe collé dans un clavardage cesse d’être un mot de passe. Il atterrit dans les messages, dans les traces et dans chaque système qui les range. Managed Deep Agents prend l’autre voie. L’agent reçoit un navigateur hébergé dans son propre bac à sable LangSmith, pilote les pages avec quatre outils que la plateforme ajoute pour lui et passe la fenêtre à une personne quand un mur de connexion, un CAPTCHA ou une vérification à deux facteurs apparaît. La personne se connecte sur le site lui même. L’agent ne voit jamais l’identifiant secret.

L’usage du navigateur est arrivé dans Managed Deep Agents v0.10, mis en bêta publique le 29 octobre 2026. La documentation couvre deux travaux pour lui : travailler sur des sites sans API utilisable, comme un flux de réservation, et tester une application par sa propre interface après un changement de code. LangChain dit que ses outils de navigateur ont passé 90 pour cent de 100 tâches WebVoyager pour 1,98 $ au total. C’est une affirmation de l’entreprise tirée de ses propres tests, pas une promesse au sujet de vos sites. Ce tutoriel construit l’installation en Python et prouve la passation avec une tâche que vous choisissez.

Démo animée tirée de la documentation de LangChain montrant un agent qui passe un site de voyage à une personne pour la connexion et qui continue après le retour du contrôle

Ce que vous allez construire ou apprendre

Vous terminerez avec un Managed Deep Agent déployé qui peut naviguer, cliquer, remplir des formulaires et inspecter des pages tout seul. Vous saurez comment activer le navigateur avec un fichier, comment choisir qui partage une connexion et comment reprendre la fenêtre, vous connecter vous même et rendre le contrôle pour que l’agent reprenne là où il s’est arrêté.

Le navigateur n’est pas une fenêtre locale et rien ne fonctionne sur votre machine. Managed Deep Agents le fait fonctionner à distance, dans un bac à sable distinct du bac à sable de l’agent, et attache ses outils quand il trouve votre déclaration. Les captures d’écran appartiennent au même ensemble d’outils, et enregistrer un fichier de capture demande un bac à sable d’agent, alors que naviguer lui même n’en demande pas.

Avant de commencer

Choisissez un site à faibles enjeux pour le premier lancement. Utilisez un compte de test là où le site en offre un, et une tâche que vous pouvez vous permettre de répéter. Un agent navigateur peut cliquer le mauvais contrôle sur une page qu’il a mal lue, et une réservation ou un achat fait dans le mauvais fil reste une réservation ou un achat.

La portée est une décision de partage, alors prenez la avant de commencer. La portée fil garde une connexion dans une conversation. La portée utilisateur transporte une personne et ses connexions dans toutes les conversations de cette personne, ce qui est pratique et qui appartient à votre politique de données si d’autres personnes utiliseront l’agent.

Étape 1 : monter le projet

Action : créez le projet avec le CLI mda du paquet managed-deepagents, puis déplacez vous dans le nouveau dossier.

uvx --from managed-deepagents mda init browser-agent
cd browser-agent

Résultat attendu : le CLI crée l’échafaudage du projet pour un Managed Deep Agent en Python dans le dossier browser-agent. Chaque fichier ultérieur de ce tutoriel va dans ce projet, et la déclaration du navigateur à l’étape 3 va à sa racine.

Étape 2 : ajouter vos clés et régler les instructions

Action : ouvrez le fichier .env à la racine du projet et ajoutez votre clé de fournisseur de modèle et votre clé LangSmith comme espaces réservés ici, puis remplacez les par vos vraies valeurs sur votre propre machine seulement.

OPENAI_API_KEY=your-model-provider-key
LANGSMITH_API_KEY=your-langsmith-api-key

Le démarrage rapide utilise OpenAI par défaut. Pour Anthropic, Google ou Microsoft Foundry, réglez les valeurs de fournisseur correspondantes à la place. Votre clé LangSmith vient de Settings, puis API Keys, puis Create API Key dans LangSmith. Ne consignez pas le fichier .env dans le contrôle de version.

Ensuite, ouvrez instructions.md et dites à l’agent comment traiter un mur de connexion. Ajoutez une règle simple dans vos propres mots, dans ce sens :

When a site needs a login, a CAPTCHA, or two factor authentication, request a browser handoff and explain why you need it. Never ask me to paste a password or a code into chat.

Résultat attendu : le projet a les deux clés dans .env, et ses instructions nomment la passation comme la voie pour passer un mur de connexion. Quand vous déployez, Managed Deep Agents synchronise les instructions vers LangSmith Context Hub, où vous pouvez les mettre à jour sans redéploiement.

Étape 3 : déclarer le navigateur à la racine du projet

Action : créez un fichier nommé browser.py à la racine du projet, à côté de agent.py, avec ce contenu exact pour v0.10 :

from managed_deepagents import define_browser

browser = define_browser(scope="thread", idle_ttl_seconds=600)

Résultat attendu : le CLI découvre le fichier racine et Managed Deep Agents ajoute quatre outils à l’agent tout seul : browser_snapshot lit l’arbre d’accessibilité de la page et étiquette les éléments avec des identifiants, browser_run navigue et interagit par JavaScript ou par lots d’actions sur ces identifiants, browser_screenshot capture la page et browser_handoff donne à une personne le contrôle de la fenêtre. Ne mettez la déclaration nulle part ailleurs. La documentation est nette sur ce point : une déclaration dans un dossier browser/ ou sandbox/ n’active pas la prise en charge du navigateur.

Deux options font le vrai travail dans ce seul appel :

OptionPar défautCe qu’elle contrôle
scope"thread"Qui partage le navigateur et ses connexions
idle_ttl_seconds600Secondes sans activité avant que le navigateur s’arrête; la documentation accepte 60 à 86400

Choisissez la portée selon le travail, pas par habitude :

PortéeÉtat du navigateurUtilisez la pour
"thread"Un navigateur par conversation, partagé par les participants autorisés entre ses tours, sans témoins ni connexions d’autres filsTester un changement d’application dans une conversation, ou toute tâche où une connexion doit rester en place
"user"Un navigateur par personne authentifiée, avec une fenêtre séparée pour chaque fil et des témoins et des connexions partagés entre cette personne et ses filsRéutiliser une connexion de site entre conversations, pour que l’agent demande une connexion une seule fois

Pour utiliser la portée utilisateur, changez un mot dans le même fichier :

browser = define_browser(scope="user", idle_ttl_seconds=600)

Un état de connexion partagé n’est pas un isolement de compte. En portée utilisateur, une déconnexion ou un changement de compte dans un fil peut toucher cette personne et ses autres fils, alors coordonnez les réservations et les achats entre conversations. Terminer une exécution libère le client, pas la connexion; le délai d’inactivité arrête le navigateur plutôt que de le déconnecter, et un site peut encore expirer la session de son propre côté.

Étape 4 : lancer localement et envoyer une tâche de navigateur

Action : installez les dépendances du projet et démarrez l’agent dans LangSmith Studio.

uv sync
uv run mda dev

Résultat attendu : mda dev charge les clés depuis .env, démarre un serveur d’agent local et ouvre l’agent dans Studio. Envoyez maintenant une tâche qui a besoin du navigateur et qui heurtera une connexion exprès, avec votre propre site de test et votre compte de test :

Go to the site I name in this thread and complete the task I describe. If the site asks for a login, a CAPTCHA, or two factor authentication, hand the browser to me and explain why.

Résultat attendu : dans la trace Studio, l’agent appelle les outils de navigateur au lieu de deviner le contenu de la page. Il prend un instantané pour lire la structure de la page, exécute des actions sur les identifiants de l’instantané et s’arrête au mur de connexion plutôt que de taper autour. Prenez un instantané neuf après chaque navigation dans vos propres invites et tests, parce que les identifiants d’éléments deviennent périmés à mesure que les pages changent.

Étape 5 : prendre la passation et rendre la fenêtre

Action : quand l’agent a besoin de vous, il appelle browser_handoff(reason) et vous donne le contrôle de la fenêtre de navigateur de son fil. Travaillez la passation dans cet ordre :

  1. Lisez la raison sur la carte de passation. Dans Studio, la carte se lit The agent needs you in the browser et intègre le navigateur, avec une option pour l’ouvrir dans un nouvel onglet. Les canaux comme Slack affichent un lien vers le même navigateur distant, et un client personnalisé doit afficher l’artéfact de passation pour montrer l’une ou l’autre forme.
  2. Connectez vous dans cette fenêtre, sur le site lui même. Entrez les identifiants directement sur le site Web, pas dans le clavardage, et terminez chaque étape d’authentification que le site demande, y compris un CAPTCHA ou une vérification à deux facteurs.
  3. Cliquez sur Hand back dans la fenêtre du navigateur quand vous avez terminé.

Résultat attendu : l’agent reçoit un avis que le contrôle est revenu, inspecte la page actuelle pour vérifier si la connexion a fonctionné et continue la tâche dans le navigateur maintenant connecté. Pendant que vous tenez la fenêtre, l’agent et ses outils de navigateur ne peuvent pas agir dessus. L’appel de passation revient tout de suite, pour que l’agent puisse faire d’autre travail pendant qu’il attend. Le lien expire après 15 minutes; l’expiration termine la passation et ne prouve rien au sujet de la tâche elle même. Demander une nouvelle passation remplace l’ancien lien.

LangSmith Studio montrant la carte de passation du navigateur, ‘The agent needs you in the browser’, avec Hacker News ouvert dans le navigateur intégré et le contrôle Hand back

Étape 6 : déployer l’agent

Action : déployez le même projet vers LangSmith.

uv run mda deploy

Résultat attendu : Managed Deep Agents emballe le projet et le fait fonctionner comme un déploiement hébergé sur LangSmith Agent Server. Quand le déploiement se termine, le CLI affiche l’URL du tableau de bord du déploiement. Ouvrez la, confirmez que le déploiement montre un état prêt et envoyez la même tâche de navigateur de l’étape 4 dans l’agent hébergé. Gardez le fichier browser.py à la racine en place pour chaque déploiement. Il active la prise en charge du navigateur et installe les dépendances de navigateur du déploiement, et aucun réglage ultérieur ne peut ajouter un navigateur sans lui.

Une option au niveau de l’exécution vaut la peine d’être connue. Dans une fabrique de graphes, vous pouvez régler browser pour une seule exécution afin de choisir une portée ou un délai d’inactivité différent, et vous passez une définition de navigateur, pas une instance d’intergiciel. Pour éteindre le navigateur pour une exécution, passez browser=None en Python ou browser: null en TypeScript. Les définitions d’agent statiques gardent leur réglage de navigateur dans le fichier de déclaration de l’étape 3.

Vérification

Faites ces vérifications dans Studio et comptez l’installation comme fonctionnelle seulement quand les quatre passent.

Premièrement, la trace montre du vrai travail de navigateur. L’agent appelle browser_snapshot et browser_run pour la tâche, pas une simple récupération texte de la page. Deuxièmement, la passation se déclenche au bon moment. Devant le mur de connexion, une carte ou un lien apparaît avec une raison, et aucun mot de passe ni code de votre part n’apparaît nulle part dans le clavardage ou la trace. Troisièmement, la reprise fonctionne. Après Hand back, l’agent inspecte la page, signale l’état connecté qu’il trouve et termine la tâche dans le même fil. Quatrièmement, la portée correspond à votre choix. Démarrez un nouveau fil et demandez le même site : en portée fil, l’agent commence sans connexion et demande une passation neuve, et en portée utilisateur, la même personne et sa nouvelle fenêtre peuvent réutiliser la connexion.

Dépannage

ProblèmeCause probableCorrectif
Aucun outil de navigateur n’apparaît dans la tracebrowser.py se trouve dans le mauvais dossier, ou l’exportation nommée browser manqueDéplacez le fichier à la racine du projet, gardez l’exportation nommée de l’étape 3 et lancez uv run mda dev de nouveau
Le lien de passation a expiréLa fenêtre de 15 minutes est passée avant la fin de la connexionDemandez une nouvelle passation à l’agent; la nouvelle demande remplace l’ancien lien
L’agent ne reprend pas après Hand backUne approbation séparée dans la conversation attend encore, ou l’agent a manqué l’avisTerminez d’abord l’approbation en attente; si l’agent reste inactif, envoyez lui un nouveau message dans le même fil
Une connexion ne se transporte jamais dans une nouvelle conversationLe navigateur fonctionne en portée filChangez scope pour "user" dans browser.py quand la réutilisation entre fils est ce que vous voulez, et redéployez
Une connexion fuit entre des travaux que vous vouliez séparésLe navigateur fonctionne en portée utilisateur, alors les fils partagent témoins et connexionsRetournez à la portée "thread" pour le travail isolé, et traitez chaque fil comme sa propre session
Les actions échouent ou pointent le mauvais élémentLes identifiants d’instantané sont devenus périmés après le changement de la pagePrenez un nouveau browser_snapshot après la navigation et exécutez les actions sur les identifiants neufs
Une capture d’écran ne s’enregistre pas dans un fichierEnregistrer des fichiers de capture demande un bac à sable d’agent, alors que naviguer seul n’en demande pasGardez le bac à sable du projet en place, ou utilisez les captures dans la réponse sans chemin enregistré

Prochaines étapes

Pointez la même installation vers le test d’applications, le deuxième travail que la documentation nomme pour l’usage du navigateur. Une connexion privée peut relier les bacs à sable du navigateur et de l’agent, pour que l’agent puisse démarrer une application dans son propre bac à sable et la piloter par le navigateur sans URL publique pour l’application. Gardez la portée fil pour ce travail, pour que chaque conversation de test reçoive un navigateur isolé et un état de connexion propre.

Réglez les deux chiffres que vous possédez maintenant avant de partager l’agent. Relevez idle_ttl_seconds pour les longues tâches avec des étapes humaines lentes, et abaissez le pour les courtes tâches où un navigateur connecté qui persiste est un risque pur. Quand d’autres personnes commencent à utiliser l’agent, écrivez le choix de portée et son partage de connexion dans les notes que vous leur donnez, en mots simples, avant que la première passation les surprenne.

Étapes, commandes, règles de portée et comportement de passation vérifiés par rapport à la documentation LangChain pour l’usage du navigateur Managed Deep Agents et au démarrage rapide Python, octobre 2026. Cette procédure a été vérifiée par rapport à ces documents; elle n’a pas été exécutée de bout en bout contre un déploiement LangSmith réel dans ce passage, alors faites le premier passage avec un compte de test comme écrit.

Sources

  • Screenshots: LangChain
■

FIN DE LA TRANSMISSION

Restez curieux. Remettez tout en question.

CONTINUEZ LA DESCENTE

PLUS DE DIRTY STATIC ↘