Skip to main content
Glama

yt-mem-ai — локальная память YouTube для вашего ИИ-ассистента

Дайте Claude, Codex, Cursor или любому MCP-хосту возможность смотреть YouTube за вас: транскрибировать видео, запоминать их, следить за подписками и превращать всё это в саммари, таймкод-выжимки, Q&A, дайджесты и видеонарезки. Всё работает на вашей машине — никакого облака, никаких API-ключей.

Установка навыков yt для Codex одной командой

Пример — «сделай презентацию из этого видео» (Andrej Karpathy: From Vibe Coding to Agentic Engineering, Sequoia, 30 мин) → 13 слайдов, PDF, каждая цитата с таймкодом из транскрипта. От загрузки до слайдов — один запрос.

Содержание

Related MCP server: YouTube MCP Server

Возможности

  • 🎧 Транскрибирует любое видео — субтитры YouTube, если они есть (быстро, любой язык), офлайн-Whisper, если их нет.

  • 🧠 Помнит, что вы смотрели — каждый транскрипт сохраняется и индексируется локально, так что ваша библиотека остаётся доступной для поиска навсегда. Ничего не покидает вашу машину.

  • 🔎 Находит нужный момент — спросите «что то видео говорило про X» и получите ответ с таймкодом, к которому можно перейти.

  • 📡 Следит за вашими подписками — подхватывает новые загрузки и превращает день в один дайджест.

  • ✍️ Ваш ассистент пишет сам — саммари, выжимки, Q&A, слайды — всё на языке видео, используя модель, за которую вы уже платите.

  • ❤️ Учится вашим вкусам — ставьте лайки или дизлайки видео и получайте рекомендации из собственной библиотеки.

  • 🎬 Создаёт и медиа — кликабельные документы с выжимками, кадры и отрендеренные суперкат-нарезки.

  • 🔌 Работает с вашими инструментами — Claude Code, Claude Desktop, Codex, Cursor, Antigravity, OpenClaw, Hermes: навыки или MCP — на ваш выбор.

Как установить

1. Подключите своего ассистента ⭐

curl -LsSf https://raw.githubusercontent.com/dasein108/yt-mem-ai/main/install.sh | sh

Откроется интерактивный мастер. Выберите, что вам нужно, отметьте свои приложения, нажмите Enter:

step 1/2 — what (pick one)     step 2/2 — where (tick any)
> Plugin  skills + CLI         [x] Claude Code    [ ] Claude Desktop
  MCP     typed tools          [x] Codex          [ ] Cursor
                               [ ] Antigravity    [ ] OpenClaw   [ ] Hermes

Плагин учит ассистента действовать по обычным запросам — «сделай саммари этого видео». MCP вместо этого даёт ему набор инструментов. Не уверены? Начните с плагина; мастер можно запустить снова для другого варианта.

Он установит всё необходимое, отметит то, что у вас уже есть, и удалит всё, что вы снимете (сначала покажет план и спросит). Затем перезапустите приложение и попробуйте: сделай саммари 'https://youtu.be/…'.

Уже знаете, что хотите? Пропустите вопросы:

curl -LsSf https://raw.githubusercontent.com/dasein108/yt-mem-ai/main/install.sh \
  | sh -s -- --plugin --claude-code --codex
curl -LsSf https://raw.githubusercontent.com/dasein108/yt-mem-ai/main/install.sh \
  | sh -s -- --mcp --claude-desktop --cursor

Хосты: --claude-code --claude-desktop --codex --cursor --antigravity --openclaw --hermes или --all. Полный список флагов и инструкции по удалению: integrations/README.md. Предпочитаете, чтобы это сделал агент? Вставьте integrations/PROMPT.md в любого ассистента.

2. MCP вручную — одна запись в конфиге, самоустанавливающийся

Предварительная установка не нужна: uvx загрузит пакет при первом запуске сервера хостом и будет хранить его в кеше. Вставьте это в MCP-конфиг вашего хоста:

{
  "mcpServers": {
    "yt-mem-ai": {
      "command": "uvx",
      "args": ["--from", "yt-mem-ai[mcp]", "yt-ai-mcp"]
    }
  }
}

Это вся настройка — никаких путей, никакого блока env. Настройки хранятся в ~/.yt-mem-ai/config.env, и агент может записать их сам с помощью инструмента config_set (или вы — командой yt-ai config set).

Хост

Куда вставлять этот JSON

Claude Desktop

macOS ~/Library/Application Support/Claude/claude_desktop_config.json · Windows %APPDATA%\Claude\claude_desktop_config.json — перезапустите приложение

Claude Code

claude mcp add -s user yt-mem-ai -- uvx --from 'yt-mem-ai[mcp]' yt-ai-mcp

Cursor

~/.cursor/mcp.json (перезагрузите Cursor)

Antigravity

~/.gemini/config/mcp_config.json (перезапустите)

Codex

~/.codex/config.toml — TOML, см. ниже (или codex mcp add yt-mem-ai -- uvx --from 'yt-mem-ai[mcp]' yt-ai-mcp)

OpenClaw

openclaw mcp add yt-mem-ai --command uvx --arg --from --arg 'yt-mem-ai[mcp]' --arg yt-ai-mcp (или ~/.openclaw/openclaw.json → mcp.servers)

Hermes

~/.hermes/config.yaml в разделе mcp_servers: — YAML, см. ниже

# ~/.codex/config.toml
[mcp_servers.yt-mem-ai]
command = "uvx"
args = ["--from", "yt-mem-ai[mcp]", "yt-ai-mcp"]
# ~/.hermes/config.yaml
mcp_servers:
  yt-mem-ai:
    command: "uvx"
    args: ["--from", "yt-mem-ai[mcp]", "yt-ai-mcp"]
    enabled: true

Перезапустите приложение — и инструменты появятся. Что они делают, см. в Использование.

Ничего не появилось или хост вышел по таймауту? Первый запуск скачивает зависимости и может превысить время проверки запуска хоста. Выполните uvx --from 'yt-mem-ai[mcp]' yt-ai-mcp --help один раз, затем снова откройте приложение. Если хост всё ещё не может его запустить, укажите абсолютные пути — uv tool install 'yt-mem-ai[mcp]' и используйте which yt-ai-mcp как command с "args": [] (GUI-приложения часто не видят ~/.local/bin в своём PATH).

3. Claude Desktop — навыки (в приложении)

Desktop хранит плагины в вашем аккаунте Claude, а не на диске, поэтому никто не может установить их за вас. Это займёт минуту в приложении:

Customize (левая боковая панель) → Plugins → Personal plugins → + → Add marketplace → Add from a repository → https://github.com/dasein108/yt-mem-ai → Add → Install yt-mem-ai

Затем спросите: сделай саммари 'https://youtu.be/…'. Удаляется так же. Тот же плагин работает и на claude.ai, и в Cowork. Предпочитаете инструменты навыкам? MCP-настройка выше подходит и для Desktop — и её можно автоматизировать.

Каждый хост загружает файлы SKILL.md из каталога уровня пользователя: Codex ~/.codex/skills/ (CLI и IDE используют его совместно, v0.117.0+), Cursor ~/.cursor/skills/, Antigravity ~/.gemini/skills/, OpenClaw ~/.agents/skills/, Hermes ~/.hermes/skills/ (где они становятся /yt и /yt-agent).

# from a checkout
cp -R skills/yt skills/yt-agent ~/.codex/skills/

# without a checkout
for s in yt yt-agent; do
  mkdir -p ~/.codex/skills/$s
  curl -LsSf "https://raw.githubusercontent.com/dasein108/yt-mem-ai/main/skills/$s/SKILL.md" \
    -o ~/.codex/skills/$s/SKILL.md
done

