Claude Media
Claude Agent SDKとCrewAIの違い — 役割を割り当てるか、ループに任せるか

Claude Agent SDKとCrewAIの違い — 役割を割り当てるか、ループに任せるか

CrewAIはロールとタスクを定義してチームで動かし、Claude Agent SDKはClaude Codeのエージェントループを組み込みます。モデル接続・ツール・実行制御・分業を並べて選び方を示します。

違いは「設計図を書くか、動くループを受け取るか」にある

Claude Agent SDKとCrewAIは、どちらもエージェントをコードから動かす道具です。ただ、開発者が最初に手にするものが違います。

CrewAIは、エージェントに役割(role)・目的(goal)・背景(backstory)を与え、仕事をタスクとして切り出し、チーム(Crew)にまとめて動かすフレームワークです。設計の中心は「誰に何を任せるか」です。

Claude Agent SDKは、Claude Codeのエージェントループ・ビルトインツール・コンテキスト管理を、PythonとTypeScriptから呼べるようにしたライブラリです。ループはすでに動いており、設計の中心は「何を許可し、どこで止めるか」になります。

比べる軸Claude Agent SDKCrewAI
設計の単位Claude Agent SDKプロンプトと許可設定、必要ならサブエージェントCrewAIAgent(ロール)・Task・Crew・Flow
次の一手を決める主体Claude Agent SDKClaudeがループの中で決めるCrewAIタスクの並びとプロセス(順次または階層)
最初から持つものClaude Agent SDKファイル操作・コマンド実行・Web検索・フック・権限・セッションCrewAIツールの仕組み・メモリ・ガードレール・チェックポイント
接続できるモデルClaude Agent SDKClaude Codeが動かすClaude(Claude API直のほか、Bedrock・Vertex AI・Foundry経由も可)CrewAIOpenAI・Anthropic・Google・Azure・Bedrockなど
向く仕事Claude Agent SDKコードやファイルを触って完結させる自律作業CrewAI役割分担した成果物の受け渡し

CrewAIの中身は、ロールとタスクと進行役

CrewAIの紹介ページは、アプリの骨格をFlows、実働部隊をCrewsと説明しています。Flowはステップと状態の流れを決める「進行役」で、Crewはそこから呼ばれる自律エージェントのチームです。

Agentにはrole・goal・backstoryの3つが基本の属性として並びます。Taskはdescriptionとexpected_outputで仕事と完成形を書き、agentで担当を決めます。前のタスクの結果を使いたいときはcontextに渡します。

from crewai import Agent, Crew, Process, Task
 
researcher = Agent(
    role="Research Analyst",
    goal="Find and summarize information about specific topics",
    backstory="You are an experienced researcher",
)
analyst = Agent(
    role="Data Analyst",
    goal="Analyze findings and identify key trends",
    backstory="You excel at finding patterns",
)
 
research_task = Task(
    description="Research the latest developments in AI",
    expected_output="A list of recent AI developments",
    agent=researcher,
)
analysis_task = Task(
    description="Analyze the research findings",
    expected_output="Analysis report of AI trends",
    agent=analyst,
    context=[research_task],
)
 
crew = Crew(
    agents=[researcher, analyst],
    tasks=[research_task, analysis_task],
    process=Process.sequential,
)

上の断片は、CrewAIのドキュメントにある定義例を組み合わせた形です。実行するにはAPIキーなどの設定が別に要ります。

プロセスはsequentialとhierarchicalの2種類です。順次実行ではタスクの定義順に進み、前のタスクの出力が次の文脈になります。階層実行ではマネージャー役のLLM(manager_llm)か専用エージェント(manager_agent)が、タスクの割り振りと出来のチェックを担います。

Claude Agent SDKの中身は、動いているループ

SDKの側は、設計図ではなく完成した1周の流れを渡してきます。Claudeがツール呼び出しを要求し、SDKが実行して結果を返す。この1往復が1ターンで、ツール呼び出しを含まない応答が出たところで終わります。ループの進行はClaudeが決め、コードが介入できるのはフックや権限コールバックの場面に限られます。

import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
 
 
async def main():
    async for message in query(
        prompt="Fix the failing tests in auth.py",
        options=ClaudeAgentOptions(
            allowed_tools=["Read", "Edit", "Bash"],
            max_turns=20,
            max_budget_usd=2.0,
        ),
    ):
        if hasattr(message, "result"):
            print(message.result)
 
 
asyncio.run(main())

役割も担当も書いていません。誰が何をするかはClaudeがループの中で決め、開発者が書くのは許可するツールと上限だけです。ビルトインツールには、ファイル操作(Read・Edit・Write)、検索(Glob・Grep)、Bash、WebSearch・WebFetch、サブエージェントを呼ぶAgentなどが含まれます。

インストールはpip install claude-agent-sdkで、Python 3.10以上かNode.js 18以上が前提です。

モデル接続: 選べるCrewAIと、Claude前提のSDK

