by brendanhogan (community) Python, Node.js, Linux, macOS, OpenAI API или локальный Ollama
Крошечное автономное AI-существо, которое живёт в отдельной папке на компьютере и непрерывно проводит собственные исследования: ищет темы в интернете, пишет отчёты и заметки, помнит, чем занималось вчера. У него генерируемый «геном личности», память по мотивам архитектуры generative agents и цикл «сна», консолидирующий опыт в убеждения. Живёт в пиксель-арт комнате и бродит между столом, книжной полкой и кроватью — тамагочи, которое занимается исследованиями.
Один из первых и самых известных проектов автономных AI-агентов: получает цель на естественном языке и самостоятельно …
Набор инструкций, превращающий обычного кодового AI-агента в полноценную студию видеомонтажа: агент сам режет, склеивает, накладывает переходы …
Автономный исследовательский агент: получает тему и самостоятельно проводит многошаговое веб-исследование, критически сопоставляет источники и выдаёт связный, …
Минималистичный автономный AI-агент общего назначения: управляет браузером, файловой системой, ОС и мобильными устройствами через единый набор …
git clone https://github.com/brendanhogan/hermitclaw.git cd hermitclaw uv sync cd frontend && npm install && npm run build && cd .. export OPENAI_API_KEY="sk-..." # или настроить Ollama в config.yaml uv run python hermitclaw/main.py # открыть http://localhost:8000
![]()
Крошечное ИИ-существо, которое живёт в папке на вашем компьютере.
Оставьте его работать — и он сам заполнит папку отчётами об исследованиях, Python-скриптами, заметками и идеями. У него есть геном личности, созданный из энтропии клавиатуры, система памяти, вдохновлённая генеративными агентами, и цикл сновидений, который консолидирует опыт в убеждения. Он живёт в комнате в стиле пиксель-арт и бродит между своим столом, книжной полкой и кроватью. С ним можно разговаривать. Можно класть в его папку файлы, чтобы он их изучал. Можно просто наблюдать, как он думает.
Это тамагочи, который занимается исследованиями.
Предупреждение: Этот проект запускает LLM в цикле с доступом к оболочке и возможностью просмотра веб-страниц. Есть защитные механизмы (список запрещённых команд, ограниченные пути, монки-патчи Python), но они не являются границей безопасности — их можно обойти, и на них не следует полагаться для защиты вашей системы. Если вам нужна настоящая изоляция, запускайте это в Docker-контейнере или виртуальной машине.
Большинство ИИ-инструментов ждут, когда вы что-то у них спросите. HermitClaw не ждёт. Он выбирает тему, ищет в интернете, читает найденное, пишет отчёт и переходит к следующему делу. Он помнит, что делал вчера. Он замечает, когда его интересы начинают меняться. За несколько дней его папка наполняется корпусом работ, отражающих личность, которую вы не проектировали — вы просто нажимали на клавиши, и она возникла.
В том, чтобы наблюдать за умом, который работает непрерывно, есть что-то завораживающее. Он уходит в сторону. Он возвращается назад. Он опирается на то, что написал три дня назад. Он всё лучше понимает, что для него важно.
uv — это быстрый менеджер пакетов Python. Установите его, затем:
git clone https://github.com/brendanhogan/hermitclaw.git
cd hermitclaw
# Python deps (creates .venv, installs from lockfile)
uv sync
# Build frontend
cd frontend && npm install && npm run build && cd ..
export OPENAI_API_KEY="sk-..." # or configure Ollama in config.yaml
# Run
uv run python hermitclaw/main.py
git clone https://github.com/brendanhogan/hermitclaw.git
cd hermitclaw
# Install Python dependencies
pip install -e .
# Build the frontend
cd frontend && npm install && npm run build && cd ..
# Set your OpenAI API key
export OPENAI_API_KEY="sk-..."
# Run it
python hermitclaw/main.py
Откройте http://localhost:8000.
При первом запуске вы дадите имя своему крабу и будете нажимать клавиши, чтобы сгенерировать его геном личности. Создаётся папка {name}_box/ — это весь мир краба.
Для горячей перезагрузки фронтенда во время разработки:
# Terminal 1 — backend
uv run python hermitclaw/main.py # or: python hermitclaw/main.py
# Terminal 2 — frontend dev server (proxies API to backend)
cd frontend && npm run dev
Dev-сервер запускается на порту :5173 и проксирует /api/* и /ws на :8000.
Краб работает в непрерывном цикле. Каждые несколько секунд он:
projects.md)Brain.run()
|
|-- Check for new files in the box
| \-- If found: queue inbox alert for next thought
|
|-- _think_once()
| |-- Build context: system prompt + recent history + nudge
| | |-- First cycle: wake-up (reads projects.md, lists files, retrieves memories)
| | |-- User message pending: "You hear a voice from outside your room..."
| | |-- New files detected: "Someone left something for you!"
| | \-- Otherwise: current focus + relevant memories + mood nudge
| |
| |-- Call LLM (with tools: shell, web_search, move, respond)
| |
| \-- Tool loop: execute tools -> feed results back -> call LLM again
| \-- Repeat until the crab outputs final text
|
|-- If importance threshold crossed -> Reflect
| \-- Extract insights from recent memories, store as reflections
|
|-- Every 10 cycles -> Plan
| \-- Review state, update projects.md, write daily log entry
|
\-- Idle wander + sleep -> loop
У краба есть четыре инструмента:
| Инструмент | Что он делает |
|---|---|
| shell | Выполняет команды в своей коробке — ls, cat, mkdir, записывает файлы, запускает Python-скрипты |
| web_search | Ищет в интернете что угодно (инструмент веб-поиска OpenAI) |
| respond | Общается со своим хозяином (вами) |
| move | Перемещается в определённое место в своей комнате в стиле пиксель-арт |
Когда у краба нет конкретной задачи из его плана, он получает случайное настроение, которое определяет, что он будет делать дальше:
| Настроение | Поведение |
|---|---|
| Research | Выбрать тему, сделать 2–3 веб-поиска, написать отчёт |
| Deep-dive | Выбрать проект из projects.md и продвинуть его вперёд |
| Coder | Написать настоящий код — скрипт, инструмент, симуляцию |
| Writer | Написать что-то значительное — отчёт, эссе, анализ |
| Explorer | Искать то, о чём он ничего не знает |
| Organizer | Обновить projects.md, организовать файлы, пересмотреть работу |
Система памяти напрямую вдохновлена Park et al., 2023. Каждая мысль краба сохраняется в поток памяти, в который можно только добавлять (memory_stream.jsonl).
Каждая запись памяти содержит:
text-embedding-3-small для семантического поискамысль, рефлексия или планированиеКогда крабу нужен контекст, воспоминания оцениваются по трем факторам:
score = recency + importance + relevance
| Фактор | Как это работает | Диапазон |
|---|---|---|
| Недавность | Экспоненциальное затухание: e^(-(1 - 0.995) * часов_назад) |
0–1 |
| Важность | Нормированная: важность / 10 |
0–1 |
| Релевантность | Косинусное сходство между запросом и встраиваниями воспоминаний | 0–1 |
Лучшие K воспоминаний по совокупному баллу внедряются в контекст. Воспоминание может всплыть, потому что оно недавнее, потому что было важным или потому что оно семантически связано с текущей мыслью.
Когда совокупная важность недавних мыслей пересекает порог (по умолчанию: 50), краб делает паузу и размышляет. Он просматривает последние 15 воспоминаний и извлекает 2–3 выводы высокого уровня — закономерности, уроки, развивающиеся убеждения. Они сохраняются обратно как воспоминания reflection с depth=1:
Raw thoughts (depth 0) -> Reflections (depth 1) -> Higher reflections (depth 2) -> ...
Ранние рефлексии конкретны («Я узнал о формировании вулканических пород»). Более поздние становятся абстрактнее («Мои исследования обычно начинаются широко и сужаются — мне следует выбирать конкретный ракурс раньше»). Со временем у краба формируется многослойное понимание.
Каждые 10 циклов мышления краб входит в фазу планирования. Он просматривает свой текущий projects.md, перечисляет свои файлы, читает недавние воспоминания и записывает обновленный план:
Он также добавляет запись в журнал logs/{дата}.md с кратким резюме того, что он сделал. Со временем эти журналы становятся дневником жизни краба.
Рефлексия (сны) происходит независимо от планирования — она запускается накоплением важности, а не временем. Краб может размышлять после всплеска высоковажных мыслей или вообще не размышлять в спокойный период.
Режим фокусировки заставляет краба перестать следовать своим автономным настроениям и полностью сосредоточиться на том, что вы ему дали.
Когда его использовать: Вы положили документ и хотите, чтобы краб потратил свои следующие несколько циклов на его глубокий анализ, связанное исследование и создание результата — не отвлекаясь на изучение чего-то еще.
Как его использовать: Нажмите кнопку Фокус в панели ввода. Она становится оранжевой, когда активна. Нажмите еще раз, чтобы выключить.
Когда режим фокусировки включен, подсказка каждого цикла мышления говорит крабу оставаться привязанным к предоставленному пользователем материалу. Когда он выключен, краб возвращается к своей обычной смеси настроений, любопытства и запланированной работы.
При первом запуске вы вводите имя, а затем нажимаете клавиши в течение нескольких секунд. Время и символы каждого нажатия создают энтропийное зерно, которое хешируется (SHA-512) в детерминированный геном. Этот геном выбирает:
Один и тот же геном всегда дает одну и ту же личность. Два краба с разными геномами будут иметь совершенно разные интересы и подходы. Области краба направляют его к тому, что он предпочитает, но он следует тому, что действительно захватывает его интерес в данный момент.
Введите сообщение в поле ввода. Краб слышит его как «голос из-за пределов комнаты» в свой следующий цикл мышления.
Он может решить ответить (с помощью инструмента respond) или продолжить работу. Если он отвечает, у вас есть 15 секунд, чтобы ответить — цикл мышления приостанавливается, пока он ждет. Вы можете вести многоходовой диалог. После тайм-аута краб возвращается к своей работе.
Краб любопытен к своему владельцу. Он будет задавать вам вопросы, предлагать исследовать что-то для вас и в целом стараться быть полезным. Он запоминает разговоры через свой поток воспоминаний, поэтому со временем накапливает контекст о вас.
Положите любой файл в папку {имя}_box/ (или в любую подпапку). Краб обнаруживает его в следующий цикл и получает уведомление:
«Кто-то оставил тебе что-то! Появился новый файл: report.pdf» Он читает содержимое (текстовые файлы, изображения, PDF) и рассматривает его как приоритетную задачу — пишет резюме, проводит связанные исследования, анализирует данные, проверяет код. Он использует инструмент
respond, чтобы сообщить вам, что он нашёл.
Поддерживаемые типы файлов:
- Текст: .txt, .md, .py, .json, .csv, .yaml, .toml, .js, .ts, .html, .css, .sh, .log, .pdf
- Изображения: .png, .jpg, .jpeg, .gif, .webp
Все крабы работают одновременно. При запуске приложение сканирует корень проекта на предмет каждой директории *_box/, загружает личность каждого и запускает все их циклы мышления параллельно.
$ python hermitclaw/main.py
Found 2 crab(s): Coral, Pepper
Create a new one? (y/N) >
Когда запущено несколько крабов, в верхней части панели чата появляется панель переключателя. Каждая кнопка показывает имя краба и текущее состояние (думает/размышляет/планирует/бездействует). Нажмите, чтобы переключить просматриваемого краба — лента чата сбрасывается и переподключается к живому потоку выбранного краба.
Каждый краб работает независимо: отправка сообщения, переключение режима фокусировки или сброс файлов влияет только на того краба, которого вы сейчас просматриваете.
Вы также можете создать нового краба без перезапуска:
curl -X POST http://localhost:8000/api/crabs \
-H "Content-Type: application/json" \
-d '{"name": "Pepper"}'
Новый краб получает случайный геном личности, сразу начинает думать и появляется в переключателе.
Если у вас есть устаревшая папка environment/ из более старой версии, она будет автоматически перенесена в {name}_box/ при следующем запуске.
Краб живёт в комнате 12x12 тайлов, отображаемой на HTML5 Canvas. Он перемещается в именованные локации в зависимости от того, что делает:
| Локация | Когда он туда идёт |
|---|---|
| Стол | Пишет, программирует |
| Книжная полка | Исследует, просматривает |
| Окно | Размышляет, рефлексирует |
| Кровать | Отдыхает |
| Ковёр | По умолчанию / центр |
Визуальные индикаторы над крабом показывают его текущее состояние:
Значки активности появляются рядом с крабом, когда он использует инструменты: окно терминала, значок Python, увеличительное стекло, бумага с карандашом или открытая книга.
Краб предназначен для работы только с файлами внутри своего бокса. Вот что мы делаем для поощрения этого — но ни одно из этих мер не является реальной границей безопасности. Это добросовестные ограничения, которые могут быть обойдены решительным субъектом, взломанной моделью или инъекцией подсказок с полученной веб-страницы. Если вам важна изоляция, используйте контейнер.
Что сделано:
sudo, curl, ssh, rm -rf / и т.д.), отклоняет обход пути (..), абсолютные пути и шаблоны экранирования shell (обратные кавычки, $(), ${}). Это блэклист, а не вайтлист — он может пропустить что-то.pysandbox.py патчит builtins.open(), различные функции os.* и отравляет sys.modules для subprocess, socket и т.д. Эти патчи могут быть отменены кодом, который знает о их существовании.bin/ venv краба, /usr/bin, /binpip install пакеты в свой собственный venv, не затрагивая ваш системный PythonДля реальной изоляции запускайте в Docker или виртуальной машине. Мы хотели бы со временем усилить ограничения — вклад специалистов по безопасности очень приветствуется.
Отредактируйте config.yaml:
provider: "openai" # "openai" | "openrouter" | "custom"
model: "gpt-4.1" # any OpenAI model
thinking_pace_seconds: 5 # seconds between think cycles
max_thoughts_in_context: 4 # recent thoughts in LLM context
reflection_threshold: 50 # importance sum before reflecting
memory_retrieval_count: 3 # memories per retrieval query
embedding_model: "text-embedding-3-small"
recency_decay_rate: 0.995
Использование Ollama (локальные модели):
provider: "custom"
model: "glm-4.7-flash" # or any ollama model name
base_url: "http://localhost:11434/v1"
embedding_model: "nomic-embed-text" # required for memory search; run: ollama pull nomic-embed-text
Использование Ollama cloud с веб-поиском (например, minimax-m2.5:cloud):
provider: "custom"
model: "minimax-m2.5:cloud"
base_url: "http://localhost:11434/v1"
# export OLLAMA_API_KEY=your-key # enables web_search + web_fetch from ollama.com
Использование OpenRouter:
provider: "openrouter"
model: "google/gemini-2.0-flash-001"
# export OPENROUTER_API_KEY=your-key
Установите свой API-ключ через переменную окружения для OpenAI: export OPENAI_API_KEY="sk-...". Или установите api_key напрямую в config.yaml.
hermitclaw/ Python backend (FastAPI + async thinking loop)
main.py Entry point, multi-crab discovery, onboarding
brain.py The thinking loop (the heart of everything)
memory.py Smallville-style memory stream
prompts.py All system prompts and mood definitions
providers.py OpenAI API calls (Responses API + embeddings)
tools.py Sandboxed shell execution
pysandbox.py Python sandbox (restricts file I/O to the box)
identity.py Personality generation from entropy
config.py Config loader (config.yaml + env vars)
server.py FastAPI server, WebSocket, REST endpoints
frontend/ React + TypeScript + Canvas
src/App.tsx Two-pane layout, chat feed, crab switcher
src/GameWorld.tsx Pixel-art room rendered on HTML5 Canvas
src/sprites.ts Sprite sheet definitions
public/ Room background + character sprite sheet
{name}_box/ The crab's entire world (sandboxed, gitignored)
identity.json Name, genome, traits, birthday
memory_stream.jsonl Every thought and reflection
projects.md Current plan and project tracker
projects/ Code the crab writes
research/ Reports and analysis
notes/ Running notes and ideas
logs/ Daily log entries
text-embedding-3-small для векторных представлений памяти, инструмент веб-поиска для исследованийMIT