Дополнительно для Codex: промпты /yt-* (integrations/codex/prompts/*.md → ~/.codex/prompts/) и integrations/codex/AGENTS.md → ~/.codex/AGENTS.md. Полное руководство: skills/README.md.

4. CLI сам по себе

Навыки управляют им, но это вполне самостоятельный инструмент:

uvx yt-mem-ai --help          # zero-install run
uv tool install yt-mem-ai     # or install the persistent `yt-ai` command

Требуется Python 3.11+ и uv; ffmpeg — только для supercut / frame.

Десктопный интерфейс живёт в отдельном репозитории: yt-mem-ai-desktop — он зависит от этого пакета и запускает собственный локальный REST API.

Начало работы

Установили и перезапустили хост? Вы готовы. Просто говорите со своим ассистентом — навыки (или MCP-промпты + analyze_video) сделают загрузку за вас:

«Сделай саммари https://youtu.be/dQw4w9WgXcQ» → загружает видео (субтитры → whisper), затем пишет executive summary и ключевые пункты на языке видео.

«Дай мне выжимку этого видео с таймкодами» → 3–8 моментов с глубокими ссылками (watch?v=…&t=123s), найденных семантическим поиском.

«Что я смотрел про retrieval-augmented generation?» → ищет по всем транскриптам в вашей библиотеке и цитирует моменты.

«Обработай мои подписки в сегодняшний дайджест» → находит новые загрузки, загружает их, пишет digests/<DATE>.md.

Предпочитаете терминал? Тот же первый запуск:

yt-ai fetch 'https://www.youtube.com/watch?v=VIDEO_ID'   # ingest one video
yt-ai search "what was said about embeddings"            # search your library
yt-ai status                                             # what's in the store

Всё сохраняется в ~/.yt-mem-ai/ (библиотека, логи, загрузки).

Первый запуск медленный — это нормально. Установка подтягивает ML-стек (torch, LanceDB, sentence-transformers ≈ 1 ГБ на диске), а ваш первый fetch или search дополнительно скачивает модель эмбеддингов. Если у видео нет субтитров, скачается и модель Whisper (small, ≈ 460 МБ) — путь с субтитрами в ней не нуждается. Всё это кешируется, так что происходит один раз, а не для каждого видео. На GUI-хосте первый запуск MCP может превысить время проверки запуска приложения по той же причине: выполните uvx --from 'yt-mem-ai[mcp]' yt-ai-mcp --help один раз в терминале, чтобы прогреть кеш, затем снова откройте приложение.

Ежедневная рутина

yt-ai discover               # what's new in your subscriptions
yt-ai fetch-pending          # transcribe today's batch

затем в ассистенте: «обработай подписки» → саммари по каждому видео и digests/<DATE>.md, и при желании yt-ai compile --out compilations/$(date +%F).md для дневной выжимки в виде кликабельных ссылок.

Использование

Общение с ассистентом (навыки и промпты)

С плагином поставляются два навыка. MCP-хосты получают те же сценарии в виде промптов (yt_summarize, yt_highlights, yt_qa, yt_presentation, yt_digest, yt_review, yt_group), так что без поддержки навыков ничего не теряется.

Навык

Для чего

yt

точка входа — любая операция и полные конвейеры (ежедневная рутина, одно видео); передаёт анализ навыку yt-agent

yt-agent

сценарии — одно видео → саммари / выжимки / Q&A / презентация; подписки → ежедневный дайджест; кросс-видео обзор; группа видео

Что вы говорите

Что происходит

Куда сохраняется

«сделай саммари <url>»

загрузка → executive summary + ключевые пункты

чат, save_summary в хранилище

«выжимку для <url>»

3–8 моментов с таймкодами и глубокими ссылками

чат + хранилище

«Q&A по <url>»

3–6 пар вопрос/ответ с опорой на источник

чат + хранилище

«сделай презентацию из <url>»

слайды, разделённые ---

slides/<id>.md

«обработай подписки»

поиск → загрузка → анализ каждого видео

digests/<DATE>.md

«сделай обзор того, что я смотрел на этой неделе»

эссе по темам между видео

reviews/<DATE>.md

«проанализируй эти видео: <ids/urls/channel>»

загрузка набора → по каждому + синтез

groups/<label>.md

Навыки никогда не обращаются к базе данных напрямую — они вызывают CLI, так что один и тот же процесс работает на любом хосте. Установите или вставьте их вручную: skills/README.md.

MCP-инструменты

Сервер yt-ai-mcp предоставляет весь движок в виде типизированных инструментов. analyze_video — точка входа в один шаг: он загружает видео и возвращает транскрипт, чтобы модель сама написала саммари.

Категория

Инструмент

Описание

Анализ

analyze_video

Принять видео и вернуть его транскрипт (+ заголовок, канал, язык, существующее резюме). Вызывайте это первым для любого запроса на резюме / выделение / Q&A.

Загрузка

fetch

Скачать + транскрибировать + встроить одно видео (force, captions_only, prefer_whisper).

discover

Новые загрузки из вашей ленты подписок (инкрементально; after, deep, min_duration).

fetch_pending

Пакетная загрузка всего, что было обнаружено с определённой даты.

channel_list

Перечислить недавние загрузки канала (без загрузки).

Библиотека

search

Гибридный / векторный / полнотекстовый поиск по всем фрагментам, с временными метками.

show

Метаданные + полный транскрипт для одного видео.

list_videos

Список сохранённых видео по статусу / дате / каналу.

status

Количество по статусам жизненного цикла.

Резюме

save_summary

Сохранить резюме + выделенные моменты + Q&A, чтобы compile и supercut могли их использовать.

Вкус

like / dislike

Записать отзыв для одного видео.

recommend

Ранжировать неоценённые видео по схожести с тем, что вам понравилось.

Медиа

compile

Документ с глубокими ссылками на выделенные моменты, ограниченный по бюджету минут.

supercut

Собрать выделенные фрагменты в один размеченный mp4 (требуется ffmpeg + сеть).

frame

Извлечь кадр в указанный момент времени.

Конфигурация

config_list / config_get

Просмотр настроек, значений и источника каждого (секреты скрыты).

config_set / config_unset

Изменение настроек из чата — учётные данные прокси, браузер для cookies, модель встраивания.

Обслуживание

reembed

Пере-встроить всю библиотеку после смены модели встраивания.

Детали сервера, список промптов и сырая конфигурация: integrations/mcp/README.md.

Команды CLI

yt-ai fetch <url>            # download + transcribe + embed + store one video
yt-ai fetch <url> --captions-only  # captions only: no audio download / no whisper (fails if none)
yt-ai transcript <url>       # same pipeline
yt-ai discover               # new subscription uploads (--after/--deep/--min-duration/--json); incremental by default
yt-ai fetch-pending          # batch-fetch pending 'discovered' videos (since --since, default today; --limit)
yt-ai list                   # list stored videos (--status/--since/--json)
yt-ai show <video_id>        # metadata + transcript (--json)
yt-ai status                 # counts by status
yt-ai search "<query>"       # semantic search (--hybrid/--fts/--vector, -k N)
yt-ai save-summary <id> "<summary>" --highlights '<json>' --qa '<json>'  # persist a summary (used by skills)
yt-ai like <video_id>        # mark liked (feeds recommendations)
yt-ai dislike <video_id>     # mark disliked
yt-ai recommend              # rank your unrated fetched videos by taste (--limit/--json)
yt-ai compile                # deep-linked highlights doc, budget-bounded (--since/--max-minutes/--json/--out)
yt-ai supercut               # video reel of highlights, re-downloaded + labeled (--since/--max-minutes/--out/--keep-clips)
yt-ai frame <video_id> --at <ts>  # still frame at a timestamp (seconds or H:M:S) → frames/<id>_<s>s.png
yt-ai reembed                # re-embed all chunks with the current YT_EMBEDDING_* config
yt-ai channel-list <url>     # list a channel's recent uploads (--limit/--from/--to/--json); enumerate only
yt-ai config list            # get/set any .env setting: config get/set/unset/path (reconfigure from CLI or chat)

Примеры

Кейс: полный PDF-учебник из 10-частного курса на YouTube. examples/defi-crypto-options.pdf — это 96-страничная русская образовательная книга, созданная из серии «DeFi. Бесплатный вводный курс по крипто-опционам» (@Menaskop).

Конвейер: определить 10 видео серии → извлечь субтитры ru-orig (yt-dlp + cookies браузера; Whisper не нужен) → структурированные дайджесты по каждому видео → один общий каркас (глоссарий, обозначения, каталог рисунков) → 10 переписанных глав (~28,5 тыс. слов)

  • 47 перерисованных векторных рисунков → собраны и отрендерены с помощью Typst. Это не резюме — главы с нуля, с проработанными примерами, диаграммами, глоссарием и глубокими ссылками на каждое видео в конце каждой главы.

Конфигурация

Для начала ничего не требуется — по умолчанию хранилище, логи и загрузки находятся в ~/.yt-mem-ai/ и используется локальная модель встраивания. Настройте, когда понадобится:

Настройка

Что делает

YT_STORE_PATH

Каталог LanceDB

YT_EMBEDDING_BACKEND

local (sentence-transformers) или openai

YT_EMBEDDING_MODEL

например, paraphrase-multilingual-MiniLM-L12-v2 для неанглийских библиотек

OPENAI_API_KEY

только для бэкенда встраивания openai

YT_COOKIES_BROWSER

chrome/firefox/… — исправляет «подтвердите, что вы не бот» от YouTube

YT_CAPTION_LANGS

предпочтительные языки субтитров (по умолчанию en, откат на любую дорожку)

WEBSHARE_PROXY_*, YT_USE_WEBSHARE

опциональный ротационный прокси

YT_CHUNK_TARGET_S

длина фрагмента для встраивания

Настройка из CLI или агента — вместо ручного редактирования .env используйте yt-ai config (или инструменты MCP config_*, чтобы агент мог перенастроить себя из чата):

yt-ai config list                  # every setting, value, and source
yt-ai config set WEBSHARE_PROXY_USERNAME <user>
yt-ai config set WEBSHARE_PROXY_PASSWORD <pass>
yt-ai config set YT_EMBEDDING_MODEL paraphrase-multilingual-MiniLM-L12-v2
yt-ai config get OPENAI_API_KEY    # secrets masked (--reveal to show)

set по умолчанию записывает глобальный файл конфигурации (~/.yt-mem-ai/config.env), чтобы MCP-сервер подхватывал его независимо от рабочего каталога; --project записывает ./.env. Приоритет: переменные окружения процесса > проектный .env > глобальный файл конфигурации, и config list показывает, откуда взялось каждое значение.

Под капотом

Всё ниже — необязательное чтение: внутренности, настройка и заметки для разработчиков.

Как это работает

yt-dlp → captions (or Whisper) → chunks → embeddings → LanceDB
                                                          ↓
                     your assistant reads + writes summaries back

CLI выполняет тяжёлый ввод-вывод и владеет хранилищем; навыки и инструменты MCP — тонкие вызовы. Видео проходит через discovered → downloaded → transcribed → summarized; прямые трансляции получают конечный статус stream и пропускаются пакетной загрузкой (транскрибируйте одну по запросу с помощью yt-ai fetch <url>). Хранилище — встроенная LanceDB (videos, channels, transcripts, chunks, summaries, feedback), с векторами для каждого фрагмента плюс полнотекстовый индекс — именно это делает поиск гибридным.

Детали команд

Оценка и рекомендации — ставьте лайки/дизлайки загруженным видео, затем yt-ai recommend ранжирует остальные по схожести с тем, что вам понравилось (минус то, что не понравилось), используя их транскрипционные встраивания. Пока вы ничего не оценили, используется откат к самым недавно опубликованным.

discover инкрементален — он получает новые записи ленты одним плоским вызовом (ограничен YT_DISCOVER_FEED_LIMIT), помечает каждую приблизительной временной меткой и сохраняет только те, что новее отметки последнего запуска минус 1 час перекрытия (YT_DISCOVER_OVERLAP_S), чтобы округлённые до часа даты никогда не пропускали пограничное видео. Уже обработанные видео отфильтровываются. --after YYYY-MM-DD переопределяет порог.

compile против supercut — compile рендерит дневные выделенные моменты как markdown глубокие ссылки (watch?v=ID&t=<start>s), сначала новые видео, ограничено --max-minutes (по умолчанию 20); это мгновенно и выводит в stdout, если не передать --out. supercut пере-скачивает каждый выделенный фрагмент в 720p, накладывает метку на него и объединяет всё в supercuts/<date>.mp4 плюс .refs.md sidecar со списком источников (и любые клипы, пропущенные после сбоя) — гораздо медленнее, требует сеть + ffmpeg, но доступно для обмена.

Встраивания, прокси и другие настройки

Встраивания: YT_EMBEDDING_BACKEND=local|openai. Локальный использует sentence-transformers (YT_EMBEDDING_MODEL, по умолчанию all-MiniLM-L6-v2) — для неанглийских библиотек установите paraphrase-multilingual-MiniLM-L12-v2 (384-мерный, 50+ языков), чтобы семантический поиск работал на разных языках. openai использует text-embedding-3-small|large (требуется OPENAI_API_KEY). После смены модели запустите yt-ai reembed, чтобы перенести существующую библиотеку (пере-встраивает все фрагменты; без повторной загрузки).

Прокси / VLESS: YT_USE_WEBSHARE по умолчанию выключен. Если у вас уже есть системный прокси/VPN (VLESS/Xray и т.п.), оставьте его выключенным — трафик идёт через этот туннель. Наложение прокси Webshare поверх ломает аутентифицированную ленту подписок (его CONNECT-туннель возвращает 405). Устанавливайте YT_USE_WEBSHARE=true только если у вас нет другого прокси и YouTube ограничивает ваш сырой IP. Настройка discover: YT_DISCOVER_FEED_LIMIT (ограничение последних N, по умолчанию 60), YT_DISCOVER_OVERLAP_S (инкрементальное перекрытие, по умолчанию 3600), YT_DISCOVER_TIMEOUT_S.

Работаете из репозитория? uv sync --extra dev, затем cp .env.example .env если предпочитаете хранить настройки локально для проекта, а не в ~/.yt-mem-ai/config.env.

Использование как Python-пакет

yt-mem-ai — обычная библиотека: CLI — тонкая оболочка Typer над ядрами run_*, которые можно вызывать напрямую. Всё локально: нет сервера, нет ключа API (если не выберете бэкенд встраивания openai).

pip install yt-mem-ai     # or: uv add yt-mem-ai
from dataclasses import replace
from pathlib import Path

from yt_mem_ai.config import load_config
from yt_mem_ai.cli import open_store, run_fetch, run_search, run_list, run_save_summary
from yt_mem_ai.store import db as store

# Config comes from ~/.yt-mem-ai/config.env < ./.env < process env.
# Override any field in code (Config is a frozen dataclass):
cfg = replace(load_config(), store_path=Path("~/.yt-mem-ai/lance").expanduser())

db = open_store(cfg)          # opens LanceDB + creates tables/indexes once
                              # pass db=... to every run_* call to reuse it

# 1. Ingest: download → transcribe (captions → whisper) → chunk → embed → store
video_id = run_fetch("https://www.youtube.com/watch?v=dQw4w9WgXcQ", cfg, db=db)
# captions only (no audio download, no whisper):
# video_id = run_fetch(url, cfg, db=db, captions_only=True)

# 2. Read what was stored
video = store.get_video(db, video_id)
text = store.get_transcript_text(db, video_id)
print(video.title, video.channel, video.duration_s, len(text or ""))

for c in store.list_chunks(db, video_id)[:3]:
    print(f"[{c['start_s']:.0f}s] {c['text'][:80]}")

# 3. Semantic search across the whole library (hybrid | vector | fts)
for hit in run_search(cfg, "retrieval augmented generation", mode="hybrid", k=5, db=db):
    print(hit["video_id"], hit["start_s"], hit["text"][:100])

# 4. Bring your own LLM: summarize the transcript however you like, then persist
summary_md = my_llm(text)                       # any model / provider
run_save_summary(
    cfg, video_id, summary_md,
    highlights_json='[{"t": 42, "text": "key moment"}]',
    qa_json='[{"q": "What is it about?", "a": "..."}]',
    db=db,
)
print(store.get_summary(db, video_id))

# 5. Library queries
for v in run_list(cfg, status="transcribed", since="2026-01-01", db=db):
    print(v.video_id, v.published_at, v.title)

Другие ядра, той же формы (run_x(cfg, ..., db=db)): run_discover, run_fetch_pending, run_channel_list, run_recommend, run_feedback, run_compile, run_supercut, run_frame, run_reembed. Низкоуровневые части также импортируемы — yt_mem_ai.download.download, yt_mem_ai.transcript.get_transcript, yt_mem_ai.store.embeddings.build_embedder / chunk_segments, yt_mem_ai.store.db (LanceDB CRUD + search_chunks).

Хранилище — обычная LanceDB, так что вы можете открыть его напрямую:

import lancedb
from pathlib import Path
tbl = lancedb.connect(Path("~/.yt-mem-ai/lance").expanduser()).open_table("chunks")
df = tbl.to_pandas()      # video_id, start_s, end_s, text, vector

Логирование

CLI записывает структурированные JSON-события в logs/common.jsonl (через obs.log_event/blog) — один объект на строку, {ts, source, level, event, msg, ...ctx}. Переопределите путь с помощью YT_LOG_FILE; он в .gitignore. Просмотр с помощью jq:

jq -c 'select(.level=="error")' logs/common.jsonl   # every error
tail -f logs/common.jsonl | jq -c '{ts,event,msg}'  # live tail, compact

Тесты

uv run pytest -q                       # offline unit tests (fake embedder)
YT_RUN_INTEGRATION=1 uv run pytest -q  # + real sentence-transformers integration

Релиз (для мейнтейнеров)

Версия берётся из git-тега (hatch-vcs). Тег, сборка и публикация:

git tag -a vX.Y.Z -m "vX.Y.Z" && git push origin vX.Y.Z
uv build                                # → dist/ (sdist + wheel)
sh scripts/publish.sh dist/yt_mem_ai-X.Y.Z*   # uploads to PyPI

scripts/publish.sh загружает UV_PUBLISH_TOKEN из .env (gitignored) по запросу, так что вам не нужно экспортировать его каждый раз — добавьте UV_PUBLISH_TOKEN=pypi-… в .env один раз (см. .env.example). Эквивалентно: set -a; . ./.env; set +a; uv publish dist/*. Ротируйте токен на PyPI, если он когда-либо был раскрыт.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers