Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
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).