OpenClaw 自定义 Skills 开发实战 —— 自定义生成音乐Skill |

历史文章
微信也能用 OpenClaw!ClawBot 插件接入 OpenClaw 详细指南
微信/企业微信接入腾讯QClaw 一文给你讲清楚 | openclaw系列教程
从0到100万:我用10年打造一人公司的逆袭之路 | 一人公司 | 10年的奋斗里程 | 普通人的逆袭之路 | 真实案例
Seedance 2.0 API 已上线 | 支持「人像视频生成」|支持100并发 | 满血版
先说结论
|
步骤 |
耗时 |
难度 |
|---|---|---|
|
理解 Skill 结构 |
5 分钟 |
⭐ |
|
写 SKILL.md |
10 分钟 |
⭐⭐ |
|
写脚本逻辑 |
10 分钟 |
⭐⭐ |
|
调试 + 测试 |
15 分钟 |
⭐⭐⭐ |
|
发布到 ClawHub |
5 分钟 |
⭐ |
一、为什么要自己写 Skill?
现成的技能或者插件往往是通用型的,可能无法完全满足你的业务逻辑或个人需求。自己写 Skill 可以:
-
定制功能:只做你想要的事情,不多也不少。 -
精准交互:根据用户场景优化问答流程。 -
数据掌控:用户数据和逻辑完全可控,不依赖第三方服务。
自己写 Skill 可以把重复的、机械的任务自动化:
-
自动报表生成 -
智能提醒 -
家庭/办公环境控制(比如 IoT 设备)
开发 Skill 涉及:
-
API 调用 -
数据处理 -
自然语言理解(NLU) -
对话设计
通过自己开发,你可以理解背后的逻辑,比单纯使用别人技能要深入得多。这在职业技能提升上很有价值。
-
可以为特定行业或企业提供定制化技能服务,形成商业化产品。 -
自己写的 Skill 可以卖给平台或者企业,甚至自己开通付费服务。

