Бесплатные модели, телеграм-бот и суб-агенты

Прогресс не стоит на месте, и вот уже люди догадались дать «искусственному интеллекту» доступ к своим «железкам» 😊. Весело — без сомнений, полезно — возможно, небезопасно — сто процентов. В интернете полно гайдов о том, как запустить и настроить OpenClaw. Но знаете что? Они все какие-то поверхностные, что ли. Все эти гайды можно разделить на два типа. Первый: «Я подключил LLM от Anthropic за 100 баксов в месяц, а потом просил бота настроить самого себя. Через неделю (и 100B токенов) у меня получилось добавить не лагающий полезный скилл» =)). Второй: «Для установки OpenClaw пишем команду в терминал, нажимаем сюда, выбираем сюда. Для подключения Telegram копируем код, который он прислал, и отправляем команду. Всё». На этом инструкция заканчивается. Я решительно собираюсь исправить эту ситуацию своей статьёй!
Началось всё с того, что по работе мне нужно было автоматизировать некоторые задачи. Сначала для автоматизации я хотел использовать n8n. Но когда начал разбираться, понял, что n8n очень хорошо настраивается под одну конкретную задачу. А мне хотелось, чтобы я мог автоматизировать решение сразу «класса задач». Например, проверка документов разного типа с возможностью поиска информации в интернете и сохранение отчета. Да и к тому же мне не очень хотелось разбираться во всех этих инструментах построения workflow (времени на это реально нет). И тут я наткнулся на OpenClaw.
Хайп вокруг этой штуки нешуточный. Посмотрите только на объемы потребляемых токенов на OpenRouter. Все они идут на обслуживание маленьких "клешнявых помощников".

