Intégration de paiement Agno.
Il n'y a pas de package Agno, et vous n'en avez pas besoin. Encapsulez le vrai client blockchain0x dans un petit Toolkit et votre agent peut déplacer USDC sur Base - abstraction minimale, à la manière d'Agno.
Il n'existe pas de package spécifique à Agno, et vous n'en avez pas besoin. Agno transforme une méthode en outil, donc vous encapsulez le vrai client Python dans une petite boîte à outils et l'ajoutez à votre . L'agent peut envoyer des USDC, régler des factures et lire des wallets, sur tous les modèles Agno (OpenAI, Anthropic, DeepSeek, Llama, Mistral). Les paiements sont réglés sur Base.
Le framework Python léger. Pas de taxe d'abstraction.
Agno (anciennement Phidata) est le cadre d'agent que vous choisissez lorsque vous voulez un minimum de cérémonies. Il n'y a pas de constructeur de Graph, pas de Crew, pas de Workflow - juste Agent, Outils, et une méthode run(). Les outils sont des appelables Python. Le cadre ajoute suffisamment d'échafaudage pour appeler des LLM avec un support d'outils, gérer la mémoire, et produire une sortie en streaming, puis se met en retrait.
La recette suit la même philosophie. Vous écrivez une petite sous-classe Toolkit qui enregistre une méthode appelant le véritable client - elle ressemble et se comporte comme tout autre outil Agno. Pas de configuration spéciale au-delà de l'instanciation, pas de graphique à câbler, pas de version d'adaptateur à suivre. La simplicité est le but : si vous vouliez des graphiques, vous seriez sur LangGraph.
Installez Agno et le SDK de base. Deux clés.
Il n'y a pas de package blockchain0x Agno à ajouter. Vous installez Agno (Python 3.10+, la ligne 1.0+ après le renommage de Phidata) et le vrai SDK de base blockchain0x, puis écrivez le toolkit ci-dessous. Si vous êtes encore sur les imports phi.*, exécutez d'abord 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 (ou l'équivalent pour le modèle pris en charge par Agno que vous utilisez). BLOCKCHAIN0X_API_KEY est une clé sk_test_ testnet ou sk_live_ mainnet de votre tableau de bord ; le client la lit depuis l'environnement. Si votre agent reçoit également de l'argent, le gestionnaire de webhook a également besoin de BLOCKCHAIN0X_WEBHOOK_SECRET.
Un Toolkit qui paie, remis à un Agent.
Voici l'intégration complète. WalletTools est une sous-classe de Toolkit qui enregistre send_usdc, qui appelle le véritable client blockchain0x. Ajoutez-le à l'Agent et l'appel run() orchestre l'invocation de l'outil. Agno lit la signature de la méthode et la docstring pour construire le schéma.
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.
Confirmer les paiements entrants avec un webhook signé.
Si votre agent reçoit également des USDC, confirmez-le avec le webhook plutôt que par sondage. L'assistant de vérification est inclus dans le SDK Node ; dans un service Python, vous vérifiez manuellement contre le HMAC documenté, ce que fait l'assistant. Exemple FastAPI ci-dessous ; le même code fonctionne dans n'importe quel framework Python asynchrone.
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}
L'algorithme est HMAC-SHA256 sur la chaîne t.rawBody, une comparaison en temps constant, et une fenêtre de répétition de 300 secondes. Lisez le corps brut via await request.body(), jamais request.json() re-sérialisé, car cela change les octets que la signature couvre. Les événements expédiés sont payment.received, payment.sent, wallet.deployed, et webhook.test. Pour un travail de suivi lourd, mettez une tâche en file d'attente (Celery, arq) et répondez 200 immédiatement plutôt que de bloquer le gestionnaire.
Le client que vous enveloppez est ouvert. Lisez-le.
Il n'y a pas de package de démarrage Agno à cloner - la recette ci-dessus est l'intégration. Les SDK blockchain0x sont open source sur GitHub ; cette recette encapsule le SDK Python (blockchain0x-python), avec la surface complète des méthodes dans la documentation. Lisez-le pour une référence sur les méthodes de l'outil.
github.com/tosh-labs/blockchain0x-pythonLa surface complète des méthodes SDK et les portées sont documentées dans la documentation. Commencez avec une clé sk_test_ sur Base Sepolia, puis passez à sk_live_ lorsque l'outil fonctionne comme vous l'attendez.
Cinq choses spécifiques à Agno à surveiller.
Agno est l'un des cadres d'agent les plus propres à intégrer, mais il a ses propres pièges - en particulier autour du renommage de Phidata et du rendu markdown.
Il n'y a pas de package Agno - vous encapsulez le SDK dans un Toolkit
Blockchain0x expédie des adaptateurs pour LangChain et CrewAI ainsi que le serveur MCP ; il n'y a pas de package Agno dédié. La recette ci-dessus est le chemin : une sous-classe Toolkit qui enregistre une méthode appelant le véritable client blockchain0x. Agno lit la signature de la méthode et la docstring pour construire le schéma de l'outil, alors gardez la docstring précise.
Confusion sur la migration de Phidata vers Agno
Agno a été renommé de Phidata en 2024. Les anciennes bases de code importées depuis phi.agent ou phi.tools fonctionnent toujours via un adaptateur de compatibilité, mais les imports agno.* sont les actuels. La recette utilise agno.* tout au long ; si votre code est toujours sur les imports phi.*, exécutez pip install -U agno et changez les chemins d'importation avant d'ajouter le Toolkit.
Les montants sont des unités de base USDC, sous forme de chaînes
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.
Exécution synchrone vs asynchrone
Agno prend en charge agent.run() (synchronisé) et agent.arun() (asynchrone). Choisissez un mode par agent - appelez agent.run() et essayez d'attendre le résultat et vous obtenez une coroutine où vous vous attendiez à une chaîne. L'appel blockchain0x à l'intérieur du Toolkit est synchrone ; si vous êtes sur le chemin asynchrone et que vous traitez un volume réel, encapsulez-le avec asyncio.to_thread pour que la boucle d'événements reste réactive.
Vérifiez les webhooks par rapport au corps brut
Si votre agent reçoit également des USDC, confirmez-le avec le webhook, pas par sondage. Vérifiez la signature sur les octets de la requête RAW (await request.body()), jamais request.json() re-sérialisé, car le HMAC couvre les octets exacts. C'est HMAC-SHA256 avec une fenêtre de répétition de 300 secondes. Le gestionnaire ci-dessous est l'ensemble.