Integración de pagos CrewAI.
Dale a un equipo de CrewAI una billetera. Un agente tesorero dedicado envía USDC, liquida facturas y lee saldos mientras los agentes de trabajo se concentran en el trabajo.
Blockchain0x incluye un paquete Python real, . Instálalo, configura , llama a y entrega las herramientas a un agente tesorero dedicado. Ese agente puede enviar USDC, liquidar una factura con prueba on-chain y leer wallets, mientras que los agentes de trabajo del equipo no tienen acceso a la wallet. USDC se liquida en Base.
La fortaleza de CrewAI es la separación de roles. Úselo también para la billetera.
Otros frameworks acumulan todas las herramientas en un solo agente. El diseño de CrewAI fomenta la separación de roles: un investigador investiga, un escritor escribe, un revisor revisa. El dinero merece el mismo tratamiento - un agente tesorero dedicado sostiene las herramientas de billetera, y los agentes de trabajo no sostienen ninguna. La autoridad de gasto vive en un solo lugar en lugar de filtrarse a través de cada agente que se encuentra en el equipo.
Esta forma también hace que las auditorías sean más claras. Cuando se mueve USDC, sabes exactamente qué agente lo movió (el tesorero) y para qué tarea fue (la que se le entregó). Las integraciones de un solo agente difuminan esa línea y hacen que el análisis de gastos por tarea sea más difícil.
Una instalación de pip. Una variable de entorno.
El paquete necesita Python 3.10 o superior y funciona con poetry o pip. Incluye el SDK central de blockchain0x y crewai como dependencias; nada más que agregar.
pip install blockchain0x-crewaiexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY es una clave sk_test_ testnet o sk_live_ mainnet de tu panel de control de Blockchain0x, y es la única variable que necesita el adaptador - reenvía la clave al backend y no guarda ningún secreto propio. Para el manejador de webhook a continuación, también debes establecer BLOCKCHAIN0X_WEBHOOK_SECRET, que el panel de control devuelve una vez cuando creas o rotas un webhook.
Una tripulación funcional de dos agentes con roles de facturación + investigación.
A continuación se presenta un equipo completo de CrewAI donde un agente tesorero paga a un proveedor de datos en USDC, y un agente investigador utiliza el resultado. El tesorero tiene las herramientas de billetera; el investigador no tiene ninguna. Este es el patrón canónico para un equipo que gasta.
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.
Activando el siguiente equipo cuando un pago llega.
Cuando USDC se liquida a tu agente, Blockchain0x envía un evento firmado a tu URL de webhook. El ayudante de verificación se envía en el SDK de Node; un servicio de Python verifica manualmente contra el HMAC documentado, que es todo lo que hace el ayudante de todos modos. Ejemplo de Flask a continuación; el mismo código funciona en FastAPI o cualquier framework web de 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
Este es el algoritmo real: HMAC-SHA256 sobre la cadena t.rawBody, una comparación en tiempo constante, y una ventana de repetición de 300 segundos. Lee el cuerpo sin procesar (request.get_data()), nunca request.get_json() re-serializado, porque eso cambia los bytes que cubre la firma. Arquitectura: haz que el controlador encole un trabajo (Celery, RQ, una lista de Redis) que desencadena la ejecución real de CrewAI. Llamar a crew.kickoff() dentro del controlador puede tardar minutos y agotar la solicitud HTTP.
Entrega al equipo todo el conjunto de herramientas, o solo una herramienta.
create_blockchain0x_toolset devuelve las cinco herramientas: blockchain0x_send_payment, blockchain0x_settle_invoice, blockchain0x_get_wallet, blockchain0x_list_wallets y blockchain0x_get_transaction. Si un equipo solo necesita pagar, déjele solo esa con una única fábrica.
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")
Las fábricas por capacidad son create_payment_tool, create_invoice_tool, create_wallet_tool, create_wallets_list_tool y create_transaction_tool. Ejemplos de código y testnet se encuentran en el repositorio del SDK de Python; la matriz de soporte de CrewAI está en la documentación.
Cinco cosas a tener en cuenta al integrar la facturación en un equipo.
El diseño basado en roles de CrewAI es lo que hace que la integración de pagos sea más limpia que otros marcos. También tiene sus propias trampas. Conocerlas de antemano ahorra tiempo.
Colocando las herramientas de billetera en el agente equivocado
Los agentes de CrewAI tienen roles. Entregue las herramientas de billetera al investigador, que debería estar investigando, y el LLM comienza a intentar mover dinero en medio del análisis. El patrón limpio es un agente tesorero dedicado que sostiene las herramientas y funciona como su propia tarea; los agentes de trabajo no tienen acceso a la billetera en absoluto. El ejemplo anterior sigue esa forma. Cópielo.
Procesos secuenciales vs jerárquicos
CrewAI admite ejecución secuencial (predeterminada) y jerárquica. Con jerárquica, un agente gerente orquesta al equipo. Si se permite al gerente delegar las herramientas de billetera, puede entregarlas a cualquier subordinado, lo cual es exactamente lo que no desea para la autoridad de gasto. O mantenga las herramientas en un agente dedicado y ejecute secuencialmente, o restrinja las reglas de delegación del gerente.
Leyendo el estado de liquidación del contexto de la tarea
El asentamiento entrante es asíncrono. Si la tarea de investigación lista la tarea de pago en su contexto (bien) pero el LLM luego intenta leer un estado de pago final de ese contexto (no bien, la confirmación llega más tarde por webhook), obtienes una salida confusa. Controla el trabajo posterior en una señal activada por webhook, no en el contexto de la tarea. Los callbacks de tarea de CrewAI son el gancho correcto.
Las cantidades son unidades base de USDC, como cadenas
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.
Manejador de webhook fuera del proceso de tripulación
Tu manejador de webhook es generalmente un proceso separado de Flask o FastAPI, no parte del tiempo de ejecución del equipo. El equipo termina su kickoff() y regresa; el webhook llega más tarde cuando un pago se liquida. Conecta los dos con una cola o una fila de base de datos que el webhook escribe y el equipo lee en su próxima ejecución. No mantengas un equipo vivo esperando un webhook - las ejecuciones de CrewAI son de corta duración por diseño.