What
Wire the session payment streamer (#30 / #31) onto the single-shot streaming path so a held-open SSE single-shot call keeps paying for the duration of the stream, not just an upfront 402.
The pieces exist but aren't connected for single-shot:
Single-shot has no reserve_session, so the loop must be drivable off the call's challenge/stream.
Scope
- Drive the payment streamer off
call_runner's 402 challenge / LiveRunnerCallStream (session id = manifest_id), not a reserved LiveRunnerSession.
- POST to the session-scoped endpoint
…/apps/{runner}/session/{id}/payment (fix the current {origin}/payment target in send_payment).
- Run the loop as a background
asyncio task started after call_runner(stream=True) opens the stream; drain the stream concurrently (the async for yields so the loop ticks).
- Drive cadence from the challenge's
payment_interval (requires go-livepeer to surface it in the 402 challenge).
- End-to-end paid-SSE test: 402 → open stream → concurrent interval payments → stream completes past the upfront amount.
Depends on / relates to
Part of the Live Runner: Single-Shot Pipelines project.
What
Wire the session payment streamer (#30 / #31) onto the single-shot streaming path so a held-open SSE single-shot call keeps paying for the duration of the stream, not just an upfront 402.
The pieces exist but aren't connected for single-shot:
call_runner(stream=True)→LiveRunnerCallStreamgives an open, non-blocking stream + one upfront 402 payment (Add SSE/chunked streaming support to the SDK #26 / feat: add SSE/chunked streaming to call_runner #25).run_session_payments/start_payments()(Encapsulate live-runner session payments in a stateful session/client object #30 / feat(live-runner): session-owned payment lifecycle for streamed sessions #31) is the interval payment loop, but it's scoped to thereserve_session/LiveRunnerSessionflow.Single-shot has no
reserve_session, so the loop must be drivable off the call's challenge/stream.Scope
call_runner's 402 challenge /LiveRunnerCallStream(session id =manifest_id), not a reservedLiveRunnerSession.…/apps/{runner}/session/{id}/payment(fix the current{origin}/paymenttarget insend_payment).asynciotask started aftercall_runner(stream=True)opens the stream; drain the stream concurrently (theasync foryields so the loop ticks).payment_interval(requires go-livepeer to surface it in the 402 challenge).Depends on / relates to
ModifyResponseheaders removed andpayment_intervaladded to the 402 challengePart of the Live Runner: Single-Shot Pipelines project.