LangChain Blog更新日

Managed Deep Agents v0.9: スケジュール実行、実行ごとの設定、Slackリアクション

重要なポイント エージェントが作成したスケジュール: エージェントは会話の中からリマインダーや繰り返しタスクを設定できます。 実行ごとの設定: 1つのデプロイメントが実行ごとにモデル、スキル、ツールを選択できます。 Slackのリアクション: エージェントは返信する前にメッセージを確認応答します。 本日、Managed Deep Agents v0.9をリリースします。新しい機能により、エージェン

画像の出典 · LangChain Blog

重要なポイント

  • エージェントが作成したスケジュール: エージェントは会話の中からリマインダーや繰り返しタスクを設定できます。
  • 実行ごとの設定: 1つのデプロイメントが実行ごとにモデル、スキル、ツールを選択できます。
  • Slackのリアクション: エージェントは返信する前にメッセージを確認応答します。

本日、Managed Deep Agents v0.9をリリースします。新しい機能により、エージェントが自身のフォローアップをスケジュールしたり、実行のたびに自分を再構成したり、Slackのメッセージに反応したりできるようになりました。

これらのアップデートにより、Slackや自社のチャネルに常駐し、まるでチームメイトのように働く社内エージェントの構築がより簡単になります。

エージェントに自分自身の作業をスケジュールさせる

ザ 新しい Schedules SDK エージェントが会話の途中でリマインダー、フォローアップ、繰り返しタスクを作成できるようにし、「これについて明日リマインドして」のようなリクエストに対応できるようになります。

エージェントが会話の中でスケジュールを自ら作成し、そのスケジュールは依頼した人物の権限セットと接続を使ってその人物として実行され、結果は同じチャンネルに返されます。

実行内からスケジュールを作成します:

await schedules.create(owner={"type": "user"}, cron="0 9 * * 1-5", timezone="America/Los_Angeles", prompt="Write the daily digest.")

ツールのバックエンドとして使うと最も有用で、エージェントのユーザーはチャットするだけでスケジュールの作成、一覧表示、更新、削除ができるようになります。以下はリマインダーツールの例です:

from langchain.tools import tool
from managed_deepagents import schedules

@tool
async def remind_me(prompt: str, cron: str, timezone: str = "UTC") -> str:
    """Run a prompt for the current user on a cron schedule."""
    item = await schedules.create(
        owner={"type": "user"},
        cron=cron,
        timezone=timezone,
        prompt=prompt,
    )
    return f"Created schedule {item['id']}."

エージェントはプロンプトとcron式を渡し、cronが発火するたびにLangSmithがそのプロンプトで新しいランを開始します。スケジュールは作成されたチャネルを引き継ぐため、結果はリクエスト元に投稿されます。Slackで依頼された平日のリマインダーは、実行のたびにその会話に新しいメッセージを投稿します。一回限りのスケジュール(at の代わりに cron") オリジナルのスレッドに返信します。これは「1時間後にこのデプロイを確認する」のようなフォローアップに適しています。")

実行ごとにエージェントを設定する

エージェントを動的に構成できるようになりました 実行あたり. エージェントを呼び出し可能な関数としてセットアップします。この関数はを受け取り、 ランタイム 各実行の開始時に処理を行い、 define_deep_agent definition、モデルの選択、instructions、skills、MCP servers、およびその実行用のサンドボックス。

各チームやリポジトリのためにほぼ同一のエージェントのコピーを維持する代わりに、1つのデプロイメントを実行します。これにより、デプロイメントはより柔軟に動作できるようになり、単一のエージェントデプロイメントが、リクエストの発生源であるチャネルやユーザーなどのコンテキストに基づいて、異なるチームやユースケース向けにカスタマイズされることが可能になります。

