概要
このリリースでは、大規模なツール結果を外部ストレージにオフロードする ContextOffloader プラグイン、プロバイダーネイティブのトークンカウント機能、CachePoint への TTL サポート、Bedrock の strict_tools 設定など、多くの新機能が追加されました。また、Bedrock のデフォルトモデルが Claude Sonnet 4.5 にアップグレードされ、複数のバグ修正も含まれています。
リリース: v1.38.0
新機能
大規模ツール結果のオフロード機能 (#2162, #2222)
この機能でできること:
- 大規模なツール結果をコンテキストウィンドウから外部ストレージにオフロードし、トークン消費を削減
- テキスト、JSON、画像、ドキュメントなど、様々なコンテンツタイプに対応
使用例:
from strands import Agent
from strands.vended_plugins.context_offloader import (
ContextOffloader,
InMemoryStorage,
FileStorage,
S3Storage,
)
# インメモリストレージ(プロセス終了時にクリア)
agent = Agent(plugins=[
ContextOffloader(storage=InMemoryStorage())
])
# ファイルストレージ(ディスクに永続化、カスタムしきい値)
agent = Agent(plugins=[
ContextOffloader(
storage=FileStorage("./artifacts"),
max_result_tokens=5_000, # オフロードを開始するトークン数
preview_tokens=2_000, # コンテキストに残すプレビューのトークン数
)
])
# S3 ストレージ(取得ツール付き)
agent = Agent(plugins=[
ContextOffloader(
storage=S3Storage(
bucket="my-agent-artifacts",
prefix="tool-results/",
),
include_retrieval_tool=True, # デフォルトで True
)
])
ポイント:
include_retrieval_tool=True(デフォルト)で、Agent がオフロードされたコンテンツを必要に応じて取得可能- FileStorage は完全なファイルパス、S3Storage は
s3://URI をリファレンスとして返す - Agent はプレビューを使用して回答可能な場合はそれを優先し、必要な場合のみデータを取得
Model.count_tokens() メソッドの追加 (#2031)
この機能でできること:
- モデル呼び出し前にトークン数を推定し、プロアクティブなコンテキスト管理が可能に
使用例:
# モデル呼び出し前にトークン数を推定
token_count = await agent.model.count_tokens(
messages=messages,
tool_specs=tool_specs,
system_prompt="You are a helpful assistant.",
)
if token_count > threshold:
# コンテキスト圧縮をトリガー
pass
ポイント:
- 基本実装は tiktoken(
cl100k_base)を使用し、利用不可の場合は文字ベースのヒューリスティック(テキストはchars/4、JSON はchars/2)にフォールバック - プロバイダーサブクラスでネイティブ API を使用したオーバーライドが可能
プロバイダーネイティブのトークンカウント (#2189, #2211)
この機能でできること:
- サポートされているプロバイダーでネイティブ API を使用した正確なトークンカウントを実現
使用例:
# 使用方法は同じ - ネイティブカウントは透過的に動作
token_count = await agent.model.count_tokens(
messages=messages,
tool_specs=tool_specs,
system_prompt="You are a helpful assistant.",
)
ポイント:
- 対応プロバイダー: Bedrock(
count_tokens)、Anthropic(messages.count_tokens)、OpenAI Responses(responses.input_tokens.count)、Gemini(models.count_tokens)、llama.cpp(/tokenizeエンドポイント) - ネイティブ API が失敗した場合は
ProviderTokenCountErrorを発生させ、tiktoken/ヒューリスティックにフォールバック - 推定誤差 5-15% を排除し、正確なしきい値ベースの圧縮判断が可能に
モデル呼び出し前の入力トークン推定 (#2221)
この機能でできること:
- モデル呼び出し前に
BeforeModelCallEventで推定入力トークン数を取得可能に
使用例:
from strands.hooks import BeforeModelCallEvent
def on_before_model_call(event: BeforeModelCallEvent):
print(event.projected_input_tokens) # 例: 14200
agent.hooks.add_callback(BeforeModelCallEvent, on_before_model_call)
# AgentResult からもコンテキストサイズを取得可能
result = agent("Hello")
print(result.projected_context_size) # 例: 14250
ポイント:
- プロアクティブなコンテキスト圧縮の基盤機能
- 前回の呼び出しメタデータから既知のトークン数を取得し、新しいメッセージのみを推定
CachePoint への TTL サポート (#1660)
この機能でできること:
- AWS Bedrock のプロンプトキャッシングで TTL(有効期限)を指定可能に
使用例:
from strands.types.content import CachePoint
# 1 時間のキャッシュ TTL を指定
cache_point = CachePoint(type="default", ttl="1h") # "5m" または "1h" が指定可能
ポイント:
- Bedrock API の新しい 1 時間キャッシュオプションに対応
- 長時間実行されるエージェントセッションでのコスト最適化に有効
MCP ツール結果に isError フラグを保持 (#2118)
この機能でできること:
- MCP ツールがアプリケーションレベルのエラーを返した場合と、プロトコル/トランスポートエラーを区別可能に
使用例:
# MCPToolResult の isError フィールドを確認
if result.get("isError"):
# ツールが実行されたが、アプリケーションエラーを報告
pass
elif result["status"] == "error":
# プロトコル/クライアント例外(ツールが実行されなかった)
pass
ポイント:
status="error"かつisError=True: ツール実行成功、アプリケーションエラー報告status="error"かつisErrorなし: プロトコル/トランスポートエラー
Bedrock strict_tools 設定 (#2213)
この機能でできること:
- Bedrock の制約付きデコーディングを有効にし、ツール名やパラメータのハルシネーションを防止
使用例:
from strands.models import BedrockModel
# strict_tools を有効化
model = BedrockModel(
model_id="us.anthropic.claude-sonnet-4-6",
strict_tools=True, # ツールスキーマの厳密な検証を有効化
)
ポイント:
@toolデコレータで生成されたスキーマに自動的にadditionalProperties: falseを注入- ツール名のハルシネーション(例:
store-case-syummary-tool→ 正しくはstore-case-summary-tool)を防止 - 入力スキーマへの準拠を強制し、余分なパラメータや誤字を防止
バグ修正
Bedrock デフォルトモデルを Claude Sonnet 4.5 にアップグレード (#2193)
問題:
- 旧デフォルトの Claude Sonnet 4 (
us.anthropic.claude-sonnet-4-20250514-v1:0) が Anthropic によりレガシーとしてマークされ、過去 30 日間にそのモデルを使用していないアカウントでエラーが発生
修正内容:
- デフォルトモデルを
global.anthropic.claude-sonnet-4-6に変更 - Global クロスリージョン推論プロファイルを使用し、どのリージョンからでも動作
LiteLLM で CachePoint の TTL が転送されない問題を修正 (#2153)
問題:
LiteLLMModel._format_system_messages()がCachePointのttlフィールドを無視し、常に{"type": "ephemeral"}を出力
修正内容:
ttlフィールドが存在する場合、cache_controlディクショナリに含めるように修正
スキル注入時のキャッシュポイント保持 (#2134)
問題:
AgentSkills._on_before_invocationがシステムプロンプトを文字列として読み取り、構造化されたSystemContentBlockリスト(cachePointを含む)を単一のテキストブロックに崩壊させていた
修正内容:
- コンテンツブロックリストが利用可能な場合、スキル XML を別のブロックとして追加し、キャッシュポイントを保持
Ollama で一意の toolUseId を生成 (#2053)
問題:
toolUseIdにツール名を再利用していたため、同じツールを複数回呼び出すと ID が衝突
修正内容:
- UUID を生成して
toolUseIdとして使用するように変更
Nova Sonic の履歴再生時の問題を修正 (#2188)
問題:
BidiAgentセッション更新時に、Nova Sonic が以前のアシスタント応答を繰り返す- 会話履歴メッセージが
interactive: Trueで送信され、新しい入力として扱われていた
修正内容:
- 履歴メッセージとシステムプロンプトを
interactive: Falseで送信 - 履歴サイズを制限(個別メッセージ 50KB、合計 200KB)
SlidingWindowConversationManager の window_size=0 処理 (#2208)
問題:
window_size=0で全メッセージをクリアすることが期待されるが、実際にはメッセージが変更されない- 負の
window_size値が検証されていない
修正内容:
window_size=0で全メッセージをクリアするように修正window_size < 0の場合にValueErrorを発生させるように追加
キャンセルされたツールに例外を合成しない (#2106)
問題:
cancel_tool設定後、AfterToolCallEvent.exceptionに合成された例外が設定され、ツールキャンセルが失敗として表示
修正内容:
- キャンセルされたツールの
AfterToolCallEvent.exceptionをNoneに変更 - キャンセル検出には
cancel_messageフィールドを使用
まとめ
このリリースでは、大規模ツール結果のオフロード、ネイティブトークンカウント、プロアクティブなコンテキスト管理の基盤機能など、コンテキスト管理に関する大幅な機能強化が行われました。また、Bedrock のデフォルトモデルが Claude Sonnet 4.5 に更新され、新規ユーザーが即座に開始できるようになりました。