二、OpenClaw Skill 的结构
一个 Skill 其实就是一个文件夹,核心只需要一个文件:
perl 体验AI代码助手 代码解读复制代码my-smart-reviewer/├── SKILL.md # 必须有,Skill 的灵魂├── scripts/ # 可选,放脚本│ └── analyze.py└── references/ # 可选,放参考文档└── style-guide.md
SKILL.md 才是真正的「代码」。OpenClaw 读这个文件来理解 Skill 该干什么,说白了就是一份结构化的 prompt。
三、Skill如何编写呢?
如果要手动写的话,对于一般人复杂度还是很高的。
这里我们直接和AI互动的方式来编写这个这个skill。
3.1 梳理skill技能
在这里我们要先梳理下,你要实现一个什么skill,是让Ai生成图片,还是做什么事情?
这里我们我们让Ai生成一个音乐的skill。
那这里就要先准备描述信息。
发起音乐的创建:curl --request POST \--url https://dzwlai.com/apiuser/_open/suno/music/generate \--header 'Content-Type: application/json' \--header 'x-token: 这是访问令牌api key' \--data '{"mvVersion": "chirp-v5-5","inputType": "10","makeInstrumental": "false","gptDescriptionPrompt": “来一首”欢快的音乐,"callbackUrl": ""}'响应信息:{"code": 200,"msg": "您已成功提交创作任务,目前剩余并发任务数为9","data": {"taskBatchId": "1067069768483733505","items": [{"id": "1860190112013385729","inputType": "10","gptDescriptionPrompt": "写一首关于兄弟情义的歌","progress": 0,"status": 0,"progressMsg": "排队中..."},{"id": "1860190112013385730","inputType": "10","gptDescriptionPrompt": "写一首关于兄弟情义的歌","progress": 0,"status": 0,"progressMsg": "排队中..."}]}}获取音乐状态:curl --request GET \--url 'https://dzwlai.com/apiuser/_open/suno/music/getState?taskBatchId=音乐任务id' \--header 'x-token: 这是访问令牌api key'响应信息:{"code": 200,"msg": "操作成功","data": {"taskBatchId": "1081015604557119489","taskStatus": "finished","items": [{"id": "1874135948011253762","inputType": "10","makeInstrumental": false,"prompt": "[Verse]\n星光灿烂 夜色朦胧\n孤身一人 梦在路中\n风吹草动 掠过心头\n勇敢前行 不问结果\n\n[Verse 2]\n灯火阑珊 路途寂寞\n披星戴月 心火闪烁\n冰冷夜晚 难以言说\n创业之路 坎坷也走\n\n[Chorus]\n在路上 勇敢追梦\n跌倒再起 不怕坎坷\n沿途风景 无法描述\n心中信念 不曾退缩\n\n[Verse 3]\n黎明前奏 乌云散开\n心心相印 沉默期待\n茫茫天地 携手同行\n创无限未来 希望常在\n\n[Bridge]\n梦想如海 无边无际\n每次失败 亦有新意\n从不后悔 选择远行\n在路上 我们守望\n\n[Chorus]\n在路上 勇敢追梦\n跌倒再起 不怕坎坷\n沿途风景 无法描述\n心中信念 不曾退缩","gptDescriptionPrompt": "歌曲名称《在路上》,低沉的歌声,让所有创业者共鸣 ,把这个改一下,我来改好词给你,","title": "在路上","tags": "acoustic, reflective, folk","negativeTags": "","clipId": "fa03ad72-b5ef-4ad4-a981-bcfa458a6e29","duration": 139.0,"progress": 100,"status": 30,"cld2AudioUrl": "https://cdn1.suno.ai/fa03ad72-b5ef-4ad4-a981-bcfa458a6e29.mp3","cld2ImageUrl": "https://cdn2.suno.ai/image_b639f4e1-549b-4147-bfb8-a9564505951d.jpeg","progressMsg": "Production completed"},{"id": "1874135948011253763","inputType": "10","makeInstrumental": false,"prompt": "[Verse]\n星光灿烂 夜色朦胧\n孤身一人 梦在路中\n风吹草动 掠过心头\n勇敢前行 不问结果\n\n[Verse 2]\n灯火阑珊 路途寂寞\n披星戴月 心火闪烁\n冰冷夜晚 难以言说\n创业之路 坎坷也走\n\n[Chorus]\n在路上 勇敢追梦\n跌倒再起 不怕坎坷\n沿途风景 无法描述\n心中信念 不曾退缩\n\n[Verse 3]\n黎明前奏 乌云散开\n心心相印 沉默期待\n茫茫天地 携手同行\n创无限未来 希望常在\n\n[Bridge]\n梦想如海 无边无际\n每次失败 亦有新意\n从不后悔 选择远行\n在路上 我们守望\n\n[Chorus]\n在路上 勇敢追梦\n跌倒再起 不怕坎坷\n沿途风景 无法描述\n心中信念 不曾退缩","gptDescriptionPrompt": "歌曲名称《在路上》,低沉的歌声,让所有创业者共鸣 ,把这个改一下,我来改好词给你,","title": "在路上","tags": "acoustic, reflective, folk","negativeTags": "","clipId": "71359d0d-1d92-4d88-93a0-df7bccf85727","duration": 143.0,"progress": 100,"status": 30,"cld2AudioUrl": "https://cdn1.suno.ai/71359d0d-1d92-4d88-93a0-df7bccf85727.mp3","cld2ImageUrl": "https://cdn2.suno.ai/image_a6cd0b65-0b99-4e23-9476-17bdcd90d226.jpeg","progressMsg": "Production completed"}]}}taskStatus的取值为 create、processing、finished; finished 完成(用于结束获取音乐生成状态的的判断)包括创作成功和创作失败的情况。
3.2 开始制作Skill
先和Ai互动一下,输入提示词:如何自定义skill呢?


ok,可以开始制作了,将刚刚准备好的信息发给Ai:

发给Ai之后,Ai就开始工作了。


3.3 测试Skill
到这里,就可以开始测试了,如果需要api key的话,将api key给ai:


3.4 优化Skill

3.5 重新走一遍流程
这个时候可以重新走一遍流程:



