Wróć

07. OpenClaw — wprowadzenie do tworzenia Skills: stwórz swoją pierwszą umiejętność

Krok po kroku tworzymy pierwszą umiejętność OpenClaw. Od analizy struktury SKILL.md po kompletny przykład — opis umiejętności, projektowanie słów wyzwalających, integracja narzędzi, testowanie i publikacja, pomagając dodać własne możliwości do asystenta AI.

Dotyczy OpenClaw v2026.2 | Artykuł zakłada znajomość podstaw Markdown i wiersza poleceń oraz chęć tworzenia własnych umiejętności.

TL;DR: Do utworzenia Skill wystarczy jeden plik SKILL.md. Kluczowe pola: name, version, triggers (słowa wyzwalające), tools (lista narzędzi). Umieść w ~/.openclaw/workspace/skills/<name>/SKILL.md. Słowa wyzwalające powinny być konkretne, aby uniknąć konfliktów. Publikacja na ClawHub: openclaw skill publish <name>. Obejmuje skanowanie bezpieczeństwa i kontrolę uprawnień.

Przygotowanie środowiska deweloperskiego

Wymagania wstępne

Wymaganie Opis
OpenClaw Zainstalowany i uruchomiony
Edytor tekstu VS Code lub dowolny edytor
Podstawy Markdown SKILL.md używa formatu Markdown
Dokumentacja API Jeśli integrujesz usługi zewnętrzne, przygotuj dokumentację API

Utworzenie katalogu umiejętności

# Utworzenie katalogu umiejętności
mkdir -p ~/.openclaw/workspace/skills/weather-api

# Przejście do katalogu
cd ~/.openclaw/workspace/skills/weather-api

# Utworzenie podstawowych plików
touch SKILL.md
touch README.md
touch config.json.example

Struktura katalogów

weather-api/
├── SKILL.md              # Definicja umiejętności (wymagane)
├── README.md             # Dokumentacja (zalecane)
├── config.json.example   # Przykład konfiguracji (opcjonalne)
├── src/                  # Kod źródłowy (opcjonalne)
│   └── index.js
└── package.json          # Deklaracja zależności (opcjonalne)

Szczegółowa analiza struktury SKILL.md

Podstawowa struktura

---
# Frontmatter: metadane
name: skill-name
version: 1.0.0
author: your-name
description: Brief description
triggers:
  - trigger-1
  - trigger-2
dependencies: []
tools: []
---

# Skill Title

Detailed description...

## Features
## Setup
## Usage Examples
## Configuration
## Notes

Pola Frontmatter

Pole Wymagane Opis
name Unikalny identyfikator, małe litery i łączniki
version Wersja semantyczna
author Nazwa autora lub organizacji
description Krótki opis (jedno zdanie)
triggers Lista słów wyzwalających
dependencies ⚠️ Zależności od innych umiejętności
tools ⚠️ Lista udostępnianych narzędzi

Projektowanie słów wyzwalających

Słowa wyzwalające to klucz do rozpoznawania umiejętności przez agenta:

triggers:
  - weather
  - pogoda
  - forecast
  - prognoza
  - temperature
  - temperatura
  - rain
  - deszcz
  - umbrella
  - parasol

Zasady projektowania:

Zasada Opis Przykład
Konkretność Unikaj zbyt ogólnych słów gmail-sendsend
Wielojęzyczność Obsługuj różne języki weather pogoda
Kontekstowość Uwzględnij scenariusze użycia check-weather weather-tomorrow
Brak konfliktów Sprawdź konflikty z istniejącymi umiejętnościami openclaw skill search weather

Praktyka: tworzenie umiejętności zapytań pogodowych

Analiza wymagań

Tworzymy umiejętność zapytań pogodowych z funkcjami:

  1. Sprawdzanie bieżącej pogody
  2. Prognoza na kilka dni
  3. Obsługa nazw miast w wielu językach
  4. Porady dotyczące ubioru

Kompletny SKILL.md

---
name: weather-api
version: 1.0.0
author: your-name
description: Query weather information from OpenWeatherMap API
triggers:
  - weather
  - pogoda
  - forecast
  - prognoza
  - temperature
  - temperatura
  - rain
  - deszcz
  - umbrella
  - parasol
dependencies: []
tools:
  - weather_current
  - weather_forecast
---

# Weather API Skill

Query weather information for any city worldwide. Provides current weather and forecasts with practical suggestions.

## Features

- **Current Weather**: Get real-time weather conditions
- **Forecast**: 5-day weather forecast
- **Multi-language**: Support for city names in multiple languages
- **Smart Suggestions**: Clothing and activity recommendations

## Setup

### 1. Get API Key

