പ്രധാന ഉള്ളടക്കത്തിലേക്ക് കടക്കുക
LANGGRAPH ഇന്റഗ്രേഷൻ

LangGraph പേയ്മെന്റ് ഇന്റഗ്രേഷൻ.

LangGraph പാക്കേജ് ആവശ്യമില്ല. ഒരു സാധാരണ നോഡ് യഥാർത്ഥ blockchain0x ക്ലയന്റിനെ വിളിക്കുന്നു, interrupt() പണമടവ് വെബ് ഹുക്ക് എത്തുന്നതുവരെ നിർത്തുന്നു, ഗ്രാഫ് പുനരാരംഭിക്കുന്നു - ഓടലുകൾക്കിടയിൽ ദൃഢമായിരിക്കുന്നു.

ചുരുക്കം ഉത്തരം

LangGraph-യ്ക്ക് പ്രത്യേക package ഒന്നുമില്ല, അതിനായി ഒന്നും ആവശ്യമില്ല. നിങ്ങളുടെ -ലെ ഒരു plain node real client വിളിക്കുന്നു, payment webhook എത്തുന്നതുവരെ ഒരു graph-നെ suspend ചെയ്യുന്നു, തുടർന്ന് handler LangGraph-ന്റെ സ്വന്തം + ഉപയോഗിച്ച് അത് resume ചെയ്യുന്നു. Payments Base-ൽ settle ചെയ്യും.

LANGGRAPH ഈ മാതൃകയിൽ എങ്ങനെ അനുയോജ്യമാണ്

ദൃഢമായ പ്രവർത്തനം പേയ്മെന്റ് കഴിഞ്ഞ് പുനരാരംഭിക്കുന്ന മാതൃകയെ സ്വാഭാവികമാക്കുന്നു.

ഏജന്റ്-ചാലക പേയ്മെന്റുകളുടെ കഠിന ഭാഗം അസിങ്ക് ഗ്യാപ് ആണ്: നിങ്ങൾ പേയ്മെന്റ് അഭ്യർത്ഥിക്കുന്നു, വാങ്ങുന്നവൻ കുറച്ച് മിനിറ്റുകൾക്ക് ശേഷം (അല്ലെങ്കിൽ ഒരിക്കലും) പേയ്മെന്റ് ചെയ്യുന്നു, നിങ്ങൾ എവിടെ ആയിരുന്നു എന്ന നില നഷ്ടപ്പെടാതെ ജോലി തുടരേണ്ടതുണ്ട്. ഏറ്റവും കൂടുതൽ ഏജന്റ് ഫ്രെയിംവർക്ക് ഒരു ജോബ് ക്യൂ + മാനുവൽ സ്റ്റേറ്റ്-സ്റ്റോർ ഉപയോഗിച്ച് ഈ ഗ്യാപ് പൂരിപ്പിക്കാൻ ആശ്രയിക്കുന്നു. LangGraph ഇതിനകം പ്രിമിറ്റീവ് നിർമ്മിച്ചിരിക്കുന്നു: interrupt() ഒരു നോഡിൽ ഒരു ഗ്രാഫ് സസ്പെൻഡ് ചെയ്യുന്നു, ഒരു ചെക്ക്‌പോയിന്റർ നില ഡിസ്‌കിലേക്ക് നിലനിർത്തുന്നു. വീണ്ടും ആരംഭിക്കുന്നത് ഒരു കോൾ ആണ്.

ഈ recipe പ്രത്യേക machinery ഒന്നുമില്ലാതെ തന്നെ ഇതിനെ ഉപയോഗിക്കുന്നു. ഒരു സാധാരണ pay node blockchain0x.payments.create വിളിക്കുന്നു. ഒരു await_settlement node suspend ചെയ്യാൻ interrupt() വിളിക്കുന്നു, checkpointer state persist ചെയ്യുന്നു. webhook handler signature verify ചെയ്ത്, matching thread-ിൽ graph.updateState ഉപയോഗിച്ച് settled സെറ്റ് ചെയ്യുകയും, interrupt-ിൽ നിന്ന് തുടരാൻ graph.invoke വിളിക്കുകയും ചെയ്യുന്നു. graph മുമ്പ് നിർത്തിയിടത്തുതന്നെ തുടരുന്നു, മുമ്പത്തെ nodes-ൽ നിന്നുള്ള ഏതെങ്കിലും LLM context ഉൾപ്പെടെ - എല്ലാം LangGraph-ന്റെ സ്വന്തം APIs ഉപയോഗിച്ച്.

