タイムアウトを気にしなくていいステートフルなワークフロー。
LangGraph Platform は、ノードが再開するとエンドポイントに通知します。そのノードは完了までに LLM をさらに 2 回呼ぶかもしれません。その余裕を AnyHook が作ります。
タイミングの問題
LangGraph Platform の Webhook コールバックは、一時停止したワークフローを再開できることを知らせます。再開したノードは、さらにモデル呼び出しを起動することがよくあります。それこそがステートフルなワークフローの目的です。
Stripe や GitHub のイベントから LangGraph をつなげる場合、行き詰まります。上流の送信元が与える時間は 10〜20 秒なのに、LangGraph とその下流の呼び出しには 60〜120 秒かかります。AnyHook はこの 2 つの時間軸を切り離します。
60〜120 秒
LangGraph の再開にかかる一般的な時間
10 秒
GitHub が公表している Webhook のタイムアウト
AES-256-GCM
ペイロードを保存時に暗号化
1 クリック
プランの再送可能期間内のイベントを再送
LangGraph のコールバックを AnyHook 経由で転送する
ワークフローをハンドラーで再開する必要があるときに、AnyHook の受信 URL を呼ぶよう LangGraph を設定します。AnyHook が応答して転送するので、処理は自分のペースで進められます。
import { verifyWebhook } from "anyhook-verify";
import { Client } from "@langchain/langgraph-sdk";
const lg = new Client({ apiUrl: process.env.LANGGRAPH_API_URL });
export async function POST(req: Request) {
if (!(await verifyWebhook(req, process.env.ANYHOOK_SIGNING_SECRET!))) {
return new Response("invalid", { status: 401 });
}
const { thread_id, node_id, payload } = await req.json();
// Resume the LangGraph thread. Two more model calls + a vector
// search are common here. Total ~90s.
const result = await lg.runs.create(thread_id, "agent", {
input: payload,
config: { configurable: { resume_from: node_id } },
});
await persistRun(result);
return new Response("ok", { status: 200 });
}よくある質問
- AnyHook は LangGraph の再開可能な状態のセマンティクスを扱えますか?
- AnyHook は HTTP レイヤーのインフラで、LangGraph のチェックポイントはモデル化しません。ワークフローの状態は引き続きハンドラーが管理します。AnyHook は再開の合図を保存し、プランのスケジュールでハンドラーにリトライするだけです。それでも失敗したものは、再送できます。
- 1 つの LangGraph コールバックを複数の下流サービスに配信(ファンアウト)できますか?
- はい。AnyHook の App(Webhook の送信元ごとに作る受信設定)に複数の転送先を設定すると、配信はそれぞれ独立します。ある転送先への配信が成功しても、別の転送先はリトライ中ということもあります。
- 1 回の配信試行はどのくらいの時間まで続けられますか?
- Free は 60 秒、Pro は 120 秒、Scale は 300 秒(5 分)です。LangGraph の再開コールバックのほとんどは、Pro の時間内に余裕で収まります。
変えるのは URL 1 つだけ。LangGraph のハンドラーはそのまま。
Free プランには月 10,000 件が含まれます。SDK は不要です。LangGraph の Webhook を AnyHook の受信 URL に向けるだけです。