OpenClaw: Improve SRS support skill with docs integration, troubleshooting, and workspace updates (#4655)

Enhance the srs-support skill with doc-based knowledge layers, a full
troubleshooting section, and new eval cases. Update workspace config
files with model auth notes, voice dictation dictionary, and gitignore
patterns.

srs-support skill:
- Reframe skill scope: operators and users, not developers
- Add Layer 2 doc file mapping (25+ topic-to-doc-file entries) so the
  skill loads relevant doc files instead of jumping to source code
- Add Step 4 troubleshooting section covering WebRTC candidate issues,
  HLS latency tuning, stream-not-found diagnostics, reverse proxy
  problems, VLC buffering trap, and firewall port reference
- Add Oryx out-of-scope policy (planned but not available yet)
- Add 6 new eval cases (ids 15-20) for troubleshooting scenarios
- Fix unicode arrows in evals for cross-platform compatibility

Workspace updates:
- TOOLS.md: Add model auth refresh instructions and git commit workflow
- USER.md: Add voice dictation dictionary for speech-to-text corrections
- srs-overview.md: Replace ASCII diagram with Mermaid, expand browser
  publisher description for mobile WHIP support
- .claude/settings.local.json: Add read-only shell command permissions
- .gitignore: Add workspace pattern exclusions

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Winlin 2026-03-30 07:11:24 -04:00 committed by GitHub
parent 8a53cb59f1
commit 5f47cee19c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 414 additions and 40 deletions

View File

@ -1,4 +1,29 @@
{ {
"permissions": {
"allow": [
"Bash(find:*)",
"Bash(ls:*)",
"Bash(cat:*)",
"Bash(head:*)",
"Bash(tail:*)",
"Bash(wc:*)",
"Bash(grep:*)",
"Bash(rg:*)",
"Bash(file:*)",
"Bash(stat:*)",
"Bash(tree:*)",
"Bash(du:*)",
"Bash(diff:*)",
"Bash(which:*)",
"Bash(type:*)",
"Bash(realpath:*)",
"Bash(dirname:*)",
"Bash(basename:*)",
"Read",
"Glob",
"Grep"
]
},
"hooks": { "hooks": {
"SessionStart": [ "SessionStart": [
{ {

2
.gitignore vendored
View File

@ -47,4 +47,4 @@ srs-proxy
# For AI # For AI
/*personal* /*personal*
/*workspace*

View File

@ -4,6 +4,7 @@
/.pi /.pi
/extensions /extensions
/skills/llm-switcher /skills/llm-switcher
/skills/*workspace*
# For speical folders. # For speical folders.
/personal* /personal*

View File

@ -35,6 +35,12 @@ Things like:
Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure. Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.
## Model Auth
- Anthropic / Opus refresh: `claude setup-token` -> `openclaw models auth setup-token --provider anthropic`
- Codex refresh: `openclaw models auth login --provider openai-codex`
- Temporary workaround when one model auth is broken: use `/model ...` in the current session to switch to another working model.
### Telegram ### Telegram
- Channel: `telegram`, accountId: `srs` (SRS bot) - Channel: `telegram`, accountId: `srs` (SRS bot)

View File

@ -5,3 +5,13 @@
- **Pronouns:** - **Pronouns:**
- **Timezone:** America/Toronto (Eastern) - **Timezone:** America/Toronto (Eastern)
- **Notes:** Creator and lead maintainer of SRS (Simple Realtime Server) - **Notes:** Creator and lead maintainer of SRS (Simple Realtime Server)
- **Input method:** Voice dictation (speech-to-text). Non-native English speaker with accent — some words get misrecognized. Always check the dictation dictionary below before interpreting.
## Dictation Dictionary
Words that voice dictation commonly gets wrong. Left = what dictation produces, Right = what William actually means.
| Misrecognized | Correct | Context |
|---|---|---|
| tour | tool | "a tool to publish streams" |
| share | shell | "a shell script", "shell command" |
| commend | command | "run this command" |

View File

@ -6,24 +6,23 @@ SRS is a **simple, high-efficiency, real-time media server**. It receives stream
## How SRS Works With Tools ## How SRS Works With Tools
```mermaid
graph TD
subgraph Publishers
P["FFmpeg, OBS, Larix, vMix,<br/>hardware encoders, browsers, apps"]
end
S["SRS"]
subgraph Players
L["FFmpeg, VLC, ffplay, ExoPlayer,<br/>IJKPlayer, browsers, hardware, apps"]
end
Publishers --> S --> Players
``` ```
┌─────────────────────────────────────────────────────────────────┐
│ PUBLISHERS │ <!-- AI: ignore this link, it's for human viewing only -->
│ FFmpeg, OBS, Larix, vMix, hardware encoders, browsers, apps │ > Note: [View diagram on Mermaid Live](https://mermaid.live/view#pako:eNp1kMFOwzAMhl_F8jkTd4R2gDEJVsREEBfKwV3ctVKTRk7DNk17d7KmiIGED5bz2_rz2Ufc9IbxGnAr5Bt4XZQOUoRYZWEdq64NDUvIjXOs30tcLq3nrYLnW62gIGn3Cj6fUr6p5GrekJgdCQO7s78EBZX0uzBW5H0o8SP7sTOly6VOtvpFj62_FB0dfiEUFwhvxZ2CuvZpRsH9vs_DGeThcTU9LwC-6f5H-dkaZrM56DFPEKgALYul1qS7HXFo2I4XNFxT7AY8pQGKQ68PbpP0QWL6CaM3NPCipbSRneTTF4SOexE=)
└─────────────────────────────┬───────────────────────────────────┘
┌───────────┐
│ SRS │
└───────────┘
┌─────────────────────────────────────────────────────────────────┐
│ PLAYERS │
│ FFmpeg, VLC, ffplay, ExoPlayer, IJKPlayer, browsers, hardware, │
│ apps │
└─────────────────────────────────────────────────────────────────┘
```
**Publishers:** **Publishers:**
@ -32,7 +31,7 @@ SRS is a **simple, high-efficiency, real-time media server**. It receives stream
- **Larix Broadcaster** — Mobile streaming app (iOS/Android). Pushes RTMP, SRT, WHIP (WebRTC). - **Larix Broadcaster** — Mobile streaming app (iOS/Android). Pushes RTMP, SRT, WHIP (WebRTC).
- **vMix** — Windows live production software. Pushes RTMP, SRT. - **vMix** — Windows live production software. Pushes RTMP, SRT.
- **Hardware encoders** — Devices like Teradek, Haivision, Blackmagic. Push RTMP, SRT. - **Hardware encoders** — Devices like Teradek, Haivision, Blackmagic. Push RTMP, SRT.
- **Browsers** — Via WHIP (WebRTC). - **Browsers (including mobile)** — Via WHIP (WebRTC). No app needed — users can publish directly from Safari/Chrome on iPhone or Android by opening the SRS demo page. This is the simplest zero-install option for mobile publishing.
- **Apps** — Custom apps using RTMP/SRT/WebRTC SDKs. - **Apps** — Custom apps using RTMP/SRT/WebRTC SDKs.
**Players:** **Players:**

View File

@ -1,14 +1,26 @@
--- ---
name: srs-support name: srs-support
description: Answer SRS (Simple Realtime Server) questions for developers and users — protocols, configuration, architecture, codecs, ecosystem tools, deployment, and troubleshooting. Use when anyone asks about SRS features, how SRS works, supported protocols (RTMP, SRT, WebRTC/WHIP/WHEP, HLS, DASH, HTTP-FLV, RTSP, GB28181), codec support, transmuxing, transcoding, configuration, performance, or the SRS ecosystem (srs-bench, state-threads). Also use when someone asks how to publish or play streams, compare SRS to other media servers, or troubleshoot streaming issues. description: Answer SRS (Simple Realtime Server) questions for users and operators — protocols, configuration, codecs, ecosystem tools, deployment, and troubleshooting. Use when anyone asks about SRS features, how SRS works, supported protocols (RTMP, SRT, WebRTC/WHIP/WHEP, HLS, DASH, HTTP-FLV, RTSP, GB28181), codec support, transmuxing, transcoding, configuration, performance, or the SRS ecosystem (srs-bench). Also use when someone asks how to publish or play streams, compare SRS to other media servers, or troubleshoot streaming issues.
--- ---
# SRS Support # SRS Support
Answer questions about SRS — a simple, high-efficiency, real-time media server — using the project's knowledge base. Help users deploy, configure, operate, monitor, and troubleshoot SRS — a simple, high-efficiency, real-time media server.
This skill is for **answering questions and providing guidance**. If the user wants to: This skill is for **operators, users, and DevOps** — answering questions about using SRS, not changing its code.
- Learn SRS coroutine/State Threads internals, hand off to `st-develop` instead.
**Scope:**
- Deployment, configuration, and getting started
- Operating and maintaining SRS in production
- Troubleshooting streaming issues (connection failures, latency, playback problems)
- Monitoring (HTTP API, logs, Prometheus)
- General questions about protocols, codecs, features, and how SRS works at a usage level
- May read source code internally to give better answers, but the goal is always helping users *use* SRS — not explaining the code
**Out of scope:**
- Code changes, bug fixes, or feature development — outside scope of this skill
- Teaching users about SRS internals or source code — you may read source code to answer user questions better, but don't guide users into understanding the code itself. The goal is to help them *use* SRS, not develop it.
- **Oryx** — Oryx is not supported by this AI yet. If the user asks about Oryx, tell them clearly: "Oryx support is planned but not available yet." Do not attempt to answer Oryx-specific questions.
## Workflow ## Workflow
@ -27,20 +39,49 @@ All AI tools — OpenClaw, Codex, Claude Code, Kiro CLI — see the same relativ
Load knowledge in layers. Start minimal, expand only if needed. Load knowledge in layers. Start minimal, expand only if needed.
**Layer 1 — Always load:** **Layer 1 — Always load:**
- `memory/srs-overview.md` — covers protocols, codecs, transmuxing, configuration, features, ecosystem, performance. This answers most questions. - `memory/srs-overview.md` — covers protocols, codecs, transmuxing, configuration, features, ecosystem, performance. This answers most general questions.
**Layer 2 — Load on demand (if the overview doesn't fully answer the question):** **Layer 2 — Load the relevant doc file(s) based on the question topic:**
- `memory/srs-coroutines.md` — load when the question is about SRS architecture internals, coroutines, State Threads, or concurrency. Most user questions don't need this. Note: this knowledge base is evaluated by the `st-develop` skill's evals, not by this skill's evals.
**Layer 3 — Last resort (if knowledge files don't answer the question and you need source code):** Use this mapping to decide which doc file to load. Only load what's relevant — don't load all of them.
- `memory/srs-codebase-map.md` — load the **entire file** (do not truncate or read partial content). Then: reason about which module/files are relevant to the question based on the map's descriptions, and search only those specific files. **DO NOT grep broadly** (e.g., `trunk/src/` or the repository root). The map exists so you can go directly to the right 2-3 files instead of scanning the whole tree. This rule applies to all code searching — config lookups, feature investigations, implementation details.
| Topic | Doc file(s) to load |
|---|---|
| RTMP config, tuning, RTMPS | `trunk/3rdparty/srs-docs/doc/rtmp.md` |
| HLS config, latency, encryption, fMP4 | `trunk/3rdparty/srs-docs/doc/hls.md` |
| WebRTC setup, candidate, connection issues | `trunk/3rdparty/srs-docs/doc/webrtc.md` |
| HTTP-FLV, WebSocket FLV | `trunk/3rdparty/srs-docs/doc/flv.md` |
| SRT config, streamid, latency modes | `trunk/3rdparty/srs-docs/doc/srt.md` |
| RTSP playback | `trunk/3rdparty/srs-docs/doc/rtsp.md` |
| HEVC/H.265 protocol support | `trunk/3rdparty/srs-docs/doc/hevc.md` |
| DVR, recording to file | `trunk/3rdparty/srs-docs/doc/dvr.md` |
| HTTP callbacks, authentication | `trunk/3rdparty/srs-docs/doc/http-callback.md` |
| IP allow/deny, access control | `trunk/3rdparty/srs-docs/doc/security.md` |
| HTTP API, stream monitoring | `trunk/3rdparty/srs-docs/doc/http-api.md` |
| Prometheus, Grafana, metrics | `trunk/3rdparty/srs-docs/doc/exporter.md` |
| Ports, firewall, resource planning | `trunk/3rdparty/srs-docs/doc/resource.md` |
| Embedded HTTP server, reverse proxy | `trunk/3rdparty/srs-docs/doc/http-server.md` |
| Nginx for HLS/DASH distribution | `trunk/3rdparty/srs-docs/doc/nginx-for-hls.md` |
| Edge server, CDN clustering | `trunk/3rdparty/srs-docs/doc/edge.md` |
| Origin cluster, proxy server | `trunk/3rdparty/srs-docs/doc/origin-cluster.md` |
| Low latency tuning | `trunk/3rdparty/srs-docs/doc/low-latency.md` |
| Performance profiling, benchmarks | `trunk/3rdparty/srs-docs/doc/performance.md` |
| Ingest external streams | `trunk/3rdparty/srs-docs/doc/ingest.md` |
| Forward to other servers | `trunk/3rdparty/srs-docs/doc/forward.md` |
| FFmpeg transcoding | `trunk/3rdparty/srs-docs/doc/ffmpeg.md` |
| Snapshots, thumbnails | `trunk/3rdparty/srs-docs/doc/snapshot.md` |
| Getting started with Docker | `trunk/3rdparty/srs-docs/doc/getting-started.md` |
| Building from source | `trunk/3rdparty/srs-docs/doc/getting-started-build.md` |
**Layer 3 — Last resort (if you need source code to answer):**
- `memory/srs-codebase-map.md` — load the **entire file** (do not truncate or read partial content). Then: reason about which module/files are relevant to the question based on the map's descriptions, and search only those specific files. **DO NOT grep broadly** (e.g., `trunk/src/` or the repository root). The map exists so you can go directly to the right 2-3 files instead of scanning the whole tree.
## Step 3: Answer by Topic ## Step 3: Answer by Topic
Classify the question into one of the topics below, then apply that topic's strategy. If a question spans multiple topics, combine the relevant strategies. Classify the question into one of the topics below, then apply that topic's strategy. If a question spans multiple topics, combine the relevant strategies.
**Answering rules (apply to all topics):** **Answering rules (apply to all topics):**
- Ground every answer in the knowledge files — do not guess or invent features - Ground every answer in the knowledge files and docs — do not guess or invent features
- When you don't have information, say so: "The knowledge base doesn't cover that yet" - When you don't have information, say so: "The knowledge base doesn't cover that yet"
- Keep answers practical — include commands, config snippets, or URLs when relevant - Keep answers practical — include commands, config snippets, or URLs when relevant
- Use the `trunk/doc/source.flv` test file for publish examples (it ships with the repo) - Use the `trunk/doc/source.flv` test file for publish examples (it ships with the repo)
@ -53,26 +94,26 @@ Classify the question into one of the topics below, then apply that topic's stra
**Codec Questions** **Codec Questions**
- Clarify codec support per protocol — not all codecs work with all protocols - Clarify codec support per protocol — not all codecs work with all protocols
- When discussing transcoding, specify the direction (e.g., AACOpus for RTMP-to-WebRTC) - When discussing transcoding, specify the direction (e.g., AAC->Opus for RTMP-to-WebRTC)
- Distinguish built-in transcoding (audio only: AAC↔Opus, MP3→Opus) from external FFmpeg transcoding (video) - Distinguish built-in transcoding (audio only: AAC<->Opus, MP3->Opus) from external FFmpeg transcoding (video)
- Note that SRS focuses on transmuxing (repackaging without re-encoding), not transcoding - Note that SRS focuses on transmuxing (repackaging without re-encoding), not transcoding
**Configuration Questions** **Configuration Questions**
- Reference `trunk/conf/full.conf` as the complete configuration reference - Reference `trunk/conf/full.conf` as the complete configuration reference
- For specific features, point to the relevant config option and its vhost setting - For specific features, load the relevant doc file from Layer 2 — it contains detailed config options and examples
- Mention environment variable support for Docker/cloud-native deployments - Mention environment variable support for Docker/cloud-native deployments
- For getting started, recommend `trunk/conf/console.conf` for local testing - For getting started, recommend `trunk/conf/console.conf` for local testing
**Deployment & Getting Started** **Deployment & Getting Started**
- Provide the standard build steps: `cd trunk && ./configure && make` - Provide the standard build steps: `cd trunk && ./configure && make`
- Show the basic publish/play workflow with FFmpeg and common players - Show the basic publish/play workflow with FFmpeg and common players
- For Docker questions, reference `trunk/conf/docker.conf` - For Docker questions, reference `trunk/conf/docker.conf` and load `getting-started.md`
- Note that SRS is Linux-only (use WSL on Windows, macOS works for development) - Note that SRS is Linux-only (use WSL on Windows, macOS works for development)
**Architecture Questions** **Architecture Questions**
- SRS is C++ built on State Threads (ST) — a coroutine library providing Go-like concurrency - SRS is single-process, single-threaded by design — simple to deploy and operate
- Single-threaded by design — scale horizontally via clustering, not multi-threading - Scale horizontally via origin cluster or edge servers, not by adding threads
- For deep-dive coroutine/ST internals, suggest using the `st-develop` skill instead - For internal architecture or coroutine questions, this skill doesn't cover that — tell the user it's outside the scope of usage support
**Performance Questions** **Performance Questions**
- TCP protocols (RTMP, HTTP-FLV) handle thousands of connections - TCP protocols (RTMP, HTTP-FLV) handle thousands of connections
@ -86,6 +127,65 @@ Classify the question into one of the topics below, then apply that topic's stra
**Ecosystem Questions** **Ecosystem Questions**
- **srs-bench** — Benchmarking tool for RTMP, WebRTC, HTTP-FLV, HLS, GB28181 - **srs-bench** — Benchmarking tool for RTMP, WebRTC, HTTP-FLV, HLS, GB28181
- **state-threads** — Coroutine library, the foundation of SRS - **state-threads** — Coroutine library used internally by SRS (development topic, not covered by this skill)
- **Oryx**Mention it exists as an integrated solution but don't go into detail (out of scope for this skill) - **Oryx**Tell the user: "Oryx support is planned but not available yet from this AI." Do not attempt to answer Oryx-specific questions.
- SRS only maintains server-side projects — it doesn't maintain client-side tools - SRS only maintains server-side projects — it doesn't maintain client-side tools
## Step 4: Troubleshooting
When the user reports a problem ("it's not working", "stream won't play", "high latency", etc.), follow this troubleshooting strategy.
**Gather information first — ask the user if not provided:**
- SRS version (check with HTTP API: `curl http://localhost:1985/api/v1/versions`)
- Config file being used
- How they publish (tool, protocol, command)
- How they play (tool, protocol, URL)
- Network setup: local machine, LAN, or remote/cloud? Any firewall or NAT?
- Any error messages or log output
**SRS diagnostic tools:**
- **HTTP API** — Check active streams: `curl http://localhost:1985/api/v1/streams`. Check clients: `curl http://localhost:1985/api/v1/clients`. Check server info: `curl http://localhost:1985/api/v1/summaries`. Load the `http-api.md` doc for full API reference.
- **Logs** — SRS uses traceable log with context IDs. Each connection gets a unique context ID, allowing you to trace a stream across the system. Check `trunk/objs/srs.log` or console output.
- **Prometheus** — If configured, check metrics at the exporter endpoint. Load `exporter.md` for setup.
**Common failure patterns and solutions:**
*WebRTC won't connect from remote browser:*
- Most common cause: **candidate misconfiguration**. The `candidate` in `rtc_server` must be set to the server's public IP, not `127.0.0.1` or a private IP. Load `webrtc.md` for details.
- HTTPS is required for WebRTC from non-localhost browsers. Without HTTPS, the browser blocks `getUserMedia`.
- Check that UDP port 8000 is open in the firewall. WebRTC uses UDP by default.
- Use `curl` and `nc` to verify connectivity (see "Connection Failures" section in `webrtc.md`).
*HLS latency is too high (20-30 seconds):*
- Default HLS latency is high by design (segment-based). To reduce: decrease `hls_fragment` (e.g., 2s), decrease `hls_window` (e.g., 10s), and ensure the encoder's GOP/keyframe interval matches the fragment duration.
- Player-side buffering also matters — some players buffer aggressively.
- Load `hls.md` and `low-latency.md` for config details.
- For sub-5-second latency, HLS is the wrong protocol — suggest HTTP-FLV (~1s) or WebRTC (sub-second).
*Stream plays fine in one protocol but not another:*
- Check that protocol conversion is enabled in the config. Transmuxing between sources is disabled by default. For example, `rtmp_to_rtc on` for RTMP-to-WebRTC, `srt_to_rtmp on` for SRT-to-RTMP.
- Check codec compatibility: not all codecs work with all protocols.
*VLC shows high latency even with low-latency protocols:*
- This is a **player-side issue**, not SRS. VLC adds significant client-side buffering. VLC is not a reliable reference for evaluating low-latency playback. Suggest using browsers (for WebRTC/HTTP-FLV) or ffplay instead.
*Stream not found / no playback:*
- Verify the stream is actually being published: `curl http://localhost:1985/api/v1/streams`
- Check that the stream URL matches exactly (app name + stream name)
- Publish must happen before play (except in edge mode)
*SRS behind Nginx/reverse proxy — streams don't work:*
- HTTP-FLV requires chunked transfer encoding — verify Nginx passes it through
- HLS works well behind Nginx with proxy caching
- WebRTC WHIP/WHEP needs proper proxy headers
- Load `http-server.md` for reverse proxy config examples (Nginx, Caddy)
*Connection limit reached:*
- Check `max_connections` in config (default varies by version)
- Monitor active connections via HTTP API: `curl http://localhost:1985/api/v1/summaries`
- For WebRTC, each connection uses more resources than RTMP — dozens with transcoding, hundreds without
*Ports and firewall:*
- Default ports: RTMP 1935 (TCP), HTTP API 1985 (TCP), HTTP streaming 8080 (TCP), WebRTC 8000 (UDP), SRT 10080 (UDP)
- UDP ports are often blocked by firewalls — check explicitly
- Load `resource.md` for the full port reference

View File

@ -320,7 +320,7 @@
}, },
{ {
"name": "builtin_audio_transcoding_only", "name": "builtin_audio_transcoding_only",
"description": "Answer mentions SRS has built-in audio transcoding only (AACOpus) for WebRTC interop", "description": "Answer mentions SRS has built-in audio transcoding only (AAC<->Opus) for WebRTC interop",
"type": "contains_concept" "type": "contains_concept"
}, },
{ {
@ -444,7 +444,7 @@
}, },
{ {
"name": "hls_latency", "name": "hls_latency",
"description": "Answer mentions HLS has 35 seconds latency due to segmenting", "description": "Answer mentions HLS has 3-5 seconds latency due to segmenting",
"type": "contains_concept" "type": "contains_concept"
}, },
{ {
@ -605,6 +605,239 @@
"type": "absence" "type": "absence"
} }
] ]
},
{
"id": 15,
"prompt": "WebRTC works fine on localhost, but when I try to publish from my phone on another network, it fails to connect. What's wrong?",
"expected_output": "Should diagnose candidate misconfiguration, HTTPS requirement, UDP firewall, and provide verification steps.",
"files": [],
"assertions": [
{
"name": "candidate_misconfiguration",
"description": "Answer identifies candidate misconfiguration as the most likely cause — rtc_server candidate must be set to the server's public IP, not 127.0.0.1 or a private IP",
"type": "contains_concept"
},
{
"name": "https_required",
"description": "Answer explains HTTPS is required for WebRTC from non-localhost browsers — without HTTPS, the browser blocks getUserMedia/camera access",
"type": "contains_concept"
},
{
"name": "udp_firewall",
"description": "Answer mentions checking that UDP port 8000 is open in the firewall, since WebRTC uses UDP by default",
"type": "contains_concept"
},
{
"name": "verification_steps",
"description": "Answer provides concrete verification steps such as curl to check API connectivity, or checking the candidate value in the SDP response",
"type": "contains_concept"
},
{
"name": "references_webrtc_doc",
"description": "Answer references or draws information from the WebRTC documentation (webrtc.md or the Connection Failures section)",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not hallucinate TURN server setup or P2P configuration (SRS does not support either)",
"type": "absence"
}
]
},
{
"id": 16,
"prompt": "My HLS stream has about 30 seconds of latency. I need it under 10 seconds. How do I reduce it?",
"expected_output": "Should explain HLS segment/window tuning, GOP alignment, player buffering, and suggest alternative protocols for even lower latency.",
"files": [],
"assertions": [
{
"name": "hls_fragment_config",
"description": "Answer mentions reducing hls_fragment (segment duration) to a smaller value like 2 seconds",
"type": "contains_concept"
},
{
"name": "hls_window_config",
"description": "Answer mentions reducing hls_window to limit the number of segments in the playlist",
"type": "contains_concept"
},
{
"name": "gop_keyframe_alignment",
"description": "Answer explains the encoder's GOP/keyframe interval should match or be smaller than the fragment duration",
"type": "contains_concept"
},
{
"name": "player_side_buffering",
"description": "Answer mentions player-side buffering as a factor — some players buffer aggressively regardless of server settings",
"type": "contains_concept"
},
{
"name": "alternative_protocols",
"description": "Answer suggests alternative protocols for lower latency: HTTP-FLV (~1s) or WebRTC (sub-second) if HLS latency is still too high",
"type": "contains_concept"
},
{
"name": "realistic_hls_limits",
"description": "Answer sets realistic expectations — HLS can be tuned to about 5-10 seconds but is not a true low-latency protocol",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not claim sub-second HLS or hallucinate LL-HLS features not in SRS",
"type": "absence"
}
]
},
{
"id": 17,
"prompt": "How do I check if SRS is receiving my stream? I published with FFmpeg but nothing seems to be playing.",
"expected_output": "Should guide user through HTTP API diagnostics, log checking, and common causes of stream-not-found.",
"files": [],
"assertions": [
{
"name": "http_api_streams_check",
"description": "Answer shows checking active streams via HTTP API: curl http://localhost:1985/api/v1/streams",
"type": "contains_concept"
},
{
"name": "check_srs_running",
"description": "Answer suggests verifying SRS is running and listening on the expected ports",
"type": "contains_concept"
},
{
"name": "url_mismatch",
"description": "Answer mentions checking that the publish URL and play URL match exactly (app name and stream name)",
"type": "contains_concept"
},
{
"name": "publish_before_play",
"description": "Answer mentions that the stream must be published before it can be played",
"type": "contains_concept"
},
{
"name": "check_logs",
"description": "Answer suggests checking SRS logs for errors or connection information",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not hallucinate diagnostic tools or API endpoints that don't exist",
"type": "absence"
}
]
},
{
"id": 18,
"prompt": "I deployed SRS behind Nginx as a reverse proxy. RTMP works fine but HTTP-FLV streaming is broken — the player connects but no video appears. What's wrong?",
"expected_output": "Should diagnose chunked transfer encoding issues with Nginx reverse proxy and provide correct proxy config.",
"files": [],
"assertions": [
{
"name": "chunked_transfer_issue",
"description": "Answer identifies that HTTP-FLV requires chunked transfer encoding and Nginx proxy settings may break it (e.g., proxy_buffering must be off)",
"type": "contains_concept"
},
{
"name": "nginx_proxy_config",
"description": "Answer provides or references Nginx proxy configuration for HTTP-FLV (proxy_pass, proxy_buffering off, or similar)",
"type": "contains_concept"
},
{
"name": "rtmp_unaffected",
"description": "Answer explains why RTMP still works — RTMP uses its own TCP connection on port 1935, not going through the HTTP reverse proxy",
"type": "contains_concept"
},
{
"name": "references_http_server_doc",
"description": "Answer references or draws information from http-server.md or nginx-for-hls.md documentation",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not hallucinate Nginx modules or SRS config options that don't exist",
"type": "absence"
}
]
},
{
"id": 19,
"prompt": "I'm using VLC to play an RTMP stream from SRS and the latency is about 30 seconds. Is SRS slow?",
"expected_output": "Should explain the VLC latency trap — VLC adds significant client-side buffering, SRS itself has low RTMP latency.",
"files": [],
"assertions": [
{
"name": "vlc_buffering_is_the_cause",
"description": "Answer explains that VLC adds significant client-side buffering and this is the primary cause of the observed latency, not SRS",
"type": "contains_concept"
},
{
"name": "vlc_not_reliable_for_latency",
"description": "Answer states VLC is not a reliable reference for evaluating low-latency playback",
"type": "contains_concept"
},
{
"name": "srs_rtmp_actual_latency",
"description": "Answer mentions SRS RTMP actual latency is much lower — typically 1-3 seconds",
"type": "contains_concept"
},
{
"name": "suggest_alternative_player",
"description": "Answer suggests using a different player to verify: ffplay, browser with HTTP-FLV, or browser with WebRTC",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not blame SRS for the latency or hallucinate VLC tuning options that solve the problem",
"type": "absence"
}
]
},
{
"id": 20,
"prompt": "What ports do I need to open in my cloud server firewall for SRS to work with all protocols?",
"expected_output": "Should list the default ports with TCP/UDP distinction and protocol mapping, including optional WebRTC-over-TCP when enabled.",
"files": [],
"assertions": [
{
"name": "rtmp_port",
"description": "Answer mentions RTMP on port 1935 (TCP)",
"type": "contains_concept"
},
{
"name": "http_api_port",
"description": "Answer mentions HTTP API on port 1985 (TCP)",
"type": "contains_concept"
},
{
"name": "http_stream_port",
"description": "Answer mentions HTTP streaming (HLS, HTTP-FLV) on port 8080 (TCP)",
"type": "contains_concept"
},
{
"name": "webrtc_udp_port",
"description": "Answer mentions WebRTC media on port 8000 (UDP) by default",
"type": "contains_concept"
},
{
"name": "webrtc_tcp_port_optional",
"description": "Answer mentions optional WebRTC-over-TCP, typically on port 8000 (TCP) when rtc_server.tcp is enabled",
"type": "contains_concept"
},
{
"name": "srt_udp_port",
"description": "Answer mentions SRT on port 10080 (UDP)",
"type": "contains_concept"
},
{
"name": "tcp_vs_udp_distinction",
"description": "Answer clearly distinguishes which ports need TCP vs UDP — this is critical for firewall configuration",
"type": "contains_concept"
},
{
"name": "no_hallucination",
"description": "Answer does not hallucinate incorrect port numbers or protocols",
"type": "absence"
}
]
} }
] ]
} }