"""x402 AutoGen adapter — agentic payment flows for multi-agent conversations. AutoGen agents negotiate who pays for tool calls. x402 handles the payment transparently — agents request, verify, and deduct. Usage: from x402_frameworks import x402AutoGen from autogen import AssistantAgent, UserProxyAgent x402 = x402AutoGen(api_key="your-key") analyst = AssistantAgent( name="TokenAnalyst", system_message="You analyze tokens using x402 tools.", functions=[x402.as_function("token_scan")], ) # When analyst calls token_scan, x402 auto-pays from credits """ from __future__ import annotations import functools import json import logging from typing import Any, Callable, Optional from .base import x402Adapter logger = logging.getLogger("x402.autogen") class x402AutoGen(x402Adapter): """AutoGen adapter — handles payment for tool calls in multi-agent convos. Features: - AutoGen function format: `as_function()` returns AutoGen-compatible spec - Multi-agent: each agent has its own budget or shares a pool - Transparent: agents just call functions, x402 handles payment """ def as_function(self, tool_name: str, description: str = "") -> dict: """Return an AutoGen-compatible function specification. AutoGen agents use this to discover and call x402 tools. Payment is handled transparently when the function is called. """ return { "name": f"x402_{tool_name}", "description": description or f"x402 paid tool: {tool_name}. Pay per call via x402 protocol.", "parameters": { "type": "object", "properties": { "query": { "type": "string", "description": f"Input for {tool_name}. On-chain payment verified before execution.", } }, "required": ["query"], }, } def wrap_tool(self, tool_name: str, tool_func: Optional[Callable] = None) -> Callable: def decorator(func: Callable) -> Callable: @functools.wraps(func) def wrapper(*args, **kwargs): available, price, source = self.check_available(tool_name) if not available: invoice = self.get_invoice(tool_name) from .langchain_adapter import PaymentRequiredError raise PaymentRequiredError( tool=tool_name, price_usd=price, pay_to=invoice.get("pay_to", ""), chain=invoice.get("chain", "base"), invoice_id=invoice.get("id", ""), ) result = func(*args, **kwargs) if source == "paid": self.record_usage(tool_name, price) return result return wrapper if tool_func is not None: return decorator(tool_func) return decorator def register_agent(self, agent_name: str, budget_usd: float = 10.0): """Register an AutoGen agent with a personal budget.""" logger.info(f"x402 AutoGen: agent '{agent_name}' registered with ${budget_usd} budget")