Skip to content

Repository files navigation

# Livepeer Python SDK

The official Python SDK for the Livepeer network. Submit AI and video compute
jobs directly to orchestrators, use a remote signer for payment, and stream
media and control data over Livepeer's trickle protocol.

## Requirements

- Python 3.12 or newer

## Installation

Install the stable release from PyPI:

```bash
python -m pip install livepeer-gateway
```

The import package is named `livepeer_gateway`:

```python
from livepeer_gateway import StartJobRequest, start_lv2v
```

## Development

Install the locked development dependencies with
[uv](https://docs.astral.sh/uv/):

```bash
uv sync --locked --group test
```

Generate protobufs after installing the code-generation extra:

```bash
uv sync --extra dev
uv run generate-lp-rpc
```

## Tests

Install the locked test dependencies and run the complete pytest suite:

```bash
uv sync --locked --group test
uv run --group test pytest
```

Pass a test file or node ID to pytest for a focused run:

```bash
uv run --group test pytest tests/test_live_runner.py
uv run --group test pytest tests/test_live_runner.py::TestLiveRunnerHelpers::test_parse_go_duration
```

Run the suite with the configured line and branch coverage:

```bash
uv run --group test pytest --cov=livepeer_gateway --cov-branch --cov-report=term-missing
```

## Usage Examples

First install dependencies for example code
```bash
uv sync --extra examples
```

Get orchestrator info, offchain mode
```bash
uv run examples/get_orchestrator_info.py localhost:8935
```

On-chain mode with a remote signer

```bash
uv run examples/get_orchestrator_info.py --signer "<signer-host:port>"

# Use a custom discovery endpoint to filter orchestrators
uv run examples/get_orchestrator_info.py --signer "<signer-host:port>" '<discovery-host>/discover-orchestrators?cap=streamdiffusion-sdxl-v2v'

```

Get orchestrator info using a token encoding signer / discovery parameters
```bash
uv run examples/get_orchestrator_info.py --token "<base64-token>"
```

Write raw frames to a LiveVideoToVideo job
```bash
uv run examples/write_frames.py localhost:8935
```

Capture MacOS camera frames and publish via write_frame
```bash
uv run examples/camera_capture.py localhost:8935
```

Capture MacOS camera frames and subscribe to media output (stdout or file)
```bash
uv run examples/camera_capture.py localhost:8935 --output - | ffplay -fflags nobuffer -flags low_delay -probesize 32 -i -
uv run examples/camera_capture.py localhost:8935 --output out.ts
```

Read demuxed media output packets without decoding
```python
async with job.media_output() as output:
    async for packet in output.packets():
        print(packet.kind, packet.stream_index, packet.pts_time, packet.size)
```

Composite camera input and decoded output side-by-side with PTS delta
```bash
uv sync --extra examples
uv run examples/in_out_composite.py localhost:8935
```

Subscribe to a LiveVideoToVideo trickle events channel
```bash
uv run examples/subscribe_events.py localhost:8935
```

Start a LiveVideoToVideo job using a token (base64 JSON)
```python
import base64
import json

from livepeer_gateway.lv2v import StartJobRequest, start_lv2v

payload = {
    "orchestrators": [
        "https://orch-1.example.com:8935",
        "https://orch-2.example.com:8935",
    ],
    "signer": "https://signer.example.com",
    "signer_headers": {"Authorization": "Bearer abcdef"},
    "discovery": "https://discovery.example.com",
    "discovery_headers": {"Authorization": "Bearer qwerty"},
}
token = base64.b64encode(json.dumps(payload).encode("utf-8")).decode("utf-8")

job = start_lv2v(
    orch_url=None,
    req=StartJobRequest(model_id="noop"),
    token=token,
    timeout=5.0,  # timeout for the initial /live-video-to-video request
    # signer_url="https://fallback-signer.example.com",  # used only if token omits signer
)
```

## Token schema (base64-encoded JSON object)

| Field | Type | Description |
|---|---|---|
| `orchestrators` | `string[]` (optional) | Ordered orchestrator addresses to try before discovery |
| `signer` | `string` (optional) | Signer base URL |
| `signer_headers` | `{"key": "value"}` (optional) | Extra HTTP headers sent to all signer endpoints |
| `discovery` | `string` (optional) | Discovery endpoint URL |
| `discovery_headers` | `{"key": "value"}` (optional) | Extra HTTP headers sent to the discovery endpoint |

Token values take precedence over explicit keyword arguments.
Explicit keyword arguments are used only for fields missing in the token.

For token payloads, `orchestrators` must be a JSON array of non-empty strings.
Comma-delimited string format is not supported in the token.

Selection/discovery precedence (highest -> lowest):
1) token `orchestrators`
2) explicit `orch_url`
3) token `discovery`
4) explicit `discovery_url`
5) signer-derived discovery endpoint

`signer_headers` are sent with requests to the signer service. `discovery_headers` are only used when an explicit `discovery_url` is provided (and not when using the signer service as a discovery fallback).

About

Official Python SDK for the Livepeer network. Submit AI/video compute jobs directly to orchestrators via a remote signer, no gateway needed.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages