4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AgentCoreゲートウェイの「ツール検索ツール」機能を組み込んだStrands Agentsができた!

4
Posted at

AgentCoreゲートウェイには、オプションで「ツールを検索するツール」を追加することができます。

一見さんお断りな雰囲気を醸し出す機能ですが、

AgentCoreゲートウェイは複数のターゲット(MCPサーバーやLambdaなど)を束ねることができる
→束ねまくるとツールが山盛りになる
 →山盛りのツール定義をLLMに渡すとコンテキストを占拠しちゃう
  →山盛りのツールから必要なツールだけを検索できるようにしよう

という機能です。

この機能を、Strands Agentsと組み合わせてやってみました。

AgentCoreゲートウェイの作成

マネジメントコンソールから作成します。

まずはTavilyのAPIキーをアイデンティティにセットしてください。(キャプチャ忘れました、すいません。)

そのうえで、「ゲートウェイ」メニューから、「ゲートウェイを作成」をクリックします。

image.png

「ツール検索ツール」はデフォルトでは無効化されています。有効化するには「追加設定」を開き、「Enable semantic search」にチェックを入れます。

image.png

次画面で認証方式を選びます。今回は「IAM」を選びました。

ターゲットタイプは「統合」を選び、プロバイダーを閲覧ボタンからTavilyを選びます。事前に作成したアイデンティティのAPIキーを選びます。

ウィザードを進めてAgentCoreゲートウェイを作成します。ゲートウェイIDをコピーしておきましょう。

image.png

Strands Agentsを作成

それではStrands Agentsを作ります。

プロジェクトを作成し、ライブラリーを導入します。

uv init app --python 3.13
cd app
uv add strands-agents mcp-proxy-for-aws python-dotenv

環境依存の設定を.envに記載します。今回必要なのは機密情報ではないので堂々と.envを使います。

.envに機密情報を書いてはいけません。
.envをコーディングエージェントに渡さない方法を考えるのではありません。.envに機密情報を書かない方法を考えるのです。

話がそれました。必要な環境変数はこれらです。

.env
AWS_PROFILE=default
AWS_REGION=ap-northeast-1
MODEL_ID=jp.anthropic.claude-haiku-4-5-20251001-v1:0
GATEWAY_ID=gateway-quick-start-a17bf8-gfukq098dw

必要なライブラリーをインポートしつつ、環境変数を読み取ります。

AgentCoreゲートウェイの認証にIAMを使うので、そこをいい感じにしてくれる「MCP Proxy for AWS」を使ったMCPクライアントを生成します。

「ツール検索ツール」を作成します。「context=True」をセットすると、tool_contextパラメーターとしてエージェントのコンテキストが取得できます。

クエリーを使って、AgentCoreゲートウェイのツール検索ツール(x_amz_bedrock_agentcore_search)を呼び出します。

search_result["structuredContent"]の中身はこんな感じです。 複数見つかることもあります。

{
    "tools": [
        {
            "inputSchema": {
                ...
            },
            "name": "target-quick-start-d7b17d___TavilySearchExtract",
            "description": "ExtractwebpagecontentfromURLsusingTavilyExtract"
        },
        {
            "inputSchema": {
                ...
            },
            "name": "target-quick-start-d7b17d___TavilySearchPost",
            "description": "ExecuteasearchqueryusingTavilySearch"
        }
    ]
}

見つかったツール名から、ツールの情報を取得します。

そしてこのツールをエージェントのツールとして追加します。(ここの処理が必要なのでcontext=Trueにしたのです)

最後にツール実行結果を返却します。

これで「ツール検索ツール」ができました。あとはこのツールを付与したAgentを作って実行します。

ModelCallToolLogger()フックは、モデル呼び出し時点のツール情報を出力するフックとして、以下を追加してます。

class ModelCallToolLogger:
    def register_hooks(self, registry: HookRegistry) -> None:
        registry.add_callback(BeforeModelCallEvent, self.log_tools)

    def log_tools(self, event: BeforeModelCallEvent) -> None:
        tool_names = event.agent.tool_names
        print(f"tools: count={len(tool_names)} names={tool_names}")
実行結果
tools: count=1 names=['tool_search']
tools: count=3 names=['tool_search', 'target-quick-start-68c876___TavilySearchExtract', 'target-quick-start-68c876___TavilySearchPost']
tools: count=3 names=['tool_search', 'target-quick-start-68c876___TavilySearchExtract', 'target-quick-start-68c876___TavilySearchPost']
Bedrock AgentCore の最新情報をまとめました:
<略>

2回目のモデル呼び出し(多分ToolResultを送ってる)から、ツールが3つに増えてますね!

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?