モデルの選択肢は、2つの差がもっとも分かりやすく出る場所です。

CrewAIはOpenAI・Anthropic・Google Gemini・Azure・AWS Bedrockをネイティブ連携で扱い、それ以外のプロバイダーはLiteLLMを経由します。Ollamaで動かすローカルモデルや、OpenAI互換のAPIもbase_urlの指定で使えます。Claudeを使うなら次のように書きます。

from crewai import LLM
 
llm = LLM(
    model="anthropic/claude-sonnet-4-6",
    api_key="your-api-key",  # ANTHROPIC_API_KEYでも可
    max_tokens=4096,         # Anthropicでは必須
)

Anthropicのモデルではmax_tokensが必須パラメーターとして示されています。Agentに渡すときはAgent(llm=llm, ...)の形です。

CrewAIのドキュメントには、既定モデルの記述がページごとに揺れている箇所があります。LLM接続のページは「OPENAI_MODEL_NAMEが未設定ならgpt-4o-mini」と書き、Agentの属性表は「OPENAI_MODEL_NAMEまたはgpt-4」と書いています。llmを明示しないエージェントがどのモデルで動くかは、Claude目的で組むなら最初に固定しておく項目です。

Agent SDKは、Claude Codeのバイナリを動かすライブラリなので、動かすのはClaudeです。認証にはAPIキー(ANTHROPIC_API_KEY)を使います。Amazon BedrockならCLAUDE_CODE_USE_BEDROCK=1とAWSの認証情報、Vertex AIやMicrosoft Foundryもそれぞれの設定で使えます。またSDKは.envファイルを自動では読みません。サードパーティが製品にclaude.aiのログインやレート制限を載せることは、事前の承認がない限り認められていません。

ツール: 足していくCrewAIと、最初から持つSDK

CrewAIのツールは「エージェントが使える技能や関数」で、CrewAI Toolkitのツール、LangChainのツール、自作のBaseToolサブクラスをtoolsに渡して使います。キャッシュ、非同期、型付き出力も備えます。

見落としやすいのが失敗の扱いです。ツールが例外を出さずに「失敗」を返すと、エラー文は普通の結果としてエージェントに届き、実行は成功として記録されます。CrewAIはこれにToolFailureを返す方式を用意し、tool_failure_policyでignore・warn(既定)・raiseを選ばせます。

Agent SDKはファイル編集やコマンド実行を最初から持ちます。足したいツールは、@toolデコレーターで作り、create_sdk_mcp_serverでアプリ内のMCPサーバーにして渡します。外部のサービスはMCPで繋ぎます。

  • CrewAI: ツールを集めて役割に配る発想
  • SDK: 標準で揃ったツールに、必要なものだけ足す発想

コードを読み書きして検証する仕事では、前者は自作が増えやすく、後者は最初から手元にあります。逆にWeb検索やRAGなど既製ツールの顔ぶれを使いたい仕事は、CrewAIのToolkitが近道です。

実行制御: 暴走をどこで止めるか

どちらも「エージェントが走りすぎる」ことへの備えを持ちますが、止める場所が違います。

止めたいものCrewAIClaude Agent SDK
反復回数CrewAImax_iter(既定20)Claude Agent SDKmax_turns
費用CrewAIAgentの属性表に上限なしClaude Agent SDKmax_budget_usd(サブエージェントの分も含む)
実行時間・頻度CrewAImax_execution_time・max_rpmClaude Agent SDKオプション表に上限なし
出力の検証CrewAIタスクのguardrail(関数またはLLM)Claude Agent SDKフックで検証して拒否
人の確認CrewAIhuman_input、Flowの@human_feedbackClaude Agent SDK権限の確認コールバック(canUseTool)
途中再開CrewAIcheckpointとCrew.from_checkpoint()Claude Agent SDKセッションのresumeとfork

CrewAIの強みは、出力の検証が仕組みとして整っている点です。ガードレールは次のタスクへ渡す前に出力を検証し、失敗するとエージェントに差し戻し、既定で3回まで再試行します。

SDKの強みは、ツール呼び出しの手前で止める権限の流れです。評価は「フック → 拒否ルール → 確認ルール → 権限モード → 許可ルール → canUseTool」の順に進み、拒否ルールはbypassPermissionsモードでも効きます。たとえばBash(rm *)のようなスコープ付きの拒否は、モードに関係なくブロックされます。拒否をユーザーに見せる実装はpermission_deniedイベントの記事にまとめています。

options = ClaudeAgentOptions(
    allowed_tools=["Read", "Grep", "Glob"],
    disallowed_tools=["Bash(rm *)"],
    permission_mode="dontAsk",
    max_turns=15,
    max_budget_usd=1.0,
)

dontAskは、確認が要る呼び出しをすべて拒否するモードです。上の設定では、許可した読み取り系だけが走り、それ以外は聞かれずに止まります。無人の定期実行で「勝手に増える権限」を作らないための組み方です。

分業: マネージャーに配らせるか、サブエージェントに委ねるか

