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

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-crewai
環境変数
export 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クルーです。財務担当者はウォレットツールを保持し、研究者は何も保持しません。これは支出するクルーの標準的なパターンです。

CREW.PY
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ウェブフレームワークでも動作します。

WEBHOOK_HANDLER.PY
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 つの tool でも、5 つすべてでも

クルーに全ツールセットを渡すか、1つのツールだけを渡します。

create_blockchain0x_toolsetは、5つのツールすべてを返します:blockchain0x_send_payment、blockchain0x_settle_invoice、blockchain0x_get_wallet、blockchain0x_list_wallets、およびblockchain0x_get_transaction。クルーが支払いのみを必要とする場合は、単一のファクトリーでそれを提供してください。

SINGLE_TOOL.PY
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の役割ベースのデザインは、他のフレームワークよりも決済統合をクリーンにします。また、独自の落とし穴もあります。これを事前に知っておくことで時間を節約できます。

PITFALL 1

間違ったエージェントにウォレットツールを配置する

CrewAIエージェントには役割があります。ウォレットツールを研究者に渡し、研究を行うべきであり、LLMは分析中にお金を移動しようとし始めます。クリーンなパターンは、ツールを保持し、自身のタスクとして実行する専任の財務担当エージェントです。作業エージェントはウォレットアクセスを持ちません。上記の例はその形に従っています。コピーしてください。

PITFALL 2

逐次的プロセス vs 階層的プロセス

CrewAIは、逐次(デフォルト)および階層的な実行をサポートしています。階層的な場合、マネージャーエージェントがクルーを調整します。マネージャーがウォレットツールを委任できる場合、どの部下にも渡すことができ、これは支出権限として望ましくありません。ツールを1つの専任エージェントに保持し、逐次実行するか、マネージャーの委任ルールを制限してください。

PITFALL 3

タスクコンテキストからの決済状況の読み取り

インバウンド決済は非同期です。研究タスクがそのコンテキストに支払いタスクをリストしている場合(問題ありません)が、LLMがそのコンテキストから最終的な支払い状況を読み取ろうとすると(問題ありません、確認は後でWebhookによって到着します)、混乱した出力が得られます。下流の作業をタスクコンテキストではなく、Webhookトリガー信号にゲートします。CrewAIのタスクコールバックが適切なフックです。

PITFALL 4

金額は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.

PITFALL 5

クループロセス外のウェブフックハンドラ

あなたのWebhookハンドラーは通常、別のFlaskまたはFastAPIプロセスであり、クルーのランタイムの一部ではありません。クルーはkickoff()を完了し、戻ります。Webhookは、支払いが決済されたときに後で到着します。Webhookが書き込むキューまたはデータベース行で2つを橋渡しし、クルーが次の実行で読み取ります。Webhookを待ってクルーを生かしておかないでください - CrewAIの実行は設計上短命です。

よくある質問

CrewAIに特有の質問が3つ。

これはCrewAI Flows(新しいグラフベースの実行)で機能しますか?

はい。create_blockchain0x_toolsetは標準のCrewAIツールを返すため、クラシックなCrew + Task構造やCrewAI Flowの@start/@listenパターンで機能します。Flowでは、支払いまたは決済ステップを作業ステップの前に専任の財務担当者ステップに置き、作業ステップがあなたのWebhookハンドラーが共有状態を更新したときに発火するFlowイベントをリッスンするようにします。

同じクルーが複数の有料タスクを同時に実行できますか?

はい。payments.create(blockchain0x_send_paymentがラップするもの)は安定したIdempotency-Keyを自動生成するため、再試行された提出は二重支払いではなく単一のオンチェーン転送に収束します。各々が資金を移動する同時のキックオフをファンアウトする場合は、それぞれに独自の意図(異なる受取人またはメタデータ)を与えて、互いに重複して見えないようにします。プロセス間で重複を排除したい場合を除き、idempotencyヘッダーを自分で管理する必要はありません。

クルーは請求書を精算できますか、そして返金ツールはありますか?

決済できます: blockchain0x_settle_invoiceは、ダッシュボードで作成した支払いリクエストを決済し、オンチェーン証明(txハッシュ、支払者、確認済みUSDC金額)を記録します。返金ヘルパーはありません - その識別子は存在しません。資金を返すには、財務担当者がblockchain0x_send_paymentを使用して支払者に新しいUSDC支払いを送信します。それを財務担当者の役割に保持して、支出権限が1か所に留まるようにします。

クルーに請求役割を追加します。

pip installから数分で最初の有料クルーの開始まで。無料で始められます。