Создание собственных скиллов для OpenClaw

Создание собственных скиллов для OpenClaw

Пишем кастомные скиллы на TypeScript. От простого Hello World до интеграций с внешними API.

Создание скиллов для OpenClaw

Примечание: OpenClaw ранее назывался MoltBot и Clawdbot. Все команды взаимозаменяемы (openclaw, moltbot, clawdbot). Скиллы — это модульные расширения OpenClaw. Хочешь интеграцию с умным домом? Скилл. Трекинг криптовалют? Скилл. Любую автоматизацию можно упаковать в скилл.

Структура скилла

my-skill/
├── SKILL.md          # Инструкции для AI
├── package.json      # Метаданные и зависимости
├── src/
│   └── index.ts      # Точка входа
└── scripts/          # Вспомогательные скрипты (опционально)

Быстрый старт: Hello World

Создаём папку

mkdir -p ~/.openclaw/skills/hello-world
cd ~/.openclaw/skills/hello-world

SKILL.md

Это главный файл — инструкции для AI, когда и как использовать скилл:

# Hello World Skill

Используй этот скилл когда пользователь просит поздороваться
или хочет проверить что скиллы работают.

## Команды

### say_hello
Вызови скрипт `scripts/hello.sh` с именем пользователя.

Пример:
- "Скажи привет" → `./scripts/hello.sh "User"`
- "Поздоровайся с Машей" → `./scripts/hello.sh "Маша"`

scripts/hello.sh

#!/bin/bash
NAME="${1:-World}"
echo "👋 Привет, $NAME! OpenClaw работает отлично!"
chmod +x scripts/hello.sh

Тестируем

Пишем боту:

“Скажи привет”

Бот должен выполнить скрипт и ответить.


Продвинутый скилл: Погода

Структура

weather-skill/
├── SKILL.md
├── package.json
└── scripts/
    └── weather.ts

SKILL.md

# Weather Skill

Получает текущую погоду и прогноз для любого города.

## Когда использовать

- Пользователь спрашивает о погоде
- Упоминает город + "погода/weather/температура"
- Просит прогноз

## Команды

### get_weather
```bash
npx ts-node scripts/weather.ts "Название города"

Возвращает JSON с температурой, описанием, влажностью.

Примеры

  • “Какая погода в Москве?” → get_weather “Москва”
  • “Будет ли дождь в Париже?” → get_weather “Paris”

### scripts/weather.ts

```typescript
import https from 'https';

const city = process.argv[2] || 'London';
const apiKey = process.env.OPENWEATHER_API_KEY || 'demo';

const url = `https://api.openweathermap.org/data/2.5/weather?q=${encodeURIComponent(city)}&appid=${apiKey}&units=metric&lang=ru`;

https.get(url, (res) => {
  let data = '';
  res.on('data', chunk => data += chunk);
  res.on('end', () => {
    try {
      const weather = JSON.parse(data);
      console.log(JSON.stringify({
        city: weather.name,
        temp: weather.main.temp,
        feels_like: weather.main.feels_like,
        description: weather.weather[0].description,
        humidity: weather.main.humidity,
        wind: weather.wind.speed
      }, null, 2));
    } catch (e) {
      console.error('Ошибка парсинга:', e);
    }
  });
});

package.json

{
  "name": "weather-skill",
  "version": "1.0.0",
  "description": "Погода для OpenClaw",
  "scripts": {
    "weather": "ts-node scripts/weather.ts"
  },
  "dependencies": {
    "ts-node": "^10.9.0",
    "typescript": "^5.0.0"
  }
}

Best Practices

1. Чёткий SKILL.md

AI читает SKILL.md чтобы понять когда использовать скилл. Пиши конкретно:

❌ Плохо:

Этот скилл делает разные вещи с погодой.

✅ Хорошо:

Используй этот скилл когда пользователь:
- Спрашивает текущую погоду в городе
- Просит прогноз на N дней
- Интересуется температурой, осадками, ветром

2. Обработка ошибок

try {
  const result = await doSomething();
  console.log(JSON.stringify({ success: true, data: result }));
} catch (error) {
  console.log(JSON.stringify({ 
    success: false, 
    error: error.message 
  }));
  process.exit(1);
}

3. Environment Variables

Не хардкодь API ключи:

const apiKey = process.env.MY_API_KEY;
if (!apiKey) {
  console.error('MY_API_KEY не установлен');
  process.exit(1);
}

4. Timeout’ы

const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 10000);

try {
  const response = await fetch(url, { signal: controller.signal });
} finally {
  clearTimeout(timeout);
}

Публикация на ClawHub

Хочешь поделиться скиллом с сообществом?

Подготовка

  1. Добавь README.md с описанием
  2. Добавь LICENSE (MIT рекомендуется)
  3. Убедись что нет захардкоженных секретов

Публикация

# Установи clawhub CLI
npm install -g clawhub

# Авторизуйся
clawhub login

# Публикуй
clawhub publish

Версионирование

# Обнови версию
npm version patch  # 1.0.0 → 1.0.1
npm version minor  # 1.0.0 → 1.1.0
npm version major  # 1.0.0 → 2.0.0

# Опубликуй обновление
clawhub publish

Примеры скиллов из сообщества

СкиллОписание
todoistИнтеграция с Todoist
google-calendarУправление Google Calendar
homeassistantУправление умным домом
crypto-pricesКурсы криптовалют
github-notificationsУведомления GitHub
whoop-statsДанные с WHOOP

Установка:

clawhub install todoist

Debugging

Включаем verbose логи

# openclaw.yaml
logging:
  level: debug
  skills: true

Тестируем скрипт вручную

cd ~/.openclaw/skills/my-skill
./scripts/my-script.sh "test argument"

Смотрим что видит AI

openclaw debug skill my-skill

Итог

Скиллы — мощный способ расширить OpenClaw. Начни с простого bash-скрипта, потом добавляй сложность.

Ключевое:

  1. SKILL.md — чёткие инструкции для AI
  2. Скрипты — делают реальную работу
  3. JSON output — для структурированных данных
  4. Обработка ошибок — graceful degradation