← 試験の目次へ

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.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)

ツールを使うやりとりは、次のくり返しです。

  1. ツールの定義(名前、説明、input_schema)とメッセージを送る
  2. Claude がツールを使いたいとき、応答は stop_reason: "tool_use" になり、tool_use ブロックが入る
  3. 自分のコードでそのツールを実行し、結果を tool_result ブロックで返す
  4. 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)

ポイント:

2.3 Claude Agent SDK

Agent SDK は、Claude Code を動かしている「ツール・エージェントループ・コンテキスト管理」を、Python と TypeScript のライブラリとして使えるようにしたものです。

ループの流れ:

  1. プロンプトを受け取る(SDK は SystemMessage、subtype "init" を出す)
  2. Claude が考え、文章かツール呼び出しを返す(AssistantMessage)
  3. SDK がツールを実行し、結果を Claude に返す(UserMessage)。フックで実行前に止めたり変えたりできる
  4. ツール呼び出しがなくなるまで 2〜3 をくり返す
  5. 最後に 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 での定期実行、インフラを作りたくない場合

自前ホストのセッションの型(例):

Managed Agents の4つの概念:

概念 意味
Agent モデル、システムプロンプト、ツール、MCP サーバー、スキル。1回作って ID で使い回す
Environment セッションを動かす場所(Anthropic のクラウドサンドボックス か 自前のサンドボックス)
Session 環境の中で動いているエージェントの実体。1つの仕事をする
Events アプリとエージェントのやりとり(ユーザーの発言、ツールの結果、状態の通知)。応答は SSE でストリーミングされる

Managed Agents の注意点(2026年11月時点):

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」です。

並列のツール実行(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 サブエージェントのページより):

AgentDefinition のおもな項目:

項目 必須 意味
description はい いつこのエージェントを使うか(Claude はこれを見て呼ぶか決める)
prompt はい このエージェントのシステムプロンプト
tools いいえ 使えるツール。省略すると使えるツールをすべて引き継ぐ
disallowedTools いいえ 外すツール
model いいえ モデルの上書き(opus、sonnet、haiku、inherit など)
skills、mcpServers、maxTurns、effort、permissionMode、background など いいえ スキル、MCP、上限、推論の深さ、権限、バックグラウンド実行

サブエージェントが受け取るもの・受け取らないもの(フォーク以外):

受け取る 受け取らない
自分のシステムプロンプトと、Agent ツールに渡されたプロンプト 親の会話履歴とツールの結果
プロジェクトの CLAUDE.md(settingSources で読み込んだ場合) 親のシステムプロンプト
ツールの定義 —

大事な結論: 親から子へ渡せるのは Agent ツールのプロンプトだけです。ファイルのパス、エラーメッセージ、決めたことなど、子に必要な情報はそのプロンプトに直接書きます。

その他:

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 の考え方:


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。外部のツールやデータとつなぐ共通の仕様

出典

内容は上の出典を要約・言い換えたものです(ライセンスに配慮して書き直しています)。