diff --git a/.buildkite/scripts/unit_test.sh b/.buildkite/scripts/unit_test.sh index aacba0fcc..63bf27ecc 100644 --- a/.buildkite/scripts/unit_test.sh +++ b/.buildkite/scripts/unit_test.sh @@ -1,7 +1,10 @@ #!/usr/bin/env bash set -euo pipefail +# The livestream app's tests are CPU-only; its single gpu-marked module is +# deselected, and DreamVerse's GPU tests have their own lane. exec pytest \ + ./apps/infinite_livestream/infinite_livestream/tests \ ./fastvideo/tests/api/ \ ./fastvideo/tests/contract/ \ ./fastvideo/tests/dataset/ \ @@ -27,4 +30,5 @@ exec pytest \ --ignore=./fastvideo/tests/entrypoints/test_openai_api_integration.py \ --ignore=./fastvideo/tests/train/models \ --ignore=./fastvideo/tests/train/methods \ + -m "not gpu" \ -vs diff --git a/.github/scripts/plan_merge_ci.py b/.github/scripts/plan_merge_ci.py index 7025d81e7..867fca88f 100644 --- a/.github/scripts/plan_merge_ci.py +++ b/.github/scripts/plan_merge_ci.py @@ -523,6 +523,10 @@ def classify_paths(paths: list[str]) -> MergePlan: # DreamVerse is already one of the six automatic Fastcheck lanes. plan.reasons.append(f"covered by automatic DreamVerse Fastcheck: {path}") continue + if path.startswith("apps/infinite_livestream/"): + # The app's CPU-only tests run in the automatic unit Fastcheck lane. + plan.reasons.append(f"covered by automatic unit Fastcheck: {path}") + continue if path.startswith("fastvideo/tests/"): # The automatic unit/component Fastcheck lanes own the remaining # package tests. Domain-specific expensive test roots were handled diff --git a/apps/infinite_livestream/README.md b/apps/infinite_livestream/README.md new file mode 100644 index 000000000..af1add185 --- /dev/null +++ b/apps/infinite_livestream/README.md @@ -0,0 +1,290 @@ +# Infinite Livestream + +Infinite Livestream is a chat-driven FastH3 broadcast. Viewers type prompts into a web +page, the app rewrites them with an LLM, generates clips with FastVideo, and +plays them back as one continuous HLS stream on that same page. When nobody is +typing it feeds itself from a preset of idle prompts, so the channel never goes +dark. + +It lives in this monorepo under `apps/infinite_livestream/`. + +``` +chat -> Director -> PromptUpsampler (OpenAI-compatible LLM) + | + v enqueue / move / pop + Engine -> FastH3Backend -> FastVideo + | frames + audio + v + Pacer -> HlsSink -> the page's