OpenClaw Skills 技能

Skills 介绍

Skills是OpenClaw中用于添加新功能的模块,每个Skill是一个目录,包含一个SKILL.md 文件(提供Skill功能和对应执行指令给大语言模型),以及可选的脚本或资源。Skills允许用户通过自定义指令和工具来增强OpenClaw助手的功能,使其能够执行特定任务,例如处理问候、运行脚本或访问外部服务。

Skills解决了OpenClaw的扩展性和定制化问题,OpenClaw设计为易于扩展,但默认功能可能有限。通过Skills,用户可以:

  • 灵活添加能力:无需修改核心代码,就能集成自定义操作或集成第三方工具。
  • 模块化管理:每个Skill独立存在,便于开发、测试和共享。
  • 提升效率:将常用任务封装为Skills,让助手自动化执行,减少手动操作。

OpenClaw 每个Skill是独立的一个文件夹,一个完整的Skill文件结构如下:

one_skill_dir
|----SKILL.md    #必须
|----scripts/       #可选
|----references/    #可选
|----assets/       #可选

以上文件解释如下:

  1. SKILL.md

    必须指定的核心文件,该文件中包含技能相关的元数据和执行指令,采用“YAML元数据 + Markdown指令”的混合格式。

    • YAML元数据区(位于文件顶部—内):用于定义Skill的基本属性,元数据区包含name(英文,Skill的唯一标识符,如 hello_world)、description(对Skill功能的简要描述,帮助AI理解何时调用此技能)、requires(可选,声明执行此技能所需依赖的工具列表,如 [“bash”],)

    • Markdown指令区:用自然语言清晰描述AI应如何执行任务。该部分核心原则是导AI“做什么”和“用什么工具做”,而非教授AI基础知识,内容可以包括任务触发条件、分步操作流程、所需调用的工具(如 echo, bash)、输出结果的格式或标准。

  2. 其他目录

    另外三个目录用于存放支持技能运行的资源,使Skill更强大、更独立。

    • scripts/: 存放可执行的Shell、Python等脚本,供Skill指令调用。

    • references/: 存放相关的规范文档、数据表等参考材料。

    • assets/: 存放模板文件、示例图片、配置文件等静态资源。

    OpenClaw按固定路径发现和加载Skill,优先级从高到低为:

    1. 工作区Skill (~/.openclaw/workspace/skills/): 用户自定义开发,仅对当前工作区生效,优先级最高。
    2. 本地Skill (~/.openclaw/skills/): 从ClawHub等社区仓库安装,对所有Agent共享。
    3. 内置Skill: OpenClaw系统自带的基础技能。

自定义Skill

OpenClaw中可以自定义Skill,所有自定义安装的Skills位于工作区“/home/zs/.openclaw/workspace/skills”目录中。自定义Skill步骤如下:

  1. 环境与路径准备

    # 在终端中创建你的Skill目录
    mkdir -p ~/.openclaw/workspace/skills/你的技能名
    
  2. 创建并编写SKILL.md文件

    在创建的技能目录中,新建SKILL.md 文件,准备YAML头和SKILL执行的指令,例如,创建一个名为file_organizer的技能,其SKILL.md 示例内容如下:

    ---
    name: file_organizer
    description: 自动整理指定目录下的文件,按扩展名分类到不同文件夹。
    requires: [“bash”]
    ---
    
    # 文件整理技能
    
    当用户要求整理某个目录时,请执行以下操作:
    
    1.  使用 `bash` 工具,在用户指定的目标目录中,创建 `Images`、`Documents`、`Archives` 子文件夹。
    2.  将所有的 `.jpg`、`.png` 文件移动到 `Images` 文件夹。
    3.  将所有的 `.pdf`、`.docx` 文件移动到 `Documents` 文件夹。
    4.  将所有的 `.zip`、`.tar.gz` 文件移动到 `Archives` 文件夹。
    5.  操作完成后,向用户报告整理结果。
    
  3. 添加辅助工具或者脚本(可选)

    如果技能逻辑复杂,可以将具体命令编写成脚本,放在 scripts/目录下,然后在 SKILL.md 的指令中调用该脚本,而非直接写入冗长的命令,这样更安全、更易维护。

  4. 刷新技能列表并测试

    创建完成后,你需要让OpenClaw重新加载技能库才能生效。可以重启OpenClaw Gateway服务或者在对话过程中输入“刷新Skill”。

自定义Skill案例-HelloWorld

