Integrazione dei pagamenti CrewAI.
Dai a un equipaggio CrewAI un portafoglio. Un agente tesoriere dedicato invia USDC, regola le fatture e legge i saldi mentre gli agenti di lavoro rimangono concentrati sul lavoro.
Blockchain0x distribuisce un vero package Python, . Installalo, imposta , invoca e passa gli strumenti a un agent tesoriere dedicato. Quell'agent può inviare USDC, saldare una fattura con prova on-chain e leggere i wallet, mentre gli agent operativi nel gruppo non hanno accesso al wallet. USDC si regola su Base.
La forza di CrewAI è la separazione dei ruoli. Usala anche per il portafoglio.
Altri framework accumulano ogni strumento su un singolo agente. Il design di CrewAI incoraggia la separazione dei ruoli: un ricercatore ricerca, uno scrittore scrive, un revisore rivede. Il denaro merita lo stesso trattamento - un agente tesoriere dedicato detiene gli strumenti wallet, e gli agenti di lavoro non ne detengono nessuno. L'autorità di spesa vive in un unico posto invece di fuoriuscire attraverso ogni agente che si trova nella squadra.
Questa forma rende anche più chiari i registri di audit. Quando USDC si muove, sai esattamente quale agente lo ha spostato (il tesoriere) e per quale compito era (quello che lo ha passato). Le integrazioni a singolo agente sfumano quella linea e rendono più difficile l'analisi della spesa per compito.
Un'installazione pip. Una variabile d'ambiente.
Il pacchetto richiede Python 3.10 o superiore e funziona con poetry o pip. Include il core blockchain0x SDK e crewai come dipendenze; non c'è altro da aggiungere.
pip install blockchain0x-crewaiexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY è una chiave sk_test_ per testnet o sk_live_ per mainnet dalla tua dashboard Blockchain0x, ed è l'unica variabile di cui l'adapter ha bisogno - inoltra la chiave al backend e non conserva alcun secret proprio. Per il gestore webhook qui sotto devi impostare anche BLOCKCHAIN0X_WEBHOOK_SECRET, che la dashboard mostra una sola volta quando crei o ruoti un webhook.
Un equipaggio di due agenti funzionante con ruoli di fatturazione + ricerca.
Di seguito è riportato un equipaggio completo di CrewAI in cui un agente tesoriere paga un fornitore di dati in USDC e un agente ricercatore utilizza il risultato. Il tesoriere detiene gli strumenti del portafoglio; il ricercatore non ne detiene alcuno. Questo è il modello canonico per un equipaggio che spende.
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.
Attivare il prossimo gruppo quando un pagamento arriva.
Quando USDC si stabilisce sul tuo agente, Blockchain0x POSTa un evento firmato al tuo URL webhook. L'helper di verifica è incluso nel Node SDK; un servizio Python verifica manualmente contro l'HMAC documentato, che è tutto ciò che fa l'helper. Esempio Flask qui sotto; lo stesso codice funziona in FastAPI o in qualsiasi framework web 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
Questo è il vero algoritmo: HMAC-SHA256 sulla stringa t.rawBody, un confronto a tempo costante e una finestra di replay di 300 secondi. Leggi il corpo grezzo (request.get_data()), mai request.get_json() ri-serializzato, perché questo cambia i byte che la firma copre. Architettura: fai in modo che il gestore metta in coda un lavoro (Celery, RQ, una lista Redis) che attiva l'esecuzione effettiva di CrewAI. Chiamare crew.kickoff() all'interno del gestore può richiedere minuti e far scadere la richiesta HTTP.
Dai all'equipaggio l'intero set di strumenti, o solo uno strumento.
create_blockchain0x_toolset restituisce tutti e cinque gli strumenti: blockchain0x_send_payment, blockchain0x_settle_invoice, blockchain0x_get_wallet, blockchain0x_list_wallets e blockchain0x_get_transaction. Se un equipaggio ha solo bisogno di pagare, dagli solo quello con un'unica fabbrica.
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")
Le factory per singola capability sono create_payment_tool, create_invoice_tool, create_wallet_tool, create_wallets_list_tool e create_transaction_tool. Il sorgente e gli esempi per testnet sono nel the Python SDK repo; la matrice di supporto CrewAI è in the docs.
Cinque cose da tenere d'occhio quando si integra la fatturazione in una squadra.
Il design basato sui ruoli di CrewAI rende l'integrazione dei pagamenti più pulita rispetto ad altri framework. Ha anche le sue insidie. Conoscere queste in anticipo fa risparmiare tempo.
Mettere gli strumenti del wallet sull'agente sbagliato
Gli agenti CrewAI hanno ruoli. Affida gli strumenti del portafoglio al ricercatore, che dovrebbe essere impegnato nella ricerca, e l'LLM inizia a cercare di muovere denaro durante l'analisi. Il modello pulito è un agente tesoriere dedicato che detiene gli strumenti e funziona come un proprio compito; gli agenti di lavoro non hanno accesso al portafoglio. L'esempio sopra segue questa forma. Copialo.
Processi sequenziali vs gerarchici
CrewAI supporta l'esecuzione sequenziale (predefinita) e gerarchica. Con la gerarchica, un agente manager orchestra il gruppo. Se al manager è consentito delegare gli strumenti del portafoglio, può passarli a qualsiasi subordinato, il che è esattamente ciò che non vuoi per l'autorità di spesa. Tieni gli strumenti su un agente dedicato e esegui in sequenza, oppure restringi le regole di delega del manager.
Lettura dello stato di regolamento dal contesto del compito
Il regolamento in entrata è asincrono. Se il compito di ricerca elenca il compito di pagamento nel suo contesto (bene) ma il LLM poi cerca di leggere uno stato di pagamento finale da quel contesto (non bene, la conferma arriva più tardi tramite webhook), ottieni un output confuso. Regola il lavoro a valle su un segnale attivato dal webhook, non sul contesto del compito. I callback dei compiti di CrewAI sono il gancio giusto.
Gli importi sono unità base USDC, come stringhe
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.
Gestore webhook esterno al processo dell'equipaggio
Il tuo gestore webhook è solitamente un processo separato Flask o FastAPI, non parte del runtime dell'equipaggio. L'equipaggio termina il suo kickoff() e ritorna; il webhook arriva più tardi quando un pagamento si stabilizza. Collega i due con una coda o una riga di database che il webhook scrive e l'equipaggio legge alla sua prossima esecuzione. Non mantenere un equipaggio in vita in attesa di un webhook - le esecuzioni di CrewAI sono progettate per essere di breve durata.