Outcome
Ship the v1 livepeer-client SDK so callers can request any Livepeer capability — not just live video-to-video — using one of three idiomatic verbs (run / stream / live) without having to understand orchestrators, discovery, trickle, or local payment signing.
The same call a developer runs in the Developer Dashboard playground is the call that ships into their app.
Spec
Design lives in livepeer-specs / client-sdk.md. Update the spec rather than this issue body when the design moves.
Key shape (see spec for full details):
Gateway(token=…, signer_url=…, …) — config carrier, reused across N calls
gw.run(capability, *, input=, model=) → plain return value (Replicate / fal idiom)
gw.stream(capability, …) → StreamResponse yielding StreamEvent (OpenAI / Anthropic idiom)
gw.live(capability, …) → LiveSession with publish / subscribe / control / events (LiveKit idiom)
- Async variants (
run_async, stream_async) first-class
- Three-distribution packaging:
livepeer-client, livepeer-runner, livepeer-trickle under livepeer.* PEP 420 namespace
Blockers
The v1 release is gated on the following PRs landing:
Work checklist (post-blocker)
Public API
Packaging (paired with #8 C12)
Docs / examples
Open questions
See the Open questions before implementation section in the spec — primarily around BYOC HTTP / SSE routing path on the orchestrator and publish / subscribe lazy vs. eager creation.
Out of scope for v1
| Item |
Why deferred |
Gateway.submit(...) handle pattern (.wait / .cancel / .id) |
Needs orch-side reattach + cancel semantics designed first |
| Non-video live capabilities (raw trickle fallback) |
No non-video live capability exists upstream yet |
Sync wrapper for live() |
Live jobs are inherently async; a sync wrapper would mask that |
Related
- Spec: client-sdk.md
- Companion epic: #8 (Pipeline SDK — deploy-side)
- Initial implementation: #6
Status
Blocked on the three upstream PRs listed above. Design locked.
Outcome
Ship the v1
livepeer-clientSDK so callers can request any Livepeer capability — not just live video-to-video — using one of three idiomatic verbs (run/stream/live) without having to understand orchestrators, discovery, trickle, or local payment signing.The same call a developer runs in the Developer Dashboard playground is the call that ships into their app.
Spec
Design lives in livepeer-specs / client-sdk.md. Update the spec rather than this issue body when the design moves.
Key shape (see spec for full details):
Gateway(token=…, signer_url=…, …)— config carrier, reused across N callsgw.run(capability, *, input=, model=)→ plain return value (Replicate / fal idiom)gw.stream(capability, …)→StreamResponseyieldingStreamEvent(OpenAI / Anthropic idiom)gw.live(capability, …)→LiveSessionwith publish / subscribe / control / events (LiveKit idiom)run_async,stream_async) first-classlivepeer-client,livepeer-runner,livepeer-trickleunderlivepeer.*PEP 420 namespaceBlockers
The v1 release is gated on the following PRs landing:
Gateway/run/stream/live)Work checklist (post-blocker)
Public API
Gatewayconfig carrier with token / signer / discovery / orch precedence rulesgw.live(capability, ...)→LiveSession(delegates to existingstart_lv2vforlive-video-to-video)gw.run(...)skeleton (raisesNotImplementedErroruntil BYOC HTTP routing on orch)gw.stream(...)skeleton (raisesNotImplementedErroruntil BYOC SSE routing on orch)StreamEvent/StreamResponse/AsyncStreamResponsetypesrun_async/stream_asyncvariantsgw.runto BYOC HTTP route once upstream landsgw.streamto BYOC SSE route once upstream landsPackaging (paired with #8 C12)
uvworkspace —packages/livepeer-client,packages/livepeer-runner,packages/livepeer-trickle__init__.pyatsrc/livepeer/; CI check to enforcelivepeer-gatewaydeprecation shim re-exports public names withDeprecationWarningDocs / examples
start_lv2v(...)toGateway(...).live(...)run,stream,live)Open questions
See the Open questions before implementation section in the spec — primarily around BYOC HTTP / SSE routing path on the orchestrator and
publish/subscribelazy vs. eager creation.Out of scope for v1
Gateway.submit(...)handle pattern (.wait/.cancel/.id)live()Related
Status
Blocked on the three upstream PRs listed above. Design locked.