Skip to main content

インストール

対応バージョン: crewai 1.13 〜 2.0。1.13 は started_event_id の追加とトークン使用量の正規化が行われたリリースであり、アダプターはイベントの対応付けとトークンレポートにこれらを利用しています。

計装

instrument() は CrewAI のモジュールレベルのイベントバスにリスナーを登録し、イベントクラスごとに 1 つのハンドラーを購読します。クルー、エージェント、タスク、ツールには一切変更が加わりません。

記録される内容

タスクが意図的に何も発行しないのには理由があります。CrewAI のタスクはそれを実行するエージェント実行のサブセットであるため、両方を発行すると全行が二重になり、兄弟として表示されてしまいます。タスクの id と名前は、エージェント自身のイベントに付随します。 メモリおよびナレッジ操作はツールとして記録され、アクセスしたサーフェスの名前が付くため、実際のツールの隣に並んでレイテンシを比較できます。 階層型クルーでは、ネスト構造によってトレースが読みやすくなります:
CrewAI は委任された実行を、マネージャー直下ではなく delegate_work_to_coworker ツールイベント の配下に親付けするため、アダプターもそのリンクに従います。これがないと、すべてのエージェントが並列になり委任の構造が失われます。

使用例

引き継ぎはトレースで確認できます: analyst スパンが閉じ、writer スパンが開き、両方が 1 つの crew スパンの内側に収まります。

スパンに名前を付ける

agent_idAgent(role=...) から取得されるため、ダッシュボードのファセットとして読みやすくなります。
agent_id は低カーディナリティのカラムです。実行 id やタイムスタンプを含むロールは、あらゆるクエリのパフォーマンスを低下させます。ロールが id のように見える場合、アダプターはそれを拒否し、実際の値をペイロードフィールドに格納します。

セッションを制御する

以下の順序で解決され、最初に一致したものが使用されます:
  1. instrument("crewai", session_id=...)
  2. 囲んでいる failproofai_sdk.session() スコープ
  3. クルーまたはフローごとに 1 回生成される uuid4().hex
実行ごとに制御するには、キックオフをラップします:

オプション

session_id はこのアダプターが読み取る唯一のオプションです。プロンプトとコンプリーションは常に記録され、ペイロード予算内でトランケートされます。

ヒューマン・イン・ザ・ループ

CrewAI には 2 つ のヒューマン・イン・ザ・ループのサーフェスがあり、どちらも同じ 4 つのイベントとして記録されます。 フローメソッド上の @human_feedback は CrewAI のイベントバスを経由します: ランタイムは人間の応答待ちに入る前にイベントを発行し、回答後にもう 1 つのイベントを発行します。 Task(human_input=True) はそうではありません。CrewAI 自身の入力プロバイダー内で input() を呼び出し、いかなるイベントも発行しないため、アダプターはそのプロバイダーを直接ラップします。これがないと、人間の待機時間が完全に不可視となり、アクティブなエージェント時間として計上されます。 どちらの場合も次のイベントが記録されます:
agent_pause から agent_resume の間だけが一時停止時間としてカウントされます。これがないと、10 分間の人間待機が 10 分間のアクティブなエージェント時間として計上されます。
CrewAI はどちらの人間フィードバックイベントにも相関 id を設定しないため、アダプターはフローとメソッド名を基にペアリングし、直近に開かれた一時停止にフォールバックします。コンソールプロンプトはブロッキングであるため、この方法は健全です。並行フィードバックプロバイダーを構築する場合は、両方のイベントに request_id を設定してください。
Task(human_input=True) のパスはイベント購読ではなく CrewAI の入力プロバイダーへのラッパーであるため、uninstrument() 時に元に戻され、input() が送出した例外(KeyboardInterrupt を含む)はそのまま再送出されます。

よくある問題

role に UUID、タイムスタンプ、または実行ごとのサフィックスが含まれています。安定した人間可読のロールを使用し、実行固有の id はタスクの説明に入れるようにしてください。
イベントバスは非同期であり、kickoff() は最後のハンドラーが実行される前に返ります。先にドレインしてください:
これは CrewAI の特性であり、SDK の問題ではありません。
agent_end は開いている一時停止を強制終了しますが、ツールやモデルは終了しません。そのため、ツール呼び出しの途中で実行が終了すると、そのスパンが開いたままになります。通常のティアダウンでは、まだ開いているものをすべて閉じて未完了としてマークします。SIGKILL の場合のみ、何も実行できないため開いたままになります。
以下の順で確認してください: instrument()kickoff() の前に実行されているか;with failproofai_sdk.session(): で囲まれているか;crewai が 1.13 以降か;FAILPROOFAI_SDK_STRICT=1 が設定されている場合、劣化したフックは握りつぶされずに例外を送出します。

次のステップ

仕組み

ペア、id、セッションライフサイクル、デリバリーについて。

トレースを読む

キャプチャしたセッションの因果関係を追う。

他のフレームワーク

LangGraph、LlamaIndex、Pydantic AI、カスタムエージェント。