സ്ഥാപനം

LangGraph ഇൻസ്റ്റാൾ ചെയ്യുക, കൂടാതെ കോർ SDK. അധിക പാക്കേജ് ഇല്ല.

Node 18+ @langchain/langgraph 0.2+ യഥാർത്ഥ @blockchain0x/node ക്ലയന്റോടുകൂടി. ഏതെങ്കിലും ഭാഷയിൽ ചേർക്കാൻ LangGraph അഡാപ്റ്റർ ഇല്ല - Python LangGraph ഉപയോക്താക്കൾ langgraph ഇൻസ്റ്റാൾ ചെയ്യുന്നു, blockchain0x Python ക്ലയന്റും സമാനമായ റെസിപ്പി എഴുതുന്നു, Python വശത്ത് interrupt() Command(resume=...) എന്നിവയോടുകൂടി.

ഇൻസ്റ്റാൾ ചെയ്യുക
npm install @langchain/langgraph @blockchain0x/node
പരിസ്ഥിതി മാറ്റങ്ങൾ
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 നിങ്ങളുടെ dashboard-ലുള്ള sk_test_ testnet അല്ലെങ്കിൽ sk_live_ mainnet കീ ആണ്; client അതിനെ environment-ൽ നിന്ന് വായിക്കുന്നു. BLOCKCHAIN0X_WEBHOOK_SECRET (ഒരു webhook create ചെയ്യുമ്പോഴോ rotate ചെയ്യുമ്പോഴോ ഒരിക്കൽ return ചെയ്യുന്നത്) webhooks കൈകാര്യം ചെയ്യുന്ന process-ിൽ ആവശ്യമാണ്. നിങ്ങളുടെ graph ഒരു process-ിലും handler മറ്റൊന്നിലും പ്രവർത്തിക്കുന്നുവെങ്കിൽ, handler suspended thread കണ്ടെത്താൻ രണ്ടിനും same checkpointer (ഉദാ. shared Postgres) ആവശ്യമാണ്.

മുഴുവൻ ഗ്രാഫ് ഉദാഹരണം

മൂന്ന് നോഡ് ഗ്രാഫ്: പണമടക്കുക, നിർത്തുക, വിതരണം ചെയ്യുക.

താഴെ ഒരു complete LangGraph workflow ഉണ്ട് - typed State, real blockchain0x.payments.create വിളിക്കുന്ന pay node, interrupt-based await_settlement node, കൂടാതെ chain payment moved എന്ന് സ്ഥിരീകരിച്ച ശേഷം dependent work പ്രവർത്തിപ്പിക്കുന്ന deliver node എന്നിവയോടെ.

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".

വെബ്‌ഹുക്ക് കൈകാര്യം ചെയ്യൽ

വെബ്‌ഹുക്ക് സ്ഥിരീകരിക്കുക, തുടർന്ന് ത്രെഡ് വീണ്ടും ആരംഭിക്കുക.

ഹാൻഡ്ലർ Node SDK-യിൽ നിന്ന് webhooks.verify ഉപയോഗിച്ച് ഒപ്പുവെച്ചതിന്റെ സ്ഥിരീകരണം നടത്തുന്നു, നിങ്ങളുടെ സ്വന്തം മാപ്പിംഗിൽ നിന്ന് സസ്പെൻഡഡ് LangGraph ത്രെഡ് പരിശോധിക്കുന്നു, graph.updateState ഉപയോഗിച്ച് settled ക്രമീകരിക്കുന്നു, graph.invoke(null, config) വിളിക്കുന്നു, ഇടവേളയിൽ നിന്ന് തുടരാൻ. പ്രത്യേക സഹായികളില്ല - അവ LangGraph-ന്റെ സ്വന്തം APIs ആണ്.

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 HMAC-SHA256 കൃത്യമായ സമയത്ത് കച്ചവട ശരീരത്തിൽ നടത്തുന്നു, വ്യത്യസ്തമായ യൂണിയൻ തിരികെ നൽകുന്നു - result.ok ൽ ബ്രാഞ്ച് ചെയ്യുക, ശ്രമിക്കുക/പിടിക്കുക ഇല്ല. result.eventId ന്റെ ത്രെഡ് നിങ്ങൾ നിർത്തിയതിലേക്ക് മാപ്പ് ചെയ്യുക, പിന്നീട് graph.updateState + graph.invoke(null, config) നിലനിൽക്കുന്ന ചെക്ക് പോയിന്റിൽ നിന്ന് പുനരാരംഭിക്കുന്നു, ഗ്രാഫ് പ്രവർത്തിക്കുന്നു. അയച്ച സംഭവങ്ങൾ payment.received, payment.sent, wallet.deployed, webhook.test ആണ്.

