Claude Agent SDKの違いをOpenAI Agents SDKと比較 — 委譲・ツール・セッション
Claude Agent SDKはClaude Codeのエージェントを組み込む道具、OpenAI Agents SDKは少数の部品を組み合わせる道具です。委譲・ツール・セッション・権限の持ち方を並べて比べます。
Claude Agent SDKとOpenAI Agents SDKは何が違うか
どちらもエージェントを自分のアプリに組み込むためのSDKですが、出発点が違います。Claude Agent SDKは、Claude Codeが使っているツール・エージェントループ・コンテキスト管理をPythonとTypeScriptから呼べるようにしたものです。OpenAI Agents SDKは、エージェント・委譲・ガードレールという少数の部品を組み合わせて自分で構成を作る道具です。
前者は「完成したエージェントを埋め込む」、後者は「部品から組み立てる」という捉え方が最も近いでしょう。
| 比べる軸 | Claude Agent SDK | OpenAI Agents SDK |
|---|---|---|
| 設計の出発点 | Claude Agent SDKClaude Codeの機能をライブラリ化 | OpenAI Agents SDK少数のプリミティブを組み合わせる |
| 委譲の単位 | Claude Agent SDKサブエージェント(親が制御を保つ) | OpenAI Agents SDKハンドオフ(制御を渡す)とAgents as tools |
| 組み込みツール | Claude Agent SDKファイル操作・コマンド実行・Web検索など | OpenAI Agents SDK実行基盤ごとのホスト型・ローカル実行型ツール |
| セッション | Claude Agent SDK会話履歴をディスクに自動保存し、resume・forkで戻る | OpenAI Agents SDKSession実装(SQLite・Redisなど)を選んで渡す |
| 安全策の置き場所 | Claude Agent SDK権限評価の順序とモード | OpenAI Agents SDK入出力・ツールのガードレールと承認 |
| モデルの選択肢 | Claude Agent SDKClaudeを動かすSDK | OpenAI Agents SDK既定はResponses API。OpenAI以外のモデルも使える |
| 観測(トレーシング) | Claude Agent SDKフックで処理に介入できる | OpenAI Agents SDK組み込みトレーシングで可視化・デバッグ・評価 |
| 対応言語 | Claude Agent SDKPython・TypeScript | OpenAI Agents SDKこのドキュメントはPython版 |
設計の出発点: 組み込む道具か、組み立てる道具か
Claude Agent SDKの概要ページは、SDKを「Claude Codeのバイナリを動かすライブラリ」と説明しています。ビルトインツール・フック・サブエージェント・MCP・権限・セッションがそのまま使えるのは、中身がClaude Codeだからです。自分のプロセスで運用するエージェントを持ちたいときの選択肢で、Anthropicがホストする形が良ければManaged Agentsが別に用意されています。この3者の切り分けはManaged AgentsとAgent SDK、Claude Codeの使い分けで整理しています。
OpenAI Agents SDKのトップページは、Swarmを本番向けに引き上げたものと説明し、エージェント、Agents as tools / ハンドオフ、ガードレールの3つを基本部品に挙げています。ループは内蔵で、タスクが終わるまで回り続けます。Responses APIを直接叩く選択肢との違いも明記されていて、ループやツール実行を自分で持ちたいならAPI直接、ランタイムに任せたいならSDK、という線引きです。
この差は「何を最初から持っているか」に出ます。Claude側は、ファイルを読み書きしてコマンドを走らせる実行環境まで含めて手元に届きます。OpenAI側は、何を持たせるかをtoolsに並べて決める設計です。
委譲: ハンドオフは制御を渡し、サブエージェントは結果だけ返す
エージェント間の分業は、両者でいちばん手触りが違うところです。
OpenAIのハンドオフは会話の担当を切り替える
OpenAI Agents SDKのハンドオフは、あるエージェントが別のエージェントへタスクを委ねる仕組みです。LLMには「ツール」として見えます。Refund agentへの委譲なら、ツール名はtransfer_to_refund_agentになります。
from agents import Agent, handoff
billing_agent = Agent(name="Billing agent")
refund_agent = Agent(name="Refund agent")
triage_agent = Agent(
name="Triage agent",
handoffs=[billing_agent, handoff(refund_agent)],
)ハンドオフが起きると、新しいエージェントが会話を引き継ぎ、それまでの履歴の全体を見ます。見せたくないときはinput_filterで履歴を絞ります。handoff_filters.remove_all_toolsのように、ツール呼び出しを履歴から外す既製のフィルターも用意されています。
handoff()にはほかにも調整点があります。
tool_name_overrideとtool_description_overrideでツール名と説明を差し替えるon_handoffで、委譲された瞬間にデータ取得などを始めるinput_typeで、理由や優先度といったモデル生成のメタデータを受け取るis_enabledで、実行時にハンドオフを有効・無効にする
宛先が複数あるときは、宛先ごとにハンドオフを1つずつ登録し、モデルに選ばせます。input_typeは宛先を振り分ける仕組みではありません。
OpenAIにはAgents as toolsという別の道もある
制御を渡さず、中心のエージェントが専門エージェントを道具として呼ぶ書き方もあります。agent.as_tool()でエージェントをツールに変えると、親が会話の主導権を持ったまま子の結果を受け取れます。ハンドオフのページ自身も、宛先に構造化された入力を渡したいが会話は移したくないときはAgent.as_tool(parameters=...)を選ぶよう案内しています。
Claudeのサブエージェントは親に最終報告だけを返す
Claude Agent SDKのドキュメントで委譲の基本形として説明されているのは、サブエージェントです。query()のオプションにagentsを渡し、ClaudeがAgentツール経由で呼び出します。
from claude_agent_sdk import query, ClaudeAgentOptions, AgentDefinition
options = ClaudeAgentOptions(
allowed_tools=["Read", "Grep", "Glob", "Agent"],
agents={
"code-reviewer": AgentDefinition(
description="Expert code review specialist. Use for quality and security reviews.",
prompt="You are a code review specialist.",
tools=["Read", "Grep", "Glob"],
),
},
)サブエージェントは独立した会話で動き、途中のツール呼び出しや結果は子の中に留まります。親に戻るのは最終メッセージだけです。ここがハンドオフとの決定的な差で、OpenAIのハンドオフでは新しいエージェントが履歴を丸ごと受け取りますが、Claudeのサブエージェントは(forkを除き)親の会話履歴を受け取りません。渡せるのはAgentツールのプロンプト文字列だけなので、必要なファイルパスやエラーメッセージはプロンプトに書き込みます。
使い分けの基準は、会話の主導権を移したいか、調査を切り出して要約だけ欲しいかです。顧客対応のように担当が切り替わる流れはハンドオフが素直に書けます。コードレビューのように、読み込みの多い作業を別の文脈に隔離したい場面はサブエージェントが向きます。Claude側のサブエージェント定義の詳細はAgent SDKのサブエージェント定義にまとめてあります。
暴走を抑える上限の持ち方
子が子を呼ぶ構成では、上限の設計も違います。Claude Agent SDKは、サブエージェントの入れ子の深さ(既定は3層)、同時実行数(既定は20)、問い合わせ全体の支出(maxBudgetUsd / max_budget_usd)の3つで制限をかけられます。OpenAI側のas_tool()は、max_turnsのような実行オプションで子の実行を絞る形です。
ツール: 持たせるものの出発点が逆になる
Claudeはビルトインから引き算する
Claude Agent SDKは、ファイルの読み書き・編集、コマンド実行、Web検索といったビルトインツールを最初から持っています。独自の機能はカスタムツールで足します。SDKのインプロセスMCPサーバーに関数を登録し、mcpServers経由で渡す形です。名前・説明・入力スキーマ・ハンドラの4点で定義します。実装の詳細はAgent SDKカスタムツールの作り方で扱っています。
サブエージェントごとにもtoolsで使えるツールを絞れます。省略すると、サブエージェントが使える全ツールを継承します。読み取り専用のレビュー役にはRead・Grep・Globだけを渡す、という引き算が基本です。
OpenAIは用途別のツール種別から足す
OpenAI Agents SDKのツールは、次の5分類で整理されています。
- ホスト型ツール: OpenAIのサーバー側で動く(WebSearchTool、FileSearchTool、CodeInterpreterTool、HostedMCPToolなど)
- ローカル実行ツール: ComputerToolとApplyPatchToolは自分の環境で動き、ShellToolはローカルでもホスト型コンテナでも動く
- FunctionTool: 任意のPython関数をツール化する
- Agents as tools: エージェントを呼び出し可能なツールにする
- Codexツール: 実験的な機能
ホスト型ツールはOpenAIResponsesModelを使うときの話で、モデル側の選択とツールの選択が結びついています。ツールが増えたときの対策も違い、OpenAI側にはツール検索で必要な定義だけを実行時に読み込む仕組みがあり、Claude側にもAgent SDK Tool Searchがあります。
セッション管理: ディスクの履歴か、差し替え可能な記憶層か
Claudeは会話をディスクに残して戻る
Claude Agent SDKのセッションは、プロンプト・ツール呼び出し・ツール結果・応答を含む会話履歴で、SDKが自動でディスクに書き出します。戻り方は3通りあります。
- continue: カレントディレクトリで直近のセッションを続ける
- resume: セッションIDを指定して続ける
- fork: 元の履歴を複製して新しいセッションを作り、元は変えない
PythonはClaudeSDKClient、TypeScriptはcontinue: trueで、ID管理なしのマルチターンができます。ステートレスに動かしたいときは、TypeScriptのpersistSession: falseで書き込みを止められます。セッションが保存するのは会話であってファイルシステムではない点にも注意が必要で、ファイル変更の巻き戻しはファイルチェックポイントの役目です。
別ホストで再開するなら、セッションファイルはそのマシンのローカルにあるため、sessionStoreアダプターで自前のバックエンドへ書き出すか、ファイルを移すか、結果をアプリ側の状態として渡し直します。詳しくはAgent SDKのセッション管理とSessionStoreでの永続化を参照してください。
OpenAIはSessionオブジェクトを渡して記憶層を選ぶ
OpenAI Agents SDKのセッションは、複数回のRunner.runにまたがって会話履歴を保つクライアント側のメモリ層です。.to_input_list()を手で回す必要がなくなります。
from agents import Agent, Runner, SQLiteSession
agent = Agent(name="Assistant", instructions="Reply very concisely.")
session = SQLiteSession("conversation_123")
result = await Runner.run(agent, "What city is the Golden Gate Bridge in?", session=session)
result = await Runner.run(agent, "What state is it in?", session=session)実行前に履歴を取り出して入力に前置きし、実行後に新しい項目を保存します。保存先は実装を差し替えて選びます。ローカル開発向けのSQLiteSession、ワーカー間で共有するRedisSessionのほか、SQLAlchemy、Dapr、MongoDB、暗号化ラッパーなどがドキュメントに並びます。OpenAIのConversations APIを使うセッションもあります。
同じ実行で、セッションとconversation_id・previous_response_id・auto_previous_response_idは併用できません。サーバー管理の継続を使うか、セッションを使うかのどちらかを選びます。1つのセッションを複数のエージェントで共有することもできます。
履歴の主導権が逆になっている
Claude側は「SDKが履歴を保存し、アプリはIDで戻る」、OpenAI側は「アプリが保存先を決め、SDKが出し入れする」です。ユーザーごとに会話を分けるアプリでは、どちらもセッションIDをアプリ側のユーザーと結びつける作業が残ります。
ハンドオフとの相互作用もあります。OpenAI側では、ハンドオフ時の履歴圧縮(nest_handoff_history)は既定で無効のオプトイン(ベータ)で、サーバー管理の会話ではハンドオフの入力フィルターが使えません。履歴を絞る設計をするなら、クライアント管理のセッションとの組み合わせになります。
権限とガードレール: 守る場所が違う
Claudeはツール呼び出しの前に評価の順序がある
Claude Agent SDKは、ツールが要求されるたびに、フック、拒否ルール、確認ルール、権限モードの順で評価します。拒否ルールはbypassPermissionsモードでも効きます。モードはdefault・dontAsk・acceptEdits・bypassPermissions・plan・autoの6種類です。
サブエージェントにも注意点があります。サブエージェントは親の権限モードで動き、親がbypassPermissionsのときはサブエージェントも同じモードになります。広い権限を渡すときは、子にも及ぶと考える必要があります。詳細はAgent SDKのパーミッション制御とAgent SDKのHooksにあります。
OpenAIは入出力とツールをガードレールで挟む
OpenAI Agents SDKの安全策の中心はガードレールです。入力ガードレールは最初のエージェントだけ、出力ガードレールは最終出力を作ったエージェントだけで動きます。つまり、ハンドオフでエージェントが連鎖する構成では、途中のエージェントの入出力は検査対象になりません。各ツール呼び出しの前後を検査したいなら、ツールガードレールを使います。ただし、ハンドオフの呼び出し自体にはツールガードレールは効きません。
ガードレールが違反を検知すると、トリップワイヤーで例外が上がり、実行が止まります。入力ガードレールには、エージェントと並列で走る既定のモードと、先に終わらせてからエージェントを起動するブロッキングのモードがあり、後者ならトークンの消費やツールの副作用を防げます。
人の承認が要る操作は、ツールのneeds_approvalで止められます。実行は中断してresult.interruptionsに承認待ちを返し、RunStateで承認してから再開します。ローカルのShellToolとApplyPatchToolは、needs_approvalの既定がFalseです。ドキュメントは、SDKの承認機能は隔離環境ではないので、コマンドの実行場所やファイル変更の範囲は実装側で制限する必要があると注意しています。
同じ「止める」でも差し込む位置が違う
Claudeは「ツールが実行される手前の判定」に権限の仕組みが集まり、OpenAIは「入力・出力・ツールという層」にガードレールが分かれています。前者は設定で絞り込む運用、後者はコードで検査を書く運用になりやすいでしょう。
使い分けの早見表
| 状況 | 向きやすい選択 | 理由 |
|---|---|---|
| コード・ファイルを扱う作業をアプリに埋め込みたい | 向きやすい選択Claude Agent SDK | 理由ファイル操作とコマンド実行が最初から揃う |
| 窓口が専門担当へ会話を引き渡す顧客対応 | 向きやすい選択OpenAI Agents SDK | 理由ハンドオフが担当の切り替えをそのまま表せる |
| 調査を切り出して要約だけ受け取りたい | 向きやすい選択どちらも可 | 理由Claudeはサブエージェント、OpenAIはAgents as tools |
| 履歴の保存先をRedisやDBに揃えたい | 向きやすい選択OpenAI Agents SDK | 理由Session実装を選んで差し込める |
| 履歴をIDで戻り、分岐も試したい | 向きやすい選択Claude Agent SDK | 理由resumeとforkが標準で用意されている |
| 実行前の承認と設定ルールで絞りたい | 向きやすい選択Claude Agent SDK | 理由評価順序とモードが一式ある |
| 入出力の検査をコードで書き込みたい | 向きやすい選択OpenAI Agents SDK | 理由ガードレールとトリップワイヤー |
どちらかの機能を、もう一方で作り直す必要は多くありません。ただし、両者はモデルの選び方からして別の前提を置いています。Claude Agent SDKはClaudeを動かすSDKで、第三者の製品にclaude.aiのログインを持ち込めず、APIキーでの認証を使う決まりもあります。OpenAI Agents SDKは既定でResponses APIを使い、ホスト型ツールもOpenAIのモデルとの組み合わせで成り立ちます。OpenAI側にはトレーシングも組み込まれていて、エージェントの流れを可視化・デバッグ・評価に使えます。トップページはOpenAI以外のプロバイダーも使えると案内しているので、モデルの選択肢はOpenAI側のほうが広くなります。乗り換えを視野に入れるなら、委譲・セッション・権限の3点がそのまま移植できないことが前提になります。
乗り換えや併用で引っかかる点
OpenAIのハンドオフ前提で組んだ設計をClaudeに移す場合は、「担当の引き渡し」を「親が子を呼んで結果を受け取る」形に書き換える必要があります。引き渡し先に会話の履歴を見せたいなら、親のプロンプトに必要な情報を明示して渡します。
逆にClaudeのサブエージェント前提の設計をOpenAIに移す場合は、as_tool()が近い対応です。ただし、as_tool()の入れ子の実行は、親の会話状態を自動では継承しません。履歴を共有したいなら、親と子に同じセッションを明示的に渡します。
権限の移し替えも要注意です。Claudeのallowed_toolsや拒否ルールに当たる設定は、OpenAI側ではツールごとのneeds_approvalとガードレールに分解されます。1対1の写し替えにはならないので、守りたい操作を洗い出してから対応を決めるのが近道です。