1. Visit [OpenWeatherMap](https://openweathermap.org/api)
2. Sign up for a free account
3. Generate an API key

### 2. Configure the Skill

Set the environment variable:

\`\`\`bash
export OPENWEATHER_API_KEY="your-api-key-here"
\`\`\`

Or add to your OpenClaw config:

\`\`\`json
{
  "skills": {
    "weather-api": {
      "apiKey": "your-api-key-here",
      "units": "metric",
      "lang": "pl"
    }
  }
}
\`\`\`

## Usage Examples

### Current Weather

User: "Jaka jest pogoda w Warszawie"
User: "What's the weather in Tokyo"
User: "Check weather for London"

Action:
1. Parse city name from user message
2. Call weather_current tool with city parameter
3. Format and return weather information

### Weather Forecast

User: "Czy jutro będzie padać"
User: "Prognoza na 3 dni dla Krakowa"
User: "Jaka będzie pogoda w weekend"

Action:
1. Parse city name and days from user message
2. Call weather_forecast tool
3. Format forecast data into readable summary

### Smart Suggestions

User: "Czy dziś potrzebuję parasola"
User: "W co się ubrać"
User: "Czy można uprawiać sport na zewnątrz"

Action:
1. Get current weather
2. Analyze conditions (rain, temperature, UV)
3. Provide practical suggestions

## Tools

### weather_current

Get current weather for a city.

**Parameters:**
- `city` (string, required): City name, can be in any language
- `units` (string, optional): "metric", "imperial", or "kelvin". Default: "metric"
- `lang` (string, optional): Language code. Default: "pl"

**Returns:**
\`\`\`json
{
  "city": "Warsaw",
  "country": "PL",
  "temperature": 25,
  "feels_like": 27,
  "humidity": 65,
  "wind_speed": 12,
  "condition": "Partly cloudy",
  "icon": "02d",
  "suggestion": "Light jacket recommended, no rain expected"
}
\`\`\`

### weather_forecast

Get weather forecast for up to 5 days.

**Parameters:**
- `city` (string, required): City name
- `days` (number, optional): Number of days (1-5). Default: 3
- `units` (string, optional): Temperature units

**Returns:**
\`\`\`json
{
  "city": "Warsaw",
  "forecast": [
    {
      "date": "2026-02-27",
      "temp_high": 28,
      "temp_low": 18,
      "condition": "Sunny",
      "rain_chance": 0
    },
    ...
  ]
}
\`\`\`

## Configuration Options

| Option | Type | Default | Description |
|--------|------|---------|-------------|
| `apiKey` | string | - | OpenWeatherMap API key |
| `units` | string | "metric" | Temperature units |
| `lang` | string | "pl" | Language for descriptions |
| `cache_ttl` | number | 600 | Cache duration in seconds |

## Error Handling

The skill handles common errors:

- **City not found**: Suggests similar city names
- **API key invalid**: Prompts user to check configuration
- **Rate limit**: Queues request and retries
- **Network error**: Falls back to cached data if available

## Notes

- Free tier allows 1000 requests/day
- City names support Polish: "Warszawa", "Kraków", "Gdańsk"
- Results are cached for 10 minutes by default
- Consider upgrading to paid tier for more frequent updates

Implementacja narzędzi (opcjonalna)

Jeśli Twoja umiejętność wymaga wykonywania konkretnych operacji, możesz dodać implementację narzędzi.

Prosty sposób: użycie wbudowanych narzędzi

OpenClaw ma wbudowane narzędzia web_search i read, które możesz bezpośrednio opisać w SKILL.md:

## Implementation Notes

To get weather data:

1. Use `web_search` tool to find weather API
2. Use `read` tool to fetch JSON response
3. Parse and format the data

Example search query: "weather API Warsaw current temperature"

Zaawansowany sposób: własny skrypt narzędzia

Utwórz src/index.js:

// src/index.js
const axios = require('axios');

const OPENWEATHER_BASE_URL = 'https://api.openweathermap.org/data/2.5';

async function weather_current({ city, units = 'metric', lang = 'pl' }, config) {
  const apiKey = config.apiKey || process.env.OPENWEATHER_API_KEY;
  
  if (!apiKey) {
    throw new Error('OpenWeatherMap API key not configured');
  }

  try {
    const response = await axios.get(`${OPENWEATHER_BASE_URL}/weather`, {
      params: {
        q: city,
        appid: apiKey,
        units,
        lang
      }
    });

    const data = response.data;
    
    // Generowanie sugestii na podstawie warunków
    let suggestion = '';
    if (data.rain || data.weather[0].main === 'Rain') {
      suggestion = 'Weź parasol, spodziewany deszcz';
    } else if (data.main.temp < 15) {
      suggestion = 'Ubierz się ciepło, niska temperatura';
    } else if (data.main.temp > 30) {
      suggestion = 'Pij dużo wody, wysoka temperatura';
    } else {
      suggestion = 'Przyjemna pogoda, miłego dnia';
    }

    return {
      city: data.name,
      country: data.sys.country,
      temperature: data.main.temp,
      feels_like: data.main.feels_like,
      humidity: data.main.humidity,
      wind_speed: data.wind.speed,
      condition: data.weather[0].description,
      icon: data.weather[0].icon,
      suggestion
    };
  } catch (error) {
    if (error.response?.status === 404) {
      throw new Error(`Miasto "${city}" nie znalezione. Sprawdź pisownię.`);
    }
    throw error;
  }
}

async function weather_forecast({ city, days = 3, units = 'metric' }, config) {
  const apiKey = config.apiKey || process.env.OPENWEATHER_API_KEY;
  
  if (!apiKey) {
    throw new Error('OpenWeatherMap API key not configured');
  }

  try {
    const response = await axios.get(`${OPENWEATHER_BASE_URL}/forecast`, {
      params: {
        q: city,
        appid: apiKey,
        units,
        cnt: days * 8 // 8 prognoz dziennie (co 3 godziny)
      }
    });

    const data = response.data;
    
    const dailyForecasts = {};
    data.list.forEach(item => {
      const date = item.dt_txt.split(' ')[0];
      if (!dailyForecasts[date]) {
        dailyForecasts[date] = {
          temp_high: item.main.temp_max,
          temp_low: item.main.temp_min,
          conditions: [item.weather[0].main],
          rain_chance: item.pop * 100
        };
      } else {
        dailyForecasts[date].temp_high = Math.max(dailyForecasts[date].temp_high, item.main.temp_max);
        dailyForecasts[date].temp_low = Math.min(dailyForecasts[date].temp_low, item.main.temp_min);
        if (!dailyForecasts[date].conditions.includes(item.weather[0].main)) {
          dailyForecasts[date].conditions.push(item.weather[0].main);
        }
        dailyForecasts[date].rain_chance = Math.max(dailyForecasts[date].rain_chance, item.pop * 100);
      }
    });

    return {
      city: data.city.name,
      forecast: Object.entries(dailyForecasts)
        .slice(0, days)
        .map(([date, info]) => ({
          date,
          temp_high: Math.round(info.temp_high),
          temp_low: Math.round(info.temp_low),
          condition: info.conditions.join('/'),
          rain_chance: Math.round(info.rain_chance)
        }))
    };
  } catch (error) {
    if (error.response?.status === 404) {
      throw new Error(`Miasto "${city}" nie znalezione. Sprawdź pisownię.`);
    }
    throw error;
  }
}

module.exports = {
  weather_current,
  weather_forecast
};

package.json

{
  "name": "weather-api",
  "version": "1.0.0",
  "description": "Weather API skill for OpenClaw",
  "main": "src/index.js",
  "dependencies": {
    "axios": "^1.6.0"
  },
  "openclaw": {
    "skill": "weather-api",
    "tools": ["weather_current", "weather_forecast"]
  }
}

Testowanie umiejętności

Testy lokalne

# Walidacja składni SKILL.md
openclaw skill validate weather-api

# Przykładowy wynik:
# ✅ Frontmatter valid
# ✅ Triggers defined
# ✅ Description present
# ✅ Tools documented

# Załadowanie umiejętności
openclaw skill load weather-api

# Test umiejętności
openclaw agent --message "Jaka jest pogoda w Warszawie"

# Powinny pojawić się informacje pogodowe

Tryb debugowania

# Włączenie logów debugowania
openclaw gateway --verbose --filter skill:weather-api

# Logi ładowania umiejętności
openclaw logs --skill weather-api

Scenariusze testowe

Scenariusz Wejście Oczekiwany wynik
Polskie miasto „Pogoda Warszawa" Informacje o pogodzie w Warszawie
Angielskie miasto „Weather in Tokyo" Informacje o pogodzie w Tokio
Prognoza „Czy jutro będzie padać" Prognoza na jutro
Porady ubioru „W co się dziś ubrać" Sugestia oparta na pogodzie
Obsługa błędów „Pogoda xxx" Komunikat o nieznalezieniu miasta

Publikacja umiejętności

Przygotowanie do publikacji

  1. Kompletna dokumentacja: upewnij się, że README.md jest kompletne
  2. Przykłady użycia: podaj przykłady
  3. Dokładne testy: pokryj różne przypadki brzegowe
  4. Usunięcie danych wrażliwych: usuń klucze API itp.

Publikacja na GitHub

# Inicjalizacja Git
git init
git add .
git commit -m "Initial release of weather-api skill"

# Push na GitHub
git remote add origin https://github.com/your-username/weather-api.git
git push -u origin main

# Utworzenie tagu wydania
git tag v1.0.0
git push origin v1.0.0

Przesłanie na ClawHub

# Publikacja na ClawHub
openclaw skill publish weather-api

# Przykładowy wynik:
# Validating skill...
# ✅ Validation passed
# Publishing to ClawHub...
# ✅ Published successfully!
# 
# Your skill is now available at:
# https://clawhub.com/skills/weather-api

Szablon README.md

# Weather API Skill for OpenClaw

Query weather information from OpenWeatherMap API.

## Features

- Current weather conditions
- 5-day weather forecast
- Multi-language city support
- Smart clothing suggestions

## Installation

\`\`\`bash
openclaw skill install weather-api
\`\`\`

## Configuration

Set your OpenWeatherMap API key:

\`\`\`bash
export OPENWEATHER_API_KEY="your-api-key"
\`\`\`

Or in OpenClaw config:

\`\`\`json
{
  "skills": {
    "weather-api": {
      "apiKey": "your-api-key"
    }
  }
}
\`\`\`

## Usage

Just ask about the weather:

- "Jaka jest pogoda w Warszawie"
- "What's the weather in Tokyo"
- "Czy jutro będzie padać"
- "Czy potrzebuję parasola"

## Requirements

- OpenWeatherMap API key (free tier: 1000 requests/day)
- Internet connection

## License

MIT

Zaawansowane techniki

Wyzwalanie warunkowe

Na podstawie kontekstu decyduj o wyzwoleniu:

## Advanced Triggers

This skill is triggered when:
1. User mentions weather-related keywords
2. User asks about temperature or conditions
3. User needs outdoor activity suggestions

Not triggered when:
- Weather is mentioned metaphorically ("I'm under the weather")
- User is asking about CPU temperature or other technical metrics

Pamięć kontekstowa

Dodaj obsługę kontekstu w SKILL.md:

## Context Handling

When user asks "What about tomorrow?" after a weather query:
1. Check previous context for city name
2. Use the same city for forecast query

When user asks "And in Kraków?" after querying another city:
1. Parse the new city name
2. Compare weather between both cities

Łańcuchowanie umiejętności

Współpraca z innymi umiejętnościami:

## Skill Integration

This skill works well with:
- **calendar**: Suggest events based on weather
- **travel**: Provide weather for travel destinations
- **clothing**: Recommend outfits based on temperature

Example workflow:
User: "Planning a trip to Tokyo next week"
1. Travel skill: Parse destination and dates
2. Weather skill: Get Tokyo forecast
3. Calendar skill: Check existing events
4. Combined response: Trip summary with weather

Obsługa błędów

Elegancka obsługa błędów:

## Error Recovery

When API fails:
1. Check cache for recent data
2. Inform user about the issue
3. Offer alternatives:
   - "I couldn't get live weather data. Want me to try again?"
   - "The weather service is temporarily unavailable. Would you like a general forecast?"

When city not found:
1. Suggest similar city names
2. Ask for clarification
3. Use geolocation if available

Najlepsze praktyki

Standardy dokumentacji

Wymaganie Opis
Jasny opis Jedno zdanie opisujące funkcję umiejętności
Wystarczające przykłady Pokrycie głównych scenariuszy użycia
Instrukcje konfiguracji Szczegółowy opis kroków konfiguracji
Obsługa błędów Lista typowych błędów i rozwiązań
Aktualizacja wersji Prowadzenie CHANGELOG

Bezpieczeństwo

## Security Notes

- Never hardcode API keys in SKILL.md
- Use environment variables or config files
- Validate and sanitize user input
- Rate limit API calls
- Log errors without exposing sensitive data

Optymalizacja wydajności

## Performance Tips

- Cache API responses (10-minute default)
- Use async operations for multiple requests
- Minimize tool calls by batching
- Use compressed responses when available

Podsumowanie

Rdzeń tworzenia Skills to:

  • SKILL.md to dusza: jasna definicja, dokładny opis, wystarczające przykłady
  • Słowa wyzwalające to klucz: rozsądne projektowanie, brak konfliktów, pokrycie scenariuszy
  • Narzędzia to możliwości: pełna implementacja, obsługa błędów, optymalizacja wydajności
  • Dokumentacja to most: pomaga użytkownikom zrozumieć i korzystać z Twojej umiejętności

Dzięki temu artykułowi opanowałeś podstawy tworzenia Skills i możesz zacząć budować własne umiejętności dla OpenClaw.


Podsumowanie artykułu:

  • Zrozumiałeś strukturę i pola SKILL.md
  • Nauczyłeś się zasad projektowania słów wyzwalających
  • Opanowałeś metody implementacji narzędzi
  • Poznałeś proces testowania i publikacji
  • Nauczyłeś się zaawansowanych technik i najlepszych praktyk

Historia zmian:

  • 2026-02-26: Pierwsza wersja, na podstawie OpenClaw v2026.2

Nawigacja po serii: