Zum Hauptinhalt springen
LANGGRAPH-INTEGRATION

LangGraph-Zahlungsintegration.

Kein LangGraph-Paket erforderlich. Ein einfacher Knoten ruft den echten blockchain0x-Client auf, interrupt() pausiert, bis der Zahlungs-WebHook ankommt, und der Graph wird fortgesetzt - beständig über mehrere Ausführungen.

KURZE ANTWORT

Es gibt kein LangGraph-Paket, und Sie brauchen auch keines. Ein einfacher Node in Ihrem ruft den echten -Client auf, ein setzt den Graphen aus, bis der Zahlungs-Webhook eintrifft, und der Handler setzt ihn mit LangGraphs eigenem + fort. Zahlungen werden auf Base abgewickelt.

WARUM LANGGRAPH ZU DIESER FORM PASST

Beständige Ausführung macht das Muster 'Fortsetzen nach Zahlung' natürlich.

Der schwierige Teil der agentengesteuerten Zahlungen ist die asynchrone Lücke: Sie fordern eine Zahlung an, der Käufer zahlt Minuten später (oder nie), und Sie müssen die Arbeit fortsetzen, ohne den Zustand zu verlieren, in dem Sie sich befanden. Die meisten Agentenframeworks verlassen sich auf eine Jobwarteschlange + manuelle Zustandsablage, um diese Lücke zu überbrücken. LangGraph hat das primitive bereits eingebaut: interrupt() unterbricht einen Graphen an einem Knoten und ein Checkpointer speichert den Zustand auf der Festplatte. Das Fortsetzen ist ein Aufruf.

Das Rezept setzt dies ohne spezielle Maschinen um. Ein einfacher Zahlungsknoten ruft blockchain0x.payments.create auf. Ein await_settlement-Knoten ruft interrupt() auf, um zu unterbrechen, und der Checkpointer speichert den Zustand. Der Webhook-Handler überprüft die Signatur, setzt settled im passenden Thread mit graph.updateState und ruft graph.invoke auf, um vom Interrupt fortzufahren. Der Graph setzt genau dort fort, wo er aufgehört hat, einschließlich jeglichem LLM-Kontext von früheren Knoten - alles unter Verwendung der eigenen APIs von LangGraph.

INSTALLATION

Installieren Sie LangGraph und das Kern-SDK. Kein zusätzliches Paket.

Node 18+ und @langchain/langgraph 0.2+ plus den echten @blockchain0x/node-Client. Es gibt keinen LangGraph-Adapter, der in einer der beiden Sprachen hinzugefügt werden kann - Python LangGraph-Benutzer installieren langgraph und den blockchain0x Python-Client und schreiben dasselbe Rezept, mit interrupt() und Command(resume=...) auf der Python-Seite.

INSTALLIEREN
npm install @langchain/langgraph @blockchain0x/node
UMGEBUNGSVARIABLEN
export BLOCKCHAIN0X_API_KEY=sk_test_...        # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
export BLOCKCHAIN0X_WEBHOOK_SECRET=...          # for the webhook handler

BLOCKCHAIN0X_API_KEY ist ein sk_test_ Testnet- oder sk_live_ Mainnet-Schlüssel von Ihrem Dashboard; der Client liest ihn aus der Umgebung. BLOCKCHAIN0X_WEBHOOK_SECRET (einmal zurückgegeben, wenn Sie einen Webhook erstellen oder rotieren) wird im Prozess benötigt, der Webhooks verarbeitet. Wenn Ihr Graph in einem Prozess läuft und der Handler in einem anderen, benötigen beide denselben Checkpointer (z.B. gemeinsames Postgres), damit der Handler den angehaltenen Thread finden kann.

VOLLES GRAPH-BEISPIEL

Ein Drei-Knoten-Diagramm: bezahlen, aussetzen, liefern.

Unten ist ein vollständiger LangGraph-Workflow mit einem typisierten Zustand, einem Zahlungs-Knoten, der die echte blockchain0x.payments.create aufruft, einem unterbrechungsbasierten await_settlement-Knoten und einem Liefer-Knoten, der die abhängige Arbeit ausführt, sobald die Kette bestätigt, dass die Zahlung bewegt wurde.

GRAPH.TS
import { StateGraph, START, END, MemorySaver, interrupt, Annotation } from "@langchain/langgraph";
import { createClient } from "@blockchain0x/node";

const blockchain0x = createClient({ apiKey: process.env.BLOCKCHAIN0X_API_KEY! });

const State = Annotation.Root({
  agentId: Annotation<string>(),
  to: Annotation<string>(),
  amountWei: Annotation<string>(), // USDC base units: "10000" = 0.01 USDC
  settled: Annotation<boolean>(),
});

