CrewAI決済統合。
CrewAIクルーにウォレットを提供します。専任の財務エージェントがUSDCを送信し、請求書を決済し、残高を読み取る一方で、作業エージェントは作業に集中します。
Blockchain0x は実用的な Python パッケージ を提供しています。インストールして を設定し、 を呼び出し、専任の会計担当エージェントにツールを渡してください。そのエージェントは USDC を送信し、オンチェーン証明付きで請求書を決済し、ウォレットを読み取れます。一方、チーム内の作業エージェントにはウォレット権限を持たせません。USDC の決済先は Base です。
CrewAIの強みは役割の分離です。ウォレットにもそれを使用してください。
他のフレームワークはすべてのツールを単一のエージェントに集約します。CrewAIのデザインは役割の分離を促進します:研究者は研究し、作家は書き、レビュアーはレビューします。お金も同様の扱いを受けるべきです - 専用の財務エージェントがウォレットツールを保持し、作業エージェントは何も保持しません。支出権限は1つの場所に存在し、クルーにいるすべてのエージェントに漏れません。
この形状は監査トレイルをより明確にします。USDCが移動すると、どのエージェントがそれを移動させたのか(財務官)と、それがどのタスクのためであったのか(それに引き渡したもの)が正確にわかります。シングルエージェントの統合はその境界を曖昧にし、タスクごとの支出分析を難しくします。
1つのpipインストール。1つの環境変数。
このパッケージはPython 3.10以降が必要で、poetryまたはpipで動作します。core blockchain0x SDKとcrewaiを依存関係として取り込みます; 追加するものはありません。
pip install blockchain0x-crewaiexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY は Blockchain0x dashboard の sk_test_ testnet または sk_live_ mainnet キーで、adapter が必要とする唯一の変数です - キーを backend に転送するだけで、adapter 自身は秘密情報を保持しません。下の webhook handler では、webhook を作成またはローテーションしたときに dashboard が 1 回だけ返す BLOCKCHAIN0X_WEBHOOK_SECRET も設定します。
請求および研究の役割を持つ動作する2エージェントクルー。
以下は、財務担当エージェントがデータベンダーにUSDCで支払いを行い、研究者エージェントがその結果を使用する完全なCrewAIクルーです。財務担当者はウォレットツールを保持し、研究者は何も保持しません。これは支出するクルーの標準的なパターンです。
from crewai import Agent, Task, Crew from blockchain0x import Client from blockchain0x_crewai import create_blockchain0x_toolset client = Client() # reads BLOCKCHAIN0X_API_KEY from the environment tools = create_blockchain0x_toolset(client) # A dedicated treasurer holds the wallet tools; the work agents do not. treasurer = Agent( role="Treasurer", goal="Pay vendor invoices in USDC within owner-set limits", backstory="Operates a Blockchain0x agent wallet on Base.", tools=tools, allow_delegation=False, ) researcher = Agent( role="Senior Market Analyst", goal="Produce a thorough Q4 LLM market analysis", backstory="A specialist analyst with 10 years in tech-market research.", tools=[], allow_delegation=False, ) pay_task = Task( description="Pay 0.01 USDC from our agent wallet to the data vendor at 0xVendor.", expected_output="The transaction hash of the settled payment.", agent=treasurer, ) research_task = Task( description="Using the purchased dataset, write the Q4 LLM market analysis.", expected_output="A 1,500-word market analysis.", agent=researcher, context=[pay_task], ) crew = Crew(agents=[treasurer, researcher], tasks=[pay_task, research_task]) result = crew.kickoff()
When you call crew.kickoff(), the pay_task runs first: the treasurer calls blockchain0x_send_payment, the SDK submits the transfer on Base, and the transaction hash is the task output. The research_task runs next and uses the purchased result. amount_wei is USDC base units, so 0.01 USDC is the string "10000". On a sk_test_ key the whole flow runs on Base Sepolia, and payments.create can answer 503 until the chain adapter is wired for your network.
支払いが着地したときに次のクルーをトリガーします。
USDCがあなたのエージェントに決済されると、Blockchain0xはあなたのWebhook URLに署名されたイベントをPOSTします。verifyヘルパーはNode SDKに含まれています。Pythonサービスは、文書化されたHMACに対して手動で検証します。これはヘルパーが行うことです。以下はFlaskの例で、同じコードはFastAPIや他のPythonウェブフレームワークでも動作します。
import hmac, hashlib, os, time from flask import Flask, request, abort app = Flask(__name__) SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode() @app.post("/webhooks/payment") def receive(): raw = request.get_data() # RAW bytes - do not parse first sig = request.headers.get("X-Blockchain0x-Signature", "") ts = request.headers.get("X-Blockchain0x-Timestamp", "") # Header is "t=<unix>,v1=<hex>"; some proxies send bare hex + the ts header. 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: abort(401) if request.headers.get("X-Blockchain0x-Event-Type") == "payment.received": run_followup_for(request.get_json()) # USDC landed - do the work return "ok", 200
これが実際のアルゴリズムです:文字列t.rawBodyに対するHMAC-SHA256、定数時間比較、および300秒のリプレイウィンドウ。生のボディを読み取ります(request.get_data())、決してrequest.get_json()を再シリアライズしないでください。なぜなら、それが署名がカバーするバイトを変更するからです。アーキテクチャ:ハンドラーにジョブをキューに追加させ(Celery、RQ、Redisリスト)、実際のCrewAIの実行をトリガーします。ハンドラー内でcrew.kickoff()を呼び出すと、数分かかり、HTTPリクエストがタイムアウトします。
クルーに全ツールセットを渡すか、1つのツールだけを渡します。
create_blockchain0x_toolsetは、5つのツールすべてを返します:blockchain0x_send_payment、blockchain0x_settle_invoice、blockchain0x_get_wallet、blockchain0x_list_wallets、およびblockchain0x_get_transaction。クルーが支払いのみを必要とする場合は、単一のファクトリーでそれを提供してください。
from blockchain0x_crewai import create_payment_tool pay = create_payment_tool(client) # amount_wei is USDC base units: 6 decimals, so 10000 = 0.01 USDC. pay.run(agent_id="agt_123", to="0xRecipient", amount_wei="10000")
capability ごとの factory は create_payment_tool, create_invoice_tool, create_wallet_tool, create_wallets_list_tool, create_transaction_tool です。ソースと testnet の例は the Python SDK repo にあり、CrewAI の対応表は the docs にあります。
クルーに請求を組み込む際に注目すべき5つのこと。
CrewAIの役割ベースのデザインは、他のフレームワークよりも決済統合をクリーンにします。また、独自の落とし穴もあります。これを事前に知っておくことで時間を節約できます。
間違ったエージェントにウォレットツールを配置する
CrewAIエージェントには役割があります。ウォレットツールを研究者に渡し、研究を行うべきであり、LLMは分析中にお金を移動しようとし始めます。クリーンなパターンは、ツールを保持し、自身のタスクとして実行する専任の財務担当エージェントです。作業エージェントはウォレットアクセスを持ちません。上記の例はその形に従っています。コピーしてください。
逐次的プロセス vs 階層的プロセス
CrewAIは、逐次(デフォルト)および階層的な実行をサポートしています。階層的な場合、マネージャーエージェントがクルーを調整します。マネージャーがウォレットツールを委任できる場合、どの部下にも渡すことができ、これは支出権限として望ましくありません。ツールを1つの専任エージェントに保持し、逐次実行するか、マネージャーの委任ルールを制限してください。
タスクコンテキストからの決済状況の読み取り
インバウンド決済は非同期です。研究タスクがそのコンテキストに支払いタスクをリストしている場合(問題ありません)が、LLMがそのコンテキストから最終的な支払い状況を読み取ろうとすると(問題ありません、確認は後でWebhookによって到着します)、混乱した出力が得られます。下流の作業をタスクコンテキストではなく、Webhookトリガー信号にゲートします。CrewAIのタスクコールバックが適切なフックです。
金額はUSDCの基本単位であり、文字列として表されます
blockchain0x_send_payment takes amount_wei: a string of USDC base units, not a float and not a dollar figure. USDC has 6 decimals, so 0.01 USDC is "10000". CrewAI passes tool inputs through as-is, so a Python float arrives as a float and the SDK rejects it - but the error reads like a CrewAI tool error, which throws off first integrators. Pass a string.
クループロセス外のウェブフックハンドラ
あなたのWebhookハンドラーは通常、別のFlaskまたはFastAPIプロセスであり、クルーのランタイムの一部ではありません。クルーはkickoff()を完了し、戻ります。Webhookは、支払いが決済されたときに後で到着します。Webhookが書き込むキューまたはデータベース行で2つを橋渡しし、クルーが次の実行で読み取ります。Webhookを待ってクルーを生かしておかないでください - CrewAIの実行は設計上短命です。