ラスベガスで現在開催中のAWS re:Invent 2025。
3日目の基調講演はAgentic AI領域を統括するVPスワミさんの担当でした。
例年、AI系の目玉アップデートは前日のCEOキーノートに取られてしまう傾向があり(苦笑)、今年はそれがさらに顕著で、スワミさん発表の新機能はかなり限られていました。
その中でも、AIエージェント構築に欠かせないStrands Agentのアップデートに絞って解説します。
おさらい: Strands Agentsとは?
AWSが今年5月に公開したばかりの、AIエージェント構築用フレームワークです。
OSSとしてGitHubでも公開されており、AWSやBedrock縛りではなく、OpenAIなどの他社モデルにも対応しているのが特徴です。
とにかく簡単にコードを書けるのが特徴で、最小3行でAIエージェントが動きます。
from strands import Agent
agent = Agent()
agent("Strandsってどういう意味?")
Strands AgentsのTypeScript版がプレビューで登場
PythonのみをサポートしていたStrandsで、TypeScript版のSDKが公開されました。
最近はフロントエンド・バックエンド・インフラ(IaC)ともにTypeScriptを使うモダンなフルスタック開発が人気となっており、TSの強みである型安全な開発体験をAIエージェント構築でも享受したいニーズは多いです。
他社製品では、MastraやVoltAgentなどがTypeScriptファーストな類似フレームワークとして有名です。
TS版でも「3行エージェント」の簡単さは健在でした!
import { Agent } from '@strands-agents/sdk'
const agent = new Agent();
response = await agent.invoke("Strandsってどういう意味?");
※なお、しばらくは先発のPython版のほうが機能の豊富さで先行しそうな雰囲気です。
私も早速、会場でキーノートを聴きながらTS版Strandsを使ったサンプルアプリをVercelにデプロイしてみました。良かったら使ってみてください!
試験的な新機能「ステアリング」が登場
ステアリングとは、AIエージェントのシステムプロンプトを分割するアプローチです。
AIエージェントが多くの機能を持ってくると、行動品質を保つために必要なシステムプロンプトの分量が多くなってしまいます。そうなるとモデルがコンテキストウィンドウ全体に注意を払い切れず、行動の精度が落ちたりします。
そうならないよう、システムプロンプトを分割しておいて、必要なタイミングで追加のプロンプト(ガイダンス)を提供する仕組みがStrandsのステアリングです。
ツール利用前にイベントフックで呼び出されるようになっています。
LLMSteeringHandler クラスを使って、ハンドラーを作成してエージェントに設定して使います。
from strands import Agent, tool
from strands.experimental.steering import LLMSteeringHandler
@tool
def send_email(recipient: str, subject: str, message: str):
return f"{recipient}にメールを送りました"
handler = LLMSteeringHandler(
system_prompt="AIエージェントがメールを送る際、正しく敬語を使えているかチェックして"
)
agent = Agent(
tools=[send_email],
hooks=[handler]
)
response = agent("部長に明日の休暇申請メールを送って")
比較対象となるアプローチに「ワークフロー」がありますが、ステアリングの特徴は、ワークフローのように行動経路をあらかじめ定義しておかなくとも、条件設定によってもっと柔軟に追加のガイダンスを提供できることです。
Strands Evals SDKがプレビューで登場
AIエージェントの出力や行動を評価するための機能が、Strandsに追加されました。
いわゆるLLM-as-a-Judgeを用いた自動評価を行えます。スコアリングの実行のほか、テストケースの生成機能もあります。
他社製品ではRagasやDeepEvalsなどが有名です。
from strands import Agent
from strands_evals import Case, Experiment
from strands_evals.evaluators import OutputEvaluator
def get_response(case: Case):
agent = Agent(
system_prompt="あなたは時事ネタ回答AIエージェントです",
callback_handler=None # 評価の際は無効化推奨
)
response = agent(case.input)
return str(response)
test_cases = [
Case[str, str](
name="knowledge-1",
input="日本の首相は?",
expected_output="高市早苗さんです",
metadata={"category": "knowledge"}
)
]
evaluator = OutputEvaluator(
rubric="回答が適切かどうか、0〜1の範囲内で点数評価してください",
include_inputs=True
)
experiment = Experiment[str, str](
cases=test_cases,
evaluators=[evaluator]
)
reports = experiment.run_evaluations(get_response)
reports[0].run_display()
なお、AWSにもAgentCore Evaluationsという機能が昨日発表されており、クラウド側とSDK側どちらの機能を使うべきかちょっと迷いますね。
クラウド機能はGUI付きで簡単、マネージドなのがいいところなので、AgentCoreのカスタムメトリクスなどで物足りなくなってきたら、Strands Evalsの利用を検討するのがいい気がします。
試験的な新機能「双方向ストリーミング」に対応
昨日、Amazon Novaシリーズの新モデル「Nova 2 Sonic」が発表されました。OpenAIのRealtime APIのように、音声の素早い入出力に対応したモデルなのですが、これを活用してAIエージェントを作る際に必要となるのが双方向ストリーミングの仕組みです。
例えば、AIエージェントが音声で話している途中に、人間が割り込みで会話を行うと、発話中でも臨機応変に新しい内容を取り込んで反映するといったことが可能です。
import asyncio
from strands.experimental.bidi import BidiAgent, BidiAudioIO
from strands.experimental.bidi.models import BidiNovaSonicModel
agent = BidiAgent(
model=BidiNovaSonicModel(),
system_prompt="あなたは音声対応アシスタントです"
)
audio_io = BidiAudioIO()
async def main():
await agent.run(
inputs=[audio_io.input()],
outputs=[audio_io.output()]
)
asyncio.run(main())
昨日はAWS側のインフラサービスであるAgentCoreランタイムも、この双方向ストリーミングへの対応が発表されていました。まさに音声対応させたStrandsをデプロイする先としてピッタリになりそうですね。
なお、この機能はAWS What's Newでは、llama.cppへの対応と合わせて「エッジデバイス対応のGA」としてアナウンスされていました。(上記機能はまだ "試験的" セクションにありますが…)
リアルタイムの音声処理ではネットワークレイテンシーも重要となるため、ローカルモデルの利用を推奨しているものと考えられます。
おまけ
10月に出版した書籍「AIエージェント開発/運用入門」にも、Strands Agentsに入門できるハンズオンをフルカラーで掲載しています。ぜひご活用ください!
「ITエンジニア本大賞2026」にもノミネートされていますので、本を気に入ってくださった方はぜひ投票くださいますと嬉しいです!



