Интеграция платежей CrewAI.
Дайте команде CrewAI кошелек. Специальный агент-казначей отправляет USDC, завершает счета и читает балансы, в то время как рабочие агенты сосредоточены на работе.
Blockchain0x поставляет реальный Python package, . Установите его, задайте , вызовите и передайте инструменты отдельному treasurer agent. Этот агент может отправлять USDC, закрывать счет с on-chain proof и читать кошельки, а рабочие агенты в команде не получают доступа к кошельку. Расчеты в USDC происходят на Base.
Сила CrewAI - это разделение ролей. Используйте это и для кошелька.
Другие фреймворки сваливают все инструменты на одного агента. Дизайн CrewAI поощряет разделение ролей: исследователь исследует, писатель пишет, рецензент рецензирует. Деньги заслуживают такого же обращения - специальный агент-казначей держит инструменты кошелька, а рабочие агенты не держат ничего. Полномочия на расходы находятся в одном месте, а не размываются по каждому агенту, который оказывается в команде.
Эта форма также делает аудиторские следы более ясными. Когда USDC перемещается, вы точно знаете, какой агент его переместил (казначей) и для какой задачи это было (той, которая передала его). Интеграции с одним агентом размывают эту границу и усложняют аналитику расходов по задачам.
Одна установка pip. Одна переменная окружения.
Пакет требует Python 3.10 или новее и работает с poetry или pip. Он включает в себя основной SDK blockchain0x и crewai как зависимости; ничего больше добавлять не нужно.
pip install blockchain0x-crewaiexport BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY - это ключ sk_test_ для testnet или sk_live_ для mainnet из вашего dashboard Blockchain0x, и это единственная переменная, которая нужна адаптеру - он передает ключ на backend и не хранит собственных секретов. Для обработчика webhook ниже также задайте BLOCKCHAIN0X_WEBHOOK_SECRET, который dashboard выдает один раз при создании или ротации webhook.
Рабочая команда из двух агентов с ролями выставления счетов и исследований.
Ниже приведена полная команда CrewAI, где агент-казначей оплачивает поставщику данных в USDC, а агент-исследователь использует результат. Казначей держит инструменты кошелька; исследователь не имеет никаких. Это канонический шаблон для команды, которая тратит.
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 отправляет подписанное событие на ваш URL вебхука. Помощник проверки поставляется в 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
Это реальный алгоритм: HMAC-SHA256 по строке t.rawBody, сравнение с постоянным временем и окно повторного воспроизведения в 300 секунд. Читайте необработанное тело (request.get_data()), никогда не используйте request.get_json() повторно сериализованное, потому что это изменяет байты, которые охватывает подпись. Архитектура: пусть обработчик ставит задачу в очередь (Celery, RQ, список Redis), которая запускает фактический запуск CrewAI. Вызов crew.kickoff() внутри обработчика может занять минуты и привести к тайм-ауту HTTP-запроса.
Передайте команде весь набор инструментов или только один инструмент.
create_blockchain0x_toolset возвращает все пять инструментов: 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")
Фабрики для отдельных capabilities - create_payment_tool, create_invoice_tool, create_wallet_tool, create_wallets_list_tool и create_transaction_tool. Исходный код и примеры для testnet находятся в the Python SDK repo; матрица поддержки CrewAI - в the docs.
Пять вещей, на которые стоит обратить внимание при подключении выставления счетов к команде.
Ролевой подход CrewAI делает интеграцию платежей более чистой, чем в других фреймворках. У него также есть свои подводные камни. Знание их заранее экономит время.
Установка инструментов кошелька на неправильном агенте
Агенты CrewAI имеют роли. Передайте инструменты кошелька исследователю, который должен заниматься исследованиями, и LLM начинает пытаться перемещать деньги в процессе анализа. Чистый шаблон - это выделенный агент-казначей, который держит инструменты и работает как собственная задача; рабочие агенты вообще не имеют доступа к кошельку. Пример выше следует этой структуре. Скопируйте его.
Последовательные против иерархических процессов
CrewAI поддерживает последовательное (по умолчанию) и иерархическое выполнение. При иерархическом исполнении агент-менеджер управляет командой. Если менеджеру разрешено делегировать инструменты кошелька, он может передать их любому подчиненному, что именно то, чего вы не хотите для полномочий на расходы. Либо держите инструменты на одном выделенном агенте и выполняйте последовательно, либо ограничьте правила делегирования менеджера.
Чтение статуса расчета из контекста задачи
Входной расчет является асинхронным. Если исследовательская задача перечисляет задачу оплаты в своем контексте (нормально), но затем LLM пытается прочитать окончательный статус платежа из этого контекста (не нормально, подтверждение приходит позже через вебхук), вы получаете запутанный вывод. Ограничьте последующую работу сигналом, вызванным вебхуком, а не контекстом задачи. Обратные вызовы задач 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.
Обработчик вебхуков вне процесса команды
Ваш обработчик вебхука обычно является отдельным процессом Flask или FastAPI, а не частью выполнения команды. Команда завершает свой kickoff() и возвращается; вебхук приходит позже, когда платеж завершается. Соедините их с помощью очереди или строки базы данных, которую вебхук записывает, а команда читает при следующем запуске. Не держите команду в ожидании вебхука - запуски CrewAI по замыслу недолговечны.