Статья получилась неоправданно объемной, и пришлось разбить её на две части. Во второй части я расскажу, как настроить команду агентов и их взаимодействие между собой. Надеюсь, она появится в ближайшее время. Итак, приступим.
Оглавление:
- Настройка raspberry pi
- Установка OpenClaw
- Нас��ройка OpenClaw
--- web ui
--- модели
--- сессии
--- файлы.md
--- heartbeat
--- инструменты (tools)
--- навыки (skills)
--- настройка телеграм
--- cron
- Запуск OpenClaw
- Доп. Агенты
- СубАгенты
Настройка Raspberry Pi
Кажется, этой статьи бы не случилось, не будь у меня под рукой (в комоде под толстым слоем пыли) всем нам хорошо знакомой малинки. Когда-то давно мне подарили её на день рождения, и с тех пор Raspberry Pi лежала без дела, имея на борту 8 ГБ оперативной памяти. Но время пришло.
Для настройки Raspberry Pi я частично пользовался вот этой статьей и видеороликами в интернете.
# установка библиотек apt install -y curl gnupg lsb-release jq tmux lxd # меняем права доступа для ключей chmod 700 /home/claw/.ssh # назначаем правильные права на файл и передаем владение папкой пользователю claw: chmod 600 /home/claw/.ssh/authorized_keys chown -R claw:claw /home/claw/.ssh # защита SSH sudo sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config sudo sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config systemctl restart ssh # ограничение размера логов sudo sed -i 's/^#SystemMaxUse=.*/SystemMaxUse=100M/' /etc/systemd/journald.conf sudo sed -i 's/^SystemMaxUse=.*/SystemMaxUse=100M/' /etc/systemd/journald.conf systemctl restart systemd-journald journalctl --vacuum-size=100M # скачиваем и устанавливаем nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash # вместо перезапуска оболочки применяем изменения в текущей сессии: \. "$HOME/.nvm/nvm.sh" # скачиваем и устанавливаем Node.js #(можно не делать, установится автоматически командой для установки бота - OpenClaw): nvm install 22 # проверить версию Node.js: node -v # должно вывести "v22.22.0" # в соседнем окне терминала создаем SSH-туннель для проброса портов (понадобится позже) ssh -N -L 18789:127.0.0.1:18789 claw@192.168.2.236
Чтобы бот работал внутри контейнера (на Raspberry Pi):
# устанавливаем lxc sudo apt-get install zfsutils-linux -y sudo lxd init # не паримся, просто прожимаем Enter много раз # запускаем контейнер sudo lxc launch ubuntu:24.04 openclawbot # где openclawbot — это название нашего контейнера
Для следующего запуска и остановки контейнера используются команды lxc start <container’s name> и lxc stop <container’s name>. Посмотреть все контейнеры: sudo lxc list --columns=n,s. Удалить контейнер: sudo lxc rm <container’s name>
# заходим в контейнер (чтобы установить бота) sudo lxc exec openclawbot -- bash #(Лучше перед установкой нашего бота в контейнер обновить пакеты: apt-get update, apt-get dist-upgrade -y, apt-get autoremove --purge -y.)
Установка OpenClaw
Raspberry Pi настроена, далее нужно установить OpenClaw в контейнер.
Включаем VPN и в контейнере выполняем команду (если нет VPN, копируем файл install.sh, создаем локально такой же файл на Raspberry Pi и вы��олняем bash install.sh):
curl -fsSL https://openclaw.ai/install.sh | bash
После установки необходимых пакетов запускаем настройщик (OpenClaw в режиме онбординга):
openclaw onboard --install-daemon # флаг позволяет OpenClaw создать демона для systemd
Нажимаем ModelAuth provider
Выбираем °OpenRouter
Выбираем модель. Если модели нет в списке, выбираем «Enter model manually» и добавляем её вручную. На данном этапе мы можем выбрать только одну модель, но чуть позже мы добавим ещё несколько. Советую: openrouter/z-ai/glm-4.5-air:free.
Жмём °Channels
Выбираем Telegram, после чего OpenClaw попросит передать ему API-токен, полученный при создании Telegram-бота в чате "BotFather". Подключением Telegram мы займемся позже, после того как отредактируем конфигурационные файлы OpenClaw.
Поскольку OpenClaw запущен в контейнере, systemd gateway daemon не сможет стартовать. Вы увидите такое сообщение: «systemd user services are unavailable; install/enable systemd or run the gateway under your supervisor.» Это не проблема, потому что мы запустим OpenClaw gateway вручную.
После установки можно проверить работу системы:
openclaw doctor # проверка конфигурации openclaw status # статус gateway # openclaw dashboard # открыть веб-интерфейс
На этом этапе (да и в дальнейшем) можно выйти из контейнера (exit) и создать снапшот контейнера, чтобы в любой момент можно было восстановить контейнер:
lxc snapshot openclawbot install # подразумевается, что этот снапшот был сделан сразу после установки OpenClaw
Если в дальнейшем что-то сломается, восстановить работу контейнера openclawbot можно будет из снапшота install: lxc restore openclawbot install.
Настройка OpenClaw
Если вы предпочитаете настраивать агента через веб-интерфейс, то вот вам команда, которая его запускает. Но учтите: в этой статье нет ничего про использование Web UI.
Web Ui
Чтобы веб-интерфейс заработал, нужно запустить шлюз с дополнительным параметром -- «порт»:
openclaw gateway --port 18789
Затем зайти на адрес 127.0.0.1:18789 (чтобы подключаться с рабочего хоста, должны быть проброшены порты, см. «создаём SSH-туннель»).
Адрес: http://localhost:18789/#token=b373fb33996f356519ada7c523454ae2e341fkej570c9808e
Токен можно посмотреть в openclaw.json по ключу gateway.auth.token:
cat .openclaw/openclaw.json
Есть те, кто настраивает OpenClaw с помощью самого OpenClaw. Просто пишут запрос агенту в Telegram, чтобы он исправил сам себя. Для того чтобы это сработало, нужна хорошая («умная») модель типа Claude-Sonnet ≥ 4.5. Во-первых, не у всех она есть. А во-вторых, даже после такой настройки не лишним будет проверить, что же конкретно изменилось в конфигах. Если вы понимаете, как это работает, хуже от этого не будет.
Таким образом, мы пойдём по третьему пути и будем редактировать конфиги вручную.
.openclaw/openclaw.json — основной конфигурационный файл, находится в директории .openclaw. Чтобы открыть и отредактировать файл, используем nano или любой другой редактор:
nano openclaw.json
Модели
Для начала давайте добавим ещё моделей в наш конфиг. Мы будем использовать бесплатные модели от OpenRouter (проверяйте список актуальных моделей самостоятельно):
▫ openrouter/arcee-ai/trinity-large-preview:free
▫ openrouter/tngtech/tng-r1t-chimera:free
▫ openrouter/qwen/qwen3-coder:free
▫ openrouter/qwen/qwen3-next-80b-a3b-instruct:free
▫ openrouter/z-ai/glm-4.5-air:free
▫ и т. д.
Alias и imageModel
Открываем конфиг и указываем, какая модель будет использоваться как основная (primary). Общий совет: не использовать дорогую и тяжеловесную модель в качестве основной. Дело в том, что агент может выполнять работу в параллельном режиме. Т. е. агент с его настройками клонируется, задача разбивается на несколько подзадач, и каждый клон решает свой кусочек большой задачи (декомпозиция). При этом клоны (как и основной main-агент) могут пользоваться разными моделями, указанными в конфиге, для решения своей подзадачи. Сценарий работы примерно такой: основная модель (primary) получает задачу, выбирает, какими силами её решать, запускает клонов агента с разными моделями под капотом, получает результат и отправляет пользователю.
Поэтому указываем несколько доступных моделей в конфиге main-агента и для сложных задач выбираем модель побольше. Добавляем сокращённые имена моделей (alias). Также добавляем модель для обработки изображений.
nano .openclaw/openclaw.json
{ agents: { defaults: { model: { primary: "openrouter/z-ai/glm-4.5-air:free", fallbacks: ["openrouter/arcee-ai/trinity-large-preview:free"], }, models: { "openrouter/arcee-ai/trinity-large-preview:free": { alias: "trinity" }, "openrouter/z-ai/glm-4.5-air:free": { alias: "air" }, }, imageModel: { primary: "openrouter/qwen/qwen-2.5-vl-72b-instruct:free", fallbacks: ["openrouter/google/gemini-2.0-flash-vision:free"], }, thinkingDefault: "low", verboseDefault: "off", elevatedDefault: "on", timeoutSeconds: 600, mediaMaxMb: 5, contextTokens: 200000, maxConcurrent: 3, }, }, }
Как видим, в качестве основной выбрана более легковесная модель, а также добавлены ссылки (alias), которые позволяют указывать в тексте сообщения (или в команде боту), какую модель использовать. fallbacks — запасные варианты, здесь можно перечислить несколько моделей. Например, добавить ещё openrouter/tngtech/tng-r1t-chimera:free. Ссылки (alias) не обязательно должны быть связаны с названием модели. Вы можете указать роль или специализацию той или иной модели, просто отразив это в названии. Например, ссылка может быть «secretary», «coder» или «security», ну вы поняли.
Synthetic provider
Мы используем OpenRouter в качестве провайдера, максимальная, доступная (бесплатная) версия GLM на данный момент — 4.5. В документации OpenClaw говорится, что если использовать Synthetic в качестве провайдера, то можно пользоваться бесплатно GLM-4.7. Бесплатные модели "synthetic":