// A plain node that calls the real SDK. No dedicated package needed.
async function pay(state: typeof State.State) {
  await blockchain0x.payments.create({
    agentId: state.agentId,
    to: state.to,
    amountWei: state.amountWei,
  });
  return {};
}

// Suspend the graph until the payment.sent webhook resumes this thread.
function awaitSettlement() {
  interrupt("awaiting on-chain settlement");
  return {};
}

async function deliver() {
  // Funds have moved - do the work that depended on the payment.
  return {};
}

const graph = new StateGraph(State)
  .addNode("pay", pay)
  .addNode("await_settlement", awaitSettlement)
  .addNode("deliver", deliver)
  .addEdge(START, "pay")
  .addEdge("pay", "await_settlement")
  .addConditionalEdges("await_settlement", (s) => (s.settled ? "deliver" : END))
  .addEdge("deliver", END)
  .compile({ checkpointer: new MemorySaver() });

When the graph runs, the pay node submits the USDC transfer through the SDK. The await_settlement node calls interrupt(), which suspends the graph and persists state via the checkpointer. The conditional edge waits to be told settled=true before routing to deliver; if settlement never lands, a timeout sweep routes it to END. amountWei is base units, so 0.01 USDC is "10000".

WEBHOOK-VERARBEITUNG

Überprüfen Sie das Webhook und setzen Sie dann den Thread fort.

Der Handler überprüft die Signatur mit webhooks.verify aus dem Node SDK, sucht den ausgesetzten LangGraph-Thread aus Ihrer eigenen Zuordnung, setzt settled mit graph.updateState und ruft graph.invoke(null, config) auf, um vom Interrupt fortzufahren. Kein spezieller Helfer - das sind die eigenen APIs von LangGraph.

WEBHOOK.TS
import express from "express";
import { webhooks } from "@blockchain0x/node";
import { graph } from "./graph";

const app = express();
// Capture the RAW body. The HMAC is over the exact bytes on the wire.
app.use(express.raw({ type: "application/json" }));

app.post("/webhooks/payment", async (req, res) => {
  const result = webhooks.verify({
    headers: req.headers,
    rawBody: req.body, // Buffer, raw bytes
    secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
  });
  if (!result.ok) return res.status(400).json({ code: result.code });

  if (result.eventType === "payment.sent") {
    // You map the event to the suspended graph thread (your own store).
    const config = { configurable: { thread_id: threadFor(result.eventId) } };
    await graph.updateState(config, { settled: true });
    await graph.invoke(null, config); // resume from the interrupt
  }
  res.status(200).send("ok");
});

webhooks.verify führt HMAC-SHA256 in konstanter Zeit über den Rohkörper aus und gibt eine diskriminierte Vereinigung zurück - verzweigen Sie auf result.ok, kein try/catch. Zuordnen result.eventId zu dem Thread, den Sie angehalten haben, dann graph.updateState + graph.invoke(null, config) setzt vom persistierten Checkpoint fort und die Graphausführungen liefern. Die gelieferten Ereignisse sind payment.received, payment.sent, wallet.deployed und webhook.test.

QUELLE UND DOKUMENTE

Der Client, den Sie umwickeln, ist offen. Lesen Sie ihn.

Es gibt kein LangGraph-Starterpaket zum Klonen - das obige Rezept ist die Integration. Die blockchain0x SDKs sind Open Source auf GitHub; dieses Rezept umschließt das Python SDK (blockchain0x-python) mit der vollständigen Methodenoberfläche in den Dokumenten. Lesen Sie es als Referenz für die Knotenkörper und die Webhook-Überprüfung.

github.com/tosh-labs/blockchain0x-python

Die vollständige SDK-Methodenoberfläche und das Webhook-Signaturschema sind in den Dokumenten dokumentiert. Beginnen Sie mit einem sk_test_-Schlüssel gegen Base Sepolia und wechseln Sie zu sk_live_, sobald der Graph wieder so funktioniert, wie Sie es erwarten.

HÄUFIGE FALLSTRICK

Fünf LangGraph-spezifische Fallen, die zu vermeiden sind.

Das langlebige Ausführungsmodell von LangGraph ist leistungsstark, hat jedoch seine eigenen Fallstricke in Bezug auf Checkpoints, Interrupts und Statusaktualisierungen.

PITFALL 1

Es gibt kein LangGraph-Paket - ein einfacher Knoten ruft das SDK auf.

Blockchain0x liefert Adapter für LangChain und CrewAI sowie den MCP-Server; es gibt kein dediziertes LangGraph-Paket in npm oder pip. Das obige Rezept ist der Weg: ein gewöhnlicher Graphknoten ruft den echten @blockchain0x/node-Client auf, und Sie setzen mit LangGraphs eigenem graph.updateState + graph.invoke fort. Es gibt keine spezielle Payment-Node-Klasse und keinen Resume-Helfer zum Importieren - die haben nie existiert.

