Integração do OpenAI Agents SDK.
Não há pacote Agents SDK, e você não precisa de um. Decore uma função com @function_tool, chame o cliente blockchain0x real, e seu agente pode mover USDC na Base.
Não existe um pacote específico para OpenAI Agents SDK, e você não precisa de um. O SDK transforma uma função decorada em uma tool com , então você encapsula o cliente Python real em uma função e o adiciona ao seu . O agente pode enviar USDC, liquidar invoices e ler wallets - em agentes únicos, handoffs e na Responses API subjacente. Os pagamentos são liquidados na Base.
A superfície de chamada de ferramenta mais limpa que a OpenAI envia.
O OpenAI Agents SDK (lançado em 2025) é a maneira recomendada pela OpenAI para construir agentes em cima da API de Respostas. Ele abstrai o boilerplate em torno do registro de ferramentas, loops de mensagens e transferências entre agentes, e produz código Python limpo e tipado. Se você está começando um projeto de agente centrado na OpenAI hoje e não tem preferências de framework, este é o SDK que recomendamos.
A receita é intencionalmente fina. send_usdc é uma função simples decorada com @function_tool; você a adiciona à lista de ferramentas de um Agente e o Runner a pega. Nenhuma configuração especial, nenhum wrapper extra, nenhum fork do SDK. Quando o SDK de Agentes envia um novo recurso (entradas multimodais, agentes de voz), sua função continua funcionando porque se baseia na superfície padrão de chamadas de ferramentas - nada específico de versão vive nela.
Instale o Agents SDK e o SDK principal. Duas chaves.
Não há pacote blockchain0x Agents SDK para adicionar. Você instala o OpenAI Agents SDK (o pacote openai-agents, Python 3.10+) e o SDK principal blockchain0x real, e então escreve a função abaixo. Essa é toda a lista de dependências.
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 é a sua chave OpenAI existente (o Agents SDK a usa para a Responses API subjacente). BLOCKCHAIN0X_API_KEY é uma chave sk_test_ de testnet ou sk_live_ de mainnet do seu dashboard; o cliente a lê do ambiente. Se o seu agente também receber dinheiro, o handler de webhook também precisa de BLOCKCHAIN0X_WEBHOOK_SECRET.
Uma @function_tool que paga, entregue a um Agente.
Abaixo está toda a integração. send_usdc chama o cliente real blockchain0x; @function_tool o transforma em uma ferramenta, e o Runner orquestra a chamada. O SDK lê as dicas de tipo e a docstring para construir o esquema, então mantenha-os honestos. Execute-o e o agente move USDC no 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.
Confirme pagamentos recebidos com um webhook assinado.
Se seu agente também recebe USDC, confirme com o webhook em vez de polling. O helper de verificação é enviado no SDK Node; em um serviço Python você verifica manualmente contra o HMAC documentado, que é tudo o que o helper faz. Exemplo FastAPI abaixo; o mesmo código funciona em qualquer framework Python assíncrono.
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}
O algoritmo é HMAC-SHA256 sobre a string t.rawBody, uma comparação em tempo constante e uma janela de replay de 300 segundos. Leia o corpo bruto via await request.body(), nunca request.json() re-serialized, porque isso altera os bytes que a assinatura cobre. Os eventos enviados são payment.received, payment.sent, wallet.deployed e webhook.test. Para trabalhos de acompanhamento pesados, enfileire um trabalho (Celery, arq) e responda 200 imediatamente em vez de bloquear o manipulador.
O cliente que você está envolvendo é aberto. Leia-o.
Não existe um starter package do Agents SDK para clonar - a receita acima é a integração. Os SDKs da blockchain0x são open source no GitHub; esta receita encapsula o Python SDK (blockchain0x-python), com a superfície completa de métodos na documentação. Leia como referência para os corpos das funções.
github.com/tosh-labs/blockchain0x-pythonA superfície completa de métodos e os escopos do SDK estão documentados em the docs. Comece com uma chave sk_test_ na Base Sepolia e depois mude para sk_live_ quando a função fizer o que você espera.
Cinco coisas para observar na primeira integração.
Estes vêm da nossa caixa de entrada de suporte. Conhecê-los com antecedência economiza uma hora cada.
Não há pacote Agents SDK - você envolve o SDK
Blockchain0x envia adaptadores para LangChain e CrewAI, além do servidor MCP; não há um pacote dedicado do OpenAI Agents SDK. A receita acima é o caminho: decore uma função tipada simples com @function_tool, chame o cliente real do blockchain0x dentro e adicione-o ao Agent(tools=[...]). O SDK lê a assinatura e a docstring para construir o esquema da ferramenta, então mantenha a docstring precisa.
Agents SDK não é a Assistants API
O SDK de Agentes OpenAI (o pacote openai-agents, importado como agents) é um produto diferente da antiga API de Assistentes. A receita visa o SDK de Agentes: Agente + Runner + @function_tool sobre a API de Respostas. Se você estiver chamando client.beta.assistants.create(...), você está no modelo mais antigo de threads/runs que a OpenAI está descontinuando - mude para o SDK de Agentes e a função acima se encaixa diretamente.
Os valores são unidades base de USDC, como strings
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 pode responder 503 logo no início
payments.create não tenta novamente por padrão e pode retornar 503 até que o adaptador de cadeia esteja configurado para sua rede. Capture o erro dentro da sua função e retorne uma mensagem clara que o modelo possa agir, em vez de deixar o Runner em loop. A chave de idempotência criada automaticamente significa que uma nova tentativa manual não resultará em pagamento duplicado.
Runtime apenas assíncrono
O SDK de Agentes é assíncrono por padrão - aguarde Runner.run(...). A chamada blockchain0x dentro da sua ferramenta é síncrona, o que é bom para um único pagamento rápido, mas bloqueia o loop sob carga. Se você estiver executando muitos agentes concorrentes, envolva a chamada do SDK com asyncio.to_thread. A partir de um ponto de entrada síncrono, asyncio.run() no nível superior.