メインコンテンツにスキップ
PYDANTIC AI統合

Pydantic AI支払い統合。

Pydantic AIパッケージはなく、必要ありません。@agent.tool_plainで型付き関数を登録し、実際のblockchain0xクライアントを呼び出せば、エージェントはBase上でUSDCを移動できます。

短い回答

Pydantic AI 専用パッケージはありませんし、必要もありません。Pydantic AI は で関数を検証済みの tool に変換するため、実際の Python client を型付き関数でラップすれば、エージェントは USDC を送信し、請求書を決済し、wallet を読み取れます。tool は model ではなく HTTP API を呼び出すため、OpenAI、Anthropic、Google、Mistral、Groq、その他あらゆる Pydantic AI provider で動作します。支払いは Base で決済されます。

型指定された支払いツールの理由

Pydantic AIの型付けが勝ちます。支払いにも使用してください。

Pydantic AIの全体のポイントは強い型付けです: エージェントの入力は型付けされ、出力も型付けされ、依存関係も型付けされ、再試行も型付けされます。このフレームワークは、LLM呼び出しを通じてデータが伝播するのを許可するのではなく、境界で不正なデータを拒否します。あなたのウォレットツールはまさにそれに基づいています - 引数を型で宣言し、Pydantic AIはモデルが呼び出すことを許可される前に、シグネチャとドキュメント文字列から検証されたスキーマを構築します。

実際の利点:モデルがベースユニットの文字列の代わりに浮動小数点数でsend_usdcを呼び出そうとすると、失敗はHTTP呼び出しの前にPydanticの検証レイヤーで発生します。暗号的なフィールドパスを持つAPIからの422ではなく、有用なメッセージを伴った明確なValidationErrorが表示されます。これが、一般的なアダプタを使うのではなく、ここでクライアントを自分でラップする理由です - ワイヤまでの型を維持します。

インストール

Pydantic AIとコアSDKをインストールします。2つのキー。

追加するblockchain0x Pydantic AIパッケージはありません。Pydantic AI(Python 3.10+)と実際のblockchain0xコアSDKをインストールし、次の関数を書きます。それが全依存関係リストです。

インストール
pip install pydantic-ai blockchain0x
環境変数
export 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 キーで、client は環境変数から読み込みます。agent が受け取る側の支払いもある場合、webhook handler には追加で BLOCKCHAIN0X_WEBHOOK_SECRET が必要です。

レシピ

支払いを行う型付き関数、ツールとして登録されます。

以下は全体の統合です。send_usdcは実際のblockchain0xクライアントを呼び出します;@agent.tool_plainは型ヒントとドキュメント文字列から構築されたスキーマでそれを登録します。実行すると、エージェントはBase上でUSDCを移動し、呼び出し前に引数が検証されます。

AGENT.PY
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を受け取る場合、ポーリングではなくWebhookで確認します。verifyヘルパーはNode SDKに含まれています; Pythonサービスでは、文書化されたHMACに対して手動で検証します。型付きイベントが必要な場合は、自分のPydanticモデルを定義し、署名が確認された後に生のボディをmodel_validate_jsonします - 型付けはあなたが追加するものです。以下のFastAPIの例。

WEBHOOK.PY
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 の starter package はありません - 上の recipe がそのまま integration です。blockchain0x の SDK は GitHub で open source です。この recipe は Python SDK (blockchain0x-python) をラップしており、完全なメソッド一覧は docs にあります。function body の参考として読んでください。

github.com/tosh-labs/blockchain0x-python

SDK のメソッド一覧とスコープは the docs に記載されています。まずは Base Sepolia で sk_test_ key を使い、関数が想定どおり動いたら sk_live_ に切り替えてください。

一般的な落とし穴

Pydantic AIに特有の避けるべき5つの罠。

Pydantic AIの強い型付けは、境界でほとんどの統合バグをキャッチします。これらは、わずかに漏れるものです。

PITFALL 1

Pydantic AIパッケージはありません - ツールを登録します。