複数のエージェントに仕事を分ける場面でも、発想が分かれます。

CrewAIの階層プロセスでは、マネージャーがタスクを事前に決めずに能力に応じて割り振り、成果物を確認します。エージェント側はallow_delegationで他のエージェントへの委任を許すかどうかを決めます(既定は許さない)。

Agent SDKでは、agentsパラメーターにAgentDefinitionを渡し、description・prompt・tools・modelを書きます。呼び出すかどうかはClaudeがdescriptionを読んで決め、Agentツール経由で動きます。

  • サブエージェントは新しい会話で始まり、親の履歴は渡りません。親に戻るのは最終メッセージだけです
  • toolsで絞れば、読み取り専用のレビュー役のように権限を狭められます
  • 並列実行ができ、独立した作業は一番遅いものの時間で終わります
  • 入れ子の深さは既定で3層、同時実行は20までで、環境変数で変えられます

つまりCrewAIは「分業の構造を人が描く」、SDKは「分業の必要性をClaudeが判断し、人が上限と権限を決める」設計です。同じ分業でも、LangGraphのようにノードとエッジで遷移まで描く方式との距離はClaude Agent SDKとLangGraphの違いで、OpenAIのSDKとの対比はClaude Agent SDKとOpenAI Agents SDKの比較で整理しています。

状態の持ち方: Flowの永続化か、セッションの再開か

長い仕事は途中で止まります。再開の単位も両者で違います。

CrewAIのFlowは、状態(State)を非構造・構造化のどちらでも持てます。@persistによるメソッド単位・クラス単位の永続化があり、保存した状態から別の実行へフォークすることもできます。Crew単体なら、checkpoint=Trueでタスク完了ごとに.checkpoints/へ保存し、Crew.from_checkpoint()で完了済みのタスクをやり直さずに再開します。

Agent SDKの単位は会話そのものです。ClaudeSDKClientはマルチターンの会話を1プロセスで続け、continue_conversation=Trueは同じディレクトリの直近のセッションを引き継ぎます。特定のセッションを戻すなら、結果に含まれるセッションIDをresumeに渡します。元を残したまま別案を試すならforkです。

  • 「どのタスクまで終わったか」を持つのがCrewAI
  • 「どの会話の続きか」を持つのがSDK

工程が決まった定型業務は前者、対話しながら進める作業は後者が自然に収まります。

どちらを選ぶか

こういう仕事なら向く選択
コードベースを読み、直し、テストを回して完結させる向く選択Claude Agent SDK
調べる人・まとめる人・チェックする人と、成果物を受け渡す向く選択CrewAI
Claude以外のモデルも同じ枠組みで使い分けたい向く選択CrewAI
無人で動かし、許可と費用の上限を厳格にしたい向く選択Claude Agent SDK
出力の形式を検証して再試行させたい向く選択CrewAI(ガードレール)
Anthropic側で動かしたい向く選択Managed Agents

迷うときは、仕事の成果物が「ファイルやコードの変更」か「受け渡される文書やデータ」かで見ます。前者はSDK、後者はCrewAIの形にはまりやすい傾向があります。

組み合わせる場合の組み立て案

2つは排他ではありません。CrewAIのエージェントに、Agent SDKを呼ぶBaseToolを持たせる構成も考えられます。コードを触る工程だけをSDKに任せ、前後の調査と報告はCrewAIの役割に置く形です。

import asyncio
from crewai.tools import BaseTool
from claude_agent_sdk import query, ClaudeAgentOptions
 
 
class FixTests(BaseTool):
    name: str = "fix_failing_tests"
    description: str = "Run the Claude agent to fix failing tests."
 
    def _run(self, instruction: str) -> str:
        async def go() -> str:
            result = ""
            async for m in query(
                prompt=instruction,
                options=ClaudeAgentOptions(
                    allowed_tools=["Read", "Edit", "Bash"],
                    max_turns=20,
                    max_budget_usd=2.0,
                ),
            ):
                if hasattr(m, "result"):
                    result = m.result
            return result
 
        return asyncio.run(go())

上の例は同期の_runの中でasyncio.runを呼んでいます。Pythonでは、イベントループがすでに動いているスレッドからasyncio.runを呼ぶとRuntimeErrorになります。ループ上でツールが呼ばれる構成では、CrewAIが公式にサポートしているasync def _runで書き、queryを直接awaitする形に替えます。SDK側にmax_turnsとmax_budget_usdを置いておくと、CrewAIから呼んだ1回の費用と反復に上限が掛かります。

まとめ

CrewAIは「誰に何を任せるか」を人が設計し、Claude Agent SDKは「どこまで任せ、どこで止めるか」を人が決めます。モデルの選択肢と出力検証を取るならCrewAI、コードを触る自律作業と権限・費用の制御を取るならSDKです。両者はツールとして繋げる余地があるので、最初から二者択一にしなくても構いません。

この記事を共有:XはてブLinkedIn