SOURCE AND DOCS

നിങ്ങൾ വ്രാപ്പ് ചെയ്യുന്ന ക്ലയന്റ് തുറന്നതാണ്. അത് വായിക്കുക.

clone ചെയ്യാൻ വേറെ LangGraph starter package ഇല്ല - മുകളിലെ recipe തന്നെയാണ് integration. blockchain0x SDKs GitHub-ൽ open source ആണ്; ഈ recipe Python SDK (blockchain0x-python) wrap ചെയ്യുന്നു, പൂർണ്ണമായ method surface docs-ൽ ഉണ്ട്. node bodies ഉം webhook verify ഉം സംബന്ധിച്ച reference ആയി അത് വായിക്കുക.

github.com/tosh-labs/blockchain0x-python

പൂർണ്ണമായ SDK method surface ഉം webhook signature scheme ഉം the docs ൽ രേഖപ്പെടുത്തിയിരിക്കുന്നു. Base Sepolia-യിൽ sk_test_ key ഉപയോഗിച്ച് ആരംഭിക്കുക, തുടർന്ന് graph നിങ്ങൾ പ്രതീക്ഷിക്കുന്നതു പോലെ resume ചെയ്യുമ്പോൾ sk_live_ ആയി മാറുക.

സാധാരണ പിഴവുകൾ

എടുപ്പിക്കേണ്ട അഞ്ചു LangGraph-നിഷ്‌ഠമായ തട്ടിപ്പുകൾ.

LangGraphന്റെ ദൃഢ-നടപ്പാക്കൽ മാതൃക ശക്തമാണ്, എന്നാൽ ചെക്ക്‌പോയിന്റുകൾ, ഇടപെടലുകൾ, സംസ്ഥാന അപ്ഡേറ്റുകൾ എന്നിവയുടെ ചുറ്റുപാടുകളിൽ അതിന്റെ സ്വന്തം അപകടങ്ങൾ ഉണ്ട്.

PITFALL 1

LangGraph പാക്കേജ് ഇല്ല - ഒരു സാധാരണ നോട് SDK-നെ വിളിക്കുന്നു

Blockchain0x LangChain, CrewAI, MCP സെർവറിന് അഡാപ്റ്ററുകൾ അയക്കുന്നു; npm അല്ലെങ്കിൽ pip-ൽ പ്രത്യേക LangGraph പാക്കേജ് ഇല്ല. മുകളിൽ നൽകിയ റെസിപ്പി വഴി: ഒരു സാധാരണ ഗ്രാഫ് നോഡ് യഥാർത്ഥ @blockchain0x/node ക്ലയന്റ് വിളിക്കുന്നു, നിങ്ങൾ LangGraph-ന്റെ സ്വന്തം graph.updateState + graph.invoke-ൽ വീണ്ടും തുടരും. പ്രത്യേക പണമിടപാട്-നോഡ് ക്ലാസ് ഇല്ല, ഇറക്കുമതി ചെയ്യാൻ വീണ്ടും സഹായം ഇല്ല - അവ ഒരിക്കലും ഉണ്ടായിരുന്നില്ല.

PITFALL 2

ചെക്ക്‌പോയിന്റർ കാണുന്നില്ല

