Tích hợp thanh toán Pydantic AI.
Không có gói Pydantic AI, và bạn không cần một cái nào. Đăng ký một hàm có kiểu với @agent.tool_plain, gọi khách hàng blockchain0x thực tế, và tác nhân của bạn có thể chuyển USDC trên Base.
Không có package riêng cho Pydantic AI, và bạn cũng không cần một package như vậy. Pydantic AI biến một hàm thành một tool đã được xác thực với , vì vậy bạn bọc Python client thực sự trong một hàm có kiểu và agent có thể gửi USDC, thanh toán hóa đơn và đọc ví. Nó hoạt động trên OpenAI, Anthropic, Google, Mistral, Groq và mọi nhà cung cấp khác của Pydantic AI, vì tool gọi HTTP API chứ không gọi model. Thanh toán được chốt trên Base.
Kiểu của Pydantic AI chiến thắng. Sử dụng nó cho thanh toán nữa.
Điểm chính của Pydantic AI là kiểu mạnh: đầu vào của tác nhân được kiểu hóa, đầu ra được kiểu hóa, các phụ thuộc được kiểu hóa, các lần thử lại được kiểu hóa. Khung từ chối dữ liệu không hợp lệ ở ranh giới thay vì để nó lan truyền qua cuộc gọi LLM. Công cụ ví của bạn dựa vào chính điều đó - khai báo các đối số với kiểu, và Pydantic AI xây dựng một sơ đồ đã được xác thực từ chữ ký và docstring trước khi mô hình được phép gọi nó.
Lợi ích thực tiễn: nếu mô hình cố gắng gọi send_usdc với một số thực thay vì một chuỗi đơn vị cơ sở, sự cố xảy ra ở lớp xác thực của Pydantic trước bất kỳ cuộc gọi HTTP nào đến chúng tôi. Bạn sẽ thấy một ValidationError rõ ràng với một thông điệp hữu ích thay vì một 422 từ API với các đường dẫn trường khó hiểu. Đó là lý do chính để bọc khách hàng của bạn ở đây thay vì tìm đến một bộ chuyển đổi chung - bạn giữ việc gõ cho đến dây.
Cài đặt Pydantic AI và SDK cốt lõi. Hai khóa.
Không có gói blockchain0x Pydantic AI nào để thêm. Bạn cài đặt Pydantic AI (Python 3.10+) và SDK cốt lõi blockchain0x thực tế, sau đó viết hàm bên dưới. Đó là toàn bộ danh sách phụ thuộc.
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 (hoặc khóa tương đương cho nhà cung cấp bạn dùng). BLOCKCHAIN0X_API_KEY là khóa sk_test_ testnet hoặc sk_live_ mainnet từ dashboard của bạn; client sẽ đọc khóa này từ biến môi trường. Nếu agent của bạn cũng nhận tiền, webhook handler còn cần thêm BLOCKCHAIN0X_WEBHOOK_SECRET.
Một hàm đã gõ trả tiền, được đăng ký như một công cụ.
Dưới đây là toàn bộ tích hợp. send_usdc gọi đến khách hàng blockchain0x thực; @agent.tool_plain đăng ký nó với một sơ đồ được xây dựng từ các gợi ý kiểu và docstring. Chạy nó và tác nhân chuyển USDC trên Base, với các tham số được xác thực trước cuộc gọi.
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.
Xác nhận các khoản thanh toán đến với một webhook đã ký.
Nếu tác nhân của bạn cũng nhận USDC, hãy xác nhận điều đó với webhook thay vì polling. Trợ giúp xác minh có trong Node SDK; trong một dịch vụ Python, bạn xác minh bằng tay theo HMAC đã được tài liệu hóa. Nếu bạn muốn các sự kiện kiểu, hãy định nghĩa mô hình Pydantic của riêng bạn và model_validate_json phần thân thô sau khi chữ ký được kiểm tra - kiểu là của bạn để thêm vào. Ví dụ FastAPI bên dưới.
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}
Thuật toán là HMAC-SHA256 trên chuỗi t.rawBody, so sánh thời gian không đổi và cửa sổ phát lại 300 giây. Đọc nội dung thô qua await request.body(), không bao giờ request.json() được tái tuần tự hóa, vì điều đó thay đổi các byte mà chữ ký bao phủ. Các sự kiện đã được gửi là payment.received, payment.sent, wallet.deployed và webhook.test; thu hẹp trên tiêu đề X-Blockchain0x-Event-Type để phân nhánh.
Khách hàng mà bạn đang bọc là mở. Đọc nó.
Không có starter package của Pydantic AI để clone - recipe ở trên chính là phần tích hợp. Các SDK của blockchain0x là mã nguồn mở trên GitHub; recipe này bọc Python SDK (blockchain0x-python), với toàn bộ bề mặt phương thức nằm trong docs. Hãy đọc để tham khảo phần thân hàm.
github.com/tosh-labs/blockchain0x-pythonToàn bộ bề mặt phương thức và các scope của SDK được tài liệu hóa tại the docs. Hãy bắt đầu với một key sk_test_ trên Base Sepolia, rồi chuyển sang sk_live_ khi hàm hoạt động đúng như bạn mong đợi.
Năm cạm bẫy cụ thể về Pydantic AI cần tránh.
Kiểu mạnh của Pydantic AI phát hiện hầu hết các lỗi tích hợp tại ranh giới; đây là một vài lỗi lọt qua.
Không có gói Pydantic AI - bạn đăng ký một công cụ
Blockchain0x cung cấp các bộ chuyển đổi cho LangChain và CrewAI cùng với máy chủ MCP; không có gói Pydantic AI chuyên dụng. Công thức ở trên là con đường: một hàm kiểu đơn giản được trang trí bằng @agent.tool_plain gọi đến khách hàng blockchain0x thực. Pydantic AI đọc chữ ký và docstring để xây dựng một sơ đồ công cụ đã được xác thực, chính xác là chiến thắng về kiểu mà bạn đã đến với Pydantic AI.
Giữ số tiền là một chuỗi; để Pydantic giữ nguyên
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 có thể trả về 503 sớm
payments.create không tự động thử lại và có thể trả về 503 cho đến khi bộ chuyển đổi chuỗi được kết nối với mạng của bạn. Bắt lỗi bên trong công cụ của bạn và trả về một thông điệp rõ ràng mà mô hình có thể hành động, thay vì để tác nhân lặp lại. Khóa idempotency tự động được cấp phát có nghĩa là một lần thử lại thủ công sẽ không thanh toán gấp đôi.
Chuỗi mô hình có tiền tố nhà cung cấp
Pydantic AI sử dụng các chuỗi mô hình có tiền tố nhà cung cấp: 'openai:gpt-4o', 'anthropic:claude-3-5-sonnet-latest', 'google-gla:gemini-1.5-pro'. Bỏ qua tiền tố sẽ dẫn đến lỗi 'mô hình không xác định'. Công cụ của bạn không phụ thuộc vào nhà cung cấp vì nó gọi API HTTP, không phải mô hình - thay thế tiền tố một cách tự do và chức năng ví không thay đổi.
tool_plain vs tool (RunContext)
Sử dụng @agent.tool_plain khi chức năng không cần gì từ lần chạy, như trên. Nếu bạn muốn các phụ thuộc của đại lý bên trong công cụ (một ID khách hàng theo yêu cầu, một giới hạn chi tiêu), hãy sử dụng @agent.tool và khai báo tham số đầu tiên là ctx: RunContext[Deps] để đọc ctx.deps. Kết hợp cả hai - khai báo một tham số ctx trên tool_plain - sẽ gây ra một TypeError khi đăng ký.