@kg-ai/kugou-skill 0.1.13 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/SKILL.md +22 -2
- package/bin/darwin-arm64/kugou-cli +0 -0
- package/bin/darwin-x64/kugou-cli +0 -0
- package/bin/linux-arm64/kugou-cli +0 -0
- package/bin/linux-x64/kugou-cli +0 -0
- package/bin/win32-x64/kugou-cli.exe +0 -0
- package/package.json +1 -1
- package/references/music.md +117 -0
- package/scripts/install.js +16 -1
package/README.md
CHANGED
|
@@ -89,6 +89,14 @@ kugou-cli music recommend-playlist --module-id 6
|
|
|
89
89
|
|
|
90
90
|
# 歌单内歌曲列表
|
|
91
91
|
kugou-cli music playlist-songs "collection_3_938985631_304_0"
|
|
92
|
+
|
|
93
|
+
# 调整音乐偏好(用户明确表达"少推点/别再推/多推点"时调用)
|
|
94
|
+
# 减少推荐某位歌手
|
|
95
|
+
kugou-cli music submit-preference --dimension singer --degree reduce --name "周杰伦" --weight-ratio 0.5
|
|
96
|
+
# 屏蔽某类曲风
|
|
97
|
+
kugou-cli music submit-preference --dimension genre --degree forbid --weight-ratio 1.5
|
|
98
|
+
# 增加某语种
|
|
99
|
+
kugou-cli music submit-preference --dimension language --degree add --name "粤语" --weight-ratio 1.8
|
|
92
100
|
```
|
|
93
101
|
|
|
94
102
|
### 安装 SKILL.md
|
package/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: kugou-skill
|
|
3
3
|
description: |
|
|
4
4
|
酷狗,酷狗音乐,酷狗skill,酷狗音乐skill,酷狗音乐助手
|
|
5
|
-
|
|
5
|
+
提供歌曲搜索、猜你喜欢、相似推荐、收藏管理、听歌统计、酷狗榜单、创建歌单、调整音乐偏好等功能。
|
|
6
6
|
|
|
7
7
|
**触发场景**(满足任一即使用本技能):
|
|
8
8
|
- 用户要求推荐歌曲、听歌建议
|
|
@@ -10,6 +10,7 @@ description: |
|
|
|
10
10
|
- 用户要求查看音乐榜单(飙升榜、TOP500、抖音热歌等)
|
|
11
11
|
- 用户要求查看收藏、最近播放、听歌统计
|
|
12
12
|
- 用户要求创建歌单、自建歌单
|
|
13
|
+
- 用户要求调整音乐偏好("少推点 XX 歌手"、"多推点 XX 语种"、"别再推 XX 曲风" 等)
|
|
13
14
|
- 用户提供 base64 secret 字符串要求登录或导入身份
|
|
14
15
|
- Agent 在尝试扫码登录时遇到环境限制(无法发图片)→ 主动询问用户是否可提供 secret
|
|
15
16
|
- 用户提到"酷狗"、"kugou"、"猜你喜欢"、"相似歌曲"
|
|
@@ -17,7 +18,7 @@ description: |
|
|
|
17
18
|
- 用户提到酷狗 URL scheme("kugou://" 或 "mackugou://")
|
|
18
19
|
- 用户提到"本机控制"、"控制酷狗客户端"
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
**与其他音乐技能的区别**:酷狗音乐以推荐算法见长,榜单数据实时更新,适合获取热门歌曲和个性化推荐;同时支持把用户偏好(歌手/语种/曲风等)实时反馈给推荐引擎。
|
|
21
22
|
|
|
22
23
|
安装方式:npm install -g @kg-ai/kugou-skill
|
|
23
24
|
---
|
|
@@ -200,6 +201,21 @@ description: |
|
|
|
200
201
|
- 客户端可用:优先 `kugou-cli control play-playlist --global-id "<id>"`(详见 [references/control.md#12-play-playlist--播放整个歌单](references/control.md#12-play-playlist--播放整个歌单))
|
|
201
202
|
- 客户端不可用 / `play-playlist` 拿不到可用 ID:按 [references/music.md#72-云端歌单的播放控制浏览器打开-h5-链接](references/music.md#72-云端歌单的播放控制浏览器打开-h5-链接) 走"先探后告知"——用浏览器工具打开 H5 `song_list_url` 尝试点击播放;工具不可用时明确告知用户手动复制链接打开
|
|
202
203
|
|
|
204
|
+
### 调整偏好的调用原则
|
|
205
|
+
|
|
206
|
+
详见 [references/music.md#11-提交偏好](references/music.md#11-提交偏好):
|
|
207
|
+
|
|
208
|
+
1. **被动调用**:必须用户**明确**表达偏好调整意愿时才调用 `kugou-cli music submit-preference`,禁止在用户仅说"推荐/搜歌/听歌"时主动改写用户偏好
|
|
209
|
+
2. **解析用户意图 → 落到 dimension/degree/name**:按 [references/music.md#11-提交偏好 调用流程](references/music.md#11-提交偏好) 里的"用户原话 → dimension/degree/name"映射表翻译,不确定时**主动询问**("你说的『少推点 XX』是指歌手还是语种/曲风?")
|
|
210
|
+
3. **name 用服务端能识别的标准名**:用户口语里的昵称/简称("老周")必须**先问清楚**再调,因为上游 name 必须是服务端能识别的标准名(如"周杰伦")
|
|
211
|
+
4. **weight-ratio 配对**:reduce→`(0,1)`、forbid/add→`(1,2)`。不匹配时 CLI 仅 warning 不阻断,最终以服务端校验为准
|
|
212
|
+
5. **提交成功后的呈现优先级**:
|
|
213
|
+
- **第一优先**:用响应 `data.msg`(上游确认话术)展示给用户,例如"收到!将减少推荐歌手「周杰伦」的歌曲,猜你喜欢以下歌曲~"
|
|
214
|
+
- **第二优先**:把响应 `data.list`(重新推荐的歌曲列表)按 [references/output-format.md#1-歌曲歌单列表展示批量优先用表格](references/output-format.md#1-歌曲歌单列表展示批量优先用表格) 的展示规范呈现(≥ 2 条用表格,= 1 条按 `client_available` 决定加不加链接)
|
|
215
|
+
- 表格里**不**加 `<em>` 高亮 / `play_link` / `mix_song_id`,agent 内部持有
|
|
216
|
+
6. **复用 list,不要再调 recommend**:拿到新推荐的 `list[]` 后,**主动询问**用户"要按这个新偏好播放一些吗?",用户同意后**直接用 list[] 里的 `mix_song_id`** 走 [`control play`](./references/control.md#1-play--播放指定歌曲) 等命令,**不要**再调一次 `recommend` 浪费调用
|
|
217
|
+
7. **多次提交会叠加**:本接口是**实时反馈**给推荐引擎,不会持久化为用户画像规则;同一歌手多次提交会**叠加效果**,不要替用户循环重提
|
|
218
|
+
|
|
203
219
|
### 能力边界提示
|
|
204
220
|
|
|
205
221
|
当用户提出的需求在 `kugou-cli` **整体能力边界之外**时,Agent 必须**明确告知用户"暂不支持该能力"**,不得擅自用其他命令拼凑代替,也不得假装能完成。
|
|
@@ -292,4 +308,8 @@ kugou-cli music playlist-songs "collection_3_938985631_304_0"
|
|
|
292
308
|
kugou-cli control play --mixsongid 32100650 --song-name "晴天" --singer-name "周杰伦"
|
|
293
309
|
kugou-cli control player --action pause
|
|
294
310
|
kugou-cli control favorite song --mixsongid 32100650
|
|
311
|
+
|
|
312
|
+
# 11. 调整音乐偏好(用户明确表达"少推点/别再推/多推点"时调用,详见 references/music.md#11-提交偏好)
|
|
313
|
+
kugou-cli music submit-preference --dimension singer --degree reduce --name "周杰伦" --weight-ratio 0.5
|
|
314
|
+
kugou-cli music submit-preference --dimension language --degree add --name "粤语" --weight-ratio 1.8
|
|
295
315
|
```
|
|
Binary file
|
package/bin/darwin-x64/kugou-cli
CHANGED
|
Binary file
|
|
Binary file
|
package/bin/linux-x64/kugou-cli
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/references/music.md
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
| `kugou-cli music search-playlist <keyword>` | 搜索歌单 |
|
|
18
18
|
| `kugou-cli music recommend-playlist` | 歌单推荐 |
|
|
19
19
|
| `kugou-cli music playlist-songs <global_collection_id>` | 歌单内歌曲列表 |
|
|
20
|
+
| `kugou-cli music submit-preference` | 提交偏好(减少/屏蔽/增加) |
|
|
20
21
|
|
|
21
22
|
---
|
|
22
23
|
|
|
@@ -524,3 +525,119 @@ kugou-cli music playlist-songs "collection_3_938985631_304_0" --page 1 --size 10
|
|
|
524
525
|
- **artist_name 拼接**: 多歌手时上游用 `/` 拼接(例如 `周杰伦/方文山`)
|
|
525
526
|
- **分页去重**: 上游按服务端数组下标分页,但歌曲可能在分页期间被增删,调用方需自行按 `mix_song_id` 去重
|
|
526
527
|
- **播放链接**: `play_link` 由服务端拿到 `mix_song_id` 后批量生成,单条失败不影响其他歌曲
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
## 11. 提交偏好
|
|
532
|
+
|
|
533
|
+
> 🔐 = 需要先登录
|
|
534
|
+
|
|
535
|
+
把用户对音乐偏好的调整(减少 / 屏蔽 / 增加 某位歌手、语种、曲风等)提交到上游推荐引擎,**服务端**先把 `name` 解析为上游 id(例如 singer → 歌手搜索取第 0 个结果的 `author_id`)再透传,上游处理后**返回一条确认话术 + 重新推荐的歌曲列表**。
|
|
536
|
+
|
|
537
|
+
适用于用户表达"最近想多听 XX 语种 / 不想再听 XX 歌手的 / 多推点 XX 曲风"等诉求的场景。
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
# 减少推荐某位歌手(weight 越小减得越多)
|
|
541
|
+
kugou-cli music submit-preference \
|
|
542
|
+
--dimension singer --degree reduce \
|
|
543
|
+
--name "周杰伦" --weight-ratio 0.5
|
|
544
|
+
|
|
545
|
+
# 屏蔽某类曲风
|
|
546
|
+
kugou-cli music submit-preference \
|
|
547
|
+
--dimension genre --degree forbid \
|
|
548
|
+
--weight-ratio 1.5
|
|
549
|
+
|
|
550
|
+
# 增加某语种
|
|
551
|
+
kugou-cli music submit-preference \
|
|
552
|
+
--dimension language --degree add \
|
|
553
|
+
--name "粤语" --weight-ratio 1.8
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
**参数**(全部为 flag,无位置参数):
|
|
557
|
+
|
|
558
|
+
| 参数 | 必填 | 取值 | 说明 |
|
|
559
|
+
|------|------|------|------|
|
|
560
|
+
| `--dimension` | 是 | `singer` / `language` / `genre` / `ai` / `dj` / `fc` / `abs` / `old` | 偏好维度(强枚举) |
|
|
561
|
+
| `--degree` | 是 | `reduce`(减少)/ `forbid`(屏蔽)/ `add`(增加) | 操作类型(强枚举) |
|
|
562
|
+
| `--name` | 条件必填 | string | `singer` 传歌手名 / `language` 传语种名;其余维度**必须为空** |
|
|
563
|
+
| `--weight-ratio` | 是 | float64,范围 `(0, 2)` | 权重系数。`reduce` 配 `(0,1)` / `forbid` & `add` 配 `(1,2)` |
|
|
564
|
+
| `--area-code` | 否 | int | 地区码;不传时不出现在 body 中 |
|
|
565
|
+
|
|
566
|
+
**`name` 必填/必空规则**:
|
|
567
|
+
|
|
568
|
+
| `--dimension` | 是否需要 `--name` | 说明 |
|
|
569
|
+
|--------------|------------------|------|
|
|
570
|
+
| `singer` | **必填**(歌手名) | 服务端查歌手搜索取第 0 个结果 `author_id` |
|
|
571
|
+
| `language` | **必填**(语种名) | 服务端查下方「语种映射表」取 id |
|
|
572
|
+
| `genre` / `ai` / `dj` / `fc` / `abs` / `old` | **必须为空** | 服务端不取 name,传了会被 CLI 拦截 |
|
|
573
|
+
|
|
574
|
+
**`weight-ratio` 与 `--degree` 的配对**:
|
|
575
|
+
|
|
576
|
+
| `--degree` | 配对范围 | 不匹配时的处理 |
|
|
577
|
+
|-----------|---------|---------------|
|
|
578
|
+
| `reduce` | `(0, 1)` | CLI 给 warning(不阻断),最终可能服务端拒 |
|
|
579
|
+
| `forbid` | `(1, 2)` | CLI 给 warning(不阻断),最终可能服务端拒 |
|
|
580
|
+
| `add` | `(1, 2)` | CLI 给 warning(不阻断),最终可能服务端拒 |
|
|
581
|
+
|
|
582
|
+
> CLI 只做基础的 `(0, 2)` 范围校验 + 不匹配时的 warning;**业务侧具体配对由服务端校验**,避免本地硬规则与服务端不一致时把"reduce 0.99"这种边界值也堵掉。
|
|
583
|
+
|
|
584
|
+
**语种映射表**(`--dimension=language` 时 `--name` 取值):
|
|
585
|
+
|
|
586
|
+
`国语` / `英语` / `粤语` / `纯音乐` / `韩语` / `日语` / `其他语种` / `小语种` / `方言` / `闽南语` / `俄语` / `伴奏` / `西班牙语` / `藏语` / `越南语` / `葡萄牙语` / `德语` / `泰语` / `意大利语` / `蒙古语`
|
|
587
|
+
|
|
588
|
+
**输出示例**:
|
|
589
|
+
|
|
590
|
+
```json
|
|
591
|
+
{
|
|
592
|
+
"errcode": 0,
|
|
593
|
+
"errmsg": "",
|
|
594
|
+
"data": {
|
|
595
|
+
"status": 801,
|
|
596
|
+
"msg": "收到!将减少推荐歌手「周杰伦」的歌曲,猜你喜欢以下歌曲~",
|
|
597
|
+
"list": [
|
|
598
|
+
{
|
|
599
|
+
"song_name": "稻香",
|
|
600
|
+
"mix_song_id": "595244683",
|
|
601
|
+
"artist_name": "周杰伦",
|
|
602
|
+
"play_link": "https://www.kugou.com/mixsong/agent_gateway/xxx.html"
|
|
603
|
+
}
|
|
604
|
+
]
|
|
605
|
+
},
|
|
606
|
+
"status": 1
|
|
607
|
+
}
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
**关键字段**:
|
|
611
|
+
- `data.status`: 上游 `msgtype`,取第一条确认话术对应的消息类型(如 `801`)
|
|
612
|
+
- `data.msg`: 上游确认话术(如「收到!将减少推荐歌手「周杰伦」的歌曲,猜你喜欢以下歌曲~」),**直接展示给用户**
|
|
613
|
+
- `data.list`: 重新推荐的歌曲列表,结构同通用 `SongInfo`(`song_name` / `mix_song_id` / `artist_name` / `play_link`)
|
|
614
|
+
|
|
615
|
+
**调用流程**(agent 必读):
|
|
616
|
+
|
|
617
|
+
```
|
|
618
|
+
1. 解析用户意图:识别"减少 / 屏蔽 / 增加" + "对象(歌手 / 语种 / 曲风等)"
|
|
619
|
+
2. 按下表确定 dimension / degree / name:
|
|
620
|
+
┌────────────────────────────────────────┬──────────┬────────────┬────────────────┐
|
|
621
|
+
│ 用户原话(例) │ dimension│ degree │ name │
|
|
622
|
+
├────────────────────────────────────────┼──────────┼────────────┼────────────────┤
|
|
623
|
+
│ "少推点周杰伦的歌" │ singer │ reduce │ 周杰伦 │
|
|
624
|
+
│ "别再给我推民谣了" │ genre │ forbid │ (空) │
|
|
625
|
+
│ "多来点粤语歌" │ language │ add │ 粤语 │
|
|
626
|
+
│ "屏蔽一下英文歌" │ language │ forbid │ 英语 │
|
|
627
|
+
└────────────────────────────────────────┴──────────┴────────────┴────────────────┘
|
|
628
|
+
3. 选 weight_ratio:
|
|
629
|
+
- reduce → 0 < x < 1(值越小减得越多;常用 0.5)
|
|
630
|
+
- forbid / add → 1 < x < 2(值越大越强;常用 1.5)
|
|
631
|
+
4. 调 submit-preference
|
|
632
|
+
5. 拿到响应后,**优先用 data.msg 展示确认话术**给用户;
|
|
633
|
+
data.list 是重新推荐的歌曲列表,按 [§0.1 / §0.2 / §1](#1-搜索歌曲) 的展示规范呈现
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
**特殊说明**:
|
|
637
|
+
- **上游返回 SSE 流式**:响应体上游为多行 `data:` 流。服务端取**第一条**确认话术(`msgtype=801`)作为对外 `status`/`msg`,避免被后续推荐话术覆盖
|
|
638
|
+
- **歌曲组装**:`list` 中的 `mixsongid` 与「歌曲推荐」接口共用同一套组装逻辑(kmr 拉歌名/歌手/hash + `GenerateBatch` 生成播放链接);未命中歌曲详情(audioMap miss)的条目会被跳过,因此最终 `list` 条数可能小于上游返回数量
|
|
639
|
+
- **name 解析**:`singer` / `language` 维度的 `name` 会在 logic 层被解析为上游 id 后透传,客户端只传 `name` 即可,不需要先去查歌手 id
|
|
640
|
+
- **name 输入规范**:用户口语里说"少推点老周"时,agent 应**询问清楚**再调用——上游 name 必须是服务端能识别的标准名(如"周杰伦"),不是昵称/简称
|
|
641
|
+
- **不是「保存为规则」**:本接口是**实时反馈**给推荐引擎,不会持久化为用户画像规则;同一歌手多次提交会**叠加效果**
|
|
642
|
+
- **不要主动调用**:必须用户**明确**表达偏好调整意愿时才调用("少推点 XX" / "别再推 XX" / "多推点 XX"),禁止在用户仅说"推荐/搜歌/听歌"时主动改写用户偏好
|
|
643
|
+
- **改完偏好 → 主动问是否要听**:提交成功(`errcode: 0`)后,服务端已返回重新推荐的 `data.list`;agent 应**主动询问**用户"要按这个新偏好播放一些吗?",等用户确认后**复用 `list[]` 里的 mix_song_id** 直接走 [`control play`](./control.md#1-play--播放指定歌曲) 等命令,不要再调一次 `recommend`
|
package/scripts/install.js
CHANGED
|
@@ -49,12 +49,27 @@ const skillDirs = [
|
|
|
49
49
|
if (fs.existsSync(skillSrc)) {
|
|
50
50
|
const referencesSrc = path.join(pkgRoot, 'references');
|
|
51
51
|
|
|
52
|
+
// workbuddy 平台:kugou-skill 与 kugou-skill__skillhub 二选一
|
|
53
|
+
// 若 ~/.workbuddy/skills/kugou-skill__skillhub 已存在,只装到那里,跳过 kugou-skill
|
|
54
|
+
// 反之只装到 kugou-skill,__skillhub 是 opt-in 不自动创建
|
|
55
|
+
const workbuddyAltDir = path.join(os.homedir(), '.workbuddy', 'skills', 'kugou-skill__skillhub');
|
|
56
|
+
const workbuddyUseAlt = fs.existsSync(workbuddyAltDir);
|
|
57
|
+
|
|
52
58
|
for (const skillDir of skillDirs) {
|
|
53
59
|
// 只在 skills 目录存在时才复制,不创建目录
|
|
54
60
|
const parentDir = path.dirname(skillDir);
|
|
55
61
|
if (fs.existsSync(parentDir)) {
|
|
62
|
+
const baseName = path.basename(skillDir);
|
|
63
|
+
|
|
64
|
+
// workbuddy 互斥:__skillhub 存在时跳过 kugou-skill,只装 __skillhub
|
|
65
|
+
const isWorkbuddyPrimary = baseName === 'kugou-skill' && skillDir === path.join(os.homedir(), '.workbuddy', 'skills', 'kugou-skill');
|
|
66
|
+
if (isWorkbuddyPrimary && workbuddyUseAlt) {
|
|
67
|
+
console.log(`Skipping ${skillDir}: ${workbuddyAltDir} exists, installing only to ${workbuddyAltDir}`);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
|
|
56
71
|
// __skillhub 子目录是 opt-in:仅在已存在时同步,绝不自动创建
|
|
57
|
-
if (
|
|
72
|
+
if (baseName === 'kugou-skill__skillhub' && !fs.existsSync(skillDir)) {
|
|
58
73
|
continue;
|
|
59
74
|
}
|
|
60
75
|
try {
|