技術約9分で読めます

AWSのStrands harnessとClaude Code・Codexを同じモデル同士で比べた

いけさん目次

AWSのStrands Agentsチームが、2026年9月21日に「Strands harness」を公開した。
AIエージェントの外側の仕組みを一式組み立て済みで配るライブラリで、PythonとTypeScriptの両方があり、ライセンスはApache 2.0。
使うLLMは model 引数の文字列1つで差し替えられる。
日本では2026年9月29日にPublickeyと、その転載のITmedia NEWSが取り上げた。

発表の見出しは「Claude CodeやCodexと同じモデルを使って28%安い」。
公式ブログのグラフは埋め込みHTMLで、中に元の数値がそのまま書かれていた。
その数値を取り出し、同じモデル同士で比べた結果をまとめる。

ハーネスはLLMの外側の部分

AIエージェントは、LLM単体では動かない。
LLMが「このコマンドを実行したい」と出力したら実際に実行して結果を返す、会話が長くなったら古い部分を要約して詰める、前回の続きから再開する。
こうしたLLMの外側の処理をまとめてハーネスと呼ぶ。
Claude CodeやCodex CLIも、それぞれのハーネスにモデルを組み込んだ構成になっている。

公式ブログは、Claude CodeやCodexでローカル環境では動いたエージェントが、自前で組み直すと同じようには動かないという不満から始まっている。
Strands harnessは、その「組み立て済みのハーネス」をライブラリとして配り、クラウドでも動かせるようにした作りになっている。
ただし用途はコーディング専用ではなく、汎用エージェントとして作ったと書いている。

土台は同じチームの「Strands Harness SDK」で、ソースはGitHubのstrands-agents/harness-sdkの harness-py と harness-ts にある。
SDKのほうはハーネスを部品から組むためのもので、Strands harnessはその部品を既定値付きで組み上げた完成品にあたる。

最初から入っている機能

create_harness() を引数なしで呼ぶと、以下の機能が有効になったエージェントが作成される(既定値は設定リファレンスによる)。

機能既定の動き
モデルAmazon Bedrock上のClaude Opus 5(bedrock/global.anthropic.claude-opus-5)
推論の強さeffort="auto"。プロバイダーの推奨レベルを使う
組み込みツールshell、read、write、edit、web_fetch、web_search、programmatic_tool_caller、subagent
コンテキスト管理約1,500トークンを超えるツール結果を切り詰め、コンテキストが85%を超えたら要約で圧縮、上限に達したらループ内で復旧
プロンプトキャッシュ対応するプロバイダーでは有効
セッションセッションIDを渡すと前の会話を再開。保存先は ./.agent/sessions
長期記憶ファイルベースで有効。保存先は ./.agent/memory
スキル./.agent/skills にあるAgent Skillsを読み込む
サブエージェント組み込みの generalist にサブタスクを委譲する
ToDo複数手順の作業をチェックリストで追う

programmatic_tool_caller は、モデルが書いたコードの中からツールを呼ばせる機能だ。

公式ブログは、トークン効率と正答率の差の大部分はこのコンテキスト管理の既定値によるものだと説明している。
ツールの出力が長ければ切ってファイルに保存し、会話履歴が長くなれば早めに要約する方針だ。

LLMは文字列1つで入れ替える

モデルの指定は プロバイダー/モデル名 の文字列で渡す。
モデル設定のドキュメントによると、使えるプロバイダーの接頭辞は bedrock、bedrock-mantle、anthropic、openai、google、ollama、litellm の7つ。
接頭辞がない文字列はBedrockのモデルIDとして扱われる。

# pip install strands-harness
from strands_harness import create_harness

agent = create_harness(model="openai/gpt-5.6-sol")
agent("Research the top three vector databases, compare pricing and limits, and write it up in comparison.md")

TypeScriptでは createHarness({ model: "openai/gpt-5.6-sol" }) と書く。
anthropic/claude-opus-5 や google/gemini-3.5-flash に書き換えれば別のモデルで同じエージェントが動き、ローカルのOllamaなら ollama/llama3.1 のように指定する。
LiteLLMを経由すれば、エイリアスのないプロバイダーにもつなげられる。