Blockchain0xは、LangChainとCrewAI用のアダプタとMCPサーバーを出荷します。専用のPydantic AIパッケージはありません。上記のレシピはパスです:実際のblockchain0xクライアントを呼び出す@agent.tool_plainで装飾されたプレーンな型付き関数です。Pydantic AIはシグネチャとドキュメンテーション文字列を読み取って検証されたツールスキーマを構築します。これは、あなたがPydantic AIに求めた型付けの利点です。

PITFALL 2

amountを文字列のままにしておきます; 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.

PITFALL 3

send_paymentは早期に503を返すことがあります

payments.createはデフォルトでは再試行せず、チェーンアダプターがネットワークに接続されるまで503を返すことがあります。ツール内でエラーをキャッチし、モデルがアクションを実行できる明確なメッセージを返してください。エージェントがループしないようにします。自動生成された冪等性キーにより、手動での再試行は二重支払いを引き起こしません。

PITFALL 4

プロバイダー接頭辞のモデル文字列

Pydantic AIは、プロバイダー接頭辞付きのモデル文字列を使用します: 'openai:gpt-4o', 'anthropic:claude-3-5-sonnet-latest', 'google-gla:gemini-1.5-pro'。接頭辞を省略すると、暗号的な「不明なモデル」エラーが発生します。あなたのツールはHTTP APIを呼び出すため、プロバイダーに依存しません - 接頭辞を自由に入れ替えてもウォレット機能は変更されません。

PITFALL 5

tool_plain vs tool (RunContext)

@agent.tool_plainを使用して、関数が実行から何も必要ない場合、上記のようにします。ツール内にエージェントの依存関係(リクエストごとのクライアントID、支出上限)が必要な場合は、@agent.toolを使用し、最初の引数をctx: RunContext[Deps]として宣言してctx.depsを読み取ります。2つを混合すること - tool_plainでctx引数を宣言することは、登録時にTypeErrorを引き起こします。

よくある質問

Pydantic AIに特有の質問が3つ。

インストールするための専用のPydantic AIパッケージはありますか?

いいえ。Pydantic AIはすでに@agent.tool_plain(またはコンテキスト対応ツール用の@agent.tool)を使用して関数を検証されたツールに変換しているため、正直な道は実際のblockchain0xクライアントを自分でラップすることです。出荷されたフレームワークパッケージはblockchain0x-langchainとblockchain0x-crewai(両方ともPython)および@blockchain0x/mcpサーバーのみです。Pydantic AIは、専用アダプターのない他のフレームワークと同様に、この数行のレシピです。

これはLLMプロバイダー(OpenAI、Anthropic、Google)で機能しますか?

はい。このツールはプロバイダーに依存しない - Blockchain0x HTTP APIを呼び出し、LLM特有の表面には依存しません。Pydantic AIがプロバイダー(OpenAI、Anthropic、Google GLA、Google VertexAI、Groq、Cohere、Mistral、Bedrock)をサポートしている限り、同じ関数が機能します。エージェントコンストラクタ内のモデル文字列を入れ替えるだけです:'anthropic:claude-3-5-sonnet-latest'ではなく'openai:gpt-4o'です。

型付き入力を追加するにはどうすればよいですか、または読み取りと決済を送信するにはどうすればよいですか?

より厳密な入力が必要な場合は、tool argument として Pydantic model を渡すと Pydantic AI が検証します - constrained decimals、address patterns など、必要なものを設定できます。読み取りや精算も同じ方法で追加できます: blockchain0x.transactions.get は transaction を読み取り、blockchain0x.agents.get と blockchain0x.agents.list は wallets を読み取り、blockchain0x.payment_requests.settle は dashboard で作成した invoice を on-chain proof 付きで精算します。入金は下の payment.received webhook で確認します。

エージェントに型付けされた支払いを追加します。

実際のクライアントをラップするいくつかの型付きの行、インストールするパッケージはありません。無料で始められます。