自定义HelloWorld技能,当用户要求打招呼时,调用该技能回复用户。

  1. 创建新文件夹

    mkdir -p ~/.openclaw/workspace/skills/hello-world
    
  2. 编写SKILL.md文件

    在创建的目录中创建 SKILL.md 文件,内容如下:

    ---
    name: hello_world
    description: 一个简单的技能用于打招呼
    requires: [“echo”]
    ---
    
    # 打招呼技能
    
    当用户请求问候时,使用“echo”工具回复:“你好——来自hello-world Skill的问候!”
    
  3. 重启OpenClaw Gateway

    openclaw gateway restart
    
  4. 测试技能

    打开浏览器,访问OpenClaw,可以通过WebUI看到该技能:

    image-20260619235952811

    在对话中输入如下测试技能:

    image-20260620000150561

特别注意:在OpenClaw中直接对话可能会命中Skill,这个与Skill描述有关,如果命中不了,可以显式提示使用xx Skill来回答xx问题。

自定义file_search技能,该技能可以查找OpenClaw工作空间指定类型的文件信息、统计各类文件的数量。

  1. 创建新文件夹

    # 创建技能主目录
    mkdir -p ~/.openclaw/workspace/skills/file-search
    
    # 创建子目录存放脚本
    mkdir -p ~/.openclaw/workspace/skills/file-search/scripts
    
  2. 编写 SKILL.md 文件

    # 进入技能目录,创建SKILL.md文件
    cd ~/.openclaw/workspace/skills/file-search
    

    SKILL.md 内容如下:

    ---
    name: file_search
    description: 该技能可以在工作空间中搜索特定扩展名文件信息、查找最近修改的文件信息、统计工作空间中各类文件类型及数量信息。
    ---
    
    # 文件搜索技能
    
    ## 重要说明
    请不要使用find命令! 请使用下面提供的Python脚本进行文件搜索和统计。
    
    ## 功能列表
    1. 搜索特定扩展名的文件 - 使用search_files.py脚本
    2. 查找最近修改的文件 - 使用search_files.py脚本并指定--sort-by time参数
    3. 统计各类文件数量 - 使用file_counter.py脚本
    
    ## 具体使用方法
    
    ### 1. 搜索Python文件(使用Python脚本)
    当用户需要搜索Python文件时,请执行以下命令:
    
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/search_files.py --extension py
    
    
    ### 2. 查找最近修改的Python文件(使用Python脚本)
    当用户需要查找最近修改的Python文件时,请执行以下命令:
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/search_files.py --extension py --sort-by time --max-results 10
    
    
    ### 3. 统计各类文件数量(使用Python脚本)
    当用户需要统计文件类型时,请执行以下命令:
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/file_counter.py
    
    
    ## 参数说明
    
    ### search_files.py参数:
    - --extension:文件扩展名(如py、md、txt),不需要点号
    - --max-results:最大显示结果数量,默认20
    - --sort-by:排序方式:name(名称)、size(大小)、time(修改时间)
    
    ### file_counter.py参数:
    - --top-n:显示前N种最常见的文件类型,默认10
    - --min-count:只显示出现次数大于此值的文件类型
    
    ## 示例对话
    
    用户:"使用file_search技能查询工作空间中所有Python文件,然后找出最近10修改的文件,并统计该空间内各类文件数量"
    
    助手应该执行以下三个命令:
    1. 搜索所有Python文件:
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/search_files.py --extension py
    
    
    2. 找出最近10个修改的Python文件:
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/search_files.py --extension py --sort-by time --max-results 10
    
    
    3. 统计各类文件数量:
    
    python3 /home/starzy/.openclaw/workspace/skills/file-search/scripts/file_counter.py
    
  3. 准备python代码

    将如下 search_files.py 和 file_counter.py 文件复制到Ubuntu目录 ~/.openclaw/workspace/skills/file-search/scripts 中。

    search_files.py:

    """
    文件搜索器脚本 - 在工作空间中搜索特定类型的文件
    """
    
    import json
    import argparse
    from pathlib import Path
    
    def search_files(extension, max_results=20, sort_by="name"):
        """搜索指定扩展名的文件"""
        # Path.home() 表示用户主目录
        workspace_path = Path.home() / ".openclaw" / "workspace"
        # workspace_path = Path("D:/BigDataArchitect-master/bigdata_hbase/notes")
        if not workspace_path.exists():
            return {"error": f"工作空间目录不存在: {workspace_path}"}
    
        # 初始化文件列表,用于存储符合条件的文件信息
        files = []
        # 使用rglob递归搜索工作空间下所有指定扩展名的文件, f"*.{extension}" 构建搜索模式,如 "*.txt"
        for file_path in workspace_path.rglob(f"*.{extension}"):
            # 确保找到的是文件而非目录
            if file_path.is_file():
                # 获取文件状态信息(大小、修改时间等)
                stat = file_path.stat()
                # 将文件信息添加到列表中
                files.append({
                    "path": str(file_path.relative_to(workspace_path)),  # 相对路径,相对于工作空间
                    "size": stat.st_size,  # 文件大小(字节)
                    "modified": stat.st_mtime  # 文件最后修改时间(时间戳)
                })
    
        # 排序
        if sort_by == "size":
            # 按文件大小降序排序(较大的文件先显示)
            files.sort(key=lambda x: x["size"], reverse=True)
        elif sort_by == "time":
            # 按修改时间降序排序(最新的先显示)
            files.sort(key=lambda x: x["modified"], reverse=True)
        else:  # 默认按名称升序排序(字典序)
            files.sort(key=lambda x: x["path"])
    
        # 限制结果数量
        files = files[:max_results]
    
        return {
            "workspace": str(workspace_path),
            "extension": extension,
            "total_files": len(files),
            "files": files
        }
    
    def main():
        # 创建命令行参数解析器
        parser = argparse.ArgumentParser(description='搜索OpenClaw工作空间中的文件')
        # 添加必需参数:文件扩展名(-e或--extension),文件扩展名(如txt、py、md),不需要点号
        parser.add_argument('--extension', '-e', required=True)
        # 添加可选参数:最大结果数(-n或--max-results),最大显示结果数量,默认20
        parser.add_argument('--max-results', '-n', type=int, default=20)
        # 添加可选参数:排序方式(-s或--sort-by),排序方式:name(名称)、size(大小)、time(修改时间)
        parser.add_argument('--sort-by', '-s', default="name",
                           choices=["name", "size", "time"])
    
        # 解析参数
        args = parser.parse_args()
    
        result = search_files(args.extension, args.max_results, args.sort_by)
        print(json.dumps(result, indent=2, ensure_ascii=False))
    
    if __name__ == "__main__":
        main()
    

    file_counter.py:

    """
    文件类型统计脚本 - 统计OpenClaw工作空间中各类文件的数量
    """
    
    import json
    import argparse
    from pathlib import Path
    from collections import Counter
    
    
    def get_file_extension(filename):
        """获取文件的扩展名"""
        if '.' in filename:
            return filename.split('.')[-1].lower()
        return "无扩展名"
    
    
    def count_file_types():
        """统计工作空间中各类文件的数量"""
        # Path.home() 表示用户主目录
        workspace_path = Path.home() / ".openclaw" / "workspace"
        # workspace_path = Path("D:/BigDataArchitect-master/bigdata_hbase/notes")
    
        if not workspace_path.exists():
            return {"error": f"工作空间目录不存在: {workspace_path}"}
    
        # 创建Counter对象,用于自动计数每种扩展名的文件数量
        file_counter = Counter()
        # 总文件数计数器
        total_files = 0
    
        # 统计所有文件
        for file_path in workspace_path.rglob("*"):
            # 只处理文件,忽略目录
            if file_path.is_file():
                file_extension = get_file_extension(file_path.name)
                file_counter[file_extension] += 1
                total_files += 1
    
        # 转换为排序后的列表(按文件数量降序)
        sorted_files = sorted(
            file_counter.items(),
            key=lambda x: x[1],
            reverse=True
        )
    
        # 计算百分比
        file_stats = []
        for extension, count in sorted_files:
    
            file_stats.append({
                "extension": extension, # 文件扩展名
                "count": count, # 文件数量
            })
    
        return {
            "workspace": str(workspace_path), # 工作空间路径
            "total_files": total_files, # 总文件数
            "file_types_count": len(file_counter), # 文件类型数量
            "file_stats": file_stats # 文件类型统计列表
        }
    
    
    def filter_results(file_stats, top_n=None, min_count=1):
        """过滤和限制结果数量"""
        # 先按最小数量过滤
        filtered_stats = [
            stat for stat in file_stats
            if stat["count"] >= min_count
        ]
    
        # 再按top_n限制数量
        if top_n is not None and top_n > 0:
            filtered_stats = filtered_stats[:top_n]
    
        return filtered_stats
    
    
    def main():
        parser = argparse.ArgumentParser(description='统计OpenClaw工作空间中各类文件的数量')
        # 添加参数, 显示前N种最常见的文件类型
        parser.add_argument('--top-n', '-n', type=int, default=None)
        # 添加参数, 只显示出现次数大于此值的文件类型
        parser.add_argument('--min-count', '-m', type=int, default=1)
        # 添加参数, 以人类可读格式输出
        parser.add_argument('--human', action='store_true')
    
        args = parser.parse_args()
    
        # 统计文件类型
        result = count_file_types()
    
        if "error" in result:
            print(json.dumps(result, indent=2, ensure_ascii=False))
            return
    
        # 过滤结果,根据用户指定的top_n和min_count
        if args.top_n is not None or args.min_count > 1:
            filtered_stats = filter_results(
                result["file_stats"],
                args.top_n,
                args.min_count
            )
            result["file_stats"] = filtered_stats
            result["displayed_types"] = len(filtered_stats)
    
        # 打印统计结果
        print(f"工作空间: {result['workspace']}")
        print(f"文件总数: {result['total_files']:,}")
        print(f"文件类型数量: {result['file_types_count']}")
        print(f"显示类型数量: {result.get('displayed_types', result['file_types_count'])}")
        print("\n文件类型统计:")
        for stat in result["file_stats"]:
            ext = stat["extension"]
            count = stat["count"]
            # 对齐打印:扩展名左对齐宽度15,数量左对齐宽度10
            print(f"文件扩展名: {ext:<15} 文件数量: {count:<10,}")
    
    
    if __name__ == "__main__":
        main()
    
  4. 重启OpenClaw Gateway

    openclaw gateway restart
    
  5. 测试技能

    打开浏览器,访问OpenClaw,可以通过WebUI看到该技能:

    image-20260620003518821

    在对话中输入如下测试技能:

    使用 file_search skill技能统计工作空间中文件类型及数量
    
    使用 file_search skill技能给我统计工作空间中 md 文件信息
    
    使用 file_search skill技能查找工作空间中最近修改的python文件有哪些?
    

    image-20260620004211644

    注意:如果使用不到对应的Skill,可以在对话过程中明确提示检查xx路径中的skill技能,这样在对话中可以发现并使用对应skill。

