タイトルの答え:apac.anthropic.claude-sonnet-4-20250514-v1:0(2026.03.01時点)
Amazon Bedrock AgentCore runtime と Strands ライブラリを使ってエージェントをデプロイする際、ふと疑問に思いました。
「あれ?どこにも使うLLM(モデル)の指定を書いていないのに、なぜ動くんだ?何が指定されている?」
今回は、この「見えないモデル」の正体を突き止めるまでのデバッグの過程と、そこから分かった Strands SDK の内部構造、そしてクロスリージョン推論の仕組みについて備忘録としてまとめます。
1. 最初の疑問:モデルはどこで指定されている?
デプロイしたコードは以下のような非常にシンプルなものでした。
from strands import Agent
from bedrock_agentcore.runtime import BedrockAgentCoreApp
agent = Agent()
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke(payload):
user_message = payload.get("prompt", "")
response = agent(user_message)
return str(response)
if __name__ == "__main__":
app.run()
model="XXX…" のように明示するのが一般的だと思っていたため混乱しました。このコードにはそれがありません。
AIアシスタントに聞いてみたところ、「インフラ側(AWSコンソール)で設定されているから」というもっともらしい回答が返ってきました。
2. 泥沼のデバッグ:AIのハルシネーションと存在しないメニュー
AIの助言に従い、AWSマネジメントコンソールで「オーケストレーション」->「エージェント」のメニューを探しましたが、AgentCore Runtimeにデプロイされたものは「エージェント」メニューにはなく、モデルを確認する項目も見当たりませんでした。
次に「コードから取得できる」と言われ、agent.model_id を試しましたが、以下のエラー。
"errorType": "AttributeError",
"errorMessage": "'Agent' object has no attribute 'model_id'",
環境変数 AWS_BEDROCK_AGENT_ID も Not Found。
完全にAIのハルシネーション(もっともらしい嘘)に振り回される展開となりました。
(今振り返ると、聞き方が悪かったかもしれないので新しい会話を始めるなどすればよかったと反省中)
3. 解決編:ググってprint
いったんAIからいったん離れてググり、
Pythonの基本に立ち返ってオブジェクトの中身を直接覗き見ることにしました。
以下の1行を追加して CloudWatch Logs を確認します。
print(agent.model.config)
【CloudWatch Logs の出力】
{'model_id': 'apac.anthropic.claude-sonnet-4-20250514-v1:0', 'include_tool_result_status': 'auto'}
Strands ライブラリの Agent() を引数なしで初期化すると、デフォルトで Claude Sonnet 4.0 (apac.anthropic.claude-sonnet-4-20250514-v1:0) が呼ばれる仕様になっていたのを確認できました。(2026年3月1日現在)
モデルの設定は agent 直下ではなく、agent.model.config の中に隠蔽(カプセル化)されていました。
4. コードから別のモデルに変更する方法
デフォルトの振る舞いが分かれば、カスタマイズも簡単です。
モデルを変更したい場合は、strands.models からモデルを定義してAgentに渡すだけです。
from strands import Agent
from strands.models import BedrockModel
from bedrock_agentcore.runtime import BedrockAgentCoreApp
# 使いたいモデルを明示的に指定
my_model = BedrockModel(
model_id="jp.anthropic.claude-sonnet-4-6"
)
# Agent に渡す
agent = Agent(model=my_model)
app = BedrockAgentCoreApp()
@app.entrypoint
def invoke(payload):
user_message = payload.get("prompt", "")
response = agent(user_message)
return str(response)
まとめ
- Strands SDK は
Agent()のデフォルトでクロスリージョン版の Claude Sonnet を呼んでいる。 - モデルの正体を知りたければ
agent.model.configを見る。 - AIの「もっともらしい回答」は完全に鵜呑みにせず、困ったらオブジェクトの中身を
printする。 - AIの回答が思った通りでない場合は、プロンプトが悪いと考える。
- プロンプトを見直す、新しい会話を始めるなど、次回はもっとAIを活かせるようにする。
泥臭いデバッグが一番の近道だと再認識した出来事でした。