こんにちは~ 浮田です。
■ はじめに
AgentCore ハーネスの GA のリリースノートを眺めていて、一行だけ気になった箇所がありました。
Agents can switch providers mid-session without losing context, so you can plan with one model and execute with another.
計画は賢いモデルに、実行は安いモデルに。
価格性能の比較のためにプロバイダーを入れ替えることもできる、と。
便利そうなんですが、素直に疑問が湧きました。
切り替えた瞬間、相手は「別人」になるはずです。じゃあ何を引き継いでいるんだろう? 会話? ツールで取ってきた結果? 作業中に書いたファイル?
結論から言うと、ちゃんと引き継がれました。ただし「何が」引き継がれているかは想像と少し違って、そこが面白かったので記録を残します。
ハーネスをおさらいすると、「エージェントのループ(モデル呼び出し→ツール選択→実行→結果を戻す)と、その周りのインフラ一式を AWS が持ってくれるサービス」です。
開発者はモデル・指示・ツール・スキルを設定として宣言するだけ。2026年6月に GA しました。
モデルは Bedrock に縛られません。
|
プロバイダー |
指定方法(設定キー) |
備考 |
|
Amazon Bedrock |
bedrockModelConfig.modelId |
今回はこれ。Claude / Nova など Bedrock のモデルすべて |
|
OpenAI |
openaiModelConfig 系 |
API キーは AgentCore Identity 経由 |
|
Google Gemini |
geminiModelConfig 系 |
同上 |
|
LiteLLM 互換 |
LiteLLM のプロバイダー指定 |
自前のエンドポイントもここ |
(※ 設定キー名は執筆時点の API リファレンスで要確認)
たとえ話をするなら、ホテルの部屋はそのままで、担当のコンシェルジュだけ交代するイメージです。部屋に置いた荷物(ファイル)も、部屋に置いてある業務日誌(会話履歴)も残る。交代したコンシェルジュは日誌を読んでから対応する。
ただしチェックアウト(セッション停止)すると部屋は片付けられます。日誌の控えをフロント(Memory)に預けていれば、次の部屋でも続きから読める。この記事の結論はこのたとえに全部収まるので、覚えておいてください。
ここは事前整理として価値が高いところです。公式ドキュメントの言い方を借りると「defaults at creation time, overrides at invocation time」。作成時のデフォルトと、呼び出し時の上書きが別レイヤーになっています。
|
手段 |
反映 |
ハーネス本体への保存 |
向いている用途 |
|
① コンソール「ハーネスを編集」/update-harness |
新バージョン作成+エンドポイント切替(今回のメモリ変更では 3〜5分待ち) |
される |
恒久的な変更 |
|
② プレイグラウンドの設定パネル |
即時。モーダルで「適用」→そのまま送信できた |
されない(後述) |
手で試す A/B |
|
③ InvokeHarness の model パラメータ |
呼び出し単位 |
されない |
プログラムから動的に切り替え。Step Functions 連携(第3弾)はこれ |
③の最小コードは公式ドキュメントのこれです。
response = client.invoke_harness(
harnessArn=HARNESS_ARN,
runtimeSessionId=SESSION_ID,
# このコールだけに効く。ハーネスのデフォルトは変わらない
model={"bedrockModelConfig": {"modelId": "us.anthropic.claude-opus-4-5-20251101-v1:0"}},
messages=[{"role": "user", "content": [{"text": "..."}]}],
)
今回の検証は②で行いました。③は未検証ですが、セッション ID を揃えてモデルだけ変える、という構造は②と同じなので、同じ結果になるはずです(第3弾で確かめます)。
ここが記事の背骨です。「コンテキストを失わない」と一口に言っても、失われうるものは複数あるはずなので、先に分解しておきます。
|
# |
軸 |
何を確かめるか |
仕込み方 |
|
1 |
会話履歴 |
前のターンの発言を覚えているか |
「私の名前は浮田です。好きな数字は 57 です」と伝える |
|
2 |
ツール実行履歴 |
前のモデルがツールで実行した結果を知っているか |
シェルでファイルを書かせ、実行結果をトレースに残す |
|
3 |
ファイルシステム |
前のモデルが書いたファイルを読めるか |
/tmp/memo.txt に文字列を書かせる |
|
4 |
トークン数 |
履歴が実際にモデルへ渡っているか |
プレイグラウンド上部の「入力」トークン数を毎ターン控える |
4番目が地味に重要でした。チャット画面に履歴が表示されていても、それがモデルに渡っているとは限りません。入力トークン数だけが真実です。
環境は次のとおりです。
新しいセッションを開いて、まず挨拶。入力 925 トークン。「こんにちは」1行で 925 トークンも載っているのは、システムプロンプトとツール定義とハーネス内部の指示が乗っているからです。初回は microVM の起動も含みます。
次に名前と数字を伝えました。
私の名前は浮田です。好きな数字は 57 です。このあとモデルを切り替える実験をするので、覚えておいてください。
続けてファイルを書かせます。
/tmp/memo.txt に「harness test 20260820」と書き込んで、書けたか確認してください。
Agent trace を開くと、Shell(command: "echo ... > /tmp/memo.txt") で書き込み、「書き込めました。続いて確認します」と言ってから File Operations(command: "view") で読み出す、という2手でした。Shell の結果は stdout / stderr / exit_code の3点セットで返っていて、モデルはこの生データを見て次を決めています。
ちなみに同じ指示を別の回に出したら、echo と cat を && で繋いで Shell 1回で済ませたり、cat を Shell で叩いたりと、毎回組み立てが違いました。どのツールをどう使うかは、実行のたびにモデルが決め直しています。
この時点で
入力: 3292
出力: 167
合計: 3459
レイテンシー: 5205ms でした。
右ペインのモデル欄の ✎ を押すと、プロバイダー → モデル → 推論タイプの3列モーダルが出ます。Amazon → Nova Pro → オンデマンドを選んで「適用」。待ち時間なし、再デプロイなし、セッション ID もそのまま。
同じセッションのまま質問します。
私の名前と好きな数字は何でしたか? また /tmp/memo.txt の中身を読んで教えてください。
① 会話履歴は覚えているか → ✅
お名前:浮田さん/好きな数字:57
即答でした。
② 前のモデルが叩いたツールの結果は残っているか → ✅(ただし一工夫必要でした)
実はこれ、名前とファイルの質問だけでは確認できません。
名前を答えたのは会話履歴(軸①)、ファイルを読めたのは microVM(軸③)で説明がついてしまい、「ツールの実行結果を知っていた」証拠が別に要ります。質問を投げてから設計ミスに気づきました。
そこで実験を組み直しました。Nova に date +%s%N を実行させます。出力はその瞬間のナノ秒タイムスタンプ会話にもファイルにも存在せず、再実行すれば必ず別の値になる、ツールの実行結果にしか存在しない情報です。
Shell(command: "date +%s%N") → 1788347984056472402
そして Claude Sonnet 4.6 に切り替え戻して、聞きます。
さっき実行した date コマンドの出力は何でしたか?ツールは使わず、会話の記憶だけで答えてください。
Claude の回答は、ツールを一切呼ばずに:
先ほどの date +%s%N の出力は:1788347984056472402 でした!
一字一句正確でした。前のモデルのツール実行結果が、会話履歴の一部として次のモデルにそのまま渡っています。
ついでに Nova → Claude という逆方向の切り替えも、これで確認できたことになります。
③ 前のモデルが書いたファイルは読めるか → ✅
File Operations(command: "view") → harness test 20260820。
同じ microVM にいるので当然といえば当然ですが、ここは正直びっくりしました。モデルが変わっても作業机は同じです。
ちなみに Nova Pro は <thinking>〜</thinking> を生テキストのまま出力してきました。Claude は出していなかったので、ハーネスが揃えてくれるのは「セッション」であって「モデルの作法」ではないんですね。
ここからが、この記事のいちばん書きたかった部分です。
「全部引き継がれました」で終わると、じゃあ何をしたら失われるのか分かりません。
そこで モデルを変えずにセッションを変える 対照実験をしました。
「新しいセッション」ボタンから、前のセッションを停止して新規作成。
同じ Nova Pro のまま同じ質問。
お探しのファイル /tmp/memo.txt は存在しないため、あなたの名前と好きな数字を特定できませんでした。
全部忘れて、逆に聞き返されました。入力 906 トークン。直前のターンの 8,125 と比べると9分の1で、履歴が何も渡っていないことが数字で分かります。
「前のセッションは停止していますが、再度呼び出せば再びアクティブ化できます」と案内が出たので、旧 ID 52a6ec3a-… を貼り直して同じ質問。
チャット画面には過去の会話が全部表示されています。
数分前に Claude が乱数を言い当てた回答も、すぐ上に見えている。
その状態で、
申し訳ありませんが、ユーザーの要求を満たすために必要な情報を得ることができませんでした。/tmp/memo.txt は存在しないようですし、提供されたツールにはユーザーの情報にアクセスする機能がありません。お手数ですが、直接お名前と好きな数字を教えていただけますか?
と聞き返されました。入力 892 トークン。ファイルも消えています(再アクティブ化で microVM が入れ替わった)。画面に履歴が見えていても、モデルには渡っていない。
公式ドキュメント(Memory)にはこう書いてあります。
By default, the harness provisions an AgentCore Memory instance automatically ... it remembers what happened in previous turns, even after the underlying microVM session has expired.
ところがハーネスの編集画面を開くと、「メモリを有効にする」トグルが OFF でした。
コンソールのクイック作成はメモリなしで作られるようです。
プレイグラウンドの設定パネルにもメモリ項目が出ていなかったのですが、これは「無効だから項目ごと非表示」だったわけです。
トグルを ON にすると「新しいメモリを作成(ハーネスで管理)」が選ばれ、戦略はセマンティック+要約、短期メモリの有効期限 30 日。保存するとハーネスの バージョン 2 が作られ、「プロビジョニングに 3〜5 分かかります」。
左メニューの「メモリー」に harness_a6o97-Rz3Dr95yL6 というリソースが「作成中」で現れました。Managed by 列にハーネス ID がリンクされていて、ハーネス所有のメモリだと一目で分かります。
READY 後、新しいセッションで種を蒔き直し(名前・57・memo.txt round2)、停止して、旧 ID を貼り直して同じ質問。
もちろんです!…残念ながら、現在ファイルが存在しませんでした❌ 先ほどのセッションで作成したファイルは、環境のリセットなどにより削除されてしまったようです
先ほどの会話で書き込みに成功していましたが、環境が変わったため(セッションのリセットや一時ファイルの削除など)、ファイルが消えてしまったようです。
|
引き継がれるもの |
モデル切替 |
新セッション |
停止→再開 |
停止→再開 |
|
会話履歴 |
✅ |
❌ |
❌ |
✅ |
|
ツール実行履歴 |
✅(乱数で証明) |
❌ |
❌ |
✅(会話の一部として) |
|
ファイル(/tmp) |
✅ |
❌ |
❌ |
❌ |
|
入力トークン |
3,292 → 4,567 |
906 |
892 |
1,806 |
注目すべきはこの表の「停止→再開・メモリ有効」列です。会話だけ戻って、/tmp のファイルは戻らない。
つまり:
だからモデルを交代させても何も失わないんです。
コンシェルジュが変わっても、フロントの記録と部屋の荷物は残っている。
トークン数で見るコストの感触
当初は「高いモデル単独/安いモデル単独/計画は高い・実行は安い、の3パターンを回して円で比較」まで書くつもりでしたが、今回はプレイグラウンドでの単発検証なので、きちんとした比較は boto3 から同条件で回せる次の記事に譲ります。ここでは取れた数字だけ置いておきます。
|
ターン |
モデル |
入力 tok |
出力 tok |
レイテンシー |
|
ファイル書き込み(Shell → File Operations) |
Claude 4.6 |
3,292 |
167 |
5,205ms |
|
切り替え直後の確認 |
Nova Pro |
4,567 |
252 |
6,116ms |
|
乱数の実行(Shell 1回) |
Nova Pro |
6,069 |
316 |
6,885ms |
|
記憶から回答(ツールなし) |
Claude 4.6 |
8,125 |
354 |
8,012ms |
|
新セッションで確認(ツール1回失敗) |
Nova Pro |
906 |
50 |
629ms |
|
停止→再アクティブ化で確認(メモリ無効) |
Nova Pro |
892 |
137 |
1,248ms |
|
メモリ有効・再開後の確認 |
Claude 4.6 |
1,806 |
116 |
2,208ms |
この表から言えることは2つあります。
「切り替えれば安くなる」は単純ではありません。切り替え後のモデルはそれまでの履歴を丸ごと入力として受け取るので、後半を安いモデルにしても、入力トークンは前半の分だけ積み上がった状態で始まります。
もう1つ。ハーネス自体は無料ですが、メモリを有効にした時点で AgentCore Memory の従量課金(短期イベント/長期レコード/取得)が始まります。モデル料金・Runtime の CPU/メモリ秒課金と合わせて、「ハーネスは無料」であって「エージェントを動かすのが無料」ではありません。
「セッション中にモデルを切り替えてもコンテキストを失わない」これは本当でした。
会話もツールの結果もファイルも、全部そのまま次のモデルに渡ります。
ただ、検証していて一番の収穫だったのは、動いた/動かなかったよりも、ハーネスが持っていてくれるのは「セッション」であって「モデルの頭の中」ではないと分かったことでした。
しかもそのセッションも一枚岩ではありません。セッション中は会話もファイルも microVM の中にあり、microVM が終わったあとに会話を持ち越すのが Memory、と持ち主と寿命が違う。
言われてみれば当然なのですが、私は最初「切り替えてもコンテキストが維持される」を「モデルが記憶を引き継ぐ」と読んでいました。実際にはそうではなくて、会話もツールの結果もファイルもセッション側に積まれていて、モデルは毎回そこを読みに来る「交代要員」にすぎません。だから交代できるんだ、と腑に落ちました。
これは要するに、状態を実行主体から切り離すという設計の原則を、そのままエージェントに持ち込んだものと理解できます。ステートレスなアプリケーションと同じ話をしているんですね。
さて、モデルを差し替えられることは分かりました。次に気になるのは「じゃあこれ、誰に使ってもらうのか」です。コンソールのプレイグラウンドは AWS アカウントの中にあるので、社内の非エンジニアにそのまま渡すわけにはいきません。
検証が終わったらハーネスを削除します。マネージドメモリは DeleteHarness でカスケード削除されるのがデフォルト(deleteManagedMemory=false を渡すと残せます)。
左メニュー「メモリー」から消えていることを確認して終わりです。
※ この記事は 2026年9月2日時点の挙動に基づきます。AgentCore まわりは更新が速く、対応プロバイダー・リージョン・コンソールの挙動は今後変わる可能性があります。実際に試す際は公式ドキュメントをご確認ください。