Pydantic AI ಪಾವತಿ ಏಕೀಕರಣ.
Pydantic AI ಪ್ಯಾಕೇಜ್ ಇಲ್ಲ, ಮತ್ತು ನಿಮಗೆ ಒಂದು ಅಗತ್ಯವಿಲ್ಲ. @agent.tool_plain ಬಳಸಿ ಟೈಪ್ಡ್ ಕಾರ್ಯವನ್ನು ನೋಂದಾಯಿಸಿ, ವಾಸ್ತವ blockchain0x ಕ್ಲೈಂಟ್ ಅನ್ನು ಕರೆ ಮಾಡಿ, ಮತ್ತು ನಿಮ್ಮ ಏಜೆಂಟ್ USDC ಅನ್ನು Base ನಲ್ಲಿ ಚಲಾಯಿಸಬಹುದು.
Pydantic AI-specific package ಇಲ್ಲ, ಮತ್ತು ನಿಮಗೆ ಅದು ಬೇಕಾಗಿಲ್ಲ. Pydantic AI ಒಂದು function ಅನ್ನು ಮೂಲಕ validated tool ಆಗಿ ಪರಿವರ್ತಿಸುತ್ತದೆ, ಆದ್ದರಿಂದ ನೀವು ನಿಜವಾದ Python client ಅನ್ನು typed function ನಲ್ಲಿ wrap ಮಾಡುತ್ತೀರಿ ಮತ್ತು agent USDC ಕಳುಹಿಸಬಹುದು, invoices settle ಮಾಡಬಹುದು, ಮತ್ತು wallets ಓದಬಹುದು. ಇದು OpenAI, Anthropic, Google, Mistral, Groq, ಮತ್ತು ಇತರೆ ಎಲ್ಲಾ Pydantic AI providers across ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ, ಏಕೆಂದರೆ tool model ಅಲ್ಲ, HTTP API ಅನ್ನು ಕರೆಯುತ್ತದೆ. Payments Base ನಲ್ಲಿ settle ಆಗುತ್ತವೆ.
Pydantic AI ಯ ಟೈಪಿಂಗ್ ಗೆಲ್ಲುತ್ತದೆ. ಇದನ್ನು ಪಾವತಿಗಳಿಗೆ ಬಳಸಿರಿ.
Pydantic AI ಯ ಸಂಪೂರ್ಣ ಉದ್ದೇಶವು ಶಕ್ತಿಯುತ ಟೈಪಿಂಗ್ ಆಗಿದೆ: ಏಜೆಂಟ್ ನ ಒಳನೋಟಗಳು ಟೈಪ್ಡ್, ಔಟ್ಪುಟ್ಗಳು ಟೈಪ್ಡ್, ಅವಲಂಬನೆಗಳು ಟೈಪ್ಡ್, ಪುನರಾವೃತ್ತಗಳು ಟೈಪ್ಡ್. ಫ್ರೇಮ್ವರ್ಕ್ ಅಸಾಧು ಡೇಟಾವನ್ನು ಗಡಿಯಲ್ಲಿ ನಿರಾಕರಿಸುತ್ತದೆ, LLM ಕರೆ ಮೂಲಕ ಹರಿಯಲು ಬಿಡುವುದಿಲ್ಲ. ನಿಮ್ಮ ವಾಲೆಟ್ ಸಾಧನವು ಖಚಿತವಾಗಿ ಅದನ್ನು ಬಳಸುತ್ತದೆ - ಆರ್ಗ್ಯುಮೆಂಟ್ಗಳನ್ನು ಟೈಪ್ಸ್ೊಂದಿಗೆ ಘೋಷಿಸಿ, ಮತ್ತು Pydantic AI ಮಾದರಿಯನ್ನು ಕರೆ ಮಾಡಲು ಅನುಮತಿಸುವ ಮೊದಲು ಸಹಿ ಮತ್ತು ಡಾಕ್ಸ್ಟ್ರಿಂಗ್ನಿಂದ ಮಾನ್ಯವಾದ ಶ್ರೇಣಿಯನ್ನು ನಿರ್ಮಿಸುತ್ತದೆ.
ಪ್ರಾಯೋಗಿಕ ಲಾಭ: model send_usdc ಅನ್ನು base-unit string ಬದಲು float ಜೊತೆ ಕರೆ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿದರೆ, ಯಾವುದೇ HTTP call ನಮಗೆ ಹೋಗುವ ಮುನ್ನವೇ Pydantic ನ validation layer ನಲ್ಲಿ failure ಆಗುತ್ತದೆ. API ಯಿಂದ cryptic field paths ಹೊಂದಿದ 422 ಬರುವ ಬದಲು, ನೀವು ಉಪಯುಕ್ತ ಸಂದೇಶದೊಂದಿಗೆ ಸ್ಪಷ್ಟವಾದ ValidationError ಅನ್ನು ಕಾಣುತ್ತೀರಿ. generic adapter ಗೆ ಮೊರೆ ಹೋಗುವ ಬದಲು ಇಲ್ಲಿ client ಅನ್ನು ನೀವೇ wrap ಮಾಡಿಕೊಳ್ಳುವ ಮೂಲ ಕಾರಣ ಇದೇ - wire ವರೆಗೆ typing ಅನ್ನು ನೀವು ಉಳಿಸಿಕೊಳ್ಳುತ್ತೀರಿ.
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 (ಅಥವಾ ನೀವು ಬಳಸುವ ಯಾವುದೇ provider ಗೆ ಸಮಾನವಾದುದು). BLOCKCHAIN0X_API_KEY ನಿಮ್ಮ dashboard ನಿಂದ ಬಂದಿರುವ sk_test_ testnet ಅಥವಾ sk_live_ mainnet key ಆಗಿದೆ; client ಇದನ್ನು environment ನಿಂದ ಓದುತ್ತದೆ. ನಿಮ್ಮ agent ಗೆ ಹಣವೂ ಬರುತ್ತಿದ್ದರೆ, webhook handler ಗೆ ಹೆಚ್ಚುವರಿಯಾಗಿ BLOCKCHAIN0X_WEBHOOK_SECRET ಬೇಕಾಗುತ್ತದೆ.
ಒಂದು ಟೈಪ್ಡ್ ಕಾರ್ಯ, ಸಾಧನವಾಗಿ ನೋಂದಾಯಿತವಾಗಿದೆ.
ಕೆಳಗೆ ಸಂಪೂರ್ಣ ಏಕೀಕರಣವಿದೆ. send_usdc ವಾಸ್ತವ blockchain0x ಕ್ಲೈಂಟ್ ಅನ್ನು ಕರೆ ಮಾಡುತ್ತದೆ; @agent.tool_plain ಇದನ್ನು ಟೈಪ್ ಹಿಂಟ್ಸ್ ಮತ್ತು ಡಾಕ್ಸ್ಟ್ರಿಂಗ್ನಿಂದ ನಿರ್ಮಿತ ಶ್ರೇಣಿಯೊಂದಿಗೆ ನೋಂದಾಯಿಸುತ್ತದೆ. ಅದನ್ನು ಓಡಿಸಿ ಮತ್ತು ಏಜೆಂಟ್ 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 ಅನ್ನು RECEIVES ಮಾಡಿದರೆ, polling ಬದಲು ವೆಬ್ಹುಕ್ ಮೂಲಕ ದೃಢೀಕರಿಸಿ. ಪರಿಶೀಲನೆ ಸಹಾಯಕವು Node SDK ನಲ್ಲಿ ಸಾಗುತ್ತದೆ; Python ಸೇವೆಯಲ್ಲಿ ನೀವು ದಾಖಲೆ ಮಾಡಿದ HMAC ವಿರುದ್ಧ ಕೈಯಿಂದ ಪರಿಶೀಲಿಸುತ್ತೀರಿ. ನೀವು ಟೈಪ್ಡ್ ಘಟನೆಗಳನ್ನು ಬಯಸಿದರೆ, ನಿಮ್ಮದೇ Pydantic ಮಾದರಿಯನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ ಮತ್ತು ಸಹಿ ಪರಿಶೀಲನೆಯ ನಂತರ ಕಚ್ಚಾ ಶರೀರವನ್ನು model_validate_json ಮಾಡಿ - ಟೈಪಿಂಗ್ ಸೇರಿಸಲು ನಿಮ್ಮದು.
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}
algorithm ಎಂದರೆ t.rawBody string ಮೇಲೆ HMAC-SHA256, constant-time compare, ಮತ್ತು 300-second replay window. raw body ಅನ್ನು await request.body() ಮೂಲಕ read ಮಾಡಿ, ಎಂದಿಗೂ request.json() ಅನ್ನು re-serialized ಮಾಡಬೇಡಿ, ಏಕೆಂದರೆ ಅದು signature ಒಳಗೊಂಡ bytes ಅನ್ನು ಬದಲಾಯಿಸುತ್ತದೆ. ship ಮಾಡಲಾದ events payment.received, payment.sent, wallet.deployed, ಮತ್ತು webhook.test; branch ಮಾಡಲು X-Blockchain0x-Event-Type header ಮೇಲೆ narrow ಮಾಡಿ.
ನೀವು wrap ಮಾಡುತ್ತಿರುವ client open ಆಗಿದೆ. ಅದನ್ನು read ಮಾಡಿ.
ಕ್ಲೋನ್ ಮಾಡಲು ಯಾವುದೇ Pydantic AI starter package ಇಲ್ಲ - ಮೇಲಿನ recipe ಯೇ integration. blockchain0x SDKs GitHub ನಲ್ಲಿ open source ಆಗಿವೆ; ಈ recipe Python SDK (blockchain0x-python) ಅನ್ನು wrap ಮಾಡುತ್ತದೆ, ಮತ್ತು ಪೂರ್ಣ method surface docs ನಲ್ಲಿ ಇದೆ. function bodies ಗಾಗಿ reference ಆಗಿ ಅದನ್ನು ಓದಿ.
github.com/tosh-labs/blockchain0x-pythonಪೂರ್ಣ SDK method surface ಮತ್ತು scopes ಗಳನ್ನು the docs ನಲ್ಲಿ document ಮಾಡಲಾಗಿದೆ. Base Sepolia ವಿರುದ್ಧ sk_test_ key ನಿಂದ ಆರಂಭಿಸಿ, function ನೀವು ನಿರೀಕ್ಷಿಸುವಂತೆ ಕೆಲಸ ಮಾಡಿದಾಗ sk_live_ ಗೆ switch ಮಾಡಿ.
ಐದು ಪೈಡಾಂಟಿಕ್ 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 vs tool (RunContext)
ಕಾರ್ಯವು ಓಟದಿಂದ ಏನೂ ಅಗತ್ಯವಿಲ್ಲದಾಗ, ಮೇಲಿನಂತೆ @agent.tool_plain ಅನ್ನು ಬಳಸಿರಿ. ನೀವು ಉಪಕರಣದಲ್ಲಿ ಏಜೆಂಟ್ನ ಅವಲಂಬನೆಗಳನ್ನು (ಪ್ರತಿ ವಿನಂತಿಯ ಕ್ಲೈಂಟ್ ಐಡಿ, ಖರ್ಚು ಶ್ರೇಣಿಯು) ಬೇಕಾದರೆ, @agent.tool ಅನ್ನು ಬಳಸಿರಿ ಮತ್ತು ctx: RunContext[Deps] ಅನ್ನು ctx.deps ಅನ್ನು ಓದಲು ಮೊದಲ ಆರ್ಗ್ಯುಮೆಂಟ್ ಎಂದು ಘೋಷಿಸಿ. ಇಬ್ಬರನ್ನು ಮಿಶ್ರಣ ಮಾಡುವುದರಿಂದ - tool_plain ನಲ್ಲಿ ctx ಆರ್ಗ್ಯುಮೆಂಟ್ ಅನ್ನು ಘೋಷಿಸುವುದರಿಂದ - ನೋಂದಣಿಯಲ್ಲಿ TypeError ಅನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ.