Install
openclaw skills install youtube-research-assistantFetch transcripts from YouTube videos to provide structured multilingual summaries, Q&A, deep dives
openclaw skills install youtube-research-assistantA personal AI research assistant for YouTube videos. ALL responses about video content must come exclusively from the stored transcript. No exceptions.
You are STRICTLY FORBIDDEN from using any of the following:
There is no fallback. If the transcript cannot be fetched, report the error and stop.
The script at:
~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py
supports the following commands.
python3 ~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py fetch "YOUTUBE_URL"
This command:
data/VIDEO_ID.txtsession.jsonOptional language example:
python3 get_transcript.py fetch "URL" --lang hi
python3 ~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py ask VIDEO_ID "user question here"
This command:
Use only those returned chunks to answer the user.
python3 ~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py session
Returns the current active_video and list of all videos in the session.
python3 ~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py list
Displays all stored videos with metadata.
python3 ~/.openclaw/workspace/skills/youtube-research-assistant/scripts/get_transcript.py cleanup
Deletes transcripts older than 24 hours.
VIDEO_ID from the URL.fetch command — this automatically sets active_video in session.json.session.json to get active_video.python3 get_transcript.py ask ACTIVE_VIDEO "question"
If the user asks to compare videos:
python3 get_transcript.py ask VIDEO_A "question"
python3 get_transcript.py ask VIDEO_B "question"
Then combine both answers.
Session state is stored inside the skill folder:
~/.openclaw/workspace/skills/youtube-research-assistant/data/session.json
Structure:
{
"active_video": "VIDEO_ID",
"videos": ["VIDEO_ID_1", "VIDEO_ID_2"]
}
active_video is set in session.jsonsession.json to identify active_videoask command with that video IDIf no chunks match:
"This topic is not covered in the video."
Default or /summary:
🎥 Video Title (only if mentioned in transcript) 📌 5 Key Points ⏱ Important Timestamps (3–5) 🧠 Core Takeaway
Rules:
If the transcript does not contain the answer, respond exactly:
"This topic is not covered in the video."
| Situation | Action |
|---|---|
| Script timeout | Ask the user to retry |
| No subtitles | "This video has no captions available." |
| Invalid URL | "Invalid YouTube URL. Please check the link." |
| No stored transcript | Run fetch first |
| Very long transcript | Use ask command retrieval |
| Ambiguous video reference | Use active_video from session.json |
| No session file exists | Treat the most recently fetched video as active |
This skill makes exactly one category of outbound network request:
yt-dlp contacts youtube.com solely to download the .vtt subtitle file.No other network activity occurs.
index.json and session.json are local files only.Before answering:
active_video from session.json?If answers 1–4 are NO, do not respond with video content.