Volver

07. Introducción al desarrollo de Skills en OpenClaw: Crea tu primera habilidad

Este artículo te guía paso a paso para desarrollar tu primer Skill de OpenClaw. Desde el análisis de la estructura de SKILL.md hasta un ejemplo completo, cubriendo la definición de habilidades, el diseño de triggers, la integración de herramientas, pruebas y publicación, ayudándote a añadir capacidades personalizadas a tu asistente IA.

Aplica para OpenClaw v2026.2 | Este artículo asume que estás familiarizado con Markdown básico y la línea de comandos, y que deseas crear habilidades personalizadas.

TL;DR: Crear un Skill solo requiere un archivo SKILL.md. Campos principales: name, version, triggers (palabras clave de activación), tools (lista de herramientas). Colócalo en ~/.openclaw/workspace/skills/<name>/SKILL.md. Los triggers deben ser específicos para evitar conflictos. Publicar en ClawHub: openclaw skill publish <name>. Incluye escaneo de seguridad y control de permisos.

Preparación del entorno de desarrollo

Requisitos previos

Requisito Descripción
OpenClaw Instalado y en ejecución
Editor de texto VS Code o cualquier editor
Markdown básico SKILL.md utiliza formato Markdown
Documentación de API Si necesitas integrar servicios externos, prepara la documentación de la API

Crear el directorio del skill

# Crear el directorio del skill
mkdir -p ~/.openclaw/workspace/skills/weather-api

# Entrar al directorio
cd ~/.openclaw/workspace/skills/weather-api

# Crear los archivos básicos
touch SKILL.md
touch README.md
touch config.json.example

Estructura del directorio

weather-api/
├── SKILL.md              # Definición del skill (obligatorio)
├── README.md             # Documentación (recomendado)
├── config.json.example   # Ejemplo de configuración (opcional)
├── src/                  # Código fuente (opcional)
│   └── index.js
└── package.json          # Declaración de dependencias (opcional)

Estructura detallada de SKILL.md

Estructura básica

---
# Frontmatter: metadatos
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

Campos del Frontmatter

Campo Obligatorio Descripción
name Identificador único del skill, letras minúsculas y guiones
version Número de versión semántica
author Nombre del autor u organización
description Descripción breve (una frase)
triggers Lista de palabras clave de activación
dependencies ⚠️ Dependencias de otros skills
tools ⚠️ Lista de herramientas proporcionadas

Diseño de triggers

Los triggers son clave para que el Agent identifique el skill:

triggers:
  - weather
  - 天气
  - forecast
  - 气温
  - temperature
  - rain
  - 下雨
  - umbrella
  - 雨伞

Principios de diseño:

Principio Descripción Ejemplo
Especificidad Evitar palabras demasiado genéricas gmail-sendsend
Multilingüe Soporte para chino e inglés weather 天气
Basado en escenarios Incluir escenarios de uso check-weather weather-tomorrow
Sin conflictos Verificar conflictos con skills existentes openclaw skill search weather

Práctica: Desarrollar un skill de consulta meteorológica

Análisis de requisitos

Vamos a desarrollar un skill de consulta meteorológica con las siguientes funcionalidades:

  1. Consultar el clima actual
  2. Consultar el pronóstico de los próximos días
  3. Soporte para nombres de ciudades en chino e inglés
  4. Proporcionar sugerencias de vestimenta

SKILL.md completo

