Skip to content

Commit 70347b9

Browse files
staging-devin-ai-integration[bot]streamkit-botstreamkit-devinstreamer45
authored
feat(e2e): add headless pipeline validation tests (#285)
* chore(registry): publish marketplace registry update (#283) * chore(registry): publish marketplace registry update * fix(marketplace): prevent plugin releases from becoming latest on GitHub Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> --------- Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-authored-by: StreamKit Devin <devin@streamkit.dev> Co-authored-by: Claudio Costa <cstcld91@gmail.com> * feat(e2e): add headless pipeline validation tests Add a Rust-based test framework for validating oneshot pipelines against a live skit server using ffprobe for output verification. No browser required. Architecture: - datatest-stable discovers .yml files in samples/pipelines/test/ - Each .yml has a companion .toml sidecar with expected output metadata - Tests POST the pipeline YAML to /api/v1/process, save the response, and validate codec, resolution, container format via ffprobe - HW codec tests (NVENC AV1, Vulkan Video H.264) are skipped gracefully when the required node kind is not registered on the server New files: - tests/pipeline-validation/ Standalone Rust test crate - samples/pipelines/test/*.yml 4 short test pipelines (30 frames) - samples/pipelines/test/*.toml Expected output metadata sidecars - justfile: test-pipelines recipe Usage: just test-pipelines http://localhost:4545 just test-pipelines http://localhost:4545 vp9 # filter by name Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * refactor(e2e): restructure test pipelines to one-dir-per-test layout Move from flat files to directory-based test layout: samples/pipelines/test/<name>/pipeline.yml samples/pipelines/test/<name>/expected.toml Each test is self-contained in its own directory, making it easier to add test-specific input media or extra config in the future. The datatest-stable harness now matches on 'pipeline.yml' recursively. Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * feat(e2e): add SVT-AV1 test pipeline and CI integration - Add svt_av1_colorbars test pipeline (SW codec, requires svt_av1 feature) - Add pacer node to VP9 pipeline for consistency with other WebM pipelines - Add pipeline-validation job to e2e.yml CI workflow — runs SW codec tests (VP9, OpenH264, SVT-AV1) against a live skit server with ffprobe validation - GPU-specific tests (NVENC AV1, Vulkan Video H.264) are skipped in CI via the requires_node mechanism Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(ci): fail explicitly when skit server doesn't start Add HEALTHY flag to health check loop so the pipeline-validation CI job fails with a clear error instead of proceeding to run tests against a server that never became healthy. Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * feat(e2e): add complete format coverage for pipeline validation tests Extend the pipeline validation framework to support audio-only tests and file upload pipelines, then add 8 new test cases covering all core codecs, muxers, and demuxers: Audio codec tests: - opus_roundtrip: Opus encode/decode via Ogg container - opus_mp4: Opus encode via MP4 container (file mode) - flac_decode: FLAC decoder (symphonia) → Opus/Ogg - mp3_decode: MP3 decoder (symphonia) → Opus/Ogg - wav_decode: WAV demuxer (symphonia) → Opus/Ogg Video codec/decoder tests: - rav1e_colorbars: rav1e AV1 encoder → WebM - vp9_roundtrip: VP9 encode → decode → re-encode roundtrip - dav1d_roundtrip: SVT-AV1 → dav1d decode → SVT-AV1 re-encode Framework changes: - Expected struct now supports audio-only tests (audio_codec, sample_rate, channels) and file uploads (input_file) - run_pipeline() accepts optional input file for multipart upload - validate_output() validates audio and/or video stream properties - Test audio fixtures (Ogg/Opus, FLAC, MP3, WAV) in fixtures/ Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * chore: add REUSE/SPDX license files for test audio fixtures Adds CC0-1.0 license companion files for the generated test tone audio fixtures (ogg, flac, mp3, wav) to satisfy the reuse-compliance check. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * feat(ci): add GPU pipeline validation job on self-hosted runner Adds a 'Pipeline Validation (GPU)' job to the E2E workflow that runs on the self-hosted GPU runner. This builds skit with gpu, svt_av1, and dav1d_static features, starts the server, and runs all pipeline validation tests. Currently the NVENC AV1 and Vulkan Video H.264 tests will skip gracefully since those features (nvcodec, vulkan_video) aren't on main yet. Once PR #279 merges, adding those features to the build command will enable full HW codec pipeline validation in CI. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(ci): use alternate port for GPU pipeline validation server The self-hosted GPU runner has a persistent skit instance on port 4545. Use port 4546 for the pipeline validation server to avoid 'Address already in use' errors. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(ci): add libssl-dev for GPU pipeline validation runner The pipeline-validation test crate depends on reqwest which pulls in openssl-sys. The self-hosted GPU runner needs libssl-dev installed. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(test): correct multipart field name and audio channel config - Use 'media' instead of 'file' for the multipart field name to match the server's http_input binding convention. - Set channels: 2 on all opus_encoder nodes since test fixtures are stereo, fixing 'Incompatible connection' errors on the GPU runner. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(test): use mono audio fixtures to match Opus encoder pin type The Opus encoder node's input pin is hardcoded to accept mono audio (channels: 1). Regenerate all test fixtures as mono sine waves and update pipeline configs and expected.toml files accordingly. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(ci): add cleanup step to kill skit on self-hosted runner Self-hosted runners persist between runs, so background processes can accumulate. Add an always-run cleanup step to kill the skit process after tests complete. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(test): remove incompatible audio decode pipelines and fix GPU cleanup Remove flac_decode, mp3_decode, and wav_decode test pipelines: the FLAC decoder, MP3 decoder, and WAV demuxer all declare channels: 2 in their static output pins, but the Opus encoder (the only audio encoder) only accepts channels: 1. This static type mismatch causes pipeline validation to reject the connection before any audio data flows. Audio codec coverage is retained via opus_roundtrip (Ogg) and opus_mp4 (MP4) tests which exercise the full Opus encode/decode path. Also fix GPU CI cleanup: use PID-based kill instead of pkill pattern matching (the port number is in an env var, not the command line). Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * feat(ci): enable nvcodec + vulkan_video in GPU pipeline validation Now that the branch is rebased on top of PR #279 (HW video codecs), enable the nvcodec and vulkan_video features in the GPU CI build so the nv_av1_colorbars and vulkan_video_h264_colorbars tests actually run on the self-hosted GPU runner. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> * fix(test): correct doc comment for multipart field name The doc comment said 'file' but the code uses 'media'. Signed-off-by: Devin AI <devin@streamkit.dev> Signed-off-by: StreamKit Devin <devin@streamkit.dev> Co-Authored-By: Claudio Costa <cstcld91@gmail.com> --------- Signed-off-by: StreamKit Devin <devin@streamkit.dev> Signed-off-by: Devin AI <devin@streamkit.dev> Co-authored-by: streamkit-bot <registry-bot@streamkit.dev> Co-authored-by: StreamKit Devin <devin@streamkit.dev> Co-authored-by: Claudio Costa <cstcld91@gmail.com>
1 parent a6583e8 commit 70347b9

File tree

35 files changed

+3398
-0
lines changed

35 files changed

+3398
-0
lines changed

.github/workflows/e2e.yml

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,178 @@ env:
1212
RUSTC_WRAPPER: sccache
1313

1414
jobs:
15+
pipeline-validation:
16+
name: Pipeline Validation
17+
runs-on: ubuntu-22.04
18+
steps:
19+
- name: Free disk space
20+
uses: jlumbroso/free-disk-space@main
21+
with:
22+
tool-cache: false
23+
android: true
24+
dotnet: true
25+
haskell: true
26+
large-packages: false
27+
docker-images: true
28+
swap-storage: false
29+
30+
- uses: actions/checkout@v5
31+
32+
- name: Setup Bun
33+
uses: oven-sh/setup-bun@v2
34+
with:
35+
bun-version: "1.3.5"
36+
37+
- name: Build UI
38+
working-directory: ./ui
39+
run: |
40+
bun install --frozen-lockfile
41+
bun run build
42+
43+
- name: Install Rust toolchain
44+
uses: dtolnay/rust-toolchain@master
45+
with:
46+
toolchain: "1.92.0"
47+
48+
- uses: mozilla-actions/sccache-action@v0.0.9
49+
50+
- uses: Swatinem/rust-cache@v2
51+
52+
- name: Install system dependencies
53+
run: sudo apt-get update && sudo apt-get install -y libvpx-dev nasm cmake ninja-build yasm meson ffmpeg
54+
55+
- name: Build and install SVT-AV1 from source (v4.1.0)
56+
run: |
57+
cd /tmp
58+
git clone --depth 1 --branch v4.1.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
59+
cd SVT-AV1
60+
cmake -S . -B build -G Ninja \
61+
-DCMAKE_BUILD_TYPE=Release \
62+
-DCMAKE_INSTALL_PREFIX=/usr/local
63+
cmake --build build -j"$(nproc)"
64+
sudo cmake --install build
65+
sudo ldconfig
66+
67+
- name: Build skit
68+
run: cargo build -p streamkit-server --bin skit --features "svt_av1 dav1d_static"
69+
70+
- name: Start skit server
71+
run: |
72+
SK_SERVER__ADDRESS=127.0.0.1:4545 ./target/debug/skit &
73+
# Wait for the server to be healthy
74+
HEALTHY=0
75+
for i in $(seq 1 30); do
76+
if curl -sf http://127.0.0.1:4545/healthz > /dev/null 2>&1; then
77+
echo "skit is healthy"
78+
HEALTHY=1
79+
break
80+
fi
81+
sleep 1
82+
done
83+
if [ "$HEALTHY" -ne 1 ]; then
84+
echo "ERROR: skit did not become healthy within 30s"
85+
exit 1
86+
fi
87+
88+
- name: Run pipeline validation tests (SW codecs only)
89+
run: |
90+
cd tests/pipeline-validation
91+
PIPELINE_TEST_URL=http://127.0.0.1:4545 cargo test --test validate
92+
93+
pipeline-validation-gpu:
94+
name: Pipeline Validation (GPU)
95+
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
96+
runs-on: self-hosted
97+
steps:
98+
- uses: actions/checkout@v5
99+
100+
- name: Setup Bun
101+
uses: oven-sh/setup-bun@v2
102+
with:
103+
bun-version: "1.3.5"
104+
105+
- name: Build UI
106+
working-directory: ./ui
107+
run: |
108+
bun install --frozen-lockfile
109+
bun run build
110+
111+
- name: Install Rust toolchain
112+
uses: dtolnay/rust-toolchain@master
113+
with:
114+
toolchain: "1.92.0"
115+
116+
- uses: mozilla-actions/sccache-action@v0.0.9
117+
118+
- uses: Swatinem/rust-cache@v2
119+
120+
- name: Install system dependencies
121+
run: sudo apt-get update && sudo apt-get install -y libvpx-dev nasm cmake ninja-build yasm meson ffmpeg libopus-dev pkg-config libssl-dev
122+
123+
- name: Build and install SVT-AV1 from source (v4.1.0)
124+
run: |
125+
cd /tmp
126+
if pkg-config --atleast-version=2.0.0 SvtAv1Enc 2>/dev/null; then
127+
echo "SVT-AV1 already installed, skipping build"
128+
else
129+
rm -rf SVT-AV1
130+
git clone --depth 1 --branch v4.1.0 https://gitlab.com/AOMediaCodec/SVT-AV1.git
131+
cd SVT-AV1
132+
cmake -S . -B build -G Ninja \
133+
-DCMAKE_BUILD_TYPE=Release \
134+
-DCMAKE_INSTALL_PREFIX=/usr/local
135+
cmake --build build -j"$(nproc)"
136+
sudo cmake --install build
137+
sudo ldconfig
138+
fi
139+
140+
- name: Build skit (with GPU + HW codecs + SVT-AV1 + dav1d)
141+
env:
142+
VPX_LIB_DIR: /usr/lib/x86_64-linux-gnu
143+
VPX_INCLUDE_DIR: /usr/include
144+
VPX_VERSION: "1.13.0"
145+
CUDA_INCLUDE_PATH: /usr/include
146+
# bindgen (used by shiguredo_nvcodec) needs the clang builtin include
147+
# path so it can find stddef.h and other compiler-provided headers.
148+
BINDGEN_EXTRA_CLANG_ARGS: "-I/usr/lib/llvm-18/lib/clang/18/include"
149+
run: |
150+
cargo build -p streamkit-server --bin skit --features "gpu nvcodec vulkan_video svt_av1 dav1d_static"
151+
152+
- name: Start skit server
153+
run: |
154+
# Use a non-default port to avoid conflicts with any persistent skit
155+
# instance that may be running on the self-hosted runner.
156+
SKIT_PORT=4546
157+
SK_SERVER__ADDRESS=127.0.0.1:${SKIT_PORT} ./target/debug/skit &
158+
echo $! > /tmp/skit-gpu.pid
159+
# Wait for the server to be healthy
160+
HEALTHY=0
161+
for i in $(seq 1 30); do
162+
if curl -sf http://127.0.0.1:${SKIT_PORT}/healthz > /dev/null 2>&1; then
163+
echo "skit is healthy on port ${SKIT_PORT}"
164+
HEALTHY=1
165+
break
166+
fi
167+
sleep 1
168+
done
169+
if [ "$HEALTHY" -ne 1 ]; then
170+
echo "ERROR: skit did not become healthy within 30s"
171+
exit 1
172+
fi
173+
174+
- name: Run pipeline validation tests (all codecs including GPU)
175+
run: |
176+
cd tests/pipeline-validation
177+
PIPELINE_TEST_URL=http://127.0.0.1:4546 cargo test --test validate
178+
179+
- name: Stop skit server
180+
if: always()
181+
run: |
182+
if [ -f /tmp/skit-gpu.pid ]; then
183+
kill "$(cat /tmp/skit-gpu.pid)" 2>/dev/null || true
184+
rm -f /tmp/skit-gpu.pid
185+
fi
186+
15187
e2e:
16188
name: Playwright E2E
17189
runs-on: ubuntu-22.04

.github/workflows/marketplace-release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ jobs:
9797
'--target', os.environ.get('GITHUB_SHA', 'HEAD'),
9898
'--title', release_name,
9999
'--notes', f'Plugin bundle for {name} v{version}.',
100+
'--latest=false',
100101
bundle,
101102
]
102103
if is_prerelease:

dist/registry/index.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,20 @@
9595
}
9696
]
9797
},
98+
{
99+
"id": "parakeet",
100+
"name": "Parakeet TDT",
101+
"description": "Fast speech-to-text using NVIDIA Parakeet TDT via sherpa-onnx",
102+
"latest": "0.1.0",
103+
"versions": [
104+
{
105+
"version": "0.1.0",
106+
"manifest_url": "https://streamkit.dev/registry/plugins/parakeet/0.1.0/manifest.json",
107+
"signature_url": "https://streamkit.dev/registry/plugins/parakeet/0.1.0/manifest.minisig",
108+
"published_at": "2026-04-10"
109+
}
110+
]
111+
},
98112
{
99113
"id": "piper",
100114
"name": "Piper",
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": 1,
3+
"id": "parakeet",
4+
"name": "Parakeet TDT",
5+
"version": "0.1.0",
6+
"node_kind": "parakeet",
7+
"kind": "native",
8+
"description": "Fast speech-to-text using NVIDIA Parakeet TDT via sherpa-onnx",
9+
"license": "MPL-2.0",
10+
"homepage": "https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2",
11+
"entrypoint": "libparakeet.so",
12+
"bundle": {
13+
"url": "https://github.com/streamer45/streamkit/releases/download/plugin-parakeet-v0.1.0/parakeet-0.1.0-bundle.tar.zst",
14+
"sha256": "9ca3cd97ba3c665517dd1319f8492c15b6b97549231577b640bbbc0f71aa60c3",
15+
"size_bytes": 15635462
16+
},
17+
"models": [
18+
{
19+
"id": "parakeet-tdt-0.6b-v2-int8",
20+
"name": "Parakeet TDT 0.6B v2 (English, INT8)",
21+
"default": true,
22+
"source": "huggingface",
23+
"repo_id": "streamkit/parakeet-models",
24+
"revision": "main",
25+
"files": [
26+
"encoder.int8.onnx",
27+
"decoder.int8.onnx",
28+
"joiner.int8.onnx",
29+
"tokens.txt"
30+
],
31+
"expected_size_bytes": 661190513,
32+
"license": "CC-BY-4.0",
33+
"license_url": "https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2",
34+
"file_checksums": {
35+
"encoder.int8.onnx": "a32b12d17bbbc309d0686fbbcc2987b5e9b8333a7da83fa6b089f0a2acd651ab",
36+
"decoder.int8.onnx": "b6bb64963457237b900e496ee9994b59294526439fbcc1fecf705b31a15c6b4e",
37+
"joiner.int8.onnx": "7946164367946e7f9f29a122407c3252b680dbae9a51343eb2488d057c3c43d2",
38+
"tokens.txt": "ec182b70dd42113aff6c5372c75cac58c952443eb22322f57bbd7f53977d497d"
39+
}
40+
},
41+
{
42+
"id": "silero-vad",
43+
"name": "Silero VAD (v6.2)",
44+
"default": true,
45+
"source": "huggingface",
46+
"repo_id": "streamkit/parakeet-models",
47+
"revision": "main",
48+
"files": [
49+
"silero_vad.onnx"
50+
],
51+
"expected_size_bytes": 2327524,
52+
"license": "MIT",
53+
"license_url": "https://github.com/snakers4/silero-vad/blob/master/LICENSE",
54+
"sha256": "1a153a22f4509e292a94e67d6f9b85e8deb25b4988682b7e174c65279d8788e3"
55+
}
56+
]
57+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
untrusted comment: signature from minisign secret key
2+
RUQ/85JEqYXEgb3NHkk8EDvKfvijFiOhUMrmR97Tqb5NEYf3kTZTK+U5IHo10l0lOfInZaLjscG7wQ6OqfgO6gaRAnqlUzMXmgo=
3+
trusted comment: timestamp:1775850398 file:manifest.json hashed
4+
BMn5YTOa/ekLGbyRUiXr5cnwpYr8NrU+bQrKORovVYFIUtYDDwUyzvELqGjs/tShSlT8Ws7UVtBDdSVdJlOxAg==

docs/public/registry/index.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,20 @@
9595
}
9696
]
9797
},
98+
{
99+
"id": "parakeet",
100+
"name": "Parakeet TDT",
101+
"description": "Fast speech-to-text using NVIDIA Parakeet TDT via sherpa-onnx",
102+
"latest": "0.1.0",
103+
"versions": [
104+
{
105+
"version": "0.1.0",
106+
"manifest_url": "https://streamkit.dev/registry/plugins/parakeet/0.1.0/manifest.json",
107+
"signature_url": "https://streamkit.dev/registry/plugins/parakeet/0.1.0/manifest.minisig",
108+
"published_at": "2026-04-10"
109+
}
110+
]
111+
},
98112
{
99113
"id": "piper",
100114
"name": "Piper",
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": 1,
3+
"id": "parakeet",
4+
"name": "Parakeet TDT",
5+
"version": "0.1.0",
6+
"node_kind": "parakeet",
7+
"kind": "native",
8+
"description": "Fast speech-to-text using NVIDIA Parakeet TDT via sherpa-onnx",
9+
"license": "MPL-2.0",
10+
"homepage": "https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2",
11+
"entrypoint": "libparakeet.so",
12+
"bundle": {
13+
"url": "https://github.com/streamer45/streamkit/releases/download/plugin-parakeet-v0.1.0/parakeet-0.1.0-bundle.tar.zst",
14+
"sha256": "9ca3cd97ba3c665517dd1319f8492c15b6b97549231577b640bbbc0f71aa60c3",
15+
"size_bytes": 15635462
16+
},
17+
"models": [
18+
{
19+
"id": "parakeet-tdt-0.6b-v2-int8",
20+
"name": "Parakeet TDT 0.6B v2 (English, INT8)",
21+
"default": true,
22+
"source": "huggingface",
23+
"repo_id": "streamkit/parakeet-models",
24+
"revision": "main",
25+
"files": [
26+
"encoder.int8.onnx",
27+
"decoder.int8.onnx",
28+
"joiner.int8.onnx",
29+
"tokens.txt"
30+
],
31+
"expected_size_bytes": 661190513,
32+
"license": "CC-BY-4.0",
33+
"license_url": "https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2",
34+
"file_checksums": {
35+
"encoder.int8.onnx": "a32b12d17bbbc309d0686fbbcc2987b5e9b8333a7da83fa6b089f0a2acd651ab",
36+
"decoder.int8.onnx": "b6bb64963457237b900e496ee9994b59294526439fbcc1fecf705b31a15c6b4e",
37+
"joiner.int8.onnx": "7946164367946e7f9f29a122407c3252b680dbae9a51343eb2488d057c3c43d2",
38+
"tokens.txt": "ec182b70dd42113aff6c5372c75cac58c952443eb22322f57bbd7f53977d497d"
39+
}
40+
},
41+
{
42+
"id": "silero-vad",
43+
"name": "Silero VAD (v6.2)",
44+
"default": true,
45+
"source": "huggingface",
46+
"repo_id": "streamkit/parakeet-models",
47+
"revision": "main",
48+
"files": [
49+
"silero_vad.onnx"
50+
],
51+
"expected_size_bytes": 2327524,
52+
"license": "MIT",
53+
"license_url": "https://github.com/snakers4/silero-vad/blob/master/LICENSE",
54+
"sha256": "1a153a22f4509e292a94e67d6f9b85e8deb25b4988682b7e174c65279d8788e3"
55+
}
56+
]
57+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
untrusted comment: signature from minisign secret key
2+
RUQ/85JEqYXEgb3NHkk8EDvKfvijFiOhUMrmR97Tqb5NEYf3kTZTK+U5IHo10l0lOfInZaLjscG7wQ6OqfgO6gaRAnqlUzMXmgo=
3+
trusted comment: timestamp:1775850398 file:manifest.json hashed
4+
BMn5YTOa/ekLGbyRUiXr5cnwpYr8NrU+bQrKORovVYFIUtYDDwUyzvELqGjs/tShSlT8Ws7UVtBDdSVdJlOxAg==

justfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,18 @@ e2e-external url filter='':
13891389
@echo "Running E2E tests against {{url}}..."
13901390
@cd e2e && E2E_BASE_URL={{url}} bun run test:only {{ if filter != "" { "--grep '" + filter + "'" } else { "" } }}
13911391

1392+
# Run headless pipeline validation tests (no browser required).
1393+
# Requires a running skit server — pass its URL as an argument.
1394+
# Each .yml in samples/pipelines/test/ becomes a test case; a companion
1395+
# .toml sidecar declares the expected ffprobe output.
1396+
#
1397+
# Usage:
1398+
# just test-pipelines http://localhost:4545
1399+
# just test-pipelines http://localhost:4545 vp9 # filter by name
1400+
test-pipelines url filter='':
1401+
@echo "Running headless pipeline validation tests against {{url}}..."
1402+
@cd tests/pipeline-validation && PIPELINE_TEST_URL={{url}} cargo test --test validate {{ if filter != "" { "-- " + filter } else { "" } }}
1403+
13921404
# Show E2E test report
13931405
[working-directory: 'e2e']
13941406
e2e-report:
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# SPDX-FileCopyrightText: © 2025 StreamKit Contributors
2+
#
3+
# SPDX-License-Identifier: MPL-2.0
4+
5+
requires_node = "video::dav1d::decoder"
6+
output_extension = ".webm"
7+
codec_name = "av1"
8+
width = 320
9+
height = 240
10+
container_format = "matroska,webm"
11+
pix_fmt = "yuv420p"

0 commit comments

Comments
 (0)