Integração de pagamento CrewAI.
Dê a uma equipe CrewAI uma carteira. Um agente tesoureiro dedicado envia USDC, liquida faturas e lê saldos enquanto os agentes de trabalho permanecem focados no trabalho.
A Blockchain0x disponibiliza um pacote Python real, . Instale, defina , chame e entregue as ferramentas a um agente tesoureiro dedicado. Esse agente pode enviar USDC, liquidar uma fatura com prova on-chain e ler carteiras, enquanto os agentes de trabalho da equipe não têm acesso à carteira. USDC liquida na Base.
A força do CrewAI é a separação de funções. Use-a para a carteira também.
Outros frameworks acumulam todas as ferramentas em um único agente. O design do CrewAI incentiva a separação de funções: um pesquisador pesquisa, um escritor escreve, um revisor revisa. O dinheiro merece o mesmo tratamento - um agente tesoureiro dedicado mantém as ferramentas de carteira, e os agentes de trabalho não mantêm nenhuma. A autoridade de gasto vive em um só lugar em vez de vazar entre todos os agentes que estão na equipe.
Esta forma também torna as trilhas de auditoria mais claras. Quando o USDC se move, você sabe exatamente qual agente o moveu (o tesoureiro) e para qual tarefa foi (a que o entregou). Integrações de um único agente borram essa linha e tornam a análise de gastos por tarefa mais difícil.
Uma instalação pip. Uma variável de ambiente.
O pacote precisa do Python 3.10 ou mais recente e funciona com poetry ou pip. Ele puxa o SDK blockchain0x principal e crewai como dependências; nada mais a adicionar.
pip install blockchain0x-crewaiexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY é uma chave sk_test_ de testnet ou sk_live_ de mainnet do seu painel Blockchain0x, e é a única variável que o adaptador precisa - ele encaminha a chave para o backend e não guarda nenhum segredo próprio. Para o handler de webhook abaixo, você também define BLOCKCHAIN0X_WEBHOOK_SECRET, que o painel retorna uma única vez quando você cria ou rota um webhook.
Uma equipe funcional de dois agentes com funções de cobrança + pesquisa.
Abaixo está uma equipe completa do CrewAI onde um agente tesoureiro paga um fornecedor de dados em USDC, e um agente pesquisador usa o resultado. O tesoureiro possui as ferramentas de carteira; o pesquisador não possui nenhuma. Este é o padrão canônico para uma equipe 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.
Acionando a próxima equipe quando um pagamento chega.
Quando o USDC é liquidado para o seu agente, Blockchain0x POSTa um evento assinado para sua URL de webhook. O helper de verificação está no SDK do Node; um serviço Python verifica manualmente contra o HMAC documentado, que é tudo o que o helper faz de qualquer forma. Exemplo de Flask abaixo; o mesmo código funciona no FastAPI ou em qualquer 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
Este é o algoritmo real: HMAC-SHA256 sobre a string t.rawBody, uma comparação em tempo constante e uma janela de repetição de 300 segundos. Leia o corpo bruto (request.get_data()), nunca request.get_json() re-serializado, porque isso altera os bytes que a assinatura cobre. Arquitetura: faça o manipulador enfileirar um trabalho (Celery, RQ, uma lista Redis) que aciona a execução real do CrewAI. Chamar crew.kickoff() dentro do manipulador pode levar minutos e expirar a solicitação HTTP.
Entregue à equipe todo o conjunto de ferramentas, ou apenas uma ferramenta.
create_blockchain0x_toolset retorna todas as cinco ferramentas: blockchain0x_send_payment, blockchain0x_settle_invoice, blockchain0x_get_wallet, blockchain0x_list_wallets, e blockchain0x_get_transaction. Se uma equipe só precisa pagar, dê apenas essa com uma ú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")
As factories por capability são create_payment_tool, create_invoice_tool, create_wallet_tool, create_wallets_list_tool e create_transaction_tool. Exemplos de source e testnet estão no the Python SDK repo; a matriz de suporte do CrewAI está em the docs.
Cinco coisas para observar ao integrar a cobrança em uma equipe.
O design baseado em funções do CrewAI é o que torna a integração de pagamento mais limpa do que outras estruturas. Ele também tem suas próprias armadilhas. Conhecer isso com antecedência economiza tempo.
Colocando as ferramentas de carteira no agente errado
Os agentes CrewAI têm funções. Entregue as ferramentas da carteira ao pesquisador, que deve estar pesquisando, e o LLM começa a tentar mover dinheiro durante a análise. O padrão limpo é um agente tesoureiro dedicado que possui as ferramentas e opera como sua própria tarefa; os agentes de trabalho não têm acesso à carteira. O exemplo acima segue essa forma. Copie-o.
Processos sequenciais vs hierárquicos
CrewAI suporta execução sequencial (padrão) e hierárquica. Com a hierárquica, um agente gerente orquestra a equipe. Se o gerente tiver permissão para delegar as ferramentas da carteira, ele pode entregá-las a qualquer subordinado, o que é exatamente o que você não deseja para a autoridade de gastos. Mantenha as ferramentas em um agente dedicado e execute sequencialmente, ou restrinja as regras de delegação do gerente.
Lendo o status de liquidação do contexto da tarefa
O acerto de entrada é assíncrono. Se a tarefa de pesquisa listar a tarefa de pagamento em seu contexto (ok), mas o LLM tentar ler um status de pagamento final desse contexto (não ok, a confirmação chega mais tarde por webhook), você obtém uma saída confusa. Controle o trabalho subsequente com um sinal acionado por webhook, não com o contexto da tarefa. Os callbacks de tarefa do CrewAI são o gancho certo.
Os valores são unidades base de USDC, como strings
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.
Manipulador de webhook fora do processo de equipe
Seu manipulador de webhook é geralmente um processo separado de Flask ou FastAPI, não parte do tempo de execução da equipe. A equipe termina sua kickoff() e retorna; o webhook chega mais tarde quando um pagamento é liquidado. Conecte os dois com uma fila ou uma linha de banco de dados que o webhook escreve e a equipe lê em sua próxima execução. Não mantenha uma equipe viva esperando por um webhook - execuções do CrewAI são de curta duração por design.