LangChainは2026年10月29日にManaged Deep Agents v0.10を発表しました。このリリースの中心は、ブラウザ利用(browser use)と非同期サブエージェント(async subagents)の2つです。ブラウザ利用により、エージェントはAPIを持たず人間がクリックする前提で作られたWebサイトでも作業できます。非同期サブエージェントは長いタスクをバックグラウンドに移し、エージェントはユーザーとの会話を続けられます。
なぜブラウザが必要なのでしょうか。旅行の予約、サブスクリプションの解約、保険金請求などは、APIのないサイトで行われることがよくあります。エージェントは手順を推論できても、ページ上でクリックなどの操作ができません。curlでページを取得しても、JavaScriptがレンダリングする前のHTMLしか得られず、要素を操作できません。InstinctやMetaのMuseのようなパーソナルエージェントはWebサイトを閲覧して用途を広げており、DataDomeのエージェント型ブラウザリクエストは9月だけで4.7倍に増えました。コーディングエージェントも、アプリの変更が実際にレンダリングされ動作するか確認するためにブラウザを必要とします。
ブラウザを有効にするには、プロジェクトルートでブラウザを宣言します。
# browser.py
from managed_deepagents import define_browser
browser = define_browser(scope="thread", idle_ttl_seconds=600)Managed Deep AgentsはLangSmithの専用サンドボックスでブラウザを実行し、次のブラウザツールをエージェントに自動追加します。browser_snapshotはページのアクセシビリティツリーを読み取り要素IDを割り当てます。browser_runはJavaScriptまたはスナップショットIDに対する一連のアクションでナビゲートと操作を行います。browser_screenshotはページをキャプチャし、必要に応じてサンドボックスに保存します。browser_handoffは人間にウィンドウの制御を渡します。デフォルトでは会話ごとに独立したブラウザが割り当てられ、ターンをまたいで再利用されますが、他のスレッドのCookieやログイン情報は引き継ぎません。scope="user"を設定すると、サインインしたユーザーごとに1つのブラウザが割り当てられ、ログイン状態がすべての会話で維持されるため、エージェントは一度だけサインインを求めます。
多くのブラウザエージェントはログイン画面や二要素認証のプロンプトで停止します。browser_handoffは代わりにウィンドウをユーザーに渡すため、パスワードがモデルのメッセージやトレースに残りません。エージェントはbrowser_handoff(reason)を呼び、ユーザーが必要な理由を説明します。SlackやStudioなどのエージェントチャネルには、ユーザーがブラウザ制御をネイティブに引き継げるリンクが表示され、リモートブラウザを操作するリンクと「返却」ボタンが開きます。カスタムクライアントはハンドオフのアーティファクトを独自に描画できます。ユーザーがサインインして制御を返すと、エージェントはページを確認してログインが成功したか判断し、処理を続けます。ハンドオフはすぐに戻るため、エージェントは待機中に他の作業ができます。ハンドオフリンクは15分で失効します。
サブエージェントは、エージェントが独立したコンテキストウィンドウを持つヘルパーに集中タスクを委任する仕組みです。以前のManaged Deep Agentsではサブエージェントはインラインで実行され、エージェントは呼び出して回答を待つ必要がありました。これは素早い検索には適しており、現在もサポートされるパターンです。しかし同期型エージェントに支えられた長いタスクや、複数エージェントへのファンアウトが必要な場合、ユーザーも待たされ、オーケストレーターエージェントとの追加対話がブロックされます。v0.10ではサブエージェント定義にasyncを追加することで、オーケストレーターをブロックせずに非同期実行できます。
from managed_deepagents import define_deep_agent
agent = define_deep_agent(
name="research-assistant",
model="openai:gpt-5.5",
subagents=[
{
"name": "researcher",
"description": "Researches a topic in the background.",
"system_prompt": "Research the topic and report your findings.",
"async": True,
},
],
)エージェントは非同期サブエージェントを独自のスレッドで開始し、サブエージェントの実行中もユーザーとの会話を続けられます。オーケストレーターエージェントは一連の非同期タスクツールでこれらのタスクを開始、確認、更新、キャンセルします。提供される各エージェントには汎用サブエージェントのバックグラウンドコピーも付属するため、実行時に委任作業をフォアグラウンドで行うかバックグラウンドで行うかを選択できます。
非同期サブエージェントは自らエージェントに通知するため、エージェントがポーリングループで待機することはありません。サブエージェント完了時の動作はエージェントの状態によって異なります。ビジー状態の場合、エージェントは各モデル呼び出しの前に未完了タスクを確認するため、結果は実行の途中で届きます。アイドル状態の場合、サブエージェントが新しい実行を起こしてエージェントを再開させます。承認待ちで一時停止している場合、承認はそのままにされ、ユーザーが回答した後に結果が届きます。非同期サブエージェントはエージェントのサンドボックスを共有するため、エージェントが書き込んだファイルを引き継げます。その実行はLangSmithでエージェントの実行の下に表示されます。Slackでは承認が元のスレッドに投稿され、そこで回答するとサブエージェントが再開します。
v0.10のその他の変更には次が含まれます。runtime.threadにより、各スレッドは開始場所(Slackスレッドなど)と参加者の記録を持つようになり、ツールは任意の実行でruntime.threadを読めます。これによりStudioの再開、スケジュール実行、非同期サブエージェントの起床実行がすべて元のSlackスレッドに返信できます。SlackスレッドにはネイティブのStopボタンが追加され、そのスレッドの実行をキャンセルできます。StudioもSlackスレッド上の実行をキャンセルできます。Slackチャネルハンドラ(実験的)では、onEventがメンション、ダイレクトメッセージ、その他のメッセージ、ボタンクリックなど各Slackイベントが何を開始するかを決定します。statusは実行中にSlackが表示する内容を設定し、reply: "none"は返信をエージェントに任せます。Bring your own Slack appでは、mda deployが新しいSlackチャネルで使用するアプリを尋ねます。LangSmithが作成・管理するアプリ、マニフェストから新しいアプリを作成、既存のアプリから選択できます。resolveUserは、Slackなどのチャネルでユーザーがエージェントにメッセージを送ると送信者を検証し、ユーザー自身のシステムの対応するユーザーにマッピングします。これによりツールはその人のアカウントと権限を参照できます。関数として書くか、呼び出すエンドポイントを指定し、identity宣言に設定してすべてのチャネルをカバーするか、単一チャネルに設定します。
破壊的変更として、connectors.mcp()とconnectors/レイアウトが削除されました。MCPサーバーはtools/mcp.tsまたはtools/mcp.pyで宣言する必要があります。サンドボックスのscopeオプションも削除されました。LANGSMITH_*変数については、シェル環境変数がプロジェクトの.envより優先されるようになりました。
Managed Deep Agents v0.10は本日パブリックベータで利用可能です。ドキュメントから始めるか、新しいプロジェクトを作成してください。
uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deployv0.9ではエージェント作成のスケジュール、実行ごとの設定、Slackリアクションが追加されました。