LangGraph-ന്റെ interrupt() ഗ്രാഫിന് ഒരു ചെക്ക്പോയിന്റർ ഉണ്ടെങ്കിൽ മാത്രമേ പ്രവർത്തിക്കൂ. ഒരു ചെക്ക്പോയിന്റർ ഇല്ലാതെ, നിങ്ങളുടെ പ്രക്രിയ പുറപ്പെടുമ്പോൾ അവസ്ഥ അകന്നുപോകുന്നു, വെബ്‌ഹുക്ക് ഹാൻഡ്ലർ പുനരാരംഭിക്കാൻ ത്രെഡ് ഇല്ല. വികസനത്തിനായി MemorySaver ഉപയോഗിക്കുക, ഉൽപ്പന്നത്തിൽ SqliteSaver അല്ലെങ്കിൽ PostgresSaver ഉപയോഗിക്കുക. നിങ്ങളുടെ ഗ്രാഫും വെബ്‌ഹുക്ക് ഹാൻഡ്ലറും വ്യത്യസ്ത പ്രക്രിയകളിൽ പ്രവർത്തിക്കുന്നുവെങ്കിൽ, അവയ്ക്ക് ഒരേ ചെക്ക്പോയിന്റർ പങ്കിടേണ്ടതുണ്ട് (ഉദാഹരണത്തിന്, ഒരു Postgres) അതിനാൽ ഹാൻഡ്ലർ നിർത്തിയ ത്രെഡ് കണ്ടെത്താൻ കഴിയും.

PITFALL 3

വെബ് ഹുക്ക് ശരിയായ ത്രെഡിലേക്ക് മാപ്പ് ചെയ്യുന്നത് നിങ്ങളുടെ ജോലി

വെബ്‌ഹുക്ക് നിങ്ങൾക്ക് ഒരു പണം നിശ്ചയിച്ചുവെന്ന് പറയുന്നു; ഇത് നിങ്ങളുടെ LangGraph thread_id-നെ അറിയുന്നില്ല. നിങ്ങളുടെ സ്വന്തം മാപ്പിംഗ് സൂക്ഷിക്കുക - നിങ്ങൾ ഒരു ഗ്രാഫ് ആരംഭിക്കുമ്പോൾ, ഏജന്റിന്റെ കീ, സ്വീകരിക്കുന്നവന്റെ കീ, അല്ലെങ്കിൽ നിങ്ങൾ സജ്ജീകരിച്ച idempotency കീ ഉപയോഗിച്ച് thread_id സൂക്ഷിക്കുക, പിന്നീട് അത് ഹാൻഡ്ലറിൽ നോക്കുക. മുകളിൽ threadFor() വിളിക്കൽ ആ നോക്കലാണ്. ഇത് തെറ്റായാൽ graph.invoke തെറ്റായ ത്രേഡിൽ അല്ലെങ്കിൽ ഒന്നും തന്നെ തുടരുന്നു.

PITFALL 4

നിലവാരമില്ലാത്ത പാത കൈകാര്യം ചെയ്യുക, അല്ലെങ്കിൽ ശാശ്വതമായി നിർത്തുക

await_settlement ൽ നിന്ന് കണ്ട്-നിശ്ചയിച്ച ശേഖരം സത്യമായാൽ മാത്രം വിതരണം ചെയ്യാൻ വഴിയൊരുക്കുന്നു. ഒരു പേയ്മെന്റ് ഒരിക്കലും എത്തുന്നില്ലെങ്കിൽ, ത്രെഡ് അനിശ്ചിതമായി സസ്പെൻഡ് ചെയ്യപ്പെടുന്നു. ഒരു ടൈംഔട്ട് ചേർക്കുക: settled=false ഉള്ള പഴയ ത്രെഡുകൾ പുനരാരംഭിക്കുന്ന ഒരു ഷെഡ്യൂൾ ചെയ്ത സ്വീപ്പ്, അതിനാൽ എഡ്ജ് END-ലേക്ക് വഴിയൊരുക്കുന്നു, അല്ലെങ്കിൽ ഒരു payment.sent-versus-deadline പരിശോധന. ഒരു സസ്പെൻഡഡ് ത്രെഡ് ഒന്നും ചെലവില്ല, എന്നാൽ അത് ഒരിക്കലും സ്വയം അവസാനിക്കില്ല.

PITFALL 5

അളവുകൾ USDC അടിസ്ഥാന യൂണിറ്റുകൾ, സ്ട്രിംഗുകളായി

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.

അവലംബമായി ചോദിച്ച

മൂന്ന് LangGraph-നിർദ്ദിഷ്ട ചോദ്യങ്ങൾ.

npm അല്ലെങ്കിൽ pip-ൽ LangGraph പാക്കേജ് ഉണ്ടോ?