Так ли это на самом деле, я не проверял, и где взять API-ключ Synthetic, я не знаю.
Также из плюшек есть OpenCode с opus-4.6 (opencode/claude-opus-4-6) — дешевле, чем от Anthropic. Но для этого нужно иметь Zen-API-key (openclaw onboard --opencode-zen-api-key "$OPENCODE_API_KEY").
Локальные модели
Чтобы добавить локальную модель, используется Ollama. Сначала установите Ollama и скачайте модель. Потом добавьте в конфигурацию apiKey: «ollama-local» и перепишите конфиг шлюза.
Install Ollama, then pull a model: ollama pull llama3.3 # or ollama pull gpt-oss:20b # or ollama pull qwen2.5-coder:32b # or ollama pull deepseek-r1:32b # Configure in your config file openclaw config set models.providers.ollama.apiKey "ollama-local"
.openclaw/openclaw.json:
{ agents: { defaults: { model: { primary: "ollama/llama3.3" } }, }, }
На этом с моделями можно закончить.
SESSION
При обращении к агенту запускается новая сессия (если период между обращениями > 15 мин). В 4 утра по местному времени создаётся новая сессия. У сессии есть своё ограничение по токенам контекста, которое OpenClaw берёт из описания модели провайдером. Когда контекст заполняется на ~90%, вызывается автоматическое сжатие контекста (Compaction).
Если вы планируете предоставить доступ к вашему OpenClaw другим пользователям и хотите, чтобы у каждого пользователя был свой файл сессии, то вам нужно указать это в настройках.
dmScope
Открываем файл ~/.openclaw/openclaw.json и меняем dmScope (по умолчанию — main):
{ session: { // Secure DM mode: isolate DM context per channel + sender. dmScope: "per-channel-peer", }, }
Возможны четыре варианта настройки dmScope (DirectMessage Scope):
main (по умолчанию): все пользователи совместно используют основную сессию для обеспечения непрерывности взаимодействия с агентом.
per-peer: изолированные сессии по идентификатору отправителя.
per-channel-peer: изолировать по каналу + отправитель (рекомендуется для многопользовательских почтовых ящиков). Как я понял, если вы хотите, чтобы в Telegram и WhatsApp у вас были разные сессии, используйте этот параметр.
per-account-channel-peer: изолировать по учётной записи + каналу + отправителю (рекомендуется для почтовых ящиков с несколькими учётными записями). Если вы хотите, чтобы два ваших аккаунта в Telegram имели разные сессии.
(Если один и тот же человек связывается с вами по нескольким каналам, используйте session.identityLinks для объединения его личных сообщений в один канонический идентификатор.)
Проверить настройки личных сообщений можно с помощью команды openclaw security audit.
maintenance
Можно настроить, где и в каком количестве хранятся ваши сессии, а также через сколько дней удалять/сжимать файлы сессии.
session.maintenance.mode: warn
Доступны два режима: «warn» и «enforce». В режиме «warn» шлюз сообщает, что будет удалено, но не изменяет записи сессий (т. е. не переписывает существующие файлы). В режиме «enforce» происходит удаление и архивация записей.
session.maintenance.pruneAfter: 30d # Записи старше этого периода будут удалены
session.maintenance.maxEntries: 500 # Максимальное количество записей
session.maintenance.rotateBytes: 10mb # заменять session.json, когда размер файла превысит указанное количество дискового пространства
session.maintenance.resetArchiveRetention: по умолчанию используется значение pruneAfter (30d)
Советы по настройке этих параметров:
используйте mode: "enforce" в продакшене, чтобы рост ограничивался автоматически;
устанавливайте ограничения по времени и количеству (pruneAfter + maxEntries), а не только по одному из этих параметров;
запускайте openclaw sessions cleanup --dry-run --json после изменения кон��игурации;
и т. д.
Пример openclaw.json с настройками сессий:
{ session: { maintenance: { mode: "enforce", pruneAfter: "45d", maxEntries: 800, rotateBytes: "20mb", resetArchiveRetention: "14d", }, }, }
полезные команды:
openclaw status # показывает путь к хранилищу и последние сеансы openclaw sessions --json # выводит все записи сессий
И советую почитать доку по настройке сессии — там много чего ещё есть.
Основная сессия (main) сохраняется в: ~/.openclaw/agents/main/sessions/sessions.json
Проверить текущие сессии: openclaw sessions list
AGENTS.md
системный промт
Далее редактируем AGENTS.md. Этот файл содержит описание того, как агент должен себя вести, например в групповых чатах, или что делать при старте сессии и т. п. Самый первый и самый важный файл контекста, который поступает в LLM. Находится по адресу .openclaw/workspace/AGENTS.md.
На самом деле изначально он заполнен какой-то непонятной чушью. И если вы пользуетесь дешёвой LLM или, как я, бесплатной, с небольшим (128K) окном контекста, то в исходном виде он будет скорее ухудшать ответы, чем помогать с ними. Поэтому смело удаляйте содержимое файла и добавляйте в него примерно такие строки:
SESSION INITIALIZATION RULE: On every session start: 1. Load ONLY these files: - SOUL.md - USER.md - IDENTITY.md - memory/YYYY-MM-DD.md (if it exists) 2. DO NOT auto-load: - MEMORY.md - Session history - Prior messages - Previous tool outputs 3. When user asks about prior context: - Use memory_search() on demand - Pull only the relevant snippet with memory_get() - Don't load the whole file 4. Update memory/YYYY-MM-DD.md at end of session with: - What you worked on - Decisions made - Leads generated - Blockers - Next steps
Эти правила я взял у одного ютубера, который утверждает, что сократил расход токенов своим агентом на 97%. Вот полный список того, что он советует изменить.
Добавляем в системный промт (файл AGENTS.md) правила по использованию моделей. Например, такие:
MODEL SELECTION RULE: Default: Always use Haiku Switch to Sonnet ONLY when: - Architecture decisions - Production code review - Security analysis - Complex debugging/reasoning - Strategic multi-project decisions When in doubt: Try Haiku first
Также стоит добавить правила, ограничивающие количество и скорость запросов LLM-ок:
RATE LIMITS: - 5 seconds minimum between API calls - 10 seconds between web searches - Max 5 searches per batch, then 2-minute break - Batch similar work (one request for 10 leads, not 10 requests) - If you hit 429 error: STOP, wait 5 minutes, retry
редактируем openclaw.json
Для настройки Агента также отредактируем openclaw.json. Прописываем
{ agent: { skipBootstrap: true } }
Также я советую использовать блочную передачу сообщений, если вы пользуетесь Telegram для общения с агентом. Для этого:
openclaw config set agents.defaults.blockStreamingDefault "on" openclaw config set agents.defaults.blockStreamingBreak "text_end"
Ещё можно почитать про настройку стриминга сообщений Telegram: Live stream preview (message edits). Это настройка похожа на блочную передачу сообщений, о которой говорилось ранее.
compaction
В настройках сессии мы уже говорили о том, что OpenClaw производит автоматическое сжатие контекста сессии (compaction). Сжатие объединяет старые диалоги в компактную сводную запись, при этом последние сообщения сохраняются без изменений. Параметрами сжатия также можно управлять:
{ agents: { defaults: { compaction: { mode: "safeguard", // default | safeguard reserveTokensFloor: 24000, // резервный уровень токенов memoryFlush: { // сброс данных из памяти enabled: true, softThresholdTokens: 6000, // мягкие пороговые значения токенов systemPrompt: "Session nearing compaction. Store durable memories now.", prompt: "Write any lasting notes to memory/YYYY-MM-DD.md; reply with NO_REPLY if nothing to store.", }, }, }, }, }
Для принудительного вызова сжатия контекста сессии используйте команду /compact в Telegram.
context pruning
Кроме сжатия контекста существует ещё сокращение контекста (context pruning). Отличие в том, что:
Compaction: обобщает и сохраняет историю сессий в формате JSONL.
Context pruning: по запросу удаляет старые результаты работы с конкретным инструментом (tool) из контекста перед отправкой в LLM. Не изменяет историю сеансов на диске.
{ agents: { defaults: { contextPruning: { mode: "cache-ttl", ttl: "5m" } } }, }
Включить «обрезку» с поддержкой инструмента ttl.
SOUL.md
.openclaw/workspace/SOUL.md
Файл для описания «характера» бота: его привычки, стиль общения и т. п. Расположен в директории workspace (.openclaw/workspace/SOUL.md).
IDENTITY.md
.openclaw/workspace/IDENTITY.md
Хранит имя агента, кто он по происхождению и т. д. Заполняем на своё усмотрение.
USER.md
Данные о пользователе: как зовут, чем увлекается, где работает и т. д.
.openclaw/workspace/USER.md
HEARTBEAT.md
«Биения сердца». Действия, которые бот выполняет раз в 30 минут (и жрёт токены). Подумайте, нужно ли оно вам, прежде чем что-то сюда прописывать.
В конфиг-файле также можно указать, какую модель использовать для выполнения heartbeat («сердцебиений»), и задать время (поставьте "every": "0m", чтобы отключить heartbeat):
"heartbeat": { "every": "2h", "model": "openrouter/meta-llama/llama-3.3-70b-instruct:free", "session": "main", "target": "slack", "prompt": "Check: Any blockers, opportunities, or progress updates needed?" }
ПРОМЕЖУТОЧНЫЙ ИТОГ
Если говорить о MD-файлах (AGENT/SOUL/IDENTITY и т. д.), то для выполнения задач агенту не требуется знать всю эту чушь о вас и историю переписки за последнюю неделю. Ему нужны чёткие правила поведения, такие, чтобы он не запостил ваши API-ключи в интернет и не удалил чувствительные файлы ОС. Весь этот контекст требуется только чтобы ответы агента вам нравились и вам казалось, что перед вами не просто тупая LLM, а живое существо, пусть и примитивное, но наивное и доброе. Поэтому любые задачи стараемся перераспределить на суб-агентов. Которым не нужен весь этот контекст — им нужны только чёткие границы, цели и инструменты достижения успеха. Да, мне кажется, наилучший сценарий использования OpenClaw-бота — это превратить main-агента в милого и наивного секретаря (бесплатная модель на OpenRouter), который отдаёт ваши задачи опытным монстрам, прожжённым профессионалам, с сотнями миллиардов параметров под капотом и платой за их услуги.
ИНСТРУМЕНТЫ (TOOLS)
профили
По умолчанию в OpenClaw установлено порядка 20 инструментов, которые позволяют работать с файлами, работать в терминале, пользоваться браузером, записывать голосовые сообщения и т. д.
Интересно тут то, что инструменты объединены в группы. Например, есть группа инструментов для работы с файлами — «fs», в которую входят: «read», «write», «edit», «apply_patch». Есть группа «web» с инструментами «web_search», «web_fetch» («web_fetch» — анализ URL-ссылки). И так далее. Также есть готовые профили инструментов, которые включают в себя как отдельные tool, так и группы tool-ов.
Пользователю предлагается задать те или иные инструменты для работы агента. Можно указать агенту, какие инструменты использовать (allow), а какие находятся под запретом (deny). Выглядеть это может примерно так:
{ tools: { profile: "messaging", allow: ["slack", "discord"], deny: ["browser"], }, }
Выбран профиль «messaging», который включает в себя: «group:messaging», «sessions_list», «sessions_history», «sessions_send», «session_status». Также перечислены доступные мессенджеры ("slack", "discord") и запрет на использование браузера.
Или другой пример (выбран профиль «кодирование», но с запретом на выполнение/запуск процессов):
{ tools: { profile: "coding", deny: ["group:runtime"], }, }
Всё это указывается по ключу agents. Также можно настроить политику использования инструментов для конкретного провайдера.
loopDetection
Забавно, что в OpenClaw есть инструмент, позволяющий отслеживать зацикливания (loop-detection), но по умолчанию он выключен. ?!? Включить его можно с помощью tools.loopDetection.enabled: true:
{ tools: { loopDetection: { enabled: true, }, }, }
НАВЫКИ (SKILLS)
При первом запуске пропускаем эту настройку.
Если говорить совсем просто, то скиллы — это файлы с описанием алгоритма действий для решения той или иной задачи: какую задачу решает, какие инструменты использовать, на каких сайтах можно прочитать документацию и т. д. Т. е. скилл — это контекст, загружаемый в LLM, чтобы ей легче было решить ту или иную задачу, чтобы не объяснять несколько раз одно и то же. Файлы скиллов, а вернее текст в них, оформляются в специальном заданном формате. Также в скиллах можно указать скрипты, которые могут пригодиться, например img_reader.py, который хранится в той же директории. У каждого навыка есть два файла: SKILL.md и YAML-заголовок (front matter).
По умолчанию есть несколько скиллов: healthcheck — аудит безопасности, skill-creator — создание скиллов, video-frames — обработка видео, weather — погода. Есть два типа навыков — общие для всех агентов и личные навыки каждого агента. Общие навыки хранятся в директории .openclaw/skills/<skill_name>/. Личные навыки агента хранятся в директории .openclaw/workspace-<agentId>/skills/<skill_name>/
Навыки можно добавлять вручную, можно скачивать готовые (но только после проверки информации, которую содержат файлы скиллов). По умолчанию в OpenClaw имеется навык по созданию навыков =)). Советую пользоваться им, но аккуратно.
хаб скиллов: https://clawhub.ai/
установить навык:
openclaw skills add <skill name>
TUI (terminal UI)
Есть те, кто предпочитает общаться с агентом в терминале. Не могу вам этого запретить, поэтому оставлю команду вызова интерфейса:
tmux openclaw tui
Мы же будем подключать Telegram, и всё наше взаимодействие с OpenClaw будет происходить там.
TELEGRAM
dmPolicy
После того как мы отредактировали все основные файлы, можем добавить общение в Telegram. Для этого нам нужно будет запустить gateway.
Пишем сообщение боту. На первое сообщение (когда параметр dmPolicy: pairing) он пришлёт код (Pairing code: NWDA92HN). Его нужно скопировать и выполнить команду в терминале (не в tui-сессии):
openclaw pairing approve telegram <код> # код действителен 1 час
После того как произошло сопоставление, бот начнёт отвечать и выполнять ваши команды.
Настройки OpenClaw, в том числе и Telegram, хранятся в .openclaw/openclaw.json.
Чтобы добавить других пользователей, которые смогут общаться с вашим ботом, ищем в openclaw.json «channels.telegram.dmPolicy». channels.telegram.dmPolicy контролирует правила доступа к сообщениям, возможны четыре варианта: [pairing, allowlist, open, disabled].
Меняем состояние "pairing" на "allowlist" и указываем ID пользователей:
{ channels: { telegram: { dmPolicy: "allowlist", allowFrom: ["123456789", "987654321"] } } }
Проверить allowlist: openclaw config get channels.telegram.allowFrom
Мультиаккаунт в Telegram
Как уже было сказано, можно сделать так, чтобы для каждого пользователя создавалась отдельная сессия (dmScope: "per-account-channel-peer") и контексты разных людей не влияли друг на друга. Но также можно создать дополнительного агента (и, соответственно, Telegram-бота), который будет отвечать в разных чатах. Например, агент для работы и агент для дома.
{ channels: { telegram: { accounts: { default: { name: "Primary bot", botToken: "123456:ABC...", }, alerts: { name: "Alerts bot", botToken: "987654:XYZ...", }, }, }, }, }
Дополнительную информацию о том, как это сделать, смотри в разделе «Агенты».
Команды в телеграм-боте:
Список команд доступных в телеграм боте по умолчанию:
Команда | Значение | Команда | Значение |
/help | Показать доступные команды | /compact | Сжать файлы контекста |
/commands | Перечислить все команды | /think | Установить уровень модели |
/skill | Запустить навык (по названию) | /verbose | Переключить в подробный режим |
/status | Текущее состояние | /reasoning | Переключить видимость рассуждений |
/approve | Утвердить/отклонить запросы на выполнение (exec) | /elevated | Переключить повышенный режим |
/context | Объяснить как использовать контекст | /exec | Установить значение «exec» по умолчанию |
/export_session | Экспортировать текущую сессию | /model | Текущая модель или задать модель |
/tts | Управление функцией текст в речь | /models | Доступные модели |
/whoami | Указать свой ID | /queue | Изменить параметры очереди |
/subagents | Запустить субагента (имя) | /dock_telegram | Перекючиться на телеграм |
/kill | Остановить субагента | /dock_discord | Перекючиться на дискорд |
/steer | Отправить команду субагенту | /dock_slack | Перекючиться на слак |
/usage | Информация об затратах | /healthcheck | Проверка состояния здоровья |
/stop | Остановить выполнение | /skill_creator | Создатель навыков |
/restart | Перезапустить openclaw | /tmux | Удаленное управление сеансами |
/activation | Режим групповой активации | /weather | Текущая погода |
/send | Задать политику отправки сообщений | /pair | Установить код для сопряжения устройства |
/reset | Сбросить текущий сеанс | /phone | Включение/выключения телефонного узла |
/new | Начать новый сеанс | /voice | Задать голос аудиосообщений |
Добавление кастомных команд. Чтобы добавить свою собственную команду, нужно опять изменить конфиг-файл:
{ channels: { telegram: { customCommands: [ { command: "backup", description: "Git backup" }, { command: "generate", description: "Create an image" }, ], }, }, }
При создании кастомных команд помните, что:
имена нормализованы (сначала «/», потом идут строчные буквы);
допустимые символы: a-z, 0-9, _, длина 1..32;
пользовательские команды не могут переопределять собственные команды, конфликты/дубликаты пропускаются.
политика повторных попыток
Настройка политики повторных попыток. Иногда при взаимодействии с Telegram сервера могут вернуть ошибку (429, timeout, connect/reset/closed, temporarily unavailable). «Политика повторных попыток» говорит, что делать в таком случае:
{ channels: { telegram: { retry: { attempts: 3, // попытки (сколько раз будем повторять запрос) minDelayMs: 400, // минимальная задержка отправки сообщения maxDelayMs: 30000, // максимальная задержка jitter: 0.1, // дрожание (?), задаётся в процентах (от 0 до 1) }, }, }, }
Очередь сообщений
Входящие сообщения могут управлять текущим обращением к агенту, как если бы вы хотели уточнить ваш запрос по мере его выполнения. Сообщения могут ожидать следующего вызова агента (накапливаться в очереди) или выполнять обе функции:
steer: немедленно внедряется в текущий запрос (отменяет ожидающие выполнения вызовы инструментов после перехода к следующему инструменту). Если потоковая передача не используется, приступает к выполнению.
followup: ставится в очередь для следующего шага агента после завершения текущего этапа.
collect: объединяет все сообщения в очереди в одну следующую команду (по умолчанию). Если сообщения предназначены для разных каналов/потоков, они обрабатываются по отдельности для сохранения маршрутизации.
steer-backlog (также steer+backlog): выполняется в момент отправки сообщения и сохраняется для последующего шага.
{ messages: { queue: { mode: "collect", debounceMs: 1000, cap: 20, // максимальное количество сообщений в очереди за сеанс drop: "summarize", // политика переполнения, можно установить [old, new, summarize] byChannel: { discord: "collect" }, }, }, }
drop: "summarize" — сохраняет краткий список удалённых сообщений и вводит его в виде синтетического промпта при следующем обращении.
inbound messages
Быстрые последовательные сообщения от одного и того же отправителя могут быть объединены в один ответ агента с помощью messages.inbound:
{ messages: { inbound: { debounceMs: 2000, byChannel: { whatsapp: 5000, telegram: 2500, discord: 1500, }, }, }, }
CRON (проактивный бот)
Cron позволяет настраивать выполнение задач по расписанию. Например:
# Утренняя личная подборка, каждый день в 9:00 openclaw cron add --name "Утро" --cron "0 9 * * *" \ --message "Погода, календарь, важные письма, результат Лиги Чемпионов"
Вообще (забудем на секунду про openclaw), cron — это утилита, для выполнения регулярных задач в UNIX-подобных опрационных системах, предназначенная для автоматического выполнения команд или скриптов по заданному расписанию. Регулярные действия, описываются инструкциями, помещенными в файл /etc/crontab. Структура записи cron:
* * * * * <user> <comand> * * * * * - минута, час, день, месяц, день недели (* - значит любой) <user> - от имени кого выполнить <comand> - команда
Примеры записей в cron:
* * * * * touch file - каждую минуту выполнять команду touch file 0 * * * * touch file2 - раз в каждый час, в нулевую минуту, выполнять команду touch file2 0 0 * * * touch file3 - раз в день, в 00:00 выполнять команду touch file3 3 5 15 * * touch file4 - 15-го числа любого месяца в 05:03 выполнять команду touch file4 10 15 20 5 * touch file5 - каждого 20-го мая в 15:10 */5 * * * * touch file6 - раз в 5 минут 0 9,18 * * * touch fil7 - в 09:00 и 18:00 0 0 * * 1-5 touch file8 - каждую полночь с понедельника по пятницу
Надеюсь, вы поняли).
Предполагаю, openclaw cron придерживается такой же логики в обозначениях для управления расписанием задач.
Запуск OpenClaw
Наконец-то можно стартовать:
Запускаем tmux-сессию. Это делается для того, чтобы openclaw gateway у нас постоянно работал, даже после закрытия терминала.
(Работа в tmux: <(CTRL + b) + c> — новое окно, <(CTRL + b) + w> — список окон, <(CTRL + b) + n> — следующее окно, <(CTRL + b) + x> — закрыть окно, <(CTRL + b) + d> — отключиться от сессии, <tmux attach> — подключиться к сессии.)
tmux # Для переключения между окнами сессии используйте (ctrl+b) + n
Заходим в контейнер и запускаем шлюз:
openclaw gateway # Restart the Gateway: openclaw gateway restart
С помощью tmux создаём новое окно:
(CTRL + b) + c
Если хотим общаться в терминале:
openclaw tui
ДОПОЛНИТЕЛЬНЫЕ АГЕНТЫ
Мы можем добавить дополнительного агента. Например, один будет помогать нам с рабочими задачами, а второй — «по дому». Для этого сначала командой добавим нового агента, а потом в конфиг-файле пропишем каналы для общения с агентами.
#Смотрим на имеющихся агентов: display help openclaw agents -h #Вывести список агентов: openclaw agents list
Добавление агента:openclaw agents add <agent’s name> # напр., openclaw agents add alerts
Выбираем каталог для сохранения настроек и файлов агента.
Выбираем модель, которую агент будет использовать.
При этом создаётся дополнительное рабочее пространство .openclaw/workspace-<agentId>. В котором хранятся файлы AGENTS.md, SOUL.md и т. д. Настраивать каждого агента нужно отдельно.
Перезапускаем наш шлюз и проверяем, что всё нормально:
openclaw gateway restart openclaw agents list --bindings openclaw channels status --probe
Файл конфигурации должен измениться:
{ agents: { list: [ { id: "main", workspace: "~/.openclaw/workspace-main" }, { id: "alerts", workspace: "~/.openclaw/workspace-alerts" }, ], }, bindings: [ { agentId: "main", match: { channel: "telegram", accountId: "default" } }, { agentId: "alerts", match: { channel: "telegram", accountId: "alerts" } }, ], channels: { telegram: { accounts: { default: { botToken: "123456:ABC...", dmPolicy: "pairing", }, alerts: { botToken: "987654:XYZ...", dmPolicy: "allowlist", allowFrom: ["tg:123456789"], }, }, }, }, }
Обратите внимание, что в данном примере агенты подключены к разным телеграм-ботам. Вы же можете использовать не только телеграм но и другие площадки.
СУБАГЕНТЫ
Субагенты это клоны основного агента, запущенные фоном с параллельностью до 8 штук. Они спавнятся когда нужно решить сложную задачу. Цель использования субагентов — это распараллеливание работы над «исследованием / длительной задачей / медленным инструментом», не блокируя основной процесс. Субагенты на создают отдельный файл сессии и не имеют доступа к некоторым инструментам (sessions_spawn и др.). Если не указано явно (в конфиге agents.defaults.subagents.model (или agents.list[].subagents.model для каждого агента)), а также не прописано в системном промте, то субагент по умолчанию использует ту же модель что и основной агент.
Конец (вместо выводов и заключения)
Хотел ещё написать более подробно про cron и про skills, но статья и так уже получилась слишком большой (про навыки и крон, немного написано здесь). В дальнейшем планирую создать команду из агентов и прогнать их по каким-нибудь бенчмаркам. Сдаётся мне, что если не захламлять контекст модели одной большой задачей, а, наоборот, декомпозировать её и раздать группе агентов-помощников, то результаты будут хорошими. Это я и собираюсь проверить. Пишите, если было интересно. Оставляйте свои лайфхаки в комментариях. Как вы думаете реально OpenClaw так хорош или это очередной проект который просто хайпится? Cпасибо, что дочитали до конца. Удачи! Всем жму краба!

