Интеграция платежей Agno.
Нет пакета Agno, и он вам не нужен. Оберните реальный клиент blockchain0x в небольшой Toolkit, и ваш агент сможет перемещать USDC на Base - минимальная абстракция, по методу Agno.
Специального пакета для Agno нет, и он вам не нужен. Agno превращает метод в tool, поэтому вы оборачиваете реальный Python client в небольшой toolkit и добавляете его в свой . Агент может отправлять USDC, закрывать invoices и читать wallets во всех моделях Agno (OpenAI, Anthropic, DeepSeek, Llama, Mistral). Платежи завершаются в Base.
Легковесный фреймворк Python. Никакого налога на абстракцию.
Agno (ранее Phidata) - это фреймворк для агентов, который вы выбираете, когда хотите минимального церемониала. Нет конструктора графов, нет Crew, нет Workflow - только Agent, Tools и метод run(). Инструменты - это вызываемые Python-объекты. Фреймворк добавляет достаточно каркаса, чтобы вызывать LLM с поддержкой инструментов, управлять памятью и производить потоковый вывод, а затем уходит с вашего пути.
Рецепт следует той же философии. Вы пишете небольшой подкласс Toolkit, который регистрирует один метод, вызывающий реальный клиент - он выглядит и ведет себя как любой другой инструмент Agno. Никакой специальной настройки, кроме инстанцирования, никакого графа для подключения, никакой версии адаптера для отслеживания. Простота - это суть: если бы вы хотели графы, вы бы использовали LangGraph.
Установите Agno и основной SDK. Два ключа.
Нет пакета blockchain0x Agno для добавления. Вы устанавливаете Agno (Python 3.10+, линия 1.0+ после переименования Phidata) и реальный основной SDK blockchain0x, затем пишете toolkit ниже. Если вы все еще используете импорты phi.*, сначала выполните pip install -U agno.
pip install agno blockchain0xexport OPENAI_API_KEY=sk-... export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
OPENAI_API_KEY (или аналогичный ключ для любой поддерживаемой Agno модели). BLOCKCHAIN0X_API_KEY - это ключ sk_test_ для testnet или sk_live_ для mainnet из вашего dashboard; client читает его из environment. Если ваш agent также получает деньги, обработчику webhook дополнительно нужен BLOCKCHAIN0X_WEBHOOK_SECRET.
Набор инструментов, который оплачивает, переданный Агенту.
Ниже приведена вся интеграция. WalletTools - это подкласс Toolkit, который регистрирует send_usdc, который вызывает реальный клиент blockchain0x. Добавьте его к Агенту, и вызов run() организует вызов инструмента. Agno считывает сигнатуру метода и документацию, чтобы построить схему.
from agno.agent import Agent from agno.models.openai import OpenAIChat from agno.tools import Toolkit from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment # Wrap the real client in an Agno Toolkit. No dedicated package needed. class WalletTools(Toolkit): def __init__(self): super().__init__(name="wallet_tools") self.register(self.send_usdc) def send_usdc(self, agent_id: str, to: str, amount_wei: str) -> str: """Send a USDC payment from an agent wallet. amount_wei is USDC base units (6 decimals), so "10000" is 0.01 USDC. """ return str( blockchain0x.payments.create(body={"agentId": agent_id, "to": to, "amountWei": amount_wei}) ) agent = Agent( model=OpenAIChat(id="gpt-4o"), tools=[WalletTools()], instructions=["You pay vendor invoices in USDC within owner-set limits."], ) result = agent.run("Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset.") print(result.content)
When agent.run() executes, the model decides to pay, calls send_usdc, the SDK submits the transfer, and you get a transaction hash back. amount_wei is base units, so 0.01 USDC is "10000". A sk_test_ key keeps it on Base Sepolia until you switch to sk_live_. Register more methods on the toolkit - read a wallet, settle an invoice - the same way.
Подтвердите входящие платежи с помощью подписанного webhook.
Если ваш агент также получает USDC, подтвердите это с помощью вебхука, а не опросом. Помощник проверки поставляется в Node SDK; в Python-сервисе вы проверяете вручную по документированному HMAC, что и делает помощник. Пример FastAPI ниже; тот же код работает в любом асинхронном Python-фреймворке.
import hmac, hashlib, os, time from fastapi import FastAPI, Request, HTTPException app = FastAPI() SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode() @app.post("/webhooks/payment") async def receive(request: Request): raw = await request.body() # RAW bytes - do not parse first sig = request.headers.get("X-Blockchain0x-Signature", "") ts = request.headers.get("X-Blockchain0x-Timestamp", "") 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: raise HTTPException(status_code=401) if request.headers.get("X-Blockchain0x-Event-Type") == "payment.received": await trigger_followup() # USDC landed - run the next step return {"ok": True}
Алгоритм - HMAC-SHA256 над строкой t.rawBody, сравнение с постоянным временем и окно повторного воспроизведения 300 секунд. Читайте необработанное тело через await request.body(), никогда не request.json() повторно сериализованное, потому что это изменяет байты, которые охватывает подпись. Отправленные события - payment.received, payment.sent, wallet.deployed и webhook.test. Для тяжелой последующей работы добавьте задачу в очередь (Celery, arq) и сразу ответьте 200, а не блокируйте обработчик.
Клиент, который вы оборачиваете, открыт. Читайте его.
Нет starter package для Agno, который можно было бы клонировать - рецепт выше и есть интеграция. SDK Blockchain0x открыты в GitHub; этот рецепт оборачивает Python SDK (blockchain0x-python), а полный набор методов приведен в docs. Используйте его как reference для методов toolkit.
github.com/tosh-labs/blockchain0x-pythonПолный набор методов SDK и scopes описаны в the docs. Начните с ключа sk_test_ в Base Sepolia, затем переключитесь на sk_live_, когда toolkit начнет работать так, как вы ожидаете.
Пять специфических для Agno вещей, на которые стоит обратить внимание.
Agno - один из более чистых фреймворков для агентов, с которыми можно интегрироваться, но у него есть свои подводные камни - особенно в отношении переименования Phidata и рендеринга markdown.
Нет пакета Agno - вы оборачиваете SDK в Toolkit.
Blockchain0x поставляет адаптеры для LangChain и CrewAI, а также сервер MCP; нет отдельного пакета Agno. Рецепт выше - это путь: подкласс Toolkit, который регистрирует метод, вызывающий реальный клиент blockchain0x. Agno читает сигнатуру метода и docstring, чтобы построить схему инструмента, поэтому держите docstring точным.
Путаница с миграцией Phidata на Agno
Agno был переименован из Phidata в 2024 году. Более старые кодовые базы, импортирующие из phi.agent или phi.tools, все еще работают через совместимый шим, но импорты agno.* являются актуальными. Рецепт использует agno.* на протяжении всего; если ваш код все еще использует импорты phi.*, выполните pip install -U agno и измените пути импорта перед добавлением Toolkit.
Суммы представлены в базовых единицах USDC, как строки
payments.create takes amountWei: a string of USDC base units (6 decimals), so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the method argument as str. It also does not retry by default and can answer 503 until the chain adapter is wired for your network - return a clear message rather than letting the agent loop.
Синхронный vs асинхронный запуск
Agno поддерживает agent.run() (синхронный) и agent.arun() (асинхронный). Выберите один режим для каждого агента - вызовите agent.run() и попытайтесь дождаться результата, и вы получите корутину, где ожидали строку. Вызов blockchain0x внутри Toolkit является синхронным; если вы на асинхронном пути и обрабатываете реальный объем, оберните его с помощью asyncio.to_thread, чтобы цикл событий оставался отзывчивым.
Проверьте вебхуки по необработанному телу.
Если ваш агент также получает USDC, подтвердите это с помощью вебхука, а не опросом. Проверьте подпись по необработанным байтам запроса (await request.body()), никогда не request.json() повторно сериализованный, потому что HMAC охватывает точные байты. Это HMAC-SHA256 с окном повторного воспроизведения в 300 секунд. Обработчик ниже - это все.