Integração de pagamento AutoGen.
Não há pacote AutoGen, e você não precisa de um. Envolva o cliente blockchain0x real em uma função, entregue-a ao seu agente, e ele pode mover USDC na Base.
Não existe um pacote específico para AutoGen, e você não precisa de um. O AutoGen já transforma uma função tipada simples em uma tool, então você encapsula o cliente Python real em uma função, a entrega a um via , e o agente pode enviar USDC, liquidar invoices e ler wallets na Base. Configure e siga em frente.
AutoGen já transforma uma função em uma ferramenta. Use isso.
AutoGen constrói um esquema de ferramenta diretamente da assinatura e docstring de uma função Python. Um adaptador AutoGen dedicado apenas envolveria uma função que teríamos escrito de qualquer forma, e depois ficaria fora de sincronia com a API em rápida evolução do AutoGen. Portanto, não enviamos um. Você escreve algumas linhas que chamam o cliente real blockchain0x e mantém total controle sobre os argumentos, validação e tratamento de erros.
Este é o mesmo cliente que os adaptadores LangChain e CrewAI enviados envolvem por trás das cenas. Aqui você o envolve você mesmo, o que significa que não há versão de adaptador para rastrear e nada entre seu agente e a API, exceto sua própria função. Equipes de múltiplos agentes funcionam da mesma maneira: dê a função da carteira a um agente, deixe os outros sem ela e a autoridade de gasto permanece em um só lugar.
Instale AutoGen e o SDK principal. Uma variável de ambiente.
Não há pacote dedicado AutoGen para adicionar. Você instala AutoGen (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 autogen-agentchat "autogen-ext[openai]" blockchain0x
export BLOCKCHAIN0X_API_KEY=sk_test_... # sk_test_ = Base Sepolia, sk_live_ = Base mainnet
BLOCKCHAIN0X_API_KEY é uma chave sk_test_ de testnet ou sk_live_ de mainnet do seu painel; o cliente a lê do ambiente. Se o seu agente também recebe dinheiro, o handler de webhook também precisa de BLOCKCHAIN0X_WEBHOOK_SECRET, que o painel retorna uma única vez quando você cria ou rota um webhook.
Uma função que paga, entregue a um AssistantAgent.
Abaixo está toda a integração. send_usdc chama o cliente real blockchain0x; AssistantAgent(tools=[send_usdc]) o transforma em uma ferramenta que o modelo pode chamar. AutoGen 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 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.
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, RQ, 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 AutoGen 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 armadilhas de chat em grupo e assíncronas a evitar.
O design multi-agente + assíncrono do AutoGen desbloqueia padrões poderosos, mas introduz suas próprias armadilhas. Estas vêm da nossa caixa de entrada de suporte.
Não há pacote AutoGen - você envolve o SDK
Blockchain0x envia adaptadores para LangChain e CrewAI, além do servidor MCP; não há um pacote dedicado do AutoGen. A receita acima é o caminho suportado: uma função tipada simples que chama o cliente real do blockchain0x, entregue ao AssistantAgent(tools=[...]). O AutoGen lê a assinatura da função e a docstring para construir o esquema da ferramenta, então mantenha a docstring precisa.
Os valores são unidades base de USDC, como strings
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 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. Não deixe o chat em grupo entrar em loop em um pagamento falhado - capture o erro na sua função, retorne uma mensagem clara que o modelo possa agir e confie na chave de idempotência criada automaticamente para que uma nova tentativa manual não resulte em pagamento duplicado.
AutoGen 0.4+ é assíncrono; a chamada do SDK é síncrona
AutoGen 0.4 executa ferramentas em um loop assíncrono. A chamada do cliente blockchain0x é síncrona, o que é bom para uma solicitação rápida, mas uma chamada lenta bloqueia o loop. Se você estiver movimentando volume real, envolva a chamada do SDK com asyncio.to_thread para que o loop de eventos permaneça responsivo. Para um único pagamento por vez, chamá-la diretamente é aceitável.
Verifique webhooks de entrada contra o corpo bruto
Se seu agente também RECEBER dinheiro, confirme com o webhook, não por polling. Verifique a assinatura sobre os bytes RAW da requisição (await request.body()), nunca request.json() re-serializado, porque o HMAC cobre os bytes exatos. É HMAC-SHA256 com uma janela de repetição de 300 segundos. O manipulador abaixo é tudo isso.