Developer Foundations ドメイン1: エージェントとワークフロー(14.7%)
この章で学ぶこと: エージェントとワークフローの違い、Claude でエージェントを作る方法、よく使う設計パターン。
| スキル | 配点 | この章の節 |
|---|---|---|
| エージェントのアーキテクチャ(Agent Architecture) | 4.5% | 第1節 |
| Claude でのエージェント構築(Agent Construction with Claude) | 5.3% | 第2節 |
| エージェントのパターンとフレームワーク(Agent Patterns and Frameworks) | 4.9% | 第3節 |
本番の53問のうち、このドメインから約8問出る計算です。
注意: 製品の機能名やパラメータ名は変わることがあります。この教材は2026年11月時点の公式ドキュメントにもとづきます。本番前に公式ドキュメントで最新を確認してください。
1. エージェントのアーキテクチャ(4.5%)
1.1 ワークフローとエージェントの違い
Anthropic は、LLM とツールを組み合わせたシステム全体を「エージェント型システム(agentic systems)」と呼び、その中を2つに分けています。
| 種類 | 定義 | 強み | 向いている仕事 |
|---|---|---|---|
| ワークフロー(workflow) | LLM とツールを、あらかじめ決めたコードの道筋で動かす | 予測しやすい、結果がそろう | 手順が決まっている仕事 |
| エージェント(agent) | LLM が自分で手順とツールの使い方を決める | 柔軟、モデルが判断する | 手順の数が読めない、道筋を固定できない仕事 |
具体例:
- 請求書の処理(読む → 項目を抜き出す → 形式をチェック → 登録)は手順が決まっている。ワークフローが向く
- 「このバグを直して」は、何ファイル直すか事前にわからない。エージェントが向く
1.2 どちらを選ぶか: いちばん簡単な方法から
Anthropic の推奨は「できるだけ簡単な方法を選び、必要なときだけ複雑にする」です。
| 段階 | 方法 | いつ選ぶか |
|---|---|---|
| 1 | 1回の LLM 呼び出し(検索結果や例をプロンプトに入れる) | 多くのアプリはこれで十分 |
| 2 | ワークフロー | 手順が決まっていて、1回では精度が足りない |
| 3 | エージェント | 手順が読めず、柔軟さとモデルの判断が必要 |
トレードオフ: エージェント型システムは、精度を上げる代わりにレイテンシとコストが増えます。エージェントは自律的なので、コストが高く、ミスが積み重なるおそれもあります。サンドボックスでの十分なテストとガードレールが推奨されています。
試験で問われやすい判断: 「エージェントにすべきか」と聞かれたら、まず「もっと簡単な方法で足りないか」を考えます。
1.3 基本の部品: 拡張 LLM(augmented LLM)
エージェント型システムの土台は、検索(retrieval)・ツール・メモリで強化された LLM です。Claude は自分で検索クエリを作り、ツールを選び、何を覚えておくかを決められます。これらをつなぐ方法の1つが MCP(Model Context Protocol)です。
1.4 5つのワークフローパターン
| パターン | しくみ | 向いている場面 | 例 |
|---|---|---|---|
| プロンプトチェーン(prompt chaining) | 仕事を順番の段階に分け、前の出力を次に渡す。途中にプログラムのチェック(ゲート)を入れられる | 決まったサブタスクにきれいに分けられる。速さより精度 | 広告文を書く → 翻訳する。目次を書く → 条件チェック → 本文を書く |
| ルーティング(routing) | 入力を分類し、専用の処理に振り分ける | 種類がはっきり分かれ、分類が正確にできる | 問い合わせを一般・返金・技術サポートに振り分ける。簡単な質問は Haiku、難しい質問は Sonnet に回す |
| 並列化(parallelization) | 同時に複数の LLM を動かし、結果をプログラムで集める。分割(sectioning)と投票(voting)の2種類 | 速くしたい、または複数の視点で確信を高めたい | 分割: 1つのモデルが回答し、別のモデルが不適切な内容をチェック。投票: 複数のプロンプトで同じコードの脆弱性をチェック |
| オーケストレーター・ワーカー(orchestrator-workers) | 中心の LLM が仕事を動的に分け、ワーカー LLM に任せ、結果をまとめる | 必要なサブタスクを事前に予測できない | 毎回いくつものファイルを変えるコーディング。複数の情報源を調べる検索 |
| 評価・最適化(evaluator-optimizer) | 1つが回答を作り、別の1つが評価とフィードバックを返す。これをくり返す | 評価基準がはっきりしていて、くり返すと明らかに良くなる | 文学作品の翻訳。何回も検索が必要な調査 |
並列化とオーケストレーター・ワーカーの違い: 形は似ていますが、並列化はサブタスクが事前に決まっています。オーケストレーター・ワーカーは、入力を見てからサブタスクを決めます。
1.5 マネージャー/スーパーバイザー型の階層
マネージャー(スーパーバイザー)が仕事を分けて部下のエージェントに任せる構成です。Anthropic の Research 機能はこの形(オーケストレーター・ワーカー型)で作られています。
- リードエージェントが質問を分析し、戦略を立て、サブエージェントを並列に起動する
- サブエージェントは自分のコンテキストで検索をくり返し、要点だけをリードに返す
- リードが結果をまとめて最終回答を作る
Anthropic が公開した数字(社内評価):
| 項目 | 結果 |
|---|---|
| Opus 4 リード + Sonnet 4 サブエージェント vs Opus 4 単体 | 社内の調査評価で 90.2% 上回った |
| トークン使用量 | エージェントは通常のチャットの約4倍、マルチエージェントは約15倍 |
| 並列化の効果 | リードが3〜5個のサブエージェントを並列起動し、サブエージェントも3つ以上のツールを並列に使うことで、複雑な調査の時間を最大90%短縮 |
マルチエージェントが向かない場面: すべてのエージェントが同じコンテキストを共有する必要がある仕事や、エージェント同士の依存関係が多い仕事。例として、多くのコーディング作業は調査ほど並列にできません。
マネージャーへの指示のこつ(同じ記事より):
- 各サブエージェントに、目的・出力形式・使うツールと情報源・仕事の範囲を伝える。指示があいまいだと、仕事が重なったり抜けたりする
- 質問の難しさに合わせて力の入れ方を決める。例: 簡単な事実確認は1エージェントでツール呼び出し3〜10回、複雑な調査は10以上のサブエージェント
1.6 サブエージェントがタスク実行を良くする理由
Claude Agent SDK のドキュメントは、サブエージェントの利点を4つ挙げています。
| 利点 | 意味 | 例 |
|---|---|---|
| コンテキストの分離 | サブエージェントは自分の会話で動く。途中のツール結果は親に入らず、最後のメッセージだけが返る | 調査役が何十ものファイルを読んでも、親には要約だけが届く |
| 並列化 | 独立したサブタスクを同時に進め、いちばん遅いものの時間で終わる | コードレビューで、スタイル・セキュリティ・テスト網羅の3つを同時にチェック |
| 専門の指示 | それぞれに専用のシステムプロンプトを持たせられる | DB 移行役にだけ、SQL やロールバックの詳しい知識を持たせる |
| ツールの制限 | 使えるツールを絞り、意図しない操作のリスクを減らす | 文書レビュー役は Read と Grep だけ。ファイルを変更できない |
2. Claude でのエージェント構築(5.3%)
2.1 Claude で作る4つの方法
| 方法 | エージェントのループを動かすのは | 向いている用途 |
|---|---|---|
| クライアント SDK(Client SDK)で Messages API を直接呼ぶ | 自分のコード(ツールのループを自分で書く。ベータの tool runner に任せることもできる) | 細かく制御したい独自のループ |
| Claude Agent SDK | 自分のアプリのプロセス(Claude Code と同じループ、組み込みツール、権限、セッション、フックをライブラリとして使う。Python と TypeScript) | 自分のアプリに本格的なエージェントを組み込む |
| Claude Code CLI | ターミナル | 日々の対話的な開発、1回限りの作業 |
| Claude Managed Agents | Anthropic(ホストされたハーネス) | 長時間の仕事、非同期の仕事、インフラを持ちたくない場合 |
Python や TypeScript 以外の言語から同じループを使いたいときは、CLI を -p フラグと --output-format json 付きでサブプロセスとして起動する方法があります。
2.2 独自のエージェントループ(Messages API)
ツールを使うやりとりは、次のくり返しです。
- ツールの定義(名前、説明、
input_schema)とメッセージを送る - Claude がツールを使いたいとき、応答は
stop_reason: "tool_use"になり、tool_useブロックが入る - 自分のコードでそのツールを実行し、結果を
tool_resultブロックで返す stop_reasonが"tool_use"でなくなる(例:"end_turn")まで、2〜3 をくり返す
import anthropic
client = anthropic.Anthropic() # APIキーは環境変数 ANTHROPIC_API_KEY から読む
tools = [{
"name": "get_order_status",
"description": "注文番号から注文の状況を返す。注文番号は '#' から始まる数字。",
"input_schema": {
"type": "object",
"properties": {"order_id": {"type": "string"}},
"required": ["order_id"],
},
}]
messages = [{"role": "user", "content": "注文 #1234 はいつ届きますか?"}]
while True:
response = client.messages.create(
model="MODEL_ID", # 使うモデルのIDを入れる
max_tokens=1024,
tools=tools,
messages=messages,
)
# Claude の応答を履歴に足す(ツール呼び出しも含めて)
messages.append({"role": "assistant", "content": response.content})
# ツールを使わなくなったら終わり
if response.stop_reason != "tool_use":
break
# 要求されたツールをすべて実行し、結果を返す
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = run_tool(block.name, block.input) # 自分で実装する関数
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id, # どの呼び出しへの結果かを対応づける
"content": result,
})
messages.append({"role": "user", "content": tool_results})
print(response.content[-1].text)
ポイント:
- ツールの結果は会話の履歴に足していく。だから Claude は次の行動を考えられる
- ループを続けるか止めるかは
stop_reasonで判断する。応答の文章を読んで判断しない - ツールには2種類ある。クライアントツール(自分のアプリで実行する)と、サーバーツール(
web_search、web_fetch、code_executionなど。Anthropic 側で実行される)
2.3 Claude Agent SDK
Agent SDK は、Claude Code を動かしている「ツール・エージェントループ・コンテキスト管理」を、Python と TypeScript のライブラリとして使えるようにしたものです。
ループの流れ:
- プロンプトを受け取る(SDK は
SystemMessage、subtype"init"を出す) - Claude が考え、文章かツール呼び出しを返す(
AssistantMessage) - SDK がツールを実行し、結果を Claude に返す(
UserMessage)。フックで実行前に止めたり変えたりできる - ツール呼び出しがなくなるまで 2〜3 をくり返す
- 最後に
ResultMessage(最終の文章、トークン使用量、コスト、セッションID)を出す
組み込みツールの例:
| 分類 | ツール |
|---|---|
| ファイル操作 | Read、Edit、Write |
| 検索 | Glob(ファイル名のパターン)、Grep(中身を正規表現で検索) |
| 実行 | Bash |
| Web | WebSearch、WebFetch |
| 発見 | ToolSearch(必要なツールをその場で探して読み込む) |
| 組み立て | Agent(サブエージェント起動)、Skill、AskUserQuestion、TaskCreate、TaskUpdate |
ループを制御するおもな設定(Python 名 / TypeScript 名):
| 設定 | 意味 |
|---|---|
max_turns / maxTurns |
ターン数の上限。超えると ResultMessage の subtype が error_max_turns |
max_budget_usd / maxBudgetUsd |
費用の上限。超えると error_max_budget_usd。本番のエージェントでは上限の設定がよい初期値 |
allowed_tools / allowedTools |
確認なしで実行してよいツール |
disallowed_tools / disallowedTools |
使わせないツール(ほかの設定より優先) |
permission_mode / permissionMode |
承認のしかた(下の表) |
effort |
推論の深さ(下の表)。簡単な仕事は低くしてコストを下げる |
権限モード(permission mode)は6つです。
| モード | ふるまい |
|---|---|
default |
許可ルールにないツールは承認を求める。CLI などの画面では「Manual」と表示され、manual という別名も使える |
acceptEdits |
作業ディレクトリ内のファイル編集と、よく使うファイル操作コマンド(mkdir、touch、mv、cp など)を自動で許可する |
plan |
読むこと・調べることはできるが、ソースファイルは編集しない(計画を先に作る) |
auto |
ふだんの確認なしで動く。シェルコマンドやネットワーク要求の前に、別の分類モデルが許可・拒否を判断する |
dontAsk |
確認が必要になる呼び出しをすべて自動で拒否する。承認する人がいないヘッドレスのエージェント向け |
bypassPermissions |
確認を飛ばす(一部の操作は除く)。CI やコンテナなど隔離された環境だけで使う |
effort(推論の深さ)は5段階です。
| レベル | 意味 |
|---|---|
low |
いちばん効率的。トークンを大きく節約できるが、能力は少し下がる |
medium |
バランス型 |
high |
必要なだけトークンを使い、良い結果を出す |
xhigh |
長い仕事向けに、さらに深く考える |
max |
上限なしで最大の能力を出す |
注意: 使えるレベルと初期値はモデルごとに違います。多くのモデルの初期値は high ですが、medium が初期値のモデルもあります。xhigh や max に対応しないモデルもあります。
ResultMessage の subtype で結果を確かめます: success、error_max_turns、error_max_budget_usd、error_during_execution、error_max_structured_output_retries。最終の文章(result)は success のときだけ入ります。
権限モードの使い分け(公式の推奨): 対話アプリは default と承認用コールバック、開発機でファイルを編集するエージェントは acceptEdits、bypassPermissions は CI やコンテナなど隔離された環境だけ。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition, ResultMessage
async def main():
options = ClaudeAgentOptions(
allowed_tools=["Read", "Grep", "Glob", "Agent"],
agents={
"code-reviewer": AgentDefinition(
description="コードの品質とセキュリティを確認するレビュー担当。",
prompt="あなたはコードレビューの専門家です。問題点と修正案を挙げてください。",
tools=["Read", "Grep", "Glob"], # 読むだけ。編集はできない
),
},
max_turns=20,
)
async for message in query(prompt="src/auth をレビューして", options=options):
if isinstance(message, ResultMessage):
print(message.subtype, message.total_cost_usd)
asyncio.run(main())
2.4 配備のしかた: 自前ホスト と Anthropic ホスト
| Agent SDK を自前でホスト | Claude Managed Agents(Anthropic ホスト) | |
|---|---|---|
| ループが動く場所 | 自分のサーバー。SDK は claude CLI のサブプロセスを起動し、stdio で話す |
Anthropic のホストされたハーネス |
| ツールが動く場所 | 自分の環境 | Anthropic が管理するクラウドのサンドボックス、または自分のインフラ上のサンドボックス |
| 状態 | セッションの記録などはローカルディスク。コンテナが消えると消えるので、SessionStore などで保存する | サーバー側に保存される(会話履歴、サンドボックスの状態、出力) |
| 向いている用途 | 細かい制御、独自の環境 | 数分〜数時間の長い仕事、非同期の仕事、cron での定期実行、インフラを作りたくない場合 |
自前ホストのセッションの型(例):
- 使い捨て(ephemeral): 仕事ごとにコンテナを作り、終わったら消す。例: バグ調査と修正、請求書の抽出、文書の翻訳
- 長時間(long-running): コンテナを動かし続ける。例: メールを仕分けて返信するエージェント、Slack のチャットボット
Managed Agents の4つの概念:
| 概念 | 意味 |
|---|---|
| Agent | モデル、システムプロンプト、ツール、MCP サーバー、スキル。1回作って ID で使い回す |
| Environment | セッションを動かす場所(Anthropic のクラウドサンドボックス か 自前のサンドボックス) |
| Session | 環境の中で動いているエージェントの実体。1つの仕事をする |
| Events | アプリとエージェントのやりとり(ユーザーの発言、ツールの結果、状態の通知)。応答は SSE でストリーミングされる |
Managed Agents の注意点(2026年11月時点):
- ベータ版です。すべてのモデルで、ベータとして提供されています
- すべてのエンドポイントにベータヘッダー
managed-agents-2026-04-01が必要です。公式 SDK を使うと自動で付きます - 状態を持つ設計(会話履歴、サンドボックスの状態、出力をサーバー側に保存する)のため、現時点ではゼロデータ保持(Zero Data Retention)や HIPAA BAA の対象外です。医療データなどの要件があるときは注意します
- 保存されたデータは、API でセッションやアップロードしたファイルを削除して管理できます
2.5 フック: 決まった処理を確実に行う
フックは、ループの決まったタイミングで自分のコードを実行するしくみです。フックはアプリのプロセスで動くので、コンテキストを使いません。
| フック | いつ動くか | よくある使い方 |
|---|---|---|
| PreToolUse | ツールの実行前 | 入力の検証、危険なコマンドを止める |
| PostToolUse | ツールが結果を返した後 | 出力の監査、副作用(通知など) |
| UserPromptSubmit | プロンプトが送られたとき | 追加のコンテキストを入れる |
| Stop | エージェントが終わるとき | 結果の検証、セッションの状態の保存 |
| SubagentStart / SubagentStop | サブエージェントの開始・終了 | 並列の仕事の追跡と集計 |
| PreCompact | コンテキスト圧縮の前 | 圧縮前に全記録を保存する |
なぜフックか: プロンプトで「〇〇しないで」と書いても、モデルが守る確率は100%ではありません。必ず守らせたいルール(例: rm -rf を止める、上限額を超える返金を止める)はフックで強制します。PreToolUse フックが拒否すると、ツールは実行されず、Claude は拒否のメッセージを受け取ります。
Agent SDK(Python)での例。公式の hooks ページの形に合わせています。
from claude_agent_sdk import ClaudeAgentOptions, HookMatcher
# フックの関数は3つの引数を受け取る
async def block_dangerous_bash(input_data, tool_use_id, context):
# PreToolUse の入力には tool_name と tool_input が入る
command = input_data["tool_input"].get("command", "")
if "rm -rf" in command:
return {
"hookSpecificOutput": {
"hookEventName": input_data["hook_event_name"], # "PreToolUse"
"permissionDecision": "deny",
"permissionDecisionReason": "rm -rf は禁止されています",
}
}
# 空のオブジェクトを返すと、そのまま実行を許す
return {}
options = ClaudeAgentOptions(
# matcher で対象のツールを絞る("Write|Edit" のように複数も書ける)
hooks={"PreToolUse": [HookMatcher(matcher="Bash", hooks=[block_dangerous_bash])]}
)
フックの関数の入力と出力:
| 内容 | |
|---|---|
| 引数1: 入力データ | イベントの詳細。すべてのフックに session_id、cwd、hook_event_name が入る。PreToolUse には tool_name と tool_input も入る |
| 引数2: tool_use_id | 同じツール呼び出しの PreToolUse と PostToolUse を対応づける ID |
| 引数3: context | TypeScript では中止用の signal。Python では将来のための予約 |
戻り値 {} |
何も変えずに実行を許す |
戻り値 hookSpecificOutput |
PreToolUse では permissionDecision("allow"、"deny"、"ask"、"defer")、permissionDecisionReason、updatedInput(入力の書き換え)を設定する。PostToolUse では additionalContext(結果に情報を足す)や updatedToolOutput(結果を差し替える)を設定する |
| 戻り値の共通項目 | systemMessage(ユーザーへのメッセージ)、continue(Python では continue_。エージェントを続けるか) |
複数の PreToolUse フックが違う判断を返したときの優先順位: deny > defer > ask > allow。1つでも拒否すれば拒否になります。
3. エージェントのパターンとフレームワーク(4.9%)
3.1 ツール利用ループ
エージェントの中身は、多くの場合「環境からのフィードバックを見ながら、ループの中でツールを使う LLM」です。
- 各ステップで、ツールの結果やコードの実行結果などの「実際の結果(ground truth)」を得て、進み具合を判断する
- 止まる条件: 仕事が終わったら止まる。管理のために最大反復回数などの停止条件を足すことも多い
- 区切り(チェックポイント)や行き詰まったときに、人の判断を求めて止まることができる
並列のツール実行(Agent SDK): 1ターンで複数のツールが要求されたとき、読むだけのツール(Read、Glob、Grep、読み取り専用の MCP ツール)は同時に実行できます。状態を変えるツール(Edit、Write、Bash)は衝突を避けるため順番に実行します。
ツール設計も大事です。Anthropic はツールの説明を「新人に向けた良いドキュメント」のように書くことを勧めています。使用例、例外ケース、入力形式、ほかのツールとの境目を書きます。SWE-bench 用エージェントでは、相対パスで間違いが起きたため、ツールが常に絶対パスを要求するように変えたところ、間違いがなくなったそうです。
3.2 サブエージェント
Agent SDK でのサブエージェントの作り方は3つです。
| 方法 | 説明 |
|---|---|
| プログラムで定義(推奨) | query() の agents パラメータに AgentDefinition を渡す |
| ファイルで定義 | .claude/agents/ に Markdown ファイルを置く |
| 組み込みの汎用サブエージェント | 何も定義しなくても、Claude が Agent ツールで呼べる |
サブエージェントは Agent ツール で起動されます。
名前についての注意(公式の Agent SDK サブエージェントのページより):
- 今の名前は
Agent。tool_useブロックでは"Agent"と出る - 古い名前は
Task。Claude Code v2.1.63 より前は、tool_useブロックでも"Task"と出ていた - 今でも
system:initのツール一覧では"Task"と表示される - 公式ドキュメントは、どのバージョンでも動くよう、サブエージェントの検出で
"Task"と"Agent"の両方を確かめるよう勧めている - Architect Foundations の試験ガイドは古い名前(Task ツール)で書かれている。試験では両方の名前を同じものとして理解しておく
AgentDefinition のおもな項目:
| 項目 | 必須 | 意味 |
|---|---|---|
description |
はい | いつこのエージェントを使うか(Claude はこれを見て呼ぶか決める) |
prompt |
はい | このエージェントのシステムプロンプト |
tools |
いいえ | 使えるツール。省略すると使えるツールをすべて引き継ぐ |
disallowedTools |
いいえ | 外すツール |
model |
いいえ | モデルの上書き(opus、sonnet、haiku、inherit など) |
skills、mcpServers、maxTurns、effort、permissionMode、background など |
いいえ | スキル、MCP、上限、推論の深さ、権限、バックグラウンド実行 |
サブエージェントが受け取るもの・受け取らないもの(フォーク以外):
| 受け取る | 受け取らない |
|---|---|
| 自分のシステムプロンプトと、Agent ツールに渡されたプロンプト | 親の会話履歴とツールの結果 |
プロジェクトの CLAUDE.md(settingSources で読み込んだ場合) |
親のシステムプロンプト |
| ツールの定義 | — |
大事な結論: 親から子へ渡せるのは Agent ツールのプロンプトだけです。ファイルのパス、エラーメッセージ、決めたことなど、子に必要な情報はそのプロンプトに直接書きます。
その他:
- フォーク(fork): 新しく始めるのではなく、それまでの会話をコピーしたサブエージェント
- サブエージェントの説明(description)は具体的に書く。Claude はそれを見て自動で呼ぶ。確実に呼ばせたいときはプロンプトで名前を出す
- サブエージェントは再開(resume)できる。完了時の結果に
agentIdが入る
3.3 メモリ
| しくみ | 何をするか |
|---|---|
| セッション | 会話をまたいでコンテキストを保つ。ResultMessage の session_id を保存して、後で再開(resume)や分岐(fork)ができる |
| CLAUDE.md | プロジェクトのルールを毎回読み込む。圧縮されても消えないので、守り続けるルールはここに書く |
| メモリツール(Messages API) | Anthropic がスキーマを定めたクライアントツール。会話をまたいで、自分が管理するファイルに情報を保存・取得する |
| 外部メモリ | 長い仕事では、終わった段階を要約して外に保存してから次へ進む(Research システムの手法) |
3.4 コンテキストウィンドウの管理
コンテキストウィンドウは、1つのセッションでモデルが使える情報の総量です。ターンが進んでもリセットされず、システムプロンプト、ツール定義、会話履歴、ツールの入出力がたまっていきます。
| 手法 | 説明 |
|---|---|
| 自動圧縮(compaction) | 上限に近づくと、古い履歴を要約して空きを作る。最初のほうの細かい指示は消えることがある |
| サブエージェントに任せる | 子は最終の回答だけを返すので、親のコンテキストは要約ぶんしか増えない |
| ツールを絞る | ツール定義もコンテキストを使う。AgentDefinition の tools で最小限にする |
| ツール検索(tool search) | MCP ツールなどを、全部先に読み込まず必要なときに読み込む |
/compact |
手動で圧縮する |
| 変わらない部分のキャッシュ | システムプロンプトやツール定義など、毎回同じ部分は自動でプロンプトキャッシュされる |
3.5 エージェントのフレームワーク
試験ガイドが例に挙げるフレームワーク:
| フレームワーク | 提供元 | ひとこと |
|---|---|---|
| Strands Agents | AWS(オープンソース) | モデル・システムプロンプト・ツールを渡すと、モデル主導でループを回す SDK。Python と TypeScript |
| LangGraph | LangChain | 長時間動く、状態を持つエージェントのための低レベルのオーケストレーション基盤。共有の状態・ノード・辺のグラフでワークフローを定義し、決まった手順と LLM 主導の手順を混ぜられる。永続的な実行、ストリーミング、人の確認(human-in-the-loop)が得意。LangChain がなくても使える |
| Pydantic AI | Pydantic | 本番品質の生成AIアプリを作りやすくする Python のエージェントフレームワーク。最初から最後まで型を重視する(Python 3.11 以上) |
| Claude Agent SDK | Anthropic | Claude Code と同じループを自分のアプリに入れる |
フレームワークについての Anthropic の考え方:
- 利点: LLM の呼び出し、ツールの定義とパース、呼び出しの連結など、低レベルの作業を簡単にする
- 欠点: 抽象化の層が増えると、中のプロンプトと応答が見えにくくなり、デバッグが難しくなる。必要以上に複雑にしたくなる
- 推奨: まず LLM の API を直接使う(多くのパターンは数行で書ける)。フレームワークを使うなら、中のコードを理解しておく。中身についての思い込みはよくある失敗の原因
4. 試験に向けたまとめ
| 問われ方 | 考え方 |
|---|---|
| ワークフローかエージェントか | 手順が決まっていればワークフロー。読めなければエージェント。まずはいちばん簡単な方法 |
| どのパターンか | 順番 → チェーン、種類分け → ルーティング、同時 → 並列化、動的に分ける → オーケストレーター・ワーカー、評価してくり返す → 評価・最適化 |
| ループを止める条件 | stop_reason が "tool_use" でなくなったとき。文章の中身では判断しない |
| サブエージェントに情報を渡す | Agent ツールのプロンプトに直接書く。親の履歴は引き継がれない |
| 必ず守らせたいルール | プロンプトではなくフック(PreToolUse など)で強制 |
| 自前ホストか Anthropic ホストか | 細かい制御 → Agent SDK。長時間・非同期・インフラ不要 → Managed Agents。ただし ZDR / HIPAA BAA が必要なら Managed Agents は対象外 |
| 暴走を防ぐ | max_turns、max_budget_usd、権限モード、ツールの制限 |
| マルチエージェントの代償 | トークンが多い(チャットの約15倍)。価値の高い、並列にできる仕事に使う |
5. 用語集
| 用語 | 意味 |
|---|---|
| エージェント型システム | LLM とツールを組み合わせたシステムの総称 |
| ハーネス(harness) | エージェントのループ、ツール実行、実行環境をまとめた土台 |
| stop_reason | 応答が止まった理由。tool_use(ツールを使いたい)、end_turn(終わり)、max_tokens(出力上限)など |
| tool_use / tool_result | ツール呼び出しのブロック / その結果を返すブロック |
| サブエージェント | 親エージェントが起動する、別のコンテキストで動くエージェント |
| AgentDefinition | Agent SDK でサブエージェントを定義する設定 |
| フック | ループの決まったタイミングで動く自分のコード |
| 圧縮(compaction) | コンテキストが上限に近づいたとき、古い履歴を要約すること |
| MCP | Model Context Protocol。外部のツールやデータとつなぐ共通の仕様 |
出典
- Building effective agents(Anthropic Engineering): ワークフローとエージェントの定義、5つのパターン、フレームワークの考え方、ツール設計
- How we built our multi-agent research system(Anthropic Engineering): オーケストレーター・ワーカー、90.2%、約15倍のトークン、並列化
- Agent SDK overview(Claude Code Docs): Agent SDK・CLI・Client SDK・Managed Agents の比較、機能一覧
- How the agent loop works(Claude Code Docs): ループ、メッセージの種類、組み込みツール、権限モード、上限、圧縮、フック
- Subagents in the SDK(Claude Code Docs): AgentDefinition、受け継ぐもの、Agent ツール、フォーク、再開
- Hosting the Agent SDK(Claude Code Docs): サブプロセスのモデル、使い捨て・長時間のセッション
- Claude Managed Agents overview(Claude Platform Docs): 4つの概念、使う場面、ベータヘッダー、ZDR / HIPAA BAA の対象外
- Tool use overview(Claude Platform Docs):
stop_reason: "tool_use"、クライアントツールとサーバーツール、tool_choice - Subagents in the SDK: Detect subagent invocation(Claude Code Docs): ツール名は今
"Agent"、v2.1.63 より前は"Task"、system:initでは"Task" - Intercept and control agent behavior with hooks(Claude Code Docs、Agent SDK): フック関数の3つの引数、入力の共通項目、
hookSpecificOutput、permissionDecisionの値と優先順位 - Hooks reference(Claude Code Docs): フックの JSON 出力の全項目
- Configure permissions(Claude Code Docs): 6つの権限モードと
manualの別名 - Effort(Claude Platform Docs): 5つの effort レベル、モデルごとの初期値と対応
- Strands Agents(公式サイト) / Strands Agents の紹介(AWS ブログ)
- LangGraph overview(LangChain Docs)
- Pydantic AI(公式ドキュメント)
内容は上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。