Metadata-Version: 2.5
Name: everpod
Version: 0.3.0
Summary: Python client for Everpod — GPU inference on Household AI Infrastructure
Project-URL: Homepage, https://everpod.com
Project-URL: Documentation, https://api.everpod.com/docs
Project-URL: Console, https://app.everpod.com
Author-email: Everpod <support@everpod.com>
License: Apache-2.0
Keywords: ai,everpod,gpu,image-generation,inference
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.9
Requires-Dist: httpx>=0.24
Description-Content-Type: text/markdown

# everpod

Python client for [Everpod](https://everpod.com) — GPU inference on Household AI Infrastructure.

```bash
pip install everpod
```

```python
from everpod import Everpod

client = Everpod(api_key="evp_...")  # or set EVERPOD_API_KEY

image = client.images.generate(prompt="a lighthouse at dusk, cinematic")
image.save("lighthouse.png")
```

Generation runs as a **job** on a real GPU node; `generate()` polls to
completion for you. For async control:

```python
job = client.images.submit(prompt="a lighthouse at dusk")
job = client.jobs.wait(job.id, timeout=120)
print(job.artifacts[0].url)
```

Check live capacity before submitting — models are only offered while a node
can serve them:

```python
for model in client.models.available():
    print(model.name, model.ready_workers)
```

Your metered usage (nothing is billed during the pilot):

```python
usage = client.usage.get(days=30)
print(usage.total_jobs, usage.total_gpu_seconds)
for row in usage.recent:
    print(row["job_id"], row["gpu_seconds"])
```

## Music (0.3.0)

```python
song = client.music.generate(
    prompt="Warm piano and acoustic guitar, a gentle instrumental melody",
    duration_seconds=30,
)
song.save("song.wav")
print(song.url, song.artifact.duration_seconds)
```

ACE-Step 1.5 Turbo runs on Everpod. Music loads on demand as secondary image
GPU work: image requests can interrupt and requeue it, so allow extra queue
time. `generate()` waits up to 15 minutes; `music.submit()` returns a job for
`jobs.retrieve()`, `jobs.wait()` and `jobs.cancel()`. Use `idempotency_key` for
safe submission retries. Output is 10–120 seconds of 48 kHz stereo WAV.
For English vocals, set `instrumental=False` and supply `lyrics`. Inspect
`music.capabilities()` for limits. Music currently requires a service API key;
consumer web/mobile apps should call it through their authenticated backend.

## Voice (0.2.0)

```python
with Everpod() as client:  # EVERPOD_API_KEY
    print(client.audio.voices.list())
    speech = client.audio.speech.create(input="Hello from Everpod.", voice="af_heart")
    speech.save("answer.wav")
    with open("answer.wav", "rb") as audio:
        transcript = client.audio.transcriptions.create(file=audio)
    print(transcript.text, speech.inference_seconds)
    print(client.audio.usage.get())
```

English speech runs on Everpod GPUs using Qwen3-ASR 0.6B and Kokoro 82M.
Transcription accepts bytes or a binary file handle containing real PCM16 WAV,
mono/stereo at 8–48 kHz, up to 30 seconds / 6 MiB. Compressed audio must be
converted locally. `Speech.content` contains the completed 24 kHz mono WAV.
Text is limited to 600 characters; voices are `af_heart` and `am_michael`,
speed 0.75–1.5. No incremental audio streaming is provided.

Both operations accept `timeout=` in seconds (95 by default) and never retry
POSTs automatically. Handle `UsageLimitError` (402), `RateLimitError` (429) and
`NoCapacityError` (503); exceptions retain `status`, `detail` and `retry_after`.
Consumer applications can pass `access_token=` as a token or token-provider
callable to select `/v1/app/audio`; use the dedicated consumer access token.

Default API base: `https://api.everpod.com`. Get an API key at
[app.everpod.com/keys](https://app.everpod.com/keys/).
