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

Прогресс не стоит на месте, и вот уже люди догадались дать «искусственному интеллекту» доступ к своим «железкам» 😊. Весело — без сомнений, полезно — возможно, небезопасно — сто процентов. В интернете полно гайдов о том, как запустить и настроить 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пасибо, что дочитали до конца. Удачи! Всем жму краба!