Install
openclaw skills install @dasein108/yt-agentGenerate summaries, highlights, Q&A, presentations, daily digests, or cross-video reviews from YouTube videos using cached transcripts and semantic search.
openclaw skills install @dasein108/yt-agentOne entry point for turning YouTube into artifacts. All data access goes through
the uvx yt-mem-ai <cmd> CLI (see [[yt]] for the full command
surface) — never touch the LanceDB store directly. Always invoke it exactly that
way: zero-install and cached, so nothing has to be on PATH. Do not go looking
for a yt-ai binary — the native plugins install no package. (Only inside a
source checkout may you use uv run yt-ai <cmd>.) Single-quote every URL —
YouTube URLs contain ?/&, which the shell globs on, so a bare URL fails:
uvx yt-mem-ai fetch 'https://www.youtube.com/watch?v=ID' --captions-only.
Everything is grounded in the transcript; highlight timestamps come from
uvx yt-mem-ai search, never invented. The analysis is done by this agent — no API
key, no OpenRouter.
video_id, or "this video" as a
follow-up): produce a summarize / highlights / qa / presentation artifact.Given a video_id (and a URL if it may not be ingested yet):
uvx yt-mem-ai show <video_id> --json.
not found and you have a URL → uvx yt-mem-ai fetch '<url>' --captions-only. If that
prints no captions available: ..., fall back to uvx yt-mem-ai fetch '<url>' --whisper
(downloads audio + transcribes — slower, always yields a transcript).Sign in to confirm you're not a bot → run
uvx yt-mem-ai config set YT_COOKIES_BROWSER chrome and retry;
captions blocked ... IP rate-limited → cookies won't help, see
[[yt]]'s When YouTube blocks a fetch.is_seen skips it).show --json output has a non-null summary,
reuse it — skip generation unless the user asked for a fresh artifact.uvx yt-mem-ai search "<phrase>" --vector -k 3 and use the MM:SS from a returned
line whose video_id matches. Never invent timestamps.summary_md (2–4 sentence exec summary
highlights JSON [{"start_s": <seconds>, "label": "..."}]
(3–8, seconds from step 3), qa JSON [{"q": "...", "a": "..."}] (3–6).uvx yt-mem-ai save-summary <video_id> "<summary_md>" --highlights '<json>' --qa '<json>'.Run the core, then deliver the artifact the phrasing asked for:
MM:SS — label, a deep link
https://www.youtube.com/watch?v=<id>&t=<start>s.slides/<video_id>.md:
----separated slides (renderable by reveal.js / Marp; no images).MM:SS timestamp.uvx yt-mem-ai discover # new uploads → 'discovered'
uvx yt-mem-ai fetch-pending # download + transcribe + embed today's batch (skips failures)
Live streams are auto-detected and marked status=stream — fetch-pending skips
them (long + usually caption-less). List them with uvx yt-mem-ai list --status stream;
to transcribe one on demand, fetch it directly (uvx yt-mem-ai fetch '<url>', optionally
--whisper).
Then for each of the day's transcribed videos
(uvx yt-mem-ai list --status transcribed --since <DATE> --json), run the core
analysis. Compose digests/<DATE>.md:
## <title> + link, the 2–4 sentence summary, top
highlights (MM:SS — label), 2–3 Q&A.Create digests/ if needed. Report the digest path + the executive digest.
Idempotent — re-running overwrites each summaries row and rewrites the file.
Select the period's videos: uvx yt-mem-ai list --status summarized --since <DATE> --json
(analyze any still transcribed via the core first). Then write one essay to
reviews/<DATE>.md — no per-video sections:
MM:SS deep link.Report the review path + a short lede in chat.
Process a user-specified set (not tied to today's subscriptions), then per-video analysis + a top-level synthesis.
id1,id2,https://youtu.be/id3) → parse directly;uvx yt-mem-ai channel-list '<url>' --limit N [--from D] [--to D] --json;--from/--to.
Report the resolved count first; if it's large (> ~15), say so and confirm/cap
before mass-ingesting (whisper is slow).uvx yt-mem-ai fetch '<url>' (captions→whisper; streams auto-marked
status=stream and skipped; continue past failures — note any skipped).presentation → slides/<id>.md if asked), persisted via save-summary,
in each video's original language (FTS-anchor non-English).groups/<label>.md (label = channel handle / date-range
slug / timestamp): an executive synthesis (themes, standouts, what's worth
watching) + one section per video (## <title> + link, summary, top highlights
as MM:SS — label, 2–3 Q&A).groups/<label>.md path + the executive synthesis.This is the daily-digest shape (B) over an arbitrary set. Use C instead for a themes-only essay with no per-video sections.
uvx yt-mem-ai CLI ([[yt]] has the full surface). Never touch
the store directly.uvx yt-mem-ai search.show --json as transcript_lang. Default:
produce each artifact in the video's OWN original language (Russian video →
Russian summary) — no translation. Only translate when the user asks for a
specific target language. If the user hasn't stated a preference and the batch
mixes languages, ask once which output language they want, then apply it to the
whole run (and treat that as their saved default). Anchoring caveat: vector
search is language-sensitive — search with a phrase in the transcript's original
language, then write the label in the chosen output language. (For heavily
multilingual libraries, a multilingual YT_EMBEDDING_MODEL improves search —
switch it from chat with uvx yt-mem-ai config set YT_EMBEDDING_MODEL paraphrase-multilingual-MiniLM-L12-v2, then uvx yt-mem-ai reembed to migrate the
library. uvx yt-mem-ai config set/list reconfigures any .env setting — Webshare
creds, cookies browser, backend — see [[yt]].)is_seen is status-based, so re-fetch is a no-op → follow-ups ("now highlight
it", "make slides") and re-runs never re-download.YYYY-MM-DD. Always report what ran + the output paths (slides/,
digests/, reviews/).