Intégration de paiement AutoGen.
Il n'y a pas de package AutoGen, et vous n'en avez pas besoin. Encapsulez le vrai client blockchain0x dans une fonction, remettez-le à votre agent, et il peut déplacer USDC sur Base.
Il n'existe pas de package spécifique à AutoGen, et vous n'en avez pas besoin. AutoGen transforme déjà une fonction typée simple en outil, donc vous encapsulez le vrai client Python dans une fonction, le transmettez à un via , et l'agent peut envoyer des USDC, régler des factures et lire des wallets sur Base. Définissez et c'est parti.
AutoGen fait déjà d'une fonction un outil. Utilisez cela.
AutoGen construit un schéma d'outil directement à partir de la signature et de la docstring d'une fonction Python. Un adaptateur AutoGen dédié ne ferait qu'encapsuler une fonction que nous aurions écrite de toute façon, puis dériverait de la synchronisation avec l'API en évolution rapide d'AutoGen. Donc, nous n'en expédions pas. Vous écrivez quelques lignes qui appellent le véritable client blockchain0x, et vous gardez le contrôle total des arguments, de la validation et de la gestion des erreurs.
C'est le même client que les adaptateurs LangChain et CrewAI expédiés encapsulent en arrière-plan. Ici, vous l'encapsulez vous-même, ce qui signifie qu'il n'y a pas de version d'adaptateur à suivre et rien entre votre agent et l'API sauf votre propre fonction. Les équipes multi-agents fonctionnent de la même manière : donnez la fonction de portefeuille à un agent, laissez les autres sans, et l'autorité de dépense reste à un seul endroit.
Installez AutoGen et le SDK de base. Une variable d'environnement.
Il n'y a pas de package AutoGen dédié à ajouter. Vous installez AutoGen (Python 3.10+) et le vrai SDK de base blockchain0x, puis écrivez la fonction ci-dessous. C'est toute la liste des dépendances.
pip install autogen-agentchat "autogen-ext[openai]" blockchain0x
export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
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, que le tableau de bord renvoie une fois lorsque vous créez ou faites tourner un webhook.
Une fonction qui paie, remise à un AssistantAgent.
Voici l'intégration complète. send_usdc appelle le véritable client blockchain0x ; AssistantAgent(tools=[send_usdc]) le transforme en un outil que le modèle peut appeler. AutoGen lit les indications de type et la docstring pour construire le schéma, alors gardez-les honnêtes. Exécutez-le et l'agent déplace USDC sur Base.
from autogen_agentchat.agents import AssistantAgent from autogen_ext.models.openai import OpenAIChatCompletionClient from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment # AutoGen turns a plain typed function into a tool. No dedicated package needed. def send_usdc(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. """ result = blockchain0x.payments.create( body={"agentId": agent_id, "to": to, "amountWei": amount_wei}, ) return str(result) treasurer = AssistantAgent( name="treasurer", model_client=OpenAIChatCompletionClient(model="gpt-4o"), tools=[send_usdc], system_message="You pay vendor invoices in USDC within owner-set limits.", ) result = await treasurer.run( task="Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset.", )
When the agent decides to pay, it 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_. Add more functions - read a wallet, settle an invoice - the same way; each becomes another entry in tools.
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, RQ, 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 AutoGen à 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 corps de fonction.
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 la fonction fonctionne comme vous l'attendez.
Cinq pièges de chat de groupe et asynchrones à éviter.
Le design multi-agent + asynchrone d'AutoGen déverrouille des modèles puissants mais introduit ses propres pièges. Ceux-ci proviennent de notre boîte de réception de support.
Il n'y a pas de package AutoGen - vous encapsulez le SDK
Blockchain0x expédie des adaptateurs pour LangChain et CrewAI ainsi que le serveur MCP ; il n'y a pas de package AutoGen dédié. La recette ci-dessus est le chemin pris en charge : une fonction typée ordinaire qui appelle le véritable client blockchain0x, remise à AssistantAgent(tools=[...]). AutoGen lit la signature de la fonction et la docstring pour construire le schéma de l'outil, alors gardez la docstring précise.
Les montants sont des unités de base USDC, sous forme de chaînes
payments.create takes amountWei: a string of USDC base units, not a float and not a dollar figure. USDC has 6 decimals, so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the tool argument as str and validate it before the call - a float that sneaks through either errors at the backend or moves a millionth of what you meant.
send_payment peut répondre 503 tôt
payments.create ne réessaie pas par défaut et peut renvoyer 503 jusqu'à ce que l'adaptateur de chaîne soit câblé pour votre réseau. Ne laissez pas le chat de groupe boucler sur un paiement échoué - attrapez l'erreur dans votre fonction, renvoyez un message clair sur lequel le modèle peut agir, et comptez sur la clé d'idempotence générée automatiquement pour qu'un réessai manuel ne paie pas deux fois.
AutoGen 0.4+ est asynchrone ; l'appel SDK est synchrone
AutoGen 0.4 exécute des outils dans une boucle asynchrone. L'appel du client blockchain0x est synchrone, ce qui est acceptable pour une demande rapide, mais un appel lent bloque la boucle. Si vous traitez un volume réel, encapsulez l'appel SDK avec asyncio.to_thread pour que la boucle d'événements reste réactive. Pour un paiement unique par tour, l'appeler directement est acceptable.
Vérifiez les webhooks entrants par rapport au corps brut
Si votre agent REÇOIT également de l'argent, 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.