PITFALL 2

Fehlender Checkpointer

LangGraphs interrupt() funktioniert nur, wenn der Graph einen Checkpointer hat. Ohne einen geht der Zustand verloren, wenn Ihr Prozess beendet wird, und der Webhook-Handler hat keinen Thread, um fortzufahren. Verwenden Sie MemorySaver für die Entwicklung und SqliteSaver oder PostgresSaver in der Produktion. Wenn Ihr Graph und der Webhook-Handler in verschiedenen Prozessen laufen, müssen sie denselben Checkpointer teilen (z.B. einen Postgres), damit der Handler den angehaltenen Thread finden kann.

PITFALL 3

Das Mapping des Webhooks auf den richtigen Thread ist Ihre Aufgabe

Das Webhook informiert Sie, dass eine Zahlung abgeschlossen wurde; es kennt nicht Ihre LangGraph thread_id. Behalten Sie Ihre eigene Zuordnung - wenn Sie einen Graphen starten, speichern Sie thread_id, die nach dem Agenten, dem Empfänger oder einem von Ihnen festgelegten Idempotenzschlüssel geordnet ist, und suchen Sie es dann im Handler. Der oben stehende threadFor()-Aufruf ist diese Suche. Wenn Sie das falsch machen, wird graph.invoke den falschen Thread oder gar keinen fortsetzen.

PITFALL 4

Verarbeiten Sie den Pfad ohne Abrechnung oder setzen Sie ihn für immer aus

Die bedingte Kante von await_settlement leitet nur dann zur Lieferung weiter, wenn settled wahr ist. Wenn eine Zahlung nie ankommt, bleibt der Thread unbegrenzt ausgesetzt. Fügen Sie ein Timeout hinzu: einen geplanten Sweep, der veraltete Threads mit settled=false wieder aufnimmt, sodass die Kante zu END weitergeleitet wird, oder eine Überprüfung von payment.sent gegen die Frist. Ein ausgesetzter Thread kostet nichts, aber er beendet sich auch nie von selbst.

PITFALL 5

Beträge sind USDC-Basiseinheiten, als Strings

payments.create takes amountWei: a string of USDC base units (6 decimals), so 0.01 USDC is "10000" and 5 USDC is "5000000". It also does not retry by default and can answer 503 until the chain adapter is wired for your network. Handle that in the pay node - route to END or a retry node on error rather than letting the graph wedge.

HÄUFIG GESTELLTE FRAGEN

Drei LangGraph-spezifische Fragen.

Gibt es ein LangGraph-Paket in npm oder pip?

Nein. LangGraph gibt Ihnen bereits alles: ein Knoten ist nur eine Funktion, interrupt() pausiert, ein Checkpointer bleibt bestehen, und graph.updateState + graph.invoke setzen fort. Daher ist der ehrliche Weg ein einfacher Knoten, der den echten @blockchain0x/node-Client (oder den Python blockchain0x-Client) aufruft, wie oben gezeigt. Die einzigen ausgelieferten Framework-Pakete sind blockchain0x-langchain und blockchain0x-crewai (beide Python) sowie der @blockchain0x/mcp-Server.

Kann ich das auch in Python LangGraph tun?

Ja, dasselbe Rezept. Python LangGraph hat dieselben Primitiven - einen Funktionsknoten, interrupt(), einen Checkpointer und Command(resume=...) oder update_state + invoke, um fortzufahren. Ihr Knoten ruft den Python blockchain0x-Client (blockchain0x.payments.create(...)) auf, und Ihr Webhook-Handler überprüft die Signatur und setzt den Thread fort. Es gibt kein pip-Paket, das über langgraph und blockchain0x installiert werden muss; die Graphdefinition ist nahezu identisch mit der TypeScript-Version.

Funktioniert das mit der LangGraph-Plattform und Human-in-the-Loop-Knoten?

Ja. Das Rezept ist einfach LangGraph, sodass es auf der LangGraph-Plattform gleich läuft - richten Sie Ihren Blockchain0x-WebHook auf das Deployment und setzen Sie den Thread dort fort. interrupt() unterstützt auch mehrere Unterbrechungspunkte in einem Graphen: eine Zahlungsunterbrechung, die durch den Webhook fortgesetzt wird, und eine human_review-Unterbrechung, die durch eine UI-Aktion fortgesetzt wird, können nebeneinander existieren, solange jede Fortsetzung ihr eigenes Feld im Zustand aktualisiert. Der Graph leitet sie in der Reihenfolge weiter.

Fügen Sie dauerhafte Zahlungen zu Ihrem Graphen hinzu.

Pause bei Zahlung, fortsetzen bei Webhook, alles mit LangGraphs eigenen APIs. Kostenlos zum Start.