check-crewai-api について
CrewAIのコードを書く、またはレビューする開発者向けに、CrewAI 1.15.xの実際のAPIをまとめたリファレンスです。利用可能なフィールド、インポート、実行時の挙動や、誤りが無視されるケースを説明します。
主な機能
- 01Agent、Task、Crewの引数確認
- 02現在のインポートパスの例
- 03kickoffと結果の参照方法
- 04構造化出力の設定説明
- 05LLMプロバイダーの設定要件
活用シーン
- 01CrewAI更新後のコード互換性確認
- 02無視される引数や無効設定の調査
- 03構造化タスク出力の設定
- 04MCPツール接続方法の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crewaiinc/ skills --skill check-crewai-apiインストール後、Claude Code で/check-crewai-apiを入力して読み込まれたか確認します。
同梱ファイルreferences/source-receipts.mdreferences/verify-installed-api.md
詳細
CrewAI API の確認
crewai のコードを記述またはレビューする前に、これを読み込んでください。おそらく覚えている内容と、crewai 1.15.x で実際に受け付けられる内容を対応付けています。
2026-10-01 に crewai 1.15.22 および 1.15.23 で検証済みです。
2026-10-01 に実際の LLM でライブテスト済みです。
まず crewai version を実行してください。メジャーまたはマイナーバージョンが 1.15 と異なる場合は、信頼する前に ask-docs スキルでバージョン依存の行を再検証してください。
1. 何かを書く前に知っておくべき3つのルール
-
不明なキーワード引数は黙って無視されます。
Agent、Task、Crewは、存在しないパラメーターを受け付けて破棄します。Crew(memory_config={...})やTask(response_format=Model)は問題なく生成されますが、何も行いません。古いパラメーター名を使っても例外は発生しないため、実在することを確認してください。from crewai import Agent, Crew, Task assert "response_model" in Task.model_fields # real field assert "response_format" not in Task.model_fields # silently dropped if passed assert "memory_config" not in Crew.model_fields # silently dropped if passed print(sorted(Agent.model_fields)[:5]) -
インストール済みのソースが、ドキュメント、チュートリアル、記憶よりも優先されます。 これには、
crewai createが新しいプロジェクトに生成するAGENTS.mdも含まれます。以下の行が重要な場合は、インストール済みのシグネチャを確認してください(verify-installed-api.md を参照)。 -
構造化出力は境界でアサートしてください。 以下のいくつかの間違いは、実行が成功したと報告される一方で、
out.pydantic is Noneとなり、ひそかに失敗します。
2. インポート
| おそらく書いた内容 | 現在の 1.15.x 形式 | 間違った形式で起きること |
|---|---|---|
from crewai_tools import BaseTool, tool | from crewai.tools import BaseTool, tool | ImportError: cannot import name 'BaseTool' from 'crewai_tools' |
from crewai.flow.flow import Flow, start, listen, persist | from crewai.flow import Flow, start, listen, router, or_, and_, persist | ImportError: cannot import name 'persist' |
from crewai.task import ConditionalTask | from crewai.tasks.conditional_task import ConditionalTask | ImportError |
from crewai.memory import ShortTermMemory, LongTermMemory, EntityMemory | from crewai import Memory | ImportError(クラスは削除されています) |
from crewai.utilities.events import crewai_event_bus | from crewai.events import BaseEventListener, crewai_event_bus | ModuleNotFoundError: No module named 'crewai.utilities.events' |
from crewai_tools import CodeInterpreterTool | crewai に代替品はありません。サンドボックスツールまたはサービスを使用してください | ImportError(削除済み) |
現在のトップレベルおよびプロジェクトのインポート:
from crewai import Agent, BaseLLM, Crew, CrewOutput, Flow, LLM, Memory, Process, Task, TaskOutput
from crewai.project import CrewBase, after_kickoff, agent, before_kickoff, crew, llm, task, tool
from crewai.tools import BaseTool, tool
from crewai.flow import Flow, and_, listen, or_, persist, router, start
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
from crewai.mcp import MCPServerHTTP, MCPServerSSE, MCPServerStdio
from crewai.events import BaseEventListener, crewai_event_bus
3. Agent、Task、Crew のパラメーターとデフォルト値
| パラメーター | 現在の値 | 備考 |
|---|---|---|
Task.expected_output | 必須 | Task(description=...) だけでは ValidationError ... expected_output Field required が発生します |
Agent.max_iter | 25 | 15 または 20 と想定しないでください |
Agent.llm | None -> 構築時に解決 | 環境変数 MODEL、次に MODEL_NAME、次に OPENAI_MODEL_NAME を参照し、いずれも設定されていない場合は gpt-4.1-mini が使われます |
Agent.cache | True | キャッシュを許可するだけで、有効化するわけではありません |
Crew.cache | False | ツール結果のキャッシュはオプトインです。有効にするには Crew(cache=True) を設定します |
Crew.memory | False | |
Crew.process | Process.sequential | 存在するのは sequential と hierarchical のみです |
Task.guardrail_max_retries | 3 | max_retries は非推奨です(DeprecationWarning) |
| おそらく書いていた内容 | 現在の形式 | 誤った形式で発生すること |
|---|---|---|
Process.consensual | Process.sequential または Process.hierarchical | AttributeError |
マネージャーを指定せずに Crew(process=Process.hierarchical, ...) | manager_llm="openai/gpt-4.1-mini" または manager_agent=... を追加 | ValidationError: Attribute manager_llm or manager_agent is required |
Crew(memory=True, memory_config={...}) | Crew(memory=Memory(...)) | memory_config は黙って無視されます |
Agent(allow_code_execution=True) / code_execution_mode="unsafe" | 削除し、サンドボックスツールを使用 | 非推奨の no-op です。allow_code_execution=True は DeprecationWarning を出します |
Crew(function_calling_llm=...) | 削除するか、エージェントごとに llm を設定 | 非推奨です。DeprecationWarning が出ます |
同じ agent を使う async_execution=True のタスクを2つ | 並行する非同期タスクごとに別のエージェントを使用 | RuntimeError: Executor is already running. Cannot invoke the same executor instance concurrently. |
from crewai import Agent, Crew, Process, Task
researcher = Agent(
role="Researcher",
goal="Find facts about {topic}",
backstory="A careful researcher.",
llm="openai/gpt-4.1-mini",
)
research = Task(
description="List three facts about {topic}.",
expected_output="Three bullet points.",
agent=researcher,
)
crew = Crew(agents=[researcher], tasks=[research], process=Process.sequential, cache=True)
out = crew.kickoff(inputs={"topic": "honey bees"})
print(out.raw)
4. Crew の実行と結果の読み取り
| おそらく書いていた内容 | 現在の形式 | 誤った形式で発生すること |
|---|---|---|
crew.kickoff("honey bees") | crew.kickoff(inputs={"topic": "honey bees"}) | TypeError: inputs must be a dict or Mapping, got str |
ネイティブな非同期処理で await crew.kickoff_async(...) | await crew.akickoff(...) | 動作しますが、kickoff_async は同期処理の kickoff をスレッド(asyncio.to_thread)で実行します |
result.output / result.final_output / result.result | result.raw | AttributeError: 'CrewOutput' object has no attribute ... |
同じ Crew で crew.kickoff(...) の後に crew.kickoff_for_each(...) を呼び出す | kickoff_for_each 用に新しい Crew を構築する(または、kickoff を呼び出す前に実行する) | エラーは発生しませんが、すべての実行で最初の kickoff の入力が再利用されます。実行ごとのコピーには、すでに補間されたタスクテキストが保持されています |
await crew.akickoff() を使う Crew の実行で Agent(mcps=["https://..."]) | mcps=[MCPServerHTTP(url="https://...")](crewai.mcp から) | エラーは発生しませんが、エージェントは MCP ツールを1つも取得しません。文字列の参照は asyncio.run() で解決されますが、実行中のイベントループ内では失敗します(connect-tools-and-mcp を参照) |
CrewOutput のフィールド:raw、pydantic、json_dict、tasks_output(TaskOutput のリスト)、token_usage。out["field"] は pydantic / json_dict から読み取ります。kickoff_for_each(inputs=[...]) は CrewOutput のリストを返します。
token_usage は実行ごとではなく、各エージェントの LLM オブジェクトの存続期間全体にわたる合計です。1つの LLM(...) インスタンスを2つのエージェントで共有すると、すべての呼び出しが2回分カウントされます。また、同じインスタンスを複数の Crew で再利用すると、前の Crew のトークンも加算されます(anthropic/claude-haiku-4-5 で検証済み。同じ LLM を使った2回目の1回呼び出しの Crew では148トークン、2リクエストが報告され、新しい LLM では73トークン、1リクエストでした)。実行ごとのコストを算出するには、Crew ごとに専用の LLM オブジェクトを割り当てるか、LLMCallCompletedEvent(event.usage)を数えてください。
import asyncio
from crewai import Agent, Crew, Task
def make_crew() -> Crew:
writer = Agent(role="Writer", goal="Write", backstory="Writes short text.", llm="openai/gpt-4.1-mini")
task = Task(description="One line on {topic}.", expected_output="One line.", agent=writer)
return Crew(agents=[writer], tasks=[task])
out = make_crew().kickoff(inputs={"topic": "bees"})
print(out.raw, out.token_usage.total_tokens, [t.raw for t in out.tasks_output])
many = make_crew().kickoff_for_each(inputs=[{"topic": "bees"}, {"topic": "ants"}])
print([o.raw for o in many])
async def main():
return await make_crew().akickoff(inputs={"topic": "wasps"})
print(asyncio.run(main()).raw)
5. LLM、モデル文字列、プロバイダーの追加機能
LiteLLM は依存関係ではなくなりました。LLM(model=...) はネイティブプロバイダークラスを返すファクトリーです。コアの crewai に含まれるのは OpenAI SDK のみです。
| おそらく以前に書いていた形式 | 現在の形式 | 誤った形式で起こること |
|---|---|---|
crewai のみをインストールし、llm="anthropic/claude-sonnet-4-5" と指定 | uv add "crewai[anthropic]" を実行してから、同じ文字列を指定 | ImportError: Anthropic native provider not available, to install: uv add "crewai[anthropic]" |
crewai のみをインストールし、llm="gemini/gemini-2.5-flash" と指定 | uv add "crewai[google-genai]" | ImportError: Google Gen AI native provider not available |
llm="groq/llama-3.3-70b-versatile"(または mistral/... など、ネイティブプロバイダー以外) | uv add "crewai[litellm]" | ImportError: Unable to initialize LLM with model '...'. The model did not match any supported native provider (...), and the LiteLLM fallback package is not installed. |
llm= を指定せず、gpt-4 が使われると思っている | デフォルトは gpt-4.1-mini です。MODEL=... または llm= を設定してください | |
llm.call(messages, response_format=Model) | llm.call(messages, response_model=Model) | TypeError: ... unexpected keyword argument 'response_format'. Did you mean 'response_model'? |
カスタム BaseLLM.call(self, messages, tools=None, callbacks=None, available_functions=None) | from_task=None、from_agent=None、response_model=None も受け付けるようにしてください(または **kwargs を指定) | キックオフ時に TypeError: call() got an unexpected keyword argument 'from_task' |
ネイティブプロバイダー:openai、anthropic/claude、azure、google/gemini、bedrock/aws、openrouter、deepseek、ollama、hosted_vllm、cerebras、dashscope、snowflake。追加機能:crewai[anthropic]、crewai[google-genai]、crewai[bedrock]、crewai[azure-ai-inference]、crewai[litellm]。コンストラクターは API キーを確認せず、キックオフ時に確認します(ValueError: OPENAI_API_KEY is required または ANTHROPIC_API_KEY is required。キーが間違っている場合は、プロバイダーの AuthenticationError ... 401 が発生します)。crewai create のスキャフォールドは、--provider anthropic/... を指定してもプロバイダーの追加機能を追加しません。自分で uv add "crewai[anthropic]" を実行してください。
from crewai import LLM
gpt = LLM(model="openai/gpt-4.1-mini", temperature=0.2) # core install
local = LLM(model="ollama/llama3") # core install, OpenAI-compatible route
claude = LLM(model="anthropic/claude-sonnet-4-5") # needs: uv add "crewai[anthropic]"
print(type(gpt).__name__, type(local).__name__, type(claude).__name__)
カスタム LLM は BaseLLM をサブクラス化し、完全なシグネチャで call を実装します。call で messages をプロバイダー SDK に渡す場合は、各メッセージの role と content のみを送信してください。crewai は一部のメッセージに cache_breakpoint: True キーを追加しますが、Anthropic API はこれを拒否し、400 ... messages.0.cache_breakpoint: Extra inputs are not permitted を返します。
from typing import Any
from crewai import Agent, BaseLLM, Crew, Task
class EchoLLM(BaseLLM):
def call(self, messages, tools=None, callbacks=None, available_functions=None,
from_task=None, from_agent=None, response_model=None, **kwargs: Any) -> str:
return "echo: " + str(messages[-1]["content"])[:40]
agent = Agent(role="Echo", goal="Echo", backstory="Echoes.", llm=EchoLLM(model="echo"))
task = Task(description="Say hi", expected_output="Anything", agent=agent)
print(Crew(agents=[agent], tasks=[task]).kickoff().raw)
6. 構造化出力
| 場所 | 用途 | 結果の格納先 |
|---|---|---|
Task(output_pydantic=Model) | タスクとクルーの出力に解析済みモデルを格納 | out.pydantic、out["field"] |
Task(output_json=Model) | 辞書形式の出力 | out.json_dict |
Task(response_model=Model) | プロバイダーのネイティブな構造化出力のみ | out.raw(JSON テキスト)。out.pydantic は None のまま |
Agent.kickoff(messages, response_format=Model) | 単独のエージェント | LiteAgentOutput.pydantic |
llm.call(messages, response_model=Model) | LLM の直接呼び出し | 解析済みモデル |
LLM(model=..., response_format=Model) | コンストラクターでのデフォルト |
| おそらく書いていた形式 | 現在の形式 | 誤った形式で起こること |
|---|---|---|
Task(response_format=Model) | Task(output_pydantic=Model) | 無視されます |
Agent.kickoff(msg, response_model=Model) | Agent.kickoff(msg, response_format=Model) | TypeError: ... Did you mean 'response_format'? |
Task(output_pydantic=M, output_json=M) | どちらか一方を選択 | ValidationError: Only one output type can be set |
ファイルに散文が出力されると期待して Task(output_pydantic=M, output_file="report.md") を指定 | output_pydantic を削除するか、自分でモデルをレンダリング | 拡張子に関係なく、ファイルにはモデルの JSON が出力されます |
output_file="/abs/path/report.md" | 相対パス(または入力経由の output_file="{out_dir}/report.md") | 先頭の / が取り除かれ、ファイルは現在のディレクトリ配下に作成されます |
tasks.yaml の output_pydantic: Report | Python の @task メソッドで output_pydantic=Report を設定 | 対応する @output_pydantic クラスがない場合:KeyError: 'Report'。ある場合:黙って無視され、out.pydantic is None になります |
from pydantic import BaseModel
from crewai import Agent, Crew, Task
class Report(BaseModel):
title: str
points: list[str]
analyst = Agent(role="Analyst", goal="Summarise", backstory="Concise.", llm="openai/gpt-4.1-mini")
task = Task(description="Summarise {topic}.", expected_output="A title and points.",
agent=analyst, output_pydantic=Report)
out = Crew(agents=[analyst], tasks=[task]).kickoff(inputs={"topic": "bees"})
assert out.pydantic is not None, "structured output was dropped"
print(out.pydantic.title, out["points"])
standalone = analyst.kickoff("Summarise bees.", response_format=Report)
print(standalone.pydantic)
@CrewBase プロジェクトでは、タスクのほかの部分が YAML でも、モデルは Python に記述してください。
@task
def research_task(self) -> Task:
return Task(config=self.tasks_config["research_task"], output_pydantic=Report)
7. ガードレール
関数型ガードレールは引数を 1 つ(TaskOutput)受け取り、タプル (bool, value) を返します。False の場合、値はエラーとしてエージェントに渡され、タスクは guardrail_max_retries(デフォルトは 3)まで再試行します。その後、タスクは Task failed guardrail validation after N retries を発生させます。文字列型ガードレールは、追加の LLM 呼び出しでチェックされます。
| おそらく書いていた形式 | 現在の形式 | 誤った形式で起こること |
|---|---|---|
def g(out) -> bool: return True | def g(out: TaskOutput) -> tuple[bool, Any] とし、(True, out.raw) を返す | 型注釈がある場合:Task(...) で ValidationError: If return type is annotated, it must be Tuple[bool, Any]。型注釈がない場合:kickoff 時に TypeError: cannot unpack non-iterable bool object |
-> tuple[bool, object] | -> tuple[bool, Any](または str、TaskOutput) | 同じ ValidationError が Task(...) で発生 |
Task(max_retries=2) | Task(guardrail_max_retries=2) | DeprecationWarning |
HallucinationGuardrail に依存 | 関数型ガードレールを記述 | オープンソース版の crewai では何もせず、常に通過します |
from typing import Any
from crewai import Agent, Crew, Task, TaskOutput
def under_50_words(output: TaskOutput) -> tuple[bool, Any]:
if len(output.raw.split()) > 50:
return (False, "Keep it under 50 words.")
return (True, output.raw)
writer = Agent(role="Writer", goal="Write", backstory="Brief.", llm="openai/gpt-4.1-mini")
task = Task(description="Describe {topic}.", expected_output="A short paragraph.", agent=writer,
guardrails=[under_50_words, "Must not mention prices"], guardrail_max_retries=2)
print(Crew(agents=[writer], tasks=[task]).kickoff(inputs={"topic": "bees"}).raw)
guardrails=[...] は各ガードレールを順番に実行します。成功した文字列の結果は、次のガードレールで out.raw を置き換えます。
8. メモリとナレッジ
メモリは、1 つの Memory クラス(LanceDB ストレージ)で構成されています。デフォルトでは OpenAI が呼び出され、埋め込みには text-embedding-3-large、分析には gpt-5.4-mini が使われます。Crew(memory=True) では、代わりに最初のエージェントの llm で分析します。また、embedder の指定がないナレッジでは、埋め込みに text-embedding-3-small が使われます。OpenAI キーを使った実動確認では、memory=True のクルーがあるプロセスでコードネームを保存し、次のプロセスで起動した新しいクルーがそれを呼び出せました。クルーとエージェントのナレッジはいずれも、ソースに基づいた回答を返しました。
| おそらく記述したもの | 現在の形式 | 誤った形式で起きること |
|---|---|---|
ShortTermMemory()、LongTermMemory()、EntityMemory() | Memory(...) | ImportError |
OPENAI_API_KEY が設定されていない(または無効な)状態での Crew(memory=True) | キーを設定するか、Memory(llm=..., embedder=...) を渡します | クルーは完了しますが、保存はすべてサイレントに失敗します(MemorySaveFailedEvent が発行されるだけです)。何も保存されません |
キーを設定せずに memory.remember(...) を実行する | 同上 | RuntimeError: Memory requires an embedder for vector search(無効なキーの場合:AuthenticationError ... 401) |
キーも embedder も指定せず、クルー内のエージェントに Agent(knowledge_sources=[...]) を設定する | Agent または Crew に embedder={...} を渡します | クルーのキックオフ時に ValueError: Invalid Knowledge Configuration: The OPENAI_API_KEY environment variable is not set.(無効なキーの場合:AuthenticationError ... 401) |
knowledge_sources を持つエージェントで agent.kickoff(...) を実行する | エージェントを Crew のタスクとして実行するか、事実をプロンプトに含めます | キーの有無にかかわらずエラーは発生しません。Agent.kickoff() はエージェントのナレッジを参照しないため、回答には反映されません |
キーも embedder も指定せずに Crew(knowledge_sources=[...]) を設定する | 同上 | Failed to upsert documents がログに記録され、クルーはナレッジなしで実行されます |
ナレッジを保存した実行の後で、ナレッジの embedder を変更する | crewai reset-memories -kn(または crew.reset_memories(command_type="knowledge"))を実行してから、再実行します | Embedding function conflict: new: <x> vs persisted: openai。クルーはナレッジなしで実行されます |
embedder を指定せずにナレッジを保存した後で embedder={"provider": "openai"} を追加する(または OpenAI の埋め込みモデルを変更する) | 同じリセットを実行します | Failed to upsert documents: Collection expecting embedding with dimension of 1536, got 3072(プロバイダーを明示すると、デフォルトで text-embedding-3-large が使われます)。クルーはナレッジを使わずに回答します |
embedder の設定形式は {"provider": <name>, "config": {...}} です。OpenAI のモデルキーは model_name です。Memory では "model" を指定すると TypeError: ... unexpected keyword argument 'model' が発生します。ナレッジでは "model" はサイレントに無視され、クルーは text-embedding-3-large で埋め込みを行います。以下の ollama プロバイダーを使うには、uv add ollama の実行と、モデルを取得済みの Ollama サーバーが必要です。パッケージがない場合、クルーのナレッジはサイレントに None になります。{"provider": "onnx"} はローカルで動作する、キー不要の embedder で、core crewai ですでに実行できます(chromadb の onnxruntime を使用し、初回利用時に約 80 MB のモデルをダウンロードします)。実用的な例は、design-agent スキルの memory-and-knowledge リファレンスを参照してください。テストで決定論的な embedder を使うには、callable(Memory の場合)またはカスタムクラス(ナレッジの場合)を使います。verify-installed-api.md を参照してください。
from crewai import Agent, Crew, Memory, Task
from crewai.knowledge.source.string_knowledge_source import StringKnowledgeSource
embedder = {"provider": "ollama", "config": {"model_name": "nomic-embed-text"}} # needs: uv add ollama
memory = Memory(llm="openai/gpt-4.1-mini", embedder=embedder)
facts = StringKnowledgeSource(content="acme was founded in 2020.")
agent = Agent(role="Analyst", goal="Answer", backstory="Uses knowledge.", llm="openai/gpt-4.1-mini")
task = Task(description="When was acme founded?", expected_output="A year.", agent=agent)
crew = Crew(agents=[agent], tasks=[task], memory=memory, knowledge_sources=[facts], embedder=embedder)
if crew.knowledge is None:
print("knowledge failed to initialise - is the ollama package installed and the server running?")
保存済みデータをリセットするには、プロジェクトディレクトリから crewai reset-memories -m(メモリ。クルーにメモリがない場合は Memory memory system is not initialized エラーが発生します)、-kn(ナレッジ)、-akn(エージェントのナレッジ)、-k(最新のキックオフ出力)、-a(すべて)を実行します。旧オプションの -s、-l、-e は、非表示の非推奨エイリアスです。警告を表示して、統合されたメモリをリセットします。ストレージパスとオフライン embedder については、verify-installed-api.md を参照してください。
9. プロジェクトのスキャフォールドと CLI
| おそらく入力した内容 | 現在の形式 | 誤った形式で起こること |
|---|---|---|
crewai create crew my_crew で crew.py + YAML が作成されると想定 | crewai create crew my_crew --classic | JSON プロジェクト(crew.jsonc、agents/*.jsonc)を書き出す対話型ウィザードが起動します。TTY がない場合は Aborted! と表示されます。クルーだけが必要なスクリプトでは、--classic --skip-provider を使用してください。 |
CI やスクリプトで JSON クルーに対して crewai run を実行 | CI では、crewai create crew <name> --classic でクルーを作成し、uv run run_crew で実行します | 全画面の実行ビューが開き、TTY がなくてもユーザーが終了するまで待機するため、コマンドが終了しません。環境変数 CREWAI_DMN=1 は crewai 1.15.x で実行ビューをスキップしましたが、サポート対象外でドキュメントにも記載されていません。変更される可能性があります |
JSON スキャフォールドで "memory": true のままにし、OPENAI_API_KEY を設定しない | キーを設定するか、"memory": false にするか、エンベッダーを設定します | クルーの処理は完了しますが、メモリの呼び出しと保存は失敗しても通知されません |
クラシッククルーで crewai run --inputs '{...}' を実行 | main.py の run() に入力を記述します | Error: --inputs is only supported for declarative flows and crews |
crewai reset-memories -s -l -e | crewai reset-memories -m | 非推奨のエイリアスが使われ、警告が表示されます |
main.run() から return crew.kickoff(...) を返す | 出力を返さないでください | run_crew スクリプトが sys.exit(<CrewOutput>) を呼び出し、実行が正常に完了した後に終了コード 1 で終了します。crewai run は An error occurred while running the crew: ... non-zero exit status 1 と表示します |
クラシッククルー(--classic)または Python フローで、CI において crewai run の終了コードを信頼する | uv run run_crew を実行します(終了コードが伝播します)。または出力を確認します | クルーまたはフローのプロセスが失敗しても、crewai run は終了コード 0 で終了します。JSON(ウィザード)クルーには run_crew スクリプトがないため、CI 用のクルーは --classic を指定して作成してください |
crewai version
crewai create crew research_crew --classic --skip-provider
cd research_crew && uv add "crewai[anthropic]" # only if an agent uses an anthropic/ model
crewai install && crewai run
crewai reset-memories --help
クラシックレイアウトは、src/<name>/crew.py(@CrewBase クラス)、src/<name>/config/agents.yaml と tasks.yaml(キーは @agent/@task メソッド名と一致)、main.py、および [tool.crewai] type = "crew" と依存関係 crewai[tools] を含む pyproject.toml で構成されます。YAML で llm: <name> を指定すると、同名の @llm メソッドが解決されます。それ以外の場合はモデル文字列として使用されます。crewai create flow も、プレースホルダーの OPENAI_API_KEY を含む .env を作成します。値を置き換え、決してコミットしないでください。
10. 削除済みおよび非推奨
| 機能 | 1.15.22-1.15.23 でのステータス | 代わりに使用するもの |
|---|---|---|
CodeInterpreterTool | crewai_tools から削除 | サンドボックスツールまたはサービス |
Agent(allow_code_execution=...)、code_execution_mode | 非推奨の無効な機能 | 同上 |
ShortTermMemory、LongTermMemory、EntityMemory、memory_config | 削除/無視 | Memory(...) |
crewai.utilities.events | 削除 | crewai.events |
Crew(function_calling_llm=...) | 非推奨 | エージェントごとの llm |
Task(max_retries=...) | 非推奨 | guardrail_max_retries |
crewai.cli モジュール | 非推奨の互換レイヤー | crewai_cli(CLI は独立したパッケージです) |
| コア依存関係としての LiteLLM | オプションの追加機能 | ネイティブではないプロバイダーに限り crewai[litellm] |
11. よくある間違い
| 症状 | 原因 | 対処方法 |
|---|---|---|
| パラメーターを指定しても効果がなく、エラーも出ない | Agent/Task/Crew が未知の kwargs を破棄する | "name" in Task.model_fields を確認します |
out.pydantic is None | YAML で output_pydantic が設定されているか、output_pydantic の代わりに response_model が使用されている | Python で output_pydantic=Model を設定し、None でないことをアサートします |
ImportError: ... native provider not available | プロバイダー SDK の追加パッケージが不足している | uv add "crewai[anthropic]"(または [google-genai]、[bedrock]、[litellm])を実行します |
kickoff 時に ValueError: OPENAI_API_KEY is required が発生する | llm= が設定されていないため、デフォルトの gpt-4.1-mini が使用された | llm= または MODEL と、プロバイダーのキーを設定します |
| Crew は終了するが、何も記憶されていない | embedder のキーが設定されていない状態で memory=True が指定されている | Memory(embedder=...) を渡すか、キーを設定します。crewai.events の MemorySaveFailedEvent を監視します |
| ナレッジがプロンプトに反映されない | Crew レベルのナレッジの埋め込みに失敗した | embedder= を設定し、Failed to upsert documents を確認します |
TypeError: ... unexpected keyword argument 'from_task' | カスタム BaseLLM.call のシグネチャが古い | from_task、from_agent、response_model、**kwargs を受け付けるようにします |
Task(...) で Tuple[bool, Any] の ValidationError が発生する | Guardrail の型注釈が -> bool または tuple[bool, object] になっている | -> tuple[bool, Any] と注釈し、タプルを返します |
crewai create crew が応答しなくなる、または Aborted! と表示する | 現在は対話型の JSON ウィザードになっている | @CrewBase レイアウトを使うには --classic を追加します。CI とスクリプトでも使用します |
JSON crew で crewai run が返ってこない | 実行画面がキー入力を待っている | CI では crewai create crew <name> --classic と uv run run_crew を使用します |
kickoff_for_each の結果がすべて最初のトピックへの回答になる | Crew がすでに kickoff されている | バッチごとに新しい Crew を構築します |
token_usage が実行で使用可能だった量を超える | 複数のエージェントで LLM オブジェクトを共有しているか、複数の crew で再利用している | エージェントごと、crew ごとに LLM を1つ用意するか、LLMCallCompletedEvent を数えます |
akickoff() でエージェントが MCP ツールを使わない | 実行中のイベントループ内で mcps に https:// 文字列を指定している | MCPServerHTTP(url=...) を使用します |
Embedding function conflict ... persisted: openai | 別の embedder でナレッジが保存されている | crewai reset-memories -kn を実行します |
Collection expecting embedding with dimension of 1536, got 3072 | 別の OpenAI 埋め込みモデルでナレッジが保存されている | crewai reset-memories -kn を実行します |
crew の成功後に crewai run が non-zero exit status 1 を報告する | run() が CrewOutput を返している | 返さないようにします |
12. チェックリスト
-
crewai versionを確認済み。1.15.x でない場合は各項目を再検証済み - すべての
Agent/Task/Crewの kwarg がmodel_fieldsに存在する - ツールは
crewai.toolsから、flow デコレーターとpersistはcrewai.flowからインポートしている - すべてのタスクに
expected_outputがある - OpenAI 以外のすべてのモデル文字列について、
pyproject.tomlに追加パッケージがある - 構造化出力を Python で
output_pydanticを使って設定し、out.pydanticが None でないことをアサートしている - Guardrail が
(bool, value)を返し、tuple[bool, Any]と型注釈されているか、型注釈がない - Memory とナレッジに明示的な embedder があるか、環境にプロバイダーキーが設定されている
-
CodeInterpreterTool、allow_code_execution、ShortTermMemory、memory_configを使用していない - Classic プロジェクトは
crewai create crew <name> --classicで作成し、プロバイダーの追加パッケージはuv addで追加している - CI とスクリプトでは classic crews を使用し(
crewai create crew <name> --classic)、uv run run_crewで実行している
参考資料
- インストール済み API の確認 - インストール済みの crewai にあるフィールド、デフォルト値、シグネチャを確認するワンライナー、ストレージパス、メモリとナレッジ用のオフラインエンベッダー
- ソースの根拠 - 各行の根拠となる crewai のソースファイルと行番号。アップグレード後に再確認できます
- 公開ドキュメント:https://docs.crewai.com
関連するスキル:
- ask-docs - 内容が変更されている可能性がある場合に、CrewAI の最新ドキュメントを照会します
- getting-started - プロジェクトのひな形作成と、crew と flow の選択
- design-agent / design-task - API が適切であることを確認した後、エージェントとタスクを調整します
- build-flow - Flow の状態、ルーター、
@persist、人間からのフィードバック - connect-tools-and-mcp -
BaseTool、@tool、mcps=[...] - test-crewai-project - オフラインのスタブ LLM と決定論的なテスト
- deploy-to-amp / call-deployed-crew - crew のデプロイと呼び出し