推論の強さは effort で "low"・"medium"・"high"・"off" を選ぶ。
プロバイダーごとの推論設定の違いはライブラリ側で合わせる。
そのプロバイダーが受け付けないレベルを指定すると、リクエストの途中ではなくエージェントの作成時にエラーになる。

モデルを替えると挙動が変わる機能もある。
モデル内蔵の web_search が使えるのはOpenAI、Anthropic、Googleなどのモデルに限られ、プロンプトキャッシュもStrands harness側で設定するのはBedrockとAnthropic直結の場合だけだ。
OpenAI、Gemini、Bedrock Mantle、LiteLLMはプロバイダー側で自動的にキャッシュされ、Ollamaではキャッシュが効かない。

公式ベンチマークの数値

公式ブログのグラフは2つあって、1つは6種類のベンチマークの平均、もう1つはターミナル操作の課題を解かせる「Terminal-Bench 2.1」を取り出した比較だ。
どちらもグラフ用HTMLのソースに書かれていた数値を表に起こした。
計測はAmazon EC2上で、評価フレームワークHarborを使って分散実行したとされている。

6ベンチマークの平均

使ったベンチマークはALFWorld、ContextBench、GAIA、WebShop、τ³-bench、Terminal-Bench 2.1の6つ。
点数は6つの平均スコア、コストは1タスクあたりの平均ドルだ。
比較相手はClaude Code、Codex、oh-my-pi、OpenCode、DeepSeek Harnessの5つ。
下の表では、Claude CodeとCodexに対して、同じモデルを載せたStrands harnessを並べた。

モデル比較相手相手のスコア相手のコストStrandsのスコアStrandsのコスト
Claude Fable 5Claude Code80.94%$1.87281.11%$0.829
Claude Opus 5Claude Code84.60%$1.06384.55%$0.634
Claude Opus 4.8Claude Code77.32%$0.98377.14%$0.421
Claude Sonnet 5Claude Code71.55%$0.97475.61%$0.311
GPT-5.6 SolCodex76.59%$0.62876.72%$0.293
GPT-5.6 TerraCodex59.06%$0.17864.75%$0.143
GPT-5.6 LunaCodex62.66%$0.02861.94%$0.009

スコアの差は、7組中5組で1ポイント未満だった。
差が大きいのはClaude Sonnet 5の約4ポイントとGPT-5.6 Terraの約6ポイントで、どちらもStrands harnessが上だった。
コストはどの組でもStrands harnessが安く、Claude Code相手だと6割から3分の1程度になっている。

見出しの「28%」は、この5つの比較相手全体に対する数字だ。
グラフの注記によると、DeepSeek HarnessはStrands harnessより約14%安いが、全ベンチマークでスコアが低い。
このDeepSeek Harnessを含めた結果、全体の削減幅が28%にとどまったと書かれている。
Claude Code単体との比較では、削減幅はさらに大きい。

Terminal-Bench 2.1でClaude Fable 5を載せた比較

2つ目のグラフは、全ハーネスにClaude Fable 5を載せ、Terminal-Bench 2.1を各89試行で解かせた比較だ。

ハーネス正答率コストトークン数
DeepSeek Harness59.55%$40.302,144万
Strands harness69.66%$56.292,873万
OpenCode66.29%$73.423,711万
oh-my-pi69.66%$86.834,506万
Claude Code61.80%$248.055,499万

発表の「Claude Codeより77%安い」はこの表の数字だ。
$56.29は$248.05の約23%で、正答率はClaude Codeより7.86ポイント高い。
oh-my-piも正答率は同じ69.66%だが、コストはStrands harnessの約1.5倍かかっている。

トークン数の差は約1.9倍なのに、コストの差は約4.4倍ある。
この開きの内訳は、公式ブログでは説明されていない。

ベンチマークの数字を読むときの注意

