LangGraph পেমেণ্ট একত্ৰিতকৰণ।
কোনো LangGraph পেকেজৰ প্ৰয়োজন নাই। এখন সাধাৰণ নোডে বাস্তৱ blockchain0x ক্লায়েন্টক কল কৰে, interrupt() পইচা ৱেবহুক আহি পৰ্যন্ত স্থগিত থাকে, আৰু গ্ৰাফ পুনৰ আৰম্ভ হয় - চলনসমূহৰ মাজত টেকসই।
LangGraph-ৰ বাবে কোনো package নাই, আৰু আপোনাক তাৰ প্ৰয়োজনো নহয়। আপোনাৰ -ৰ এটা সাধাৰণ node-এ real client call কৰে, এটা -এ payment webhook আহি নোপোৱালৈ graph-টো suspend কৰে, আৰু handler-এ LangGraph-ৰ নিজৰ + ব্যৱহাৰ কৰি ইয়াক resume কৰে। Payment-সমূহ Base-ত settle হয়।
দৃঢ় কাৰ্যন্বয় পেমেন্টৰ পিছত পুনৰ আৰম্ভ কৰাৰ পেটাৰ্নক স্বাভাৱিক কৰে।
এজেন্ট-চালিত পেমেন্টৰ কঠিন অংশ হৈছে আসিঙ্ক গেপ: আপুনি পেমেন্টৰ অনুৰোধ কৰে, ক্ৰেতাই মিনিটৰ পিছত (অথবা কেতিয়াও নহয়) পেমেন্ট কৰে, আৰু আপুনি য'ত আছিল সেখন অৱস্থাটো হেৰুৱাই নকৰাকৈ কাম পুনৰ আৰম্ভ কৰিব লাগিব। অধিকাংশ এজেন্ট ফ্ৰেমৱৰ্কে এই গেপটো পূৰণ কৰিবলৈ এটা চাকৰি কিউ + মেনুৱেল ষ্টেট-ষ্টোৰৰ ওপৰত নিৰ্ভৰ কৰে। LangGraph ইতিমধ্যে প্ৰাথমিকভাৱে নিৰ্মিত: interrupt() এটা নোডত গ্ৰাফটো স্থগিত কৰে আৰু এটা চেকপইণ্টাৰ অৱস্থাটো ডিস্কত সংৰক্ষণ কৰে। পুনৰ আৰম্ভ কৰা হৈছে এটা কল।
এই ৰেচিপিখনে কোনো বিশেষ যন্ত্ৰপাতি বিনা এইটোত ভৰসা কৰে। এটা সাধাৰণ পে নোডে blockchain0x.payments.createক কল কৰে। এটা await_settlement নোডে interrupt()ক কল কৰে স্থগিত কৰিবলৈ, আৰু চেকপইণ্টাৰ অৱস্থাটো স্থায়ী কৰে। ৱেবহুক হেণ্ডলাৰে স্বাক্ষৰটো পৰীক্ষা কৰে, মিল থকা থ্ৰেডত graph.updateStateৰ সৈতে settled স্থাপন কৰে, আৰু interruptৰ পৰা আগবঢ়িবলৈ graph.invokeক কল কৰে। গ্ৰাফে ঠিক য'ত থমকি গৈছিল স'তে পুনৰ আৰম্ভ কৰে, আগৰ নোডৰ পৰা যিকোনো LLM প্ৰসংগসহ - সকলো LangGraphৰ নিজৰ API ব্যৱহাৰ কৰি।
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 হৈছে আপোনাৰ ডেছব'ৰ্ডৰ পৰা sk_test_ testnet বা sk_live_ mainnet চাবি; ক্লায়েন্টে ইয়াক পৰিবেশৰ পৰা পঢ়ে। BLOCKCHAIN0X_WEBHOOK_SECRET (যি আপোনাৰ webhook সৃষ্টি বা ঘূৰাই দিলে একবাৰ মাক কৰে) হৈছে সেই প্ৰক্ৰিয়াত যি webhookসমূহৰ ব্যৱস্থা কৰে। যদি আপোনাৰ গ্ৰাফ এটা প্ৰক্ৰিয়াত চলে আৰু হেণ্ডলাৰ আন এটা প্ৰক্ৰিয়াত, তেন্তে দুয়োটা একে চেকপইণ্টাৰ (যেনে, শ্বেয়াৰ কৰা Postgres)ৰ প্ৰয়োজন যাতে হেণ্ডলাৰে স্থগিত থ্ৰেডটো বিচাৰি পায়।
এখন তিনিটা-নোড গ্ৰাফ: পেমেন্ট, স্থগিত, বিতৰণ।
তলত এক সম্পূৰ্ণ LangGraph কাৰ্যপদ্ধতি আছে য'ত এক টাইপ কৰা ৰাজ্য, এটা পে নোড যি বাস্তৱ blockchain0x.payments.createক কল কৰে, এটা ইণ্টাৰাপ্ট-ভিত্তিত await_settlement নোড, আৰু এটা ডেলিভাৰ নোড যি চেইনে পেমেণ্ট স্থানান্তৰ নিশ্চিত কৰিলে নিৰ্ভৰশীল কাম চলায়।
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ৰ নিজৰ API।
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 RAW শৰীৰৰ ওপৰত ধ্ৰুৱক সময়ত HMAC-SHA256 কৰে আৰু এক পৃথকিত ইউনিয়ন উভতি দিয়ে - result.ok ত শাখা কৰক, কোনো চেষ্টা/ধৰা নাই। result.eventId ক আপোনাৰ স্থগিত কৰা থ্ৰেডলৈ মানচিত্র কৰক, তাৰপিছত graph.updateState + graph.invoke(null, config) সংৰক্ষিত চেকপইণ্টৰ পৰা পুনৰ আৰম্ভ কৰে আৰু গ্ৰাফ চলা বিতৰণ কৰে। প্ৰেৰণ কৰা ঘটনাবোৰ হৈছে payment.received, payment.sent, wallet.deployed, আৰু webhook.test।
আপুনি যি ক্লায়েন্টক মুড়ি দিছে সেয়া খোলা। সিহঁত পঢ়ক।
লাংগ্ৰাফ ষ্টাৰ্টাৰ পেকেজ ক্লোন কৰিবলৈ নাই - ওপৰৰ ৰেচিপিখন হৈছে একীকৰণ। blockchain0x SDKসমূহ GitHubত খুলি আছে; এই ৰেচিপিখনে Python SDK (blockchain0x-python)ক মোড়ে, ডক্সত সম্পূৰ্ণ পদ্ধতি পৃষ্ঠাৰ সৈতে। নোড বডীসমূহ আৰু ৱেবহুক পৰীক্ষাৰ বাবে ইয়াক এটা উল্লেখ হিচাপে পঢ়ক।
github.com/tosh-labs/blockchain0x-pythonসম্পূৰ্ণ SDK পদ্ধতি পৃষ্ঠ আৰু webhook চিহ্নিতকৰণ স্কীম ডক্সসমূহত নথিভুক্ত কৰা হৈছে। Base Sepoliaৰ বিৰুদ্ধে sk_test_ চাবিৰ সৈতে আৰম্ভ কৰক, তাৰপিছত গ্ৰাফে আপোনাৰ আশা কৰা ধৰণে পুনৰ আৰম্ভ কৰিলে sk_live_লৈ সলনি কৰক।
পাঁচটা LangGraph-নির্দিষ্ট ফাঁদ যিবোৰ এৰাব লাগে।
LangGraphৰ টেকসই-নিষ্পত্তি মডেল শক্তিশালী কিন্তু ইয়াৰ চেকপইণ্ট, ইণ্টাৰাপ্ট, আৰু অৱস্থা আপডেটৰ চাৰিওফালে নিজৰ পাদুকা আছে।
LangGraph পেকেজ নাই - এটা সাধাৰণ নোড SDKক কল কৰে
Blockchain0x LangChain আৰু CrewAIৰ বাবে এডাপ্টাৰ প্ৰেৰণ কৰে লগতে MCP ছাৰ্ভাৰ; ইয়াত npm বা pipত কোনো নিৰ্দিষ্ট LangGraph পেকেজ নাই। তলত উল্লেখ কৰা ৰেচিপি হৈছে পথ: এটা সাধাৰণ গ্ৰাফ নোডে বাস্তৱ @blockchain0x/node ক্লায়েন্টক কল কৰে, আৰু আপুনি LangGraphৰ নিজস্ব graph.updateState + graph.invokeৰ সৈতে পুনৰ আৰম্ভ কৰে। বিশেষ পেমেন্ট-নোড ক্লাছ আৰু আমদানি কৰিবলৈ কোনো পুনৰাৰম্ভ সহায়ক নাই - সিহঁত কেতিয়াও অস্তিত্ব নাছিল।
চেকপইণ্টাৰ অনুপস্থিত
LangGraphৰ interrupt() মাত্ৰ তেতিয়াই কাম কৰে যেতিয়া গ্ৰাফটোৰ এটা চেকপইণ্টাৰ থাকে। এজন নথকা, অৱস্থাটো আপোনাৰ প্ৰক্ৰিয়া বাহিৰ হ'লে উড়ি যায় আৰু ৱেবহুক হেণ্ডলাৰৰ কোনো থ্ৰেড পুনৰ আৰম্ভ কৰিবলৈ নাথাকে। উন্নয়নৰ বাবে MemorySaver ব্যৱহাৰ কৰক আৰু উৎপাদনত SqliteSaver বা PostgresSaver। যদি আপোনাৰ গ্ৰাফ আৰু ৱেবহুক হেণ্ডলাৰ ভিন্ন প্ৰক্ৰিয়াত চলে, তেন্তে সিহঁতে একে চেকপইণ্টাৰ (যেনে এক Postgres) ভাগ কৰিব লাগিব যাতে হেণ্ডলাৰটোৱে স্থগিত থ্ৰেডটো বিচাৰি পায়।
ৱেবহুকটোক সঠিক থ্ৰেডলৈ মানচিত্রিত কৰা আপোনাৰ কাম
ওয়েবহুকটো আপোনাক জনায় যে এটা পেমেন্ট স্থিৰ হৈছে; ই আপোনাৰ LangGraph thread_id জানে নে। আপোনাৰ নিজৰ মানচিত্র ৰাখক - যেতিয়া আপুনি এটা গ্ৰাফ আৰম্ভ কৰে, তেতিয়া এজেন্ট, গ্ৰাহক, বা আপুনি স্থাপন কৰা idempotency কী দ্বাৰা থ্ৰেড_id সংৰক্ষণ কৰক, তাৰপিছত হেণ্ডলাৰত ইয়াক চাওক। ওপৰৰ threadFor() কলটো সেই অনুসন্ধান। এইটো ভুল হলে graph.invoke ভুল থ্ৰেডটো পুনৰ আৰম্ভ কৰে বা একো নাই।
নো-সমাধান পথৰ ব্যৱস্থা কৰক, অথবা চিৰকালৰ বাবে স্থগিত কৰক
await_settlementৰ পৰা শর্তাধীন এজে ডেলিভাৰ কৰিবলৈ মাত্ৰ তেতিয়া মাৰ্গ নিৰ্দেশ কৰে যেতিয়া settled সত্য। যদি কোনো পেমেন্ট কেতিয়াও নপৰে, থ্ৰেডটো অনন্তকালৰ বাবে স্থগিত থাকে। এটা টাইমআউট যোগ কৰক: এটা সময়সূচী কৰা পৰিষ্কাৰ যিয়ে settled=falseৰ সৈতে অবসৰ গ্ৰহণ কৰা থ্ৰেডসমূহ পুনৰ আৰম্ভ কৰে যাতে এজে ENDলৈ মাৰ্গ নিৰ্দেশ কৰে, বা পেমেন্ট.sent-ৰ বিৰুদ্ধে সময়সীমা পৰীক্ষা। এটা স্থগিত থ্ৰেডৰ কোনো খৰচ নাই, কিন্তু সেয়া নিজে শেষ নকৰে।
মাত্ৰাসমূহ 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.