Skip to main content
アダプターは両方に対応しています。LangGraph は langchain-core のコールバックマネージャー上で動作するため、一方をインストルメント化すればもう一方も自動的にインストルメント化されます。

インストール

LangGraph を使わない LangChain のみの場合は failproofai-sdk[langchain] を使用してください。 対応バージョン: langchain-core 1.4.7〜2.0、langgraph 1.2〜2.0。この範囲外でもアダプターはインストールされ、一度だけ警告が表示されます。

インストルメント化

instrument()langchain_core.tracers.context.register_configure_hook を通じてトレーサーを登録します。LangChain はビルドするすべてのコールバックマネージャーにこれを注入するため、グラフ、ツール、モデルは呼び出し箇所を変更することなくキャプチャされます。自分で書いていないライブラリ内部の呼び出しも含まれます。

記録される内容

ノードはネストされたエージェントではなく、フックになります。 agent_id はすべてのダッシュボード画面における主要なファセットです。retrievegrade_documentsshould_continue をエージェントに昇格させると識別が困難になり、最初に実行されたノードの名前でセッションがラベル付けされてしまいます。 フックスパンは同じ方法でレンダリングされ、ノードごとのレイテンシビューも提供されます。
ノードの名前は自由に付けられます。 ノードの実行は、その形状(LangGraph 独自のステップタグを持つ非リーフ実行)によって識別されます — 名前では識別されません。
以前は、実行するものにちなんでノードに名前を付けると、そのもののイベントが消えてしまっていました。現在はそのような問題はありません。

ストリーミング

.stream() および .astream() はトークンごとのイベントを発行しません。クロージング model_response にまとめられます:

ストリームレスポンスのトークン数

別の問題であり、見落としやすい点です: OpenAI はストリームレスポンスで使用量を送信するのはリクエストした場合のみです。
アダプターはフレームワークから渡された内容を記録します。このフラグがないと記録するものがなく、model_response はトークン数なしで届きます。

サンプル

スパンの名前付け

デフォルトでは、ルートスパンにグラフ自身の名前が使用されます。任意のラベルを付けるにはラップしてください:
マルチエージェント構成の場合はスコープをネストします。各ワーカーは parent_id を持つ子スパンになります:
agent_id のカーディナリティは低く保ってください。ロール名やノード名を使用し、UUID や実行ごとの文字列は使わないでください。

セッションの制御

セッション ID は以下の順序で解決され、最初に一致したものが使用されます:
  1. instrument("langchain", session_id=...)
  2. config={"metadata": {"failproofai_sdk_session_id": ...}}
  3. 囲んでいる failproofai_sdk.session() スコープ
  4. metadata["session_id"]metadata["conversation_id"]、または metadata["thread_id"]
  5. ルート実行 ID
セッション ID はゼロから生成されることはありません。合成 ID は1つの実行を複数のセッションに分割してしまうためです。

オプション

規制対象データには capture_content=False を設定してください。構造、タイミング、トークン数、ツール名、結果は引き続き記録されますが、メッセージ本文は記録されません。 include_chainsネストされた実行にのみ適用されます。トップレベルで呼び出す Runnable はセッションのルートとなるため、フックペアではなくエージェントスパンになります。ここで名前を指定しても効果はありません。

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

interrupt() は4つのイベントを生成し、どちらのペアも冗長ではありません:
human_wait から human_input にはプロンプトと回答が含まれます(capture_content=False の場合は両方が除外されます。リトリーバルのドキュメントソースも同様ですが、ドキュメント数は残ります)。agent_pause から agent_resume は一時停止時間を計測する唯一のペアであるため、これがないと10分間の人間の待機がアクティブなエージェント時間として計上されます。ルートスパンは間隔を超えて開いたままになり、両方の呼び出しが1つのセッションに保たれます。

よくある問題

create_react_agent は例外を伝播させます。モデルが失敗を確認して継続できるようにするには、ツールノードを明示的に構築してください:
いずれの場合も、失敗はエラーを含む tool_result として記録されます。これは実行がその失敗から回復するかどうかだけを決定します。
グラフ外での直接的な llm.invoke() には親実行がないため、ルートスパンが開かれ、その中にモデルペアが発行されます。ダッシュボードはリーフを開いているエージェントの子として扱うため、このスパンは意図的なものです。名前を付けてください:
instrument() を呼び出した上に、config={"callbacks": [...]} で Failproof ハンドラーも渡しています。それを削除してください。configure フック はプロセス内のすべてのコールバックマネージャーをすでにカバーしています。
そうはなりません。LangGraph は GraphInterrupt を実際の例外と同じパスで発生させるため、すべての一時停止がエラーコールバックとしてトレーサーに到達します。GraphBubbleUp のサブクラスはコントロールフローとして扱われるため、承認が赤いエラーとして表示されることはありません。
以下の順序で確認してください: instrument() がグラフ実行前に呼び出されているか;呼び出しを囲む with failproofai_sdk.session(): があるか;FAILPROOFAI_SDK_STRICT=1 が設定されている場合、デグレードしたフックは握りつぶされずに例外を発生させます。

次のステップ

仕組みを理解する

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

トレースを読む

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

他のフレームワーク

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