このベンチマークはAWS自身が計測して公表したもので、研究者の論文を後日公開するとされている。
英The Registerは、Strands harnessが汎用エージェントを掲げているのに対し、比較相手がすべてコーディングエージェントだと指摘している。

グラフのソースには、集計の条件も注記されていた。

注記の内容影響
6ベンチマークすべてでコストが取れた組だけを描画eve、deepagents、GPT-6 Astraは除外。Astraは大半のベンチでコストが欠けていた
欠けたセルは別の集計(harbor-report-sep17)の値で補ったClaude Code+Fable 5のTerminal-Bench、oh-my-piの4点のContextBench、Codex+GPT-5.6 TerraのALFWorldが該当
コストは計測値があればそれを使い、なければ推定どのセルが推定かはグラフからは分からない

Claude Codeの6ベンチ平均にあるFable 5の行は、Terminal-Benchの値を別の集計から引用している。
表の数字はそのまま並べたが、こうした補完や推定を含む比較になっている点には注意が要る。

既定ではシェルを承認なしで実行する

Claude Codeに慣れていると特に注意が必要なのが、ツール実行の承認だ。
Strands harnessの既定では、ツール呼び出しを止める仕組みである interventions が設定されていなくて、すべての呼び出しがそのまま実行される。
シェルとファイル操作の実行先もホスト上のローカル環境になっており、引数なしで作ったエージェントは動かしているマシンの上で確認なしにコマンドを実行する。

interventionsのドキュメントによると、承認の設定方法は以下の通り用意されている。

指定動き
interventions="ask"すべてのツール呼び出しで承認を求める
interventions="smart"SDKのリスク判定機能が危険と判定した呼び出しだけ承認を求める
自然文の文字列「ファイル削除やネットワーク通信の前に確認して」のような文をリスク判定の基準にする
.cedar で終わるパスCedarのポリシーファイルで許可・拒否を決める

組み込みのサブエージェント generalist も同じ設定を引き継ぐため、サブエージェントに処理を任せて承認を回避することはない。
本番運用のドキュメントも、運用前にシェルとファイル編集への承認、および programmatic_tool_caller の設定を決めるよう促している。
programmatic_tool_caller はモデルが書いたコードをMontyという仕組みで隔離して動かすが、そのコードから呼ばれるツールまでは隔離されない。
信頼できない入力を扱う場合は、DockerやSSHのサンドボックス内で動かすか、このツールを無効化することが推奨されている。

シェルツール自体は呼び出しごとに新しいプロセスを立ち上げる作りで、作業ディレクトリや環境変数は次の呼び出しに持ち越されない。
ファイル系ツールは絶対パスだけを受け付け、.. を含むパスは拒否する。

デプロイ先

Linuxコンテナが動く環境ならどこにでもデプロイできるとされ、公式ブログはModal、Cloudflare Containers、Azure Container Apps、Google Cloud Run、Amazon ECS、Amazon Bedrock AgentCoreを例に挙げている。
create_harness() が返すのは通常のStrandsの Agent なので、SDK向けのデプロイ手順がそのまま使える。

コンテナやサーバーレスに置くときは保存先の設計が前提になる。
セッションと長期記憶は既定で ./.agent 以下に書き込むため、インスタンスが破棄されると消える。
session={"dir": ...} と memory={"dir": ...} で、永続化したボリュームなどに指定し直す。

インストールとCLI

ライブラリは pip install strands-harness(Python 3.10以上)か npm install @strands-agents/harness でインストールできる。
2026年9月29日時点のバージョンは、PyPIが0.1.2、npmが0.1.1。

対話的に試すならStrands CLIがある。
公式ブログのデモでは、CLIでモデルとツールを選んでエージェントを組み、「Playwright MCPを追加して、ブログ記事の動画の読み込み遅延を測って」と指示していた。
動作を確かめたあと /export を実行すると、Playwright MCPの設定を含んだPythonかTypeScriptのコードが書き出される。
このCLI自体もStrands harnessの上に作られている。