ClawHub Skills

OpenClaw中还可以通过ClawHub搜索公开、免费的Skill。ClawHub是OpenClaw的官方公共技能中心,完全免费开放且每个skill都有版本历史,地址:https://clawhub.ai/skills 。如果想为OpenClaw助手添加新功能,ClawHub是最简单的查找和安装技能的方式。

此外,推荐一个Skills中国网站:https://hub.cocoloop.cn/

ClawHub Skill安装及使用

使用ClawHub前提是需要在Ubuntu系统中安装clawhub,执行命令:

npm i -g clawhub

如果你知道某个skill名称,可以通过如下命令进行搜索及安装:

#ClawHub搜索指定Skill
clawhub search "china"

#ClawHub 安装对应skill
clawhub install "china-news"

#ClawHub更新Skill(非必须,有新版本是可以执行更新)
clawhub update "china-news"

image-20260620004941228

以上安装完成之后,可以进入到工作空间“/home/starzy/.openclaw/workspace/skills”路径中看到有对应目录。

image-20260620005131809

安装新Sill后,重启OpenClaw Gateway,使OpenClaw识别新技能:

openclaw gateway restart

除了这种方式搜索安装技能外,还可以直接进入OpenHub官网搜索技能,找到对应技能名称再进行安装:

image-20260620005947760