---
name: weather-api
version: 1.0.0
author: your-name
description: Query weather information from OpenWeatherMap API
triggers:
  - weather
  - 天气
  - forecast
  - 预报
  - temperature
  - 气温
  - rain
  - 下雨
  - umbrella
  - 雨伞
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": "zh_cn"
    }
  }
}
\`\`\`

## Usage Examples

### Current Weather

User: "北京今天天气怎么样"
User: "What's the weather in Tokyo"
User: "Check weather for Shanghai"

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: "明天会下雨吗"
User: "3天天气预报 for New York"
User: "周末天气怎么样"

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: "今天需要带伞吗"
User: "穿什么衣服合适"
User: "适合户外运动吗"

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: "zh_cn"

**Returns:**
\`\`\`json
{
  "city": "Beijing",
  "country": "CN",
  "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": "Beijing",
  "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 | "zh_cn" | 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 Chinese: "北京", "上海", "广州"
- Results are cached for 10 minutes by default
- Consider upgrading to paid tier for more frequent updates

Implementación de herramientas (opcional)

Si tu skill necesita ejecutar operaciones concretas, puedes añadir una implementación de herramientas.

Forma simple: Usar herramientas integradas

OpenClaw incluye herramientas integradas como web_search y read, que se pueden describir directamente en 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 Beijing current temperature"

Forma avanzada: Scripts de herramientas personalizadas

Crear 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 = 'zh_cn' }, 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;
    
    // Generar sugerencia basada en las condiciones
    let suggestion = '';
    if (data.rain || data.weather[0].main === 'Rain') {
      suggestion = 'Bring an umbrella, rain expected';
    } else if (data.main.temp < 15) {
      suggestion = 'Wear warm clothing, temperature is low';
    } else if (data.main.temp > 30) {
      suggestion = 'Stay hydrated, high temperature';
    } else {
      suggestion = 'Pleasant weather, enjoy your day';
    }

    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(`City "${city}" not found. Please check the spelling.`);
    }
    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 pronósticos por día (cada 3 horas)
      }
    });

    const data = response.data;
    
    // Agrupar por día y obtener resumen diario
    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(`City "${city}" not found. Please check the spelling.`);
    }
    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"]
  }
}

Probar el skill

Pruebas locales

# Validar la sintaxis de SKILL.md
openclaw skill validate weather-api

# Ejemplo de salida:
# ✅ Frontmatter valid
# ✅ Triggers defined
# ✅ Description present
# ✅ Tools documented

# Cargar el skill
openclaw skill load weather-api

# Probar el skill
openclaw agent --message "北京今天天气怎么样"

# Deberías ver la información meteorológica

Modo de depuración

# Activar logs de depuración
openclaw gateway --verbose --filter skill:weather-api

# Ver logs de carga del skill
openclaw logs --skill weather-api

Escenarios de prueba

Escenario de prueba Entrada Salida esperada
Ciudad en chino “北京天气” Información meteorológica de Pekín
Ciudad en inglés “Weather in Tokyo” Información meteorológica de Tokio
Consulta de pronóstico “明天会下雨吗” Pronóstico de mañana
Sugerencia de vestimenta “今天穿什么” Sugerencia basada en el clima
Manejo de errores “xxx天气” Mensaje de ciudad no encontrada

Publicar el skill

Preparar la publicación

  1. Completar la documentación: Asegurarse de que README.md esté completo
  2. Añadir ejemplos: Proporcionar ejemplos de uso
  3. Probar a fondo: Cubrir diversos casos límite
  4. Limpiar información sensible: Eliminar API Keys, etc.

Publicar en GitHub

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

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

# Crear etiqueta de versión
git tag v1.0.0
git push origin v1.0.0

Enviar a ClawHub

# Publicar en ClawHub
openclaw skill publish weather-api

# Ejemplo de salida:
# Validating skill...
# ✅ Validation passed
# Publishing to ClawHub...
# ✅ Published successfully!
# 
# Your skill is now available at:
# https://clawhub.com/skills/weather-api

Plantilla de 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:

- "北京今天天气怎么样"
- "What's the weather in Tokyo"
- "明天会下雨吗"
- "今天需要带伞吗"

## Requirements

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

## License

MIT

Técnicas avanzadas

Activación condicional

Decidir si se activa según el contexto:

## 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

Memoria de contexto

Añadir manejo de contexto en 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 Shanghai?" after querying another city:
1. Parse the new city name
2. Compare weather between both cities

Skills encadenados

Colaboración con otros skills:

## 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

Recuperación de errores

Manejo elegante de errores:

## 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

Mejores prácticas

Normas de documentación

Requisito Descripción
Descripción clara Explicar la funcionalidad del skill en una frase
Ejemplos suficientes Cubrir los principales escenarios de uso
Instrucciones de configuración Detallar los pasos de configuración
Manejo de errores Listar errores comunes y sus soluciones
Actualizaciones de versión Mantener un CHANGELOG

Consideraciones de seguridad

## 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

Optimización del rendimiento

## Performance Tips

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

Resumen

Los elementos clave del desarrollo de Skills son:

  • SKILL.md es el alma: Definición clara, descripción precisa, ejemplos suficientes
  • Los triggers son fundamentales: Diseño razonable, sin conflictos, cobertura de escenarios
  • Las herramientas son las capacidades: Implementación completa, manejo de errores, optimización del rendimiento
  • La documentación es el puente: Ayuda a los usuarios a entender y usar tu skill

Con lo aprendido en este artículo, ya dominas los conocimientos básicos del desarrollo de Skills y puedes comenzar a crear habilidades personalizadas para OpenClaw.


Resumen de este artículo:

  • Comprendiste la estructura y los campos de SKILL.md
  • Aprendiste los principios de diseño de triggers
  • Dominaste los métodos de implementación de herramientas
  • Conociste el flujo de pruebas y publicación
  • Aprendiste técnicas avanzadas y mejores prácticas

Historial de actualizaciones:

  • 2026-02-26: Primera versión publicada, basada en OpenClaw v2026.2

Navegación de la serie: