Metadata-Version: 2.4
Name: curvestone
Version: 0.1.0
Summary: Python SDK for the Curvestone compliance API
Project-URL: Homepage, https://curvestone.ai
Project-URL: Documentation, https://hub.curvestone.ai/docs
Project-URL: Repository, https://github.com/curvestone/curvestone-python
Author-email: Curvestone <engineering@curvestone.ai>
License-Expression: MIT
Classifier: Development Status :: 4 - Beta
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: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.9
Requires-Dist: httpx-sse>=0.4.0
Requires-Dist: httpx>=0.27.0
Requires-Dist: pydantic>=2.0.0
Description-Content-Type: text/markdown

# Curvestone Python SDK

Python client for the [Curvestone](https://curvestone.ai) compliance API.

## Installation

```bash
pip install curvestone
```

## Quick Start

```python
from curvestone import Agent

agent = Agent()  # reads CURVESTONE_API_KEY env var

result = agent.check(
    case_type="residential_mortgage",
    depth="full_check",
    documents=[open("fact_find.pdf", "rb"), open("suitability.pdf", "rb")],
)

print(result.triage)        # "green" | "amber" | "red"
print(result.summary)       # Executive summary
print(result.findings)      # List of Finding objects
print(result.stats)         # Stats(green=35, amber=5, red=2)
```

## Low-Level Client

For more control, use the resource-based client (similar to Stripe/Anthropic SDKs):

```python
from curvestone import Curvestone

client = Curvestone(api_key="cs_live_...")

# Upload files
f = client.files.upload(open("fact_find.pdf", "rb"), purpose="check_document")

# Submit a check
job = client.checks.create(
    case_type="residential_mortgage",
    depth="full_check",
    file_ids=[f.file_id],
)

# Poll until complete
result = client.jobs.poll(job.job_id)
print(result.status)  # "completed"
print(result.result)  # Full result dict
```

## Async Support

Every method has an async equivalent:

```python
from curvestone import AsyncAgent

async def main():
    agent = AsyncAgent()
    result = await agent.check(
        case_type="residential_mortgage",
        depth="admin_check",
        documents=[open("fact_find.pdf", "rb")],
    )
    print(result.triage)
```

## Available Resources

| Resource | Methods |
|---|---|
| `client.checks` | `create()` |
| `client.jobs` | `retrieve()`, `list()`, `cancel()`, `poll()`, `stream()` |
| `client.files` | `upload()`, `retrieve()`, `delete()` |
| `client.ask` | `create()` |
| `client.generate` | `create()` |
| `client.monitors` | `create()`, `retrieve()`, `list()`, `update()`, `delete()`, `run()` |
| `client.webhooks` | `create()`, `retrieve()`, `list()`, `update()`, `delete()`, `test()` |

## Configuration

```python
from curvestone import Curvestone

client = Curvestone(
    api_key="cs_live_...",          # or set CURVESTONE_API_KEY env var
    base_url="https://...",          # default: https://agent.curvestone.ai/agent
    timeout=120.0,                   # request timeout in seconds (default: 60)
    max_retries=3,                   # retries on 429/5xx (default: 2)
)
```

## Documentation

Full API documentation: [hub.curvestone.ai/docs](https://hub.curvestone.ai/docs)