ഇല്ല. LangGraph ഇതിനകം നിങ്ങൾക്ക് എല്ലാം നൽകുന്നു: ഒരു നോഡ് ഒരു ഫംഗ്ഷൻ മാത്രമാണ്, interrupt() നിർത്തുന്നു, ഒരു ചെക്ക് പോയിന്റർ നിലനിൽക്കുന്നു, graph.updateState + graph.invoke പുനരാരംഭിക്കുന്നു. അതിനാൽ സത്യസന്ധമായ പാത യഥാർത്ഥ @blockchain0x/node ക്ലയന്റിനെ (അല്ലെങ്കിൽ Python blockchain0x ക്ലയന്റിനെ) വിളിക്കുന്ന ഒരു സാധാരണ നോഡ് ആണ്, മുകളിൽ കാണിച്ചിരിക്കുന്നതുപോലെ. അയച്ചിട്ടുള്ള ഏക ഫ്രെയിംവർക്ക് പാക്കേജുകൾ blockchain0x-langchain, blockchain0x-crewai (രണ്ട് Python) കൂടാതെ @blockchain0x/mcp സെർവറാണ്.

ഞാൻ Python LangGraph-ൽ ഇത് ചെയ്യാമോ?

അതെ, അതേ recipe തന്നെയാണ്. Python LangGraph-ലും അതേ primitives ഉണ്ട് - ഒരു function node, interrupt(), ഒരു checkpointer, കൂടാതെ തുടരാൻ Command(resume=...) അല്ലെങ്കിൽ update_state + invoke. നിങ്ങളുടെ node Python blockchain0x client (blockchain0x.payments.create(...)) വിളിക്കുന്നു, നിങ്ങളുടെ webhook handler signature verify ചെയ്ത് thread resume ചെയ്യുന്നു. langgraph ഉം blockchain0x ഉം ഒഴികെ ഇൻസ്റ്റാൾ ചെയ്യാനുള്ള വേറെ pip package ഒന്നുമില്ല; graph definition TypeScript പതിപ്പിനോട് ഏകദേശം സമാനമാണ്.

ഇത് LangGraph പ്ലാറ്റ്ഫോം, മനുഷ്യൻ-ഇൻ-ലൂപ്പ് നോഡുകൾ എന്നിവയുമായി പ്രവർത്തിക്കുന്നുണ്ടോ?

അതെ. റെസിപ്പി സാധാരണ LangGraph ആണ്, അതിനാൽ അത് LangGraph പ്ലാറ്റ്ഫോമിൽ ഒരുപോലെ പ്രവർത്തിക്കുന്നു - നിങ്ങളുടെ Blockchain0x വെബ്ഹുക്ക് വിന്യസത്തിലേക്ക് സൂചിപ്പിക്കുക, അവിടെ ത്രെഡ് വീണ്ടും ആരംഭിക്കുക. interrupt() ഒരു ഗ്രാഫിൽ നിരവധി ഇടപെടൽ പോയിന്റുകൾക്കും പിന്തുണ നൽകുന്നു: വെബ്ഹുക്ക് പുനരാരംഭിച്ച ഒരു പേയ്മെന്റ് ഇടപെടൽ, UI പ്രവർത്തനത്തിലൂടെ പുനരാരംഭിച്ച ഒരു മനുഷ്യ-അവലോകന ഇടപെടൽ എന്നിവ ഒരുമിച്ച് ജീവിക്കാം, ഓരോ പുനരാരംഭവും അവയുടെ സ്വന്തം ഫീൽഡ് സംസ്ഥാനത്ത് അപ്ഡേറ്റ് ചെയ്യുന്നവയായിരിക്കണം. ഗ്രാഫ് അവയെ ക്രമത്തിൽ വഴി നടത്തുന്നു.

നിങ്ങളുടെ ഗ്രാഫിലേക്ക് ദൃഢമായ പണമടയ്ക്കലുകൾ ചേർക്കുക.

പണമടവിൽ നിർത്തുക, വെബ് ഹുക്ക് വഴി പുനരാരംഭിക്കുക, എല്ലാം LangGraph-ന്റെ സ്വന്തം APIs ഉപയോഗിച്ച്. ആരംഭിക്കാൻ സൗജന്യമാണ്.