![[小ネタ] Strands AgentsのツールでAmazon Bedrock AgentCore Code Interpreterが簡単に使用できるようになっていた](https://images.ctfassets.net/ct0aopd36mqt/4o8n2qvRpfnsx0yGmKgDZr/1b05f3211bdf64deb5322bf5be42b202/StrandsAgents.png?w=3840&fm=webp)
[小ネタ] Strands AgentsのツールでAmazon Bedrock AgentCore Code Interpreterが簡単に使用できるようになっていた
はじめに
こんにちは、スーパーマーケットが大好きなコンサルティング部の神野です。
2026年始まりましたね、今年も変わらず去年以上にアウトプットを出していければと思っております!
早速ですが、みなさんAgentCore Built-in toolsのCode Interpreterを使っていますか?
私は下記記事を書いてからあまり触っておりませんでした。
この時のコードでもCode Interpreterを使うのは十分簡単なのですが、若干セッションの処理など煩わしい箇所があったかと思いますが、Strands Agentsの組み込みのツールとして提供されたことでより簡単に扱えるようになりました。今回はこのポイントを紹介したいと思います!
どうシンプルになったか
公式サンプルを見るに下記コードで動きます。サンプルのコードを日本語に変えました。
めちゃくちゃシンプルですね・・・
from strands import Agent
from strands.models import BedrockModel
from strands_tools.code_interpreter import AgentCoreCodeInterpreter
# Code Interpreterツールを初期化
code_interpreter_tool = AgentCoreCodeInterpreter(region="us-west-2")
# エージェントのシステムプロンプトを定義
SYSTEM_PROMPT = """あなたはコード実行を通じて回答を検証するAIアシスタントです。
コード、アルゴリズム、計算について質問されたら、Pythonコードを書いて回答を検証してください。"""
model = BedrockModel(
model_id="us.anthropic.claude-haiku-4-5-20251001-v1:0",
region_name="us-west-2"
)
# Code Interpreterツールを持つエージェントを作成
agent = Agent(
tools=[code_interpreter_tool.code_interpreter],
system_prompt=SYSTEM_PROMPT,
model=model
)
# サンプルプロンプトでエージェントをテスト
prompt = "フィボナッチ数列の最初の10個を計算してください。"
print(f"\n\nプロンプト: {prompt}\n\n")
agent(prompt)
実行すると下記のように結果が返却されます。ツール利用としてCode Interpreterが利用されています。
uv run main.py
プロンプト: フィボナッチ数列の最初の10個を計算してください。
フィボナッチ数列の最初の10個を計算します。
Tool #1: code_interpreter
完成しました!**フィボナッチ数列の最初の10個**は以下の通りです:
| 番号 | 値 |
|------|-----|
| F(1) | 0 |
| F(2) | 1 |
| F(3) | 1 |
| F(4) | 2 |
| F(5) | 3 |
| F(6) | 5 |
| F(7) | 8 |
| F(8) | 13 |
| F(9) | 21 |
| F(10) | 34 |
**フィボナッチ数列とは:**
- 最初の2つの数が0と1で、その後の各数は前の2つの数の合となる数列です
- 一般的には F(n) = F(n-1) + F(n-2) という関係式で定義されます
- 自然界の様々な現象(花びらの配置、貝殻の渦巻きなど)に見られる興味深い数学的性質を持っています
このサンプルの例だと、生成AI自身が考えたかツールが動いたか検証が微妙ですよね。
そこで今回は生成AIだけで回答した場合とCode Interpreterを使った場合を比較して、Code Interpreterが動いているかの簡単なサンプルを作ってみます。
試してみる
前提
今回検証に下記バージョンで実施しました。
| 項目 | バージョン |
|---|---|
| Python | 3.12 |
| uv | 0.6.12 |
| strands-agents | 1.20.0 |
| strands-agents-tools | 0.2.18 |
セットアップ
今回はuvを使ってセットアップしていきます。
uv init strands-agents-builtin-tools
cd strands-agents-builtin-tools
プロジェクトが作成できたら、必要なパッケージを追加します。
uv add strands-agents strands-agents-tools
これでセットアップは完了です!
ツールを利用しない場合とCode Interpreterの比較
現在の日時を聞いてみます。
ツールを利用しない場合はリアルタイムの時刻を取得できず、Code Interpreterを使えばPythonで現在時刻を取得して返却される想定です。モデルはus.anthropic.claude-sonnet-4-5-20250929-v1:0を使用します。
from strands import Agent
from strands.models import BedrockModel
from strands_tools.code_interpreter import AgentCoreCodeInterpreter
# モデル設定
model = BedrockModel(
model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
region_name="us-west-2"
)
# 問題
prompt = "現在の日時(年月日 時分秒)を教えてください。"
print("=" * 50)
print("【比較】生成AIだけ vs Code Interpreter")
print("=" * 50)
print(f"\n問題: {prompt}\n")
# 1. 生成AIだけで回答
print("-" * 50)
print("① 生成AIだけで回答")
print("-" * 50)
agent_without_tool = Agent(model=model)
response1 = agent_without_tool(prompt)
# 2. Code Interpreterを使って回答
print("\n" + "-" * 50)
print("② Code Interpreterを使って回答")
print("-" * 50)
code_interpreter = AgentCoreCodeInterpreter(region="us-west-2")
agent_with_tool = Agent(
model=model,
tools=[code_interpreter.code_interpreter],
system_prompt="日時を取得する問題はCode Interpreterで実際にコードを実行してください。"
)
response2 = agent_with_tool(prompt)
肝心のツールの使い方としては、AgentCoreCodeInterpreterをインスタンス化し、code_interpreterメソッドをツールとして渡すだけで連携完了です。簡単ですね・・・
後はシステムプロンプトでCode Interpreterを使うよう指示しておきます。
参考までに以前の記事で紹介したコードも載せて比較してみましょう。(処理内容が異なるため、セッションの部分だけ注目ください)
以前のコード例(code_session使用)
from bedrock_agentcore.tools.code_interpreter_client import code_session
@tool
def execute_python(code: str, description: str = "") -> str:
"""Pythonコードを実行"""
if description:
code = f"# {description}\n{code}"
img_code = f"""
import matplotlib
matplotlib.use('Agg')
{code}
import matplotlib.pyplot as plt,base64,io,json
imgs=[]
for i in plt.get_fignums():
b=io.BytesIO()
plt.figure(i).savefig(b,format='png')
b.seek(0)
imgs.append({{'i':i,'d':base64.b64encode(b.read()).decode()}})
if imgs:print('_IMG_'+json.dumps(imgs)+'_END_')
"""
try:
with code_session("us-west-2") as code_client:
response = code_client.invoke("executeCode", {
"code": img_code,
"language": "python",
"clearContext": False
})
result = None
for event in response["stream"]:
result = event["result"]
# 結果の処理...
return json.dumps(result, ensure_ascii=False)
except Exception as e:
return json.dumps({"isError": True, "error": str(e)})
以前はcode_sessionでセッションを管理し、invokeでコードを実行する必要がありました。
今回のAgentCoreCodeInterpreterを使えば、ツールとして渡すだけでセッション管理も自動化されるのでかなりシンプルになりましたね。
実行
uv run main.py
==================================================
【比較】生成AIだけ vs Code Interpreter
==================================================
問題: 現在の日時(年月日 時分秒)を教えてください。
--------------------------------------------------
① 生成AIだけで回答
--------------------------------------------------
申し訳ございません。私はリアルタイムの時計機能を持っていないため、現在の正確な日時をお伝えすることができません。
現在の日時を確認するには:
- お使いのデバイス(スマートフォン、パソコンなど)の時計をご確認ください
- 「OK Google, 今何時?」や「Hey Siri, 今日は何日?」などの音声アシスタントをご利用ください
- インターネットで「現在時刻」と検索してください
お力になれず申し訳ございません。
--------------------------------------------------
② Code Interpreterを使って回答
--------------------------------------------------
Tool #1: code_interpreter
現在の日時は **2026年01月02日 14時43分22秒** です。
生成AIだけではわかりませんと回答していたのが、ツール利用を通じてCode Interpreterを使うことで実際の現在時刻を取得できていますね!Code Interpreterがシンプルに実行できるようになって嬉しいですね。(細かいですがUTC表記で取得されているため9時間マイナスとなった時刻です、日本だと23時です)
おわりに
以前の記事で紹介した方法と比べると、セッション管理の部分が簡略化されて、
ツールとして使えるようになっているのは良いですね!
使い方がシンプルなのでCode Interpreterを使うタスクはStrands Agents経由で使ってみたくなりました。
本記事が少しでも参考になりましたら幸いです。
最後までご覧いただきありがとうございました!
補足
補足ですがAgentCoreにほぼ同じコードを書いてデプロイしてGenAI Observability ダッシュボードからログを見てみました。意図通りコードが生成されて実行結果が返却されたのを確認できました。
デプロイしたコード
from bedrock_agentcore.runtime import BedrockAgentCoreApp
from strands import Agent
from strands.models import BedrockModel
from strands_tools.code_interpreter import AgentCoreCodeInterpreter
app = BedrockAgentCoreApp()
@app.entrypoint
def main(payload):
# payloadからpromptを取得
prompt = payload.get("prompt", "現在の日時(年月日 時分秒)を教えてください。")
# モデル設定
model = BedrockModel(
model_id="us.anthropic.claude-sonnet-4-5-20250929-v1:0",
region_name="us-west-2"
)
print("=" * 50)
print("【比較】生成AIだけ vs Code Interpreter")
print("=" * 50)
print(f"\n問題: {prompt}\n")
# 1. 生成AIだけで回答
print("-" * 50)
print("① 生成AIだけで回答")
print("-" * 50)
agent_without_tool = Agent(model=model)
response1 = agent_without_tool(prompt)
# 2. Code Interpreterを使って回答
print("\n" + "-" * 50)
print("② Code Interpreterを使って回答")
print("-" * 50)
code_interpreter = AgentCoreCodeInterpreter(region="us-west-2")
agent_with_tool = Agent(
model=model,
tools=[code_interpreter.code_interpreter],
system_prompt="日時を取得する問題はCode Interpreterで実際にコードを実行してください。"
)
response2 = agent_with_tool(prompt)
return response2
if __name__ == "__main__":
app.run()
ログ
{
"resource": {
"attributes": {
"deployment.environment.name": "bedrock-agentcore:default",
"aws.local.service": "********.DEFAULT",
"service.name": "********.DEFAULT",
"cloud.region": "us-west-2",
"aws.log.stream.names": "otel-rt-logs",
"telemetry.sdk.name": "opentelemetry",
"aws.service.type": "gen_ai_agent",
"telemetry.sdk.language": "python",
"cloud.provider": "aws",
"cloud.resource_id": "arn:aws:bedrock-agentcore:us-west-2:************:runtime/********/runtime-endpoint/DEFAULT:DEFAULT",
"aws.log.group.names": "/aws/bedrock-agentcore/runtimes/********-DEFAULT",
"telemetry.sdk.version": "1.33.1",
"cloud.platform": "aws_bedrock_agentcore",
"telemetry.auto.version": "0.12.2-aws"
}
},
"scope": {
"name": "strands.telemetry.tracer"
},
"timeUnixNano": 1767407718077295383,
"observedTimeUnixNano": 1767407718077538699,
"severityNumber": 9,
"severityText": "",
"body": {
"output": {
"messages": [
{
"content": {
"message": "[{\"text\": \"[{'type': 'text', 'text': '現在の日時: 2026年01月03日 11時35分18秒\\\\n\\\\nISO形式: 2026-01-03T11:35:18.050048+09:00'}]\"}]",
"id": "tooluse_****************"
},
"role": "assistant"
}
]
},
"input": {
"messages": [
{
"content": {
"content": "{\"code_interpreter_input\": {\"action\": {\"type\": \"executeCode\", \"code\": \"from datetime import datetime\\nimport pytz\\n\\n# 日本時間(JST)で現在の日時を取得\\njst = pytz.timezone('Asia/Tokyo')\\nnow = datetime.now(jst)\\n\\n# フォーマットして表示\\nprint(f\\\"現在の日時: {now.strftime('%Y年%m月%d日 %H時%M分%S秒')}\\\")\\nprint(f\\\"\\\\nISO形式: {now.isoformat()}\\\")\", \"language\": \"python\"}}}",
"role": "tool",
"id": "tooluse_****************"
},
"role": "tool"
}
]
}
},
"attributes": {
"event.name": "strands.telemetry.tracer",
"session.id": "********-****-****-****-************"
},
"flags": 1,
"traceId": "********************************",
"spanId": "****************"
}








