Перейти к содержимому
Экосистема AI Vibe

Разборы

slothd: локальный ИИ-демон, который наводит порядок в файлах, пока вы отошли от клавиатуры

Редакция 22 октября 2026 г.

slothd: локальный ИИ-демон, который наводит порядок в файлах, пока вы отошли от клавиатуры

Три развилки решают, можно ли доверять фоновому агенту на диске: облако или полностью локальный inference, сначала план или сразу перенос файлов, табличная триаж перед тяжёлой моделью. slothd, open-source демон с приоритетом локального режима и работой без сети по умолчанию, закрывает контур для соло-разработчика: PDF и скриншоты без отправки приватных документов в облачный ИИ, Gemma 3 через локальный Ollama только там, где не хватает метаданных. В build-story Dhruv Jani (@dj29) показывает, почему «медленный» темп агента работает как фича, а не как баг.

Почему «терпеливый» демон, а не чат-агент в каждой папке

Заголовок build-story обещает демон, который терпеливо разбирает захламлённое рабочее пространство, а не интерактивный чат на каждый файл. Dhruv Jani привязывает релиз к Hacktoberfest Open-Source AI Challenge, неделя Week 3: Slow and Steady: фоновый ИИ не мешает во время работы.

Механика проверяемая: через нативные OS API демон смотрит на бездействие клавиатуры и мыши и включается после 5+ минут непрерывной неактивности. Пока вы отошли, он сканирует целевые зоны: рабочие каталоги, «свалки» на Desktop, project inboxes. Для vibe-workflow это другой контракт с агентом: не «сгенерируй имя сейчас», а «подчисти хаос, когда я не в IDE».

Мотивация приземлённая: накопившиеся PDF, установщики и скриншоты с нечитаемыми именами. Jani явно отказывается гонять приватные документы в облачный ИИ ради сортировки. Локальный open-source демон здесь граница доверия к данным на диске, а не маркетинговый лозунг.

Двухступенчатый контур: таблица, Gemma и офлайн по умолчанию

Чтобы не кормить vision/LLM каждым байтом, slothd строит воронку из двух стадий.

Стадия 1: семь сигналов файловой системы (логарифм размера, категория расширения, глубина пути, час и день модификации, длина имени, энтропия UUID и цифр в имени). По умолчанию работает детерминированный локальный движок TabPFN-Heuristic-Local, порядка менее 1 ms на батч в офлайн-режиме; при настроенных credentials и checkpoint можно переключиться на Prior Labs TabPFN (Jani указывает ~15–25 ms).

Стадия 2: только файлы, которым нужна семантика по содержимому, уходят в Gemma 3 локально через Ollama (в таблице треков gemma3:4b). PDF обрабатываются через PyMuPDF (рендер в память); ответ жёстко ограничен Pydantic JSON schema через параметр format в Ollama. Если Ollama недоступен, демон делает короткий health probe (0,2 s) и откатывается к классификации по расширению. В трейсе Sentry встречается Connection refused на 127.0.0.1:11434.

Паттерн знакомый тем, кто уже крутит локальный inference: сначала дешёвый фильтр, потом модель. Иначе соло-разработчик платит latency и VRAM за каждый мусорный .dmg в загрузках.

Ядро (idle detection, scan, triage, Gemma через локальный Ollama, SQLite WAL, rollback) по заявлению автора работает без интернет-вызовов по умолчанию. Партнёрские облачные интеграции (Tiger Data, SerpApi, ElevenLabs) включаются только через --enrich-online, с офлайн-fallback: локальный vector search, эвристики, terminal chimes.

Семантический поиск строится на эмбеддингах 768-dim моделью nomic-embed-text: основной бэкенд Tiger Data PostgreSQL + pgvector (опционально), локальный fallback SQLite vector. Как пример UX Jani приводит запрос вроде «Where is my AWS invoice from October?».

Репозиторий под лицензией MIT на GitHub: JaniDhruv/slothd. Запуск и CLI завязаны на uv run; точка входа для эксперимента: демо-набор test_workspace/messy_inbox:

uv run slothd scan test_workspace/messy_inbox

На этой фикстуре Jani приводит воспроизводимые цифры: 10 файлов, 2 clutter anomalies, 1 duplicate set (SHA-256), 973 B reclaimable, 0 cloud API calls, 1 ms metadata triage на локальном движке. Там же указано: uv run pytest -v даёт 118 passed; uv run ruff check . all checks passed (заявления автора, не независимый бенчмарк редакции).

В репозитории есть слой rules/prompts под GitHub Copilot: .github/copilot-instructions.md, кастомные промпты (/new-sorter, /audit-privacy, /verify-demo), CLI slothd copilot. Это опциональная надстройка; офлайн-ядро от неё не зависит, но показывает связку «агент + явные инструкции в репо» рядом с локальным inference.

Доверие к автоматизации: dry-run, WAL и откат

Файловая система не прощает сценарий «агент сам всё переложил». Команда slothd organize по умолчанию в режиме dry-run; реальный перенос только с флагом --go или после Approve в локальном dashboard (FastAPI + Vanilla ES6).

Каждое одобренное перемещение пишется в SQLite WAL с batch_id; откат через slothd undo. Коллизии имён решаются суффиксами _1, _2; сохраняются mtime и atime. В комментариях Dev.to Jani уточняет продуктовые edge cases: содержимое важнее имени файла, multi-label tags, низкий confidence → не переименовывать слепо.

Для схемы «человек подтверждает каждый шаг» это минимальный набор, без которого фоновый ИИ на диске быстро превращается в стресс, а не в помощника.

Ollama для кода: три проверки на своём диске

Если вы уже держите Ollama для кодинга, slothd редкий случай, когда тот же стек применяют к бытовому хаосу на диске, а не к репозиторию. Три развилки из лида стоят проверки на вашей машине: включён ли только локальный контур, устраивает ли dry-run перед --go, не гоняете ли Gemma по файлам, которые отсекла табличная стадия.

Build-story вышел 21 октября 2026; на Dev.to у него 46 публичных реакций и 11 комментариев, оценочное время чтения 14 минут. Требования к железу для gemma3:4b Jani в одном месте не сводит: перед боевым деплоем имеет смысл прогнать scan на копии каталога, а не на единственной рабочей папке.

Источники