[Amazon Bedrock] Inline Agentを使って爆速でエージェントを開発しよう！

こんにちは！
今回はBedrockのInline Agentについて、実際に利用する方法をソースコード交えて紹介していきたいと思います！

## Bedrock Inline Agentとは

端的に言うと、素早くBedrock Agentsを実装することができる仕組みです。

> [InvokeInlineAgent](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeInlineAgent.html) API を使用して、実行時にインライン Amazon Bedrock エージェントを動的に設定して呼び出すことができます。インラインエージェントを使用すると、エージェントを呼び出すと同時に、基盤モデル、命令、アクショングループ、ガードレール、ナレッジベースなどのエージェント機能を柔軟に指定できます。エージェント機能を使用する前に事前定義する必要はありません。

https://docs.aws.amazon.com/bedrock/latest/userguide/agents-create-inline.html

## Inline Agentを使いたいと思った背景

Bedrock Agentsを開発していると、Action GroupのLambdaの実装を弄る、エージェントのプロンプトを弄るを繰り返します。InlineではないBedrock AgentsだとLambdaの実装を変更するには、再度Lambdaをデプロイしなくてはいけないし、プロンプトを変更したらその度にビルドしなくてはいけません。これが地味に手間で、もう少しスピーディーにエージェントをこねくり回せないかと思っていました。

そこで見つけた機能がInline Agentでした。

自分のローカルでInline Agentを組み込んだプログラムさえ使えば、すぐにAction Groupの中身を変更したり、プロンプトを変更したり、FMモデルを変更したりすることができます。めちゃくちゃ快適になりました。

## Bedrock Inline Agentをもう少し詳しく

2025年05月現在、GAされていません。

>インラインエージェント機能の設定と呼び出しは、Amazon Bedrock のプレビューリリースであり、変更される可能性があります。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/agents-create-inline.html

マネージメントコンソールからは利用不可です。

Action GroupをLambdaで作る必要がありません。

ちなみに、Inline AgentからだとMCP対応できたりします。
https://aws.amazon.com/jp/blogs/machine-learning/harness-the-power-of-mcp-servers-with-amazon-bedrock-agents/
(aws-samplesで提供しているInlineAgent SDKがラップされることにより、MCPクライアント機能を具備しています)

## 試してみる

pythonでinline agentを呼び出してみます。

Inline Agentですが、どうやら現状は専用のSDKなどはなく、boto3から呼び出すしかできないようです。

実装に関しては[@moritalous](https://qiita.com/moritalous)さんの[こちらの記事](https://qiita.com/moritalous/items/5c12ca179fac7ca416c3)を大いに参考にさせていただきました！

(記事内のinvoke関数を個人で実装するのは骨が折れるので、この辺もSDKなどが出てきて簡単に実装できるようになると嬉しいですね)

ソースコードはGithubにて保存しています。
https://github.com/kskmats/bedrock-inline-agent-sample

エージェントの基底クラス(BaseAgent)をインライン呼び出しを用いるように実装します。
https://github.com/kskmats/bedrock-inline-agent-sample/blob/main/src/bedrock.py

アクショングループ用の簡単な関数も作成します。
https://github.com/kskmats/bedrock-inline-agent-sample/blob/main/src/utils.py

```python
from datetime import datetime

def get_current_date():
    """
    get current date

    Returns:
        str: current date
    """
    return datetime.now().strftime("%Y-%m-%d")
```

BaseAgentを継承してSampleAgentクラスを定義します。

```python
class SampleAgent(BaseAgent):
    """サンプルエージェント"""

    def __init__(self, foundation_model="anthropic.claude-3-sonnet-20240229-v1:0"):
        """
        SampleAgentのコンストラクタ

        Args:
            foundation_model: 使用する基盤モデル名
        """
        super().__init__(foundation_model)
        from utils import get_current_date
        self.action_groups = [get_current_date]

        self.instruction = """
        あなたは日常会話をするエージェントです。
        ユーザーからの入力に対して、適切な回答をしてください。

        本日の日付を取得する場合は、「get_current_date」を使用してください。
        """
```

あとはこのSampleAgentクラスを呼び出せるようにします。
https://github.com/kskmats/bedrock-inline-agent-sample/blob/main/src/call_sample_agent.py

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from bedrock import SampleAgent
def main():
    sample_agent = SampleAgent()
    print(sample_agent.invoke("本日の日付を教えてください！"))


if __name__ == "__main__":
    main()
```

ではこのcall_sample_agent.pyを実行してみます（dockerで実行するようにしています）。
※AWS Access Key / Secret Access Keyを.envに登録する必要があります。詳細は[README](https://github.com/kskmats/bedrock-inline-agent-sample/blob/main/README.md)をご参照ください。

```
❯ docker build -t python-sample .

❯ docker run python-sample call_sample_agent.py
本日の日付は2025年5月17日です。
```

（日付なんてアクショングループなくても取れると思うかもしれませんが、LLMは現在時刻を取得する手段をデフォルトだと持っていません。Bedrock Agentsを利用する場合はCode Interpreterを利用することが多いですが、今回はアクショングループとして現在時刻を取得する手段を設けました）

## 最後に

このようにBaseAgentクラスさえ用意してしまえば、スピーディーにエージェントを実装することができます！
ただまだInline AgentはGAしていないので、本番ワークロードで利用というよりは検証/開発という用途なのかなと思います。

ぜひお試しください！


## なんか出てきた。。

https://aws.amazon.com/jp/blogs/opensource/introducing-strands-agents-an-open-source-ai-agents-sdk

このブログを書き終わったあと、Strandsというエージェント構築SDKがAWSからリリースされました。。
まだちゃんと見てないですが、AIエージェント構築を簡単に実装できるようなSDKのようです。

「あれ、Inline Agentってお役御免になるの？」と心配してますが、ひとまずこのブログは公開します！
Strandsは今から調査します。。。