Bedrockの開発体験をバク上げするツールを発見しました（画像多め）

ここにBedrockのConverse APIを呼び出すサンプルがあります。

https://docs.aws.amazon.com/code-library/latest/ug/bedrock-runtime_example_bedrock-runtime_Converse_AnthropicClaude_section.html

モデル名とメッセージをセットしてリクエストを送信しています。

```python
# Create a Bedrock Runtime client in the AWS Region you want to use.
client = boto3.client("bedrock-runtime", region_name="us-east-1")

# Set the model ID, e.g., Claude 3 Haiku.
model_id = "anthropic.claude-3-haiku-20240307-v1:0"

# Start a conversation with the user message.
user_message = "Describe the purpose of a 'hello world' program in one line."
conversation = [
    {
        "role": "user",
        "content": [{"text": user_message}],
    }
]

try:
    # Send the message to the model, using a basic inference configuration.
    response = client.converse(
        modelId=model_id,
        messages=conversation,
        inferenceConfig={"maxTokens": 512, "temperature": 0.5, "topP": 0.9},
    )

    # Extract and print the response text.
    response_text = response["output"]["message"]["content"][0]["text"]
    print(response_text)
```

サンプルはシンプルですので、コールドリーディングは難しくないと思います。

ただ、

**このコードを何も見ずに書けますか？？**

残念ながら私は無理です。毎回サンプルコードを検索して、コピペしながら作ってました。

この開発体験をどうにかできないかなぁと思っていたところ、良いツールを発見しましたのでご紹介します。

## boto3-stubs

boto3のコード補完を便利にする「boto3-stubs」というツールを使用します。

https://youtype.github.io/boto3_stubs_docs/

ドキュメントの冒頭には以下のように記載されています。型アノテーションを行うツールで、まさに私が求めていたものでした。

> Auto-generated documentation for boto3 type annotations package boto3-stubs.
> 
> Generated by mypy-boto3-builder.

:::note
Bedrock専用ではなく、boto3で提供されている様々なAWSサービスに対応しています。
:::

## 使い方の解説

### 導入

まずは専用の仮想環境を用意し、boto3とboto3-stubsをインストールします。

```shell:Shell
python3 -m venv .venv
source .venv/bin/activate

pip3 install boto3 boto3-stubs[bedrock-runtime]
```

boto3-stubsはサービスごとに分割されてインストールすることができます。BedrockやBedrockAgent、BedrockAgentRuntimeも別に用意されているのでこれらもインストールする場合は以下のようになります。

```shell:Shell
pip3 install boto3 boto3-stubs[bedrock,bedrock-runtime,bedrock-agent,bedrock-agent-runtime]
```

導入は以上です。

:::note
VSCode用の拡張もあるようです

https://marketplace.visualstudio.com/items?itemName=Boto3typed.boto3-ide
:::

### リクエストを構築

では、まず以下のように記述してみましょう。

```python
import boto3

client = boto3.client("bedrock-runtime")
```

この状態で`.client`の部分にマウスカーソルを合わせると形の定義が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/8e3bb8e2-0a30-25dd-a883-b28c90968e29.png)

:::note
もし、ライブラリーの検出がうまく行っていない場合は、Python拡張機能がインストールされているか確認してください。

そのうえでコマンドパレットに「pytthon: select interpreter」と入力し、ライブラリーを導入した環境を選択してください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5ff57c6d-78ff-b33d-b2b7-c54a8450b6e1.png)

:::

「client」変数にマウスカーソルを合わせると「BedrockRuntimeClient」という型が検出されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/538d84e0-cb5b-fc6a-2c91-4aa639e5808d.png)

「client.」まで記述し、補完（`Ctrl + スペース`）を入力すると、関数が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/94ae0396-30ee-d1da-0a67-5f582e217c34.png)

❗️❗️❗️

最高です。

試しにConverse APIを呼び出してみましょう。
パラメーターが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/12b97d73-e2a0-7fa7-ad7f-90cadc3ad3ad.png)

modelIdに指定するモデルIDは残念ながら補完されませんので、頑張って手入力します。

そして、「messages=」を補完を活用して入力し、マウスカーソルを「messages」の上に合わせると、パラメーターの型が「Sequence[MessageUnionTypeDef]」であることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/9272746d-5c03-08fb-c6b8-4de58807c97b.png)

Sequenceなので、「[]」とその中にオブジェクトを意味する「{}」を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/54f735b3-fc06-0c26-f36a-438f003112a7.png)

ここで補完（`Ctrl + スペース`）を入力すると、指定可能なオブジェクトのキーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/5671ddd3-0f41-b707-5f40-71de50ae9f1a.png)

❗️❗️❗️

神

キーだけではなく値も補完が効きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/14f4bfbb-ccf3-72fd-3a8a-6d1c1af061ff.png)

この調子で記述できるので、「サンプルコードを探してコピペ」をしなくてもリクエストを作成できます！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/db3a79eb-b57d-8ac9-2f64-2c1bfaa84c0f.png)

「content」のタイプも選ぶだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/87ccb2f7-12bb-2495-5b22-54903ad071ff.png)

テキストメッセージを指定するだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/80f12d51-30b6-4545-1c2c-bb8c2c33022c.png)

ドキュメントの場合、指定できるファイルタイプもわかっちゃいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/1173d011-7b53-f9ba-f0f5-7a9cad296595.png)

これは、便利！！

### レスポンスの値を取得

リクエストだけではなく、レスポンスも型が利用できます。

converse APIの呼び出し結果を受け取る「response」は「ConverseResponseTypeDef」という型が適用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/68d31e27-2143-b20d-1a87-342c3e97bd42.png)

キーが一覧でリストアップされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/938deee6-d367-20c4-614e-93cc7c2787df.png)

補完を頼りにtextを取得する事ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/fe0bda37-a04e-564c-4ca1-25729d5f287f.png)

ストリームレスポンスの場合も正しく型が認識されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/08e5121e-6960-c837-9171-f03d9e5b6418.png)

ストリームを処理する作法は少しわかっておく必要はありますが、forループの中でも型補完が行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/c236e286-5f3d-1aae-c298-f78f11431dee.png)

こちらも無事、textを取得することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/49c37e36-9893-161e-9a93-e7501f6e58ae.png)


## まとめ

これは必須ですね！Converse APIとの相性も抜群です！！

---

私が知らなかっただけで、すでにいろいろなところで紹介されていました。

https://blog.serverworks.co.jp/boto3-stubs

https://blog.cloud-partner.jp/python-aws-sdk-boto3-stubs-vscode-intellisense/

https://dev.classmethod.jp/articles/try-boto3-stubs/