Agnoの支払い統合。
Agnoパッケージはなく、必要ありません。実際のblockchain0xクライアントを小さなToolkitでラップすれば、エージェントはBase上でUSDCを移動できます - 最小限の抽象化、Agnoの方法です。
Agno 専用パッケージはありませんし、必要もありません。Agno は method を tool に変換するため、実際の Python client を小さな toolkit でラップして に追加します。エージェントは USDC を送信し、請求書を決済し、wallet を読み取れます。Agno のすべての model(OpenAI、Anthropic、DeepSeek、Llama、Mistral)で利用でき、支払いは Base で決済されます。
軽量なPythonフレームワーク。抽象化税なし。
Agno(以前のPhidata)は、最小限の儀式を求めるときに手を伸ばすエージェントフレームワークです。グラフビルダー、クルー、ワークフローはなく、エージェント、ツール、run()メソッドだけです。ツールはPythonの呼び出し可能なものです。このフレームワークは、ツールサポートを持つLLMを呼び出し、メモリを管理し、ストリーミング出力を生成するために十分な足場を追加し、その後はあなたの邪魔をしません。
レシピは同じ哲学に従います。実際のクライアントを呼び出す1つのメソッドを登録する小さなToolkitサブクラスを書きます - それは他のAgnoツールと同じように見え、振る舞います。インスタンス化を超えた特別なセットアップはなく、配線するグラフもなく、追跡するアダプタバージョンもありません。シンプルさがポイントです:グラフが必要であれば、LangGraphを使用しているでしょう。
AgnoとコアSDKをインストールします。2つのキー。
追加するblockchain0x Agnoパッケージはありません。Agno(Python 3.10+、Phidataの名前変更後の1.0+ライン)と実際のblockchain0xコアSDKをインストールし、次のツールキットを書きます。まだphi.*インポートを使用している場合は、最初にpip install -U agnoを実行してください。
pip install agno blockchain0xexport OPENAI_API_KEY=sk-... export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
OPENAI_API_KEY (または使用する Agno 対応 model に相当するキー)。BLOCKCHAIN0X_API_KEY は dashboard の sk_test_ testnet または sk_live_ mainnet キーで、client は環境変数から読み込みます。agent が受け取る側の支払いもある場合、webhook handler には追加で BLOCKCHAIN0X_WEBHOOK_SECRET が必要です。
支払いを行うツールキット、エージェントに渡されます。
以下は全体の統合です。WalletToolsはsend_usdcを登録するToolkitのサブクラスであり、これは実際のblockchain0xクライアントを呼び出します。これをエージェントに追加し、run()呼び出しがツールの呼び出しを調整します。Agnoはメソッドシグネチャとドキュメント文字列を読み取ってスキーマを構築します。
from agno.agent import Agent from agno.models.openai import OpenAIChat from agno.tools import Toolkit from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment # Wrap the real client in an Agno Toolkit. No dedicated package needed. class WalletTools(Toolkit): def __init__(self): super().__init__(name="wallet_tools") self.register(self.send_usdc) def send_usdc(self, 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}) ) agent = Agent( model=OpenAIChat(id="gpt-4o"), tools=[WalletTools()], instructions=["You pay vendor invoices in USDC within owner-set limits."], ) result = agent.run("Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset.") print(result.content)
When agent.run() executes, the model decides to pay, 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_. Register more methods on the toolkit - read a wallet, settle an invoice - the same way.
署名されたウェブフックで受信支払いを確認します。
もしあなたのエージェントがUSDCを受け取る場合、ポーリングではなくWebhookで確認します。verifyヘルパーはNode SDKに含まれています; Pythonサービスでは、文書化されたHMACに対して手動で検証します。これはヘルパーが行うすべてです。以下のFastAPIの例; 同じコードは任意の非同期Pythonフレームワークで動作します。
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です。重いフォローアップ作業の場合は、ジョブをキューに入れ(Celery、arq)、ハンドラーをブロックするのではなく、すぐに200で応答します。
ラップしているクライアントはオープンです。読んでください。
クローンする Agno の starter package はありません - 上の recipe がそのまま integration です。blockchain0x の SDK は GitHub で open source です。この recipe は Python SDK (blockchain0x-python) をラップしており、完全なメソッド一覧は docs にあります。toolkit methods の参考として読んでください。
github.com/tosh-labs/blockchain0x-pythonSDK のメソッド一覧とスコープは the docs に記載されています。まずは Base Sepolia で sk_test_ key を使い、toolkit が想定どおり動いたら sk_live_ に切り替えてください。
Agnoに特有の5つの注意点。
Agnoは統合が比較的クリーンなエージェントフレームワークの1つですが、独自の注意点があります - 特にPhidataの名称変更やマークダウンレンダリングに関して。
Agnoパッケージはありません - SDKをToolkitでラップします。
Blockchain0xは、LangChainとCrewAI用のアダプタとMCPサーバーを出荷します。専用のAgnoパッケージはありません。上記のレシピはパスです:実際のblockchain0xクライアントを呼び出すメソッドを登録するToolkitのサブクラスです。Agnoはメソッドシグネチャとドキュメンテーション文字列を読み取ってツールスキーマを構築するので、ドキュメンテーション文字列を正確に保ってください。
PhidataからAgnoへの移行の混乱
Agnoは2024年にPhidataから改名されました。phi.agentまたはphi.toolsからインポートしている古いコードベースは、互換性のあるシムを介してまだ動作しますが、agno.*インポートが現在のものです。レシピは全体でagno.*を使用します。コードがまだphi.*インポートの場合は、pip install -U agnoを実行し、Toolkitを追加する前にインポートパスを切り替えてください。
金額はUSDCの基本単位であり、文字列として表されます
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 method argument as str. It also does not retry by default and can answer 503 until the chain adapter is wired for your network - return a clear message rather than letting the agent loop.
同期 vs 非同期実行
Agnoはagent.run()(同期)とagent.arun()(非同期)をサポートしています。エージェントごとに1つのモードを選択します - agent.run()を呼び出し、結果を待とうとすると、文字列を期待していた場所でコルーチンが得られます。Toolkit内のblockchain0x呼び出しは同期的です。非同期パスにあり、実際のボリュームを移動している場合は、asyncio.to_threadでラップしてイベントループが応答し続けるようにします。
生のボディに対してWebhookを確認します。
もしあなたのエージェントがUSDCを受け取る場合、ポーリングではなくWebhookで確認します。RAWリクエストバイトに対して署名を検証します (await request.body())、決してrequest.json()を再シリアライズしないでください、なぜならHMACは正確なバイトをカバーするからです。それは300秒のリプレイウィンドウを持つHMAC-SHA256です。以下のハンドラが全体です。