1つの社内Slackエージェントが複数のチームに対応しているとします。エージェント関数は、その実行がどのチャンネルから来たのかを確認し、財務チーム向けには課金スキルを、プラットフォームチーム向けにはインシデント対応のMCPサーバーを読み込むことができます。これは、いつスキルを使うかをモデルに指示する場合とは異なります。設定はモデルが実行される前に行われるため、エージェントは設定外のスキルやMCPツールを一切見ることがありません。これによりコンテキストが小さく保たれ、アクセス制御も兼ね、モデル自体を選ぶこともできます。これはモデル自身にはできません。

一般的に、これはエージェントにどのツール群を利用可能にすべきかが正確に分かっている場合に、モデルにツールキットの選択を任せることで生じる非決定的な出力を防ぎます。

同じ考え方は、リポジトリごとに異なるスキルと、より安価な、あるいはより高性能なモデルを読み込むコーディングエージェントにも応用できます:

# agent.py: one coding agent, configured per repo at the start of each run
from dataclasses import dataclass

from managed_deepagents import ManagedServerRuntime, define_deep_agent

REPOS = {
    "payments-service": {
        "model": "openai:gpt-5",
        "instructions": "Python service. Run pytest before opening a PR.",
        "skills": ["./skills/python-service"],
    },
    "storefront": {
        "model": "openai:gpt-5-mini",
        "instructions": "Next.js app. Run web tests and an a11y check before opening a PR.",
        "skills": ["./skills/typescript-web"],
    },
}


@dataclass
class AppContext:
    repository: str = ""


def agent(runtime: ManagedServerRuntime[AppContext]):
    execution = runtime.execution_runtime
    context = execution.context if execution is not None else None
    repo = context.repository if context is not None else None
    config = REPOS.get(repo, REPOS["storefront"])
    return define_deep_agent(name="open-swe", context_schema=AppContext, **config)

‍‍

この関数は読み取りを行い、 runtime.execution_runtime.context チャネル実行時や Agent Server がエージェントを読み込んでスキーマを取得する際のように該当するものがない場合には、デフォルトにフォールバックします。呼び出し元は実行の context:

# Same deployment, different repo: just change the run context
await client.runs.create(
    thread_id,
    "open-swe",
    input={"messages": [{"role": "user", "content": "Fix the flaky refund test."}]},
    context={"repository": "payments-service"},
)

Slack メッセージに反応する

Slack のリアクション は、エージェントがメッセージを受け取ったことを送信者にすぐに示すことができ、返信までに推論やツール呼び出しに時間がかかっている間も有効です。リアクションはデフォルトで有効(👀)であり、Slack チャネルの新しい reactions オプションで、オフにしたり、別の絵文字を選んだり、メッセージごとに 1 つ選んだりできます。次の例では、壊れたものに言及するメッセージには 🐛 を、それ以外には 👀 を使用します:

from managed_deepagents import channels

async def choose_emoji(context: dict) -> str:
    return "bug" if "broken" in context["text"].lower() else "eyes"

channel = channels.slack(name="Support Bot", reactions=choose_emoji)

リアクションはシンプルなもので構いません。ただし、モデルを呼び出してより的確な絵文字を選ばせる関数でリアクション応答を設定することも可能です。Jev のような決定モデルを使えば、それを高速かつ低コストに保てます。詳しくは Slack チャネルのドキュメント に完全な例が記載されています。

はじめに

Managed Deep Agents v0.9 が本日、Public Beta として利用可能になりました。詳細は Managed Deep Agents のドキュメントをご覧いただくか、次のコマンドで始められます:

uvx --from managed-deepagents mda init my-agent
cd my-agent
uv run mda deploy

‍ICYMI: v0.8 ではユーザーごとのメモリ、任意のサービスから実行をトリガーできるカスタム HTTP チャネル、Parallel による内蔵ウェブ検索などが追加されました。 v0.8 の投稿を読む.

‍

原文の出典

LangChain Blog

内容について

原文の公開と権利は出典元に帰属します。

機械翻訳 · 原文をご参照ください