Pydantic AI পেমেন্ট ইন্টিগ্রেশন।
এখানে কোনো Pydantic AI প্যাকেজ নেই, এবং আপনার একটি প্রয়োজন নেই। @agent.tool_plain দিয়ে একটি টাইপ করা ফাংশন নিবন্ধন করুন, প্রকৃত blockchain0x ক্লায়েন্টকে কল করুন, এবং আপনার এজেন্ট Base-এ USDC স্থানান্তর করতে পারে।
Pydantic AI-এর জন্য আলাদা কোনো package নেই, এবং আপনারও তা দরকার নেই। Pydantic AI দিয়ে একটি function-কে validated tool-এ রূপান্তর করে, তাই আপনি real Python client-কে একটি typed function-এ wrap করেন এবং agent USDC পাঠাতে, invoice settle করতে, এবং wallet পড়তে পারে। এটি OpenAI, Anthropic, Google, Mistral, Groq, এবং Pydantic AI-এর অন্য সব provider জুড়ে কাজ করে, কারণ tool model নয়, HTTP API call করে। Payment Base-এ settle হয়।
Pydantic AI-এর টাইপিং জয়ী। এটিকে পেমেন্টের জন্যও ব্যবহার করুন।
Pydantic AI এর পুরো পয়েন্ট হল শক্ত টাইপিং: এজেন্ট ইনপুট টাইপ করা হয়, আউটপুট টাইপ করা হয়, নির্ভরতাগুলি টাইপ করা হয়, পুনরায় চেষ্টা টাইপ করা হয়। ফ্রেমওয়ার্কটি সীমানায় অস্বাভাবিক ডেটা প্রত্যাখ্যান করে LLM কলের মাধ্যমে এটি ছড়িয়ে পড়তে না দিয়ে। আপনার ওয়ালেট টুল ঠিক সেটির উপর ভিত্তি করে চলে - টাইপ সহ আর্গুমেন্টগুলি ঘোষণা করুন, এবং Pydantic AI স্বাক্ষর এবং ডকস্ট্রিং থেকে একটি যাচাইকৃত স্কিমা তৈরি করে মডেলটি কখনও এটি কল করার অনুমতি দেওয়ার আগে।
বাস্তব সুবিধা: যদি মডেলটি একটি বেস-ইউনিট স্ট্রিংয়ের পরিবর্তে একটি ফ্লোট সহ send_usdc কল করার চেষ্টা করে, তবে ব্যর্থতা Pydantic-এর যাচাইকরণ স্তরে ঘটে আমাদের কাছে যেকোনো HTTP কলের আগে। আপনি একটি পরিষ্কার ValidationError একটি কার্যকরী বার্তা সহ দেখতে পান বরং API থেকে একটি 422 ক্রিপটিক ক্ষেত্রের পথ সহ। এটি এখানে ক্লায়েন্টটিকে নিজে মোড়ানোর পুরো কারণ - আপনি তার তারের দিকে সমস্ত টাইপিং রাখেন।
Pydantic AI এবং মূল SDK ইনস্টল করুন। দুটি কী।
যোগ করার জন্য কোনো blockchain0x Pydantic AI প্যাকেজ নেই। আপনি Pydantic AI (Python 3.10+) এবং প্রকৃত blockchain0x মূল SDK ইনস্টল করেন, তারপর নিচের ফাংশনটি লেখেন। এটি পুরো নির্ভরতা তালিকা।
pip install pydantic-ai blockchain0xexport OPENAI_API_KEY=sk-... export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
OPENAI_API_KEY (অথবা আপনি যে প্রদানকারী ব্যবহার করেন তার জন্য সমতুল্য)। BLOCKCHAIN0X_API_KEY আপনার ড্যাশবোর্ড থেকে একটি sk_test_ testnet বা sk_live_ mainnet কী; ক্লায়েন্ট এটি পরিবেশ থেকে পড়ে। যদি আপনার এজেন্টও অর্থ গ্রহণ করে, তবে ওয়েবহুক হ্যান্ডলার অতিরিক্তভাবে BLOCKCHAIN0X_WEBHOOK_SECRET প্রয়োজন।
একটি টাইপ করা ফাংশন যা অর্থ প্রদান করে, একটি টুল হিসাবে নিবন্ধিত।
নিচে পুরো ইন্টিগ্রেশন রয়েছে। send_usdc আসল blockchain0x ক্লায়েন্টকে কল করে; @agent.tool_plain এটি টাইপ হিন্ট এবং ডক্সট্রিং থেকে তৈরি স্কিমার সাথে নিবন্ধন করে। এটি চালান এবং এজেন্টটি Base-এ USDC স্থানান্তর করে, কলের আগে আর্গুমেন্টগুলি যাচাইকৃত।
from pydantic_ai import Agent from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment agent = Agent( "openai:gpt-4o", system_prompt="You pay vendor invoices in USDC within owner-set limits.", ) # Register a plain function as a tool. No dedicated package needed. @agent.tool_plain def send_usdc(agent_id: str, to: str, amount_wei: str) -> str: """Send a USDC payment from an agent wallet. amount_wei is USDC base units (6 decimals), so "10000" is 0.01 USDC. """ return str( blockchain0x.payments.create(body={"agentId": agent_id, "to": to, "amountWei": amount_wei}) ) result = agent.run_sync( "Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset." ) print(result.output)
When the agent decides to pay, it calls send_usdc, the SDK submits the transfer, and you get a transaction hash back. amount_wei is base units, so 0.01 USDC is "10000". A sk_test_ key keeps it on Base Sepolia until you switch to sk_live_. Want a typed result object instead of a string? Set the agent's output_type to your own Pydantic model and return it from the tool. Add read and settle functions the same way.
একটি স্বাক্ষরিত ওয়েবহুক দিয়ে ইনবাউন্ড পেমেন্ট নিশ্চিত করুন।
যদি আপনার এজেন্টও USDC গ্রহণ করে, তবে এটি ওয়েবহুকের সাথে নিশ্চিত করুন পোলিংয়ের পরিবর্তে। যাচাই সহায়ক নোড SDK তে শিপ করে; একটি পাইথন সার্ভিসে আপনি নথিভুক্ত HMAC এর বিরুদ্ধে হাতে যাচাই করেন। যদি আপনি টাইপ করা ইভেন্ট চান, তবে আপনার নিজস্ব Pydantic মডেল সংজ্ঞায়িত করুন এবং স্বাক্ষরের চেক করার পরে কাঁচা শরীরের model_validate_json করুন - টাইপিং আপনার যোগ করার জন্য। নিচে FastAPI উদাহরণ।
import hmac, hashlib, os, time from fastapi import FastAPI, Request, HTTPException app = FastAPI() SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode() @app.post("/webhooks/payment") async def receive(request: Request): raw = await request.body() # RAW bytes - do not parse first sig = request.headers.get("X-Blockchain0x-Signature", "") ts = request.headers.get("X-Blockchain0x-Timestamp", "") parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p) t, v1 = parts.get("t", ts), parts.get("v1", sig) want = hmac.new(SECRET, t.encode() + b"." + raw, hashlib.sha256).hexdigest() if not hmac.compare_digest(want, v1) or abs(time.time() - int(t)) > 300: raise HTTPException(status_code=401) if request.headers.get("X-Blockchain0x-Event-Type") == "payment.received": await trigger_followup() # USDC landed - run the next step return {"ok": True}
অ্যালগরিদমটি t.rawBody স্ট্রিংয়ের উপর HMAC-SHA256, একটি ধ্রুবক-সময়ের তুলনা, এবং একটি 300-সেকেন্ডের পুনরায় প্লে উইন্ডো। কাঁচা শরীরটি await request.body() এর মাধ্যমে পড়ুন, কখনও request.json() পুনরায় সিরিয়ালাইজ করবেন না, কারণ এটি সিগনেচার দ্বারা কভার করা বাইটগুলি পরিবর্তন করে। চালানো ইভেন্টগুলি হল payment.received, payment.sent, wallet.deployed, এবং webhook.test; শাখা করতে X-Blockchain0x-Event-Type হেডারে সংকীর্ণ করুন।
আপনি যেটি মোড়াচ্ছেন ক্লায়েন্টটি খোলা। এটি পড়ুন।
এখন ক্লোন করার জন্য কোন Pydantic AI স্টার্টার প্যাকেজ নেই - উপরের রেসিপিটি ইন্টিগ্রেশন। blockchain0x SDK গুলি GitHub এ ওপেন সোর্স; এই রেসিপিটি Python SDK (blockchain0x-python) মোড়ানো, ডকসে সম্পূর্ণ পদ্ধতি পৃষ্ঠ সহ। ফাংশন বডিগুলির জন্য একটি রেফারেন্স হিসাবে এটি পড়ুন।
github.com/tosh-labs/blockchain0x-pythonপূর্ণ SDK পদ্ধতি পৃষ্ঠ এবং স্কোপগুলি ডকস এ নথিভুক্ত। Base Sepolia এর বিরুদ্ধে একটি sk_test_ কী দিয়ে শুরু করুন, তারপর যখন ফাংশন আপনার প্রত্যাশা অনুযায়ী কাজ করে তখন sk_live_ এ স্যুইচ করুন।
পাঁচটি Pydantic AI-নির্দিষ্ট ফাঁদ এড়ানো উচিত।
Pydantic AI-এর শক্তিশালী টাইপিং সীমান্তে বেশিরভাগ ইন্টিগ্রেশন বাগ ধরতে পারে; এগুলি কয়েকটি যা ফাঁস হয়।
এখানে কোনো Pydantic AI প্যাকেজ নেই - আপনি একটি টুল নিবন্ধন করেন
Blockchain0x LangChain এবং CrewAI এর জন্য অ্যাডাপ্টার পাঠায় এবং MCP সার্ভার; কোনও নিবেদিত Pydantic AI প্যাকেজ নেই। উপরের রেসিপিটি হল পথ: একটি সাধারণ টাইপ করা ফাংশন যা আসল blockchain0x ক্লায়েন্টকে কল করে @agent.tool_plain দিয়ে সাজানো। Pydantic AI স্বাক্ষর এবং ডক্সট্রিং পড়ে একটি যাচাইকৃত টুল স্কিমা তৈরি করে, যা হল ঠিক সেই টাইপিং জয় যার জন্য আপনি Pydantic AI-তে এসেছিলেন।
পরিমাণ একটি স্ট্রিং রাখুন; Pydantic কে লাইনটি ধরে রাখতে দিন।
payments.create takes amountWei: a string of USDC base units (6 decimals), so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the tool argument as str and Pydantic AI rejects a float at the boundary with a clear ValidationError, before any HTTP call. That is the whole point of doing this in Pydantic AI - the malformed value never reaches the API.
send_payment প্রাথমিকভাবে 503 উত্তর দিতে পারে
payments.create ডিফল্টভাবে পুনরায় চেষ্টা করে না এবং আপনার নেটওয়ার্কের জন্য চেইন অ্যাডাপ্টার সংযুক্ত না হওয়া পর্যন্ত 503 ফেরত দিতে পারে। আপনার টুলের মধ্যে ত্রুটি ধরুন এবং একটি স্পষ্ট বার্তা ফেরত দিন যা মডেল কার্যকর করতে পারে, এজেন্টকে লুপ করতে না দিয়ে। স্বয়ংক্রিয়ভাবে তৈরি করা idempotency কী মানে একটি ম্যানুয়াল পুনরায় চেষ্টা দ্বিগুণ পেমেন্ট করবে না।
প্রদানকারী-পূর্বসূরী মডেল স্ট্রিংগুলি
Pydantic AI প্রদানকারী-পূর্বসূরী মডেল স্ট্রিং ব্যবহার করে: 'openai:gpt-4o', 'anthropic:claude-3-5-sonnet-latest', 'google-gla:gemini-1.5-pro'। পূর্বসূরী বাদ দিলে একটি রহস্যময় 'অজানা মডেল' ত্রুটি দেয়। আপনার টুল প্রদানকারী-নিরপেক্ষ কারণ এটি HTTP API কল করে, মডেল নয় - পূর্বসূরী বিনিময় করুন এবং ওয়ালেট ফাংশন অপরিবর্তিত থাকে।
tool_plain বনাম tool (RunContext)
যখন ফাংশনটি রান থেকে কিছুই প্রয়োজন না হয়, তখন @agent.tool_plain ব্যবহার করুন, যেমন উপরে। যদি আপনি টুলের ভিতরে এজেন্টের নির্ভরতাগুলি চান (একটি প্রতি-অনুরোধ ক্লায়েন্ট আইডি, একটি ব্যয় ক্যাপ), @agent.tool ব্যবহার করুন এবং প্রথম আর্গুমেন্টটি ctx: RunContext[Deps] হিসাবে ঘোষণা করুন ctx.deps পড়তে। উভয় মিশ্রিত করা - tool_plain এ একটি ctx আর্গুমেন্ট ঘোষণা করা - নিবন্ধনে একটি TypeError উত্থাপন করে।