Intégration du SDK OpenAI Agents.
Il n'y a pas de package Agents SDK, et vous n'en avez pas besoin. Décorez une fonction avec @function_tool, appelez le vrai client blockchain0x, et votre agent peut déplacer USDC sur Base.
Il n'existe pas de package OpenAI Agents SDK, et vous n'en avez pas besoin. Le SDK transforme une fonction décorée en outil avec , donc vous encapsulez le vrai client Python dans une fonction et l'ajoutez à votre . L'agent peut envoyer des USDC, régler des factures et lire des wallets - pour des agents uniques, des handoffs et l'API Responses sous-jacente. Les paiements sont réglés sur Base.
La surface d'appel d'outil la plus propre qu'OpenAI propose.
Le SDK des Agents OpenAI (publié en 2025) est la méthode recommandée par OpenAI pour construire des agents sur l'API Responses. Il abstrait le code standard autour de l'enregistrement des outils, des boucles de messages et des transferts entre agents, et produit un code Python propre et typé. Si vous commencez un projet d'agent centré sur OpenAI aujourd'hui et n'avez pas de préférences de framework, c'est le SDK que nous recommandons.
La recette est intentionnellement mince. send_usdc est une fonction simple décorée avec @function_tool ; vous l'ajoutez à la liste des outils d'un Agent et le Runner la prend. Pas de configuration spéciale, pas d'enveloppe supplémentaire, pas de fork du SDK. Lorsque le SDK des Agents expédie une nouvelle fonctionnalité (entrées multimodales, agents vocaux), votre fonction continue de fonctionner car elle repose sur la surface d'appel d'outils standard - rien de spécifique à la version n'y vit.
Installez le SDK des Agents et le SDK de base. Deux clés.
Il n'y a pas de package blockchain0x Agents SDK à ajouter. Vous installez le SDK OpenAI Agents (le package openai-agents, 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 openai-agents blockchain0xexport OPENAI_API_KEY=sk-... export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
OPENAI_API_KEY est votre clé OpenAI existante (le SDK Agents l'utilise pour l'API Responses sous-jacente). 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 @function_tool qui paie, remis à un Agent.
Voici l'intégration complète. send_usdc appelle le véritable client blockchain0x ; @function_tool le transforme en outil, et le Runner orchestre l'appel. Le SDK 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 agents import Agent, Runner, function_tool from blockchain0x import Client blockchain0x = Client() # reads BLOCKCHAIN0X_API_KEY from the environment @function_tool 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. """ return str( blockchain0x.payments.create(body={"agentId": agent_id, "to": to, "amountWei": amount_wei}) ) agent = Agent( name="treasurer", instructions="You pay vendor invoices in USDC within owner-set limits.", tools=[send_usdc], model="gpt-4o", ) result = await Runner.run( agent, input="Pay 0.01 USDC from agent agt_123 to 0xVendor for the dataset.", ) print(result.final_output)
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 is another @function_tool in the list.
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 SDK Agents à 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 choses à surveiller lors de la première intégration.
Celles-ci proviennent de notre boîte de réception de support. Les connaître à l'avance permet d'économiser une heure chacune.
Il n'y a pas de package Agents SDK - 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 OpenAI Agents SDK dédié. La recette ci-dessus est le chemin : décorez une fonction typée ordinaire avec @function_tool, appelez le véritable client blockchain0x à l'intérieur, et ajoutez-le à Agent(tools=[...]). Le SDK lit la signature et la docstring pour construire le schéma de l'outil, alors gardez la docstring précise.
Agents SDK n'est pas l'API Assistants
Le SDK des Agents OpenAI (le paquet openai-agents, importé en tant qu'agents) est un produit différent de l'ancienne API Assistants. La recette cible le SDK des Agents : Agent + Runner + @function_tool sur l'API des Réponses. Si vous appelez client.beta.assistants.create(...), vous êtes sur l'ancien modèle de threads/exécutions qu'OpenAI est en train de réduire - passez au SDK des Agents et la fonction ci-dessus s'intègre directement.
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. USDC has 6 decimals, so 0.01 USDC is "10000" and 5 USDC is "5000000". Type the function argument as str; a float will lose precision before it reaches the API. Keep it a string end to end.
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. Attrapez l'erreur à l'intérieur de votre fonction et renvoyez un message clair sur lequel le modèle peut agir, plutôt que de laisser le Runner boucler. La clé d'idempotence générée automatiquement signifie qu'un réessai manuel ne paiera pas deux fois.
Runtime uniquement asynchrone
Le SDK des agents est d'abord asynchrone - attendez Runner.run(...). L'appel blockchain0x à l'intérieur de votre outil est synchrone, ce qui est bien pour un paiement rapide unique mais bloque la boucle sous charge. Si vous exécutez de nombreux agents concurrents, enveloppez l'appel SDK avec asyncio.to_thread. À partir d'un point d'entrée synchrone, asyncio.run() au niveau supérieur.