image-20260620010121818

重启OpenClaw后,在对话中使用Skill:

openclaw gateway restart

image-20260620010651099

注意:如果需要删除安装的Skill,直接进入对应目录删除skill数据目录即可,也可以执行“clawhub delete [skill_name]”删除,这种方式需要登录clawhub。

ClawHub Skill使用示例

1. 搜索微信公众号文章

wechat-article-search:https://clawhub.ai/wuchubuzai2018/wechat-article-search

安装及重启:

# 安装skill
clawhub install "wechat-article-search"

# 该脚本依赖NodeJS依赖包 cheerio,建议先执行全局安装或在项目中安装:
npm install -g cheerio

# 重启gateway
openclaw gateway restart

使用如下,如果找不到该技能,对话中多提示几次。

image-20260620065640200

2. 聚合新闻

News-aggregator:国内外社会、科技、军事新闻汇总。自动搜索、筛选、整理新闻要点。该工具需要安装tavily或者web-fetch,需要通过联网工具搜索信息。

news-aggregator:https://clawhub.ai/httencn/news-aggregator

安装及重启:

#安装skill
clawhub install "news-aggregator"

#重启gateway
openclaw gateway restart

使用如下:

image-20260620071732014

3. 获取抖音热榜

douyin-hot-trend:获取抖音热榜/热搜榜数据,包含热门视频、挑战赛、音乐等多领域热门内容,并输出标题、热度值、跳转链接及封面图(如有)。

douyin-hot-trend:https://clawhub.ai/franklu0819-lang/douyin-hot-trend

安装及重启:

#安装skill
clawhub install "douyin-hot-trend"

#重启gateway
openclaw gateway restart

使用如下:

image-20260620073431623

其他推荐:

--- 本文结束 The End ---