流程验证通过: 用户输入描述 → 发起创作 → 轮询状态 → 返回音频链接。整个 skill 工作正常。流程
3.6 发布流程
如果你不知道如何发布,也可以和AI沟通:



四、Skill发布
还是咱们一起来手动操作看看。这里用上传到github仓库的方式来进行方式,各大平台大差不差。
地址:https://github.com/
第一步新建一个仓库New repository:

第二步上传这个skill:
你获取的到有可能是 .skill的格式,但实际这个是一个zip的压缩包格式,手动将这个修改为.zip ,然后解压:

将这个目录上传到github上即可:

最后得到这么一个链接地址:
https://github.com/openclaw-ai-opc/suno-music-skill
五、导入Skill进行使用
导入skil可以和ai互动,也可以通过界面的导入按钮进行导入。

输入地址即可:


这个时候就可以正常的进行使用这个skill了。


六、Skill结构解读
这个时候,再来理解这个skill的内容就会好理解很多。
6.1 SKILL.md
---name: suno-musicdescription: AI音乐生成技能。通过 Suno API 创建音乐作品。触发场景:用户要求"生成音乐"、"创作歌曲"、"写歌"、"AI音乐"、"生成BGM"等。支持自然语言描述生成音乐,自动轮询获取生成结果。---# Suno AI 音乐生成## 概述通过 Suno API 实现AI音乐生成。用户只需用自然语言描述想要的音乐风格、主题或内容,系统自动完成音乐创作并返回音频链接。## 快速开始### 1. 发起音乐创作使用 `scripts/generate_music.py` 发起创作任务:```bashpython scripts/generate_music.py --token "<API_TOKEN>" --prompt "欢快的音乐" [--instrumental]```参数:- `--token` (必填): API 访问令牌- `--prompt` (必填): 音乐描述(风格、主题、歌词提示等)- `--instrumental` (可选): 设为 `true` 生成纯音乐(无歌词)- `--callback-url` (可选): 回调地址### 2. 查询生成状态使用 `scripts/get_music_state.py` 轮询获取结果:```bashpython scripts/get_music_state.py --token "<API_TOKEN>" --task-batch-id "<TASK_BATCH_ID>"```参数:- `--token` (必填): API 访问令牌- `--task-batch-id` (必填): 任务批次 ID(发起创作时返回)## 工作流程1. **调用 generate_music.py** 发起创作,获取 `taskBatchId`2. **轮询 get_music_state.py** 检查状态(建议间隔 10-30 秒)3. **状态为 finished 时** 获取音频 URL(`cld2AudioUrl` 字段)### 状态说明| taskStatus | 含义 ||------------|------|| `create` | 任务创建中 || `processing` | 正在生成 || `finished` | 已完成(成功或失败) |单个任务 `status` 字段:`0` 排队中,`30` 生成完成## 输出示例每批创作返回 2 首歌曲,包含:- `title`: 歌曲标题- `duration`: 时长(秒)- `cld2AudioUrl`: 音频下载链接- `cld2ImageUrl`: 封面图片链接- `prompt`: AI 生成的歌词## 注意事项- API Token 需要用户自行获取并配置- 创作并发数有限制(响应中会提示剩余并发数)- 建议用自然语言描述风格,如"欢快的流行音乐"、"低沉的民谣"
让我们拆解这个文件的关键部分:
必填字段:
name
:技能名称,最长 64 个字符,必须和目录名一致 description
:技能描述,这是最关键的字段——AI 就是根据这段描述来判断什么时候该用这个技能
可选但实用的字段:
requires.bins
:运行这个技能需要哪些命令行工具 requires.env
:需要哪些环境变量(比如 API Key) install
:如何一键安装所需依赖 os
:支持的操作系统
Markdown 正文: 就是用自然语言写的操作指南,告诉 AI “第一步做什么、第二步做什么、遇到什么情况怎么处理”。
6.2 Scripts
这个是脚本,就是要执行什么脚本进行什么操作。
#!/usr/bin/env python3"""Suno AI 音乐生成 - 发起创作任务"""import argparseimport jsonimport urllib.requestimport urllib.errorAPI_URL = "https://dzwlai.com/apiuser/_open/suno/music/generate"def generate_music(token: str, prompt: str, instrumental: bool = False, callback_url: str = "") -> dict:"""发起音乐创作任务Args:token: API 访问令牌prompt: 音乐描述(风格、主题、歌词提示等)instrumental: 是否生成纯音乐(无歌词)callback_url: 回调地址(可选)Returns:API 响应 JSON"""payload = {"mvVersion": "chirp-v5-5","inputType": "10","makeInstrumental": str(instrumental).lower(),"gptDescriptionPrompt": prompt,"callbackUrl": callback_url}headers = {"Content-Type": "application/json","x-token": token}data = json.dumps(payload).encode("utf-8")req = urllib.request.Request(API_URL, data=data, headers=headers, method="POST")try:with urllib.request.urlopen(req, timeout=30) as response:return json.loads(response.read().decode("utf-8"))except urllib.error.HTTPError as e:error_body = e.read().decode("utf-8") if e.fp else ""return {"code": e.code, "msg": f"HTTP Error: {e.code}", "error": error_body}except urllib.error.URLError as e:return {"code": -1, "msg": f"Connection Error: {e.reason}"}def main():parser = argparse.ArgumentParser(description="Suno AI 音乐生成 - 发起创作任务")parser.add_argument("--token", required=True, help="API 访问令牌")parser.add_argument("--prompt", required=True, help="音乐描述")parser.add_argument("--instrumental", action="store_true", help="生成纯音乐(无歌词)")parser.add_argument("--callback-url", default="", help="回调地址")args = parser.parse_args()result = generate_music(token=args.token,prompt=args.prompt,instrumental=args.instrumental,callback_url=args.callback_url)print(json.dumps(result, ensure_ascii=False, indent=2))# 如果成功,提取 taskBatchId 便于后续查询if result.get("code") == 200:data = result.get("data", {})task_batch_id = data.get("taskBatchId")if task_batch_id:print(f"\n💡 查询命令: python scripts/get_music_state.py --token <TOKEN> --task-batch-id {task_batch_id}")if __name__ == "__main__":main()
这里用的python的脚本信息。
总结
好了,看到这里,你可能已经心里暗暗嘀咕:哇,这也太复杂了吧?别急,实际操作起来,比你想象的简单多了——理解结构、写描述、敲几行脚本、点几下按钮,30 分钟,你也能拥有自己的 AI 小助手。
写 Skill 就像做饭:一开始看着食谱可能手忙脚乱,但其实大部分步骤都是“加点料、翻翻锅、尝尝味”。唯一不同的是,这锅里炖的不是红烧肉,而是你专属的 AI 技能——生成音乐、自动报表、智能提醒,随你调料。
最棒的是,你自己动手写 Skill,不只是省了找别人“量身定制”的麻烦,还顺便把技术小宇宙点燃了。说不定哪天,你的 Skill 就成了朋友圈炫耀的神器,或者小小的商业机会。
所以,别再犹豫了,动手试一试,让你的 AI 也“听你号令”,下一首爆款音乐,说不定就是你做出来的!
最近开通了知识星球,想一起的,可扫码加入OpenClaw·Ai一人公司一起探索Ai一人公司变现,加入可领取100G的资料直接回本。
目前已经加入 190+ 人,一起探索Ai一人公司副业赚钱:
星球合伙人招募:如果你有想法也可以申请成为我们的星球合伙人!

历史文章
QClaw这只虾都能干啥呢?我不会养了一只废虾吧?? | QClaw超详细使用教程
微信也能用 OpenClaw!ClawBot 插件接入 OpenClaw 详细指南
OpenClaw🦞 3.22 发布:沉默9天,龙虾终于爆发!openclaw系列教程
微信/企业微信接入腾讯QClaw 一文给你讲清楚 | openclaw系列教程
腾讯上线国内首个浏览器“龙虾”——QQ 浏览器QBotClaw
教你用QClaw定制每日新闻:腾讯新闻 Skills 上手指南 | SkillHub仓库的使用
从0到100万:我用10年打造一人公司的逆袭之路 | 一人公司 | 10年的奋斗里程 | 普通人的逆袭之路 | 真实案例
夜雨聆风
