Metadata-Version: 2.4
Name: basecodeagent
Version: 0.1.0
Summary: Python SDK for BaseCodeAgent — discoverable AI agent services on Base with x402 payments
Author-email: BaseCodeAgent <agent@basecode.dev>
License: MIT
Project-URL: Homepage, https://github.com/ddlpng/agent-service
Project-URL: Repository, https://github.com/ddlpng/agent-service
Project-URL: Documentation, https://github.com/ddlpng/agent-service/blob/main/SDK_README.md
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.24.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
Requires-Dist: ruff>=0.1.0; extra == "dev"

# BaseCodeAgent SDK

Python SDK for interacting with BaseCodeAgent — discoverable AI agent services on Base with x402 payments.

## Installation

```bash
pip install httpx  # required dependency
# or install from local path:
pip install -e .
```

## Quick Start

### Sync Client

```python
from basecodeagent import BaseCodeAgent

# Initialize
client = BaseCodeAgent(url="https://agent-service-production-bb95.up.railway.app")

# Discover services
services = client.discover()
for svc in services:
    print(f"• {svc.name}: {svc.price_usd}")

# Check health
health = client.health()
print(f"Agent: {health['agent']}")

# Get metrics
metrics = client.get_metrics()
print(f"Requests: {metrics['requests']['total']}")

# Call a service (requires payment token)
result = client.call_service(
    service="code-review",
    payment_token="x402-mock-abc123",
    code="def hello(): print('world')",
    language="python"
)

if result.is_success:
    print(result.result)
```

### Async Client

```python
import asyncio
from basecodeagent import AsyncBaseCodeAgent

async def main():
    async with AsyncBaseCodeAgent() as client:
        # Discover services
        services = await client.discover()
        
        # Call service
        result = await client.call_service(
            service="code-review",
            payment_token="x402-mock-abc123",
            code="def hello(): print('world')",
            language="python"
        )
        print(result)

asyncio.run(main())
```

### Context Manager (Auto-close)

```python
from basecodeagent import BaseCodeAgent

with BaseCodeAgent() as client:
    services = client.discover()
    print(f"{len(services)} services available")
    # Client automatically closed
```

## API Reference

### `BaseCodeAgent(url, timeout=30, verify_ssl=True)`

**Parameters:**
- `url`: Agent service base URL
- `timeout`: Request timeout in seconds
- `verify_ssl`: Verify SSL certificates

**Methods:**
- `discover()` → `List[ServiceInfo]` — List all services
- `discover_dict()` → `Dict[str, ServiceInfo]` — Services as dict
- `health()` → `Dict` — Health check
- `get_metrics()` → `Dict` — Service metrics
- `call_service(service, payment_token, **kwargs)` → `ServiceResponse` — Call a service
- `settle_payment(pay_to, service, price, admin_api_key)` → `Dict` — Admin settlement
- `close()` — Close HTTP connection

### `AsyncBaseCodeAgent(url, timeout=30, verify_ssl=True)`

Same interface as sync client, but all methods are `async`.

### `ServiceInfo`

Dataclass with service metadata:
- `name`, `description`, `price_usd`, `price_atomic`
- `network`, `tags`, `required_fields`, `allowed_fields`, `examples`
- `price_float` — Parsed price as float

### `ServiceResponse`

Dataclass with service response:
- `status`, `service`, `request_id`, `result`, `payment_verified`, `timestamp`
- `is_success` — Property returning `True` if successful

## Requirements

- Python 3.9+
- httpx (automatically installed)

## License

MIT
