![]()
從兩個場景說起
第一個場景:深夜vibe coding,想換首歌。
往常的流程是:手從鍵盤移開,切到手機App / 桌面App,刷一下推薦,三首都不對感覺,思路斷了,算了隨便放著。現在的流程是:在對話框里順手發一句「幫我找幾首適合深夜寫代碼的音樂」,AI 處理完,BGM 切了,附了一句推薦理由,你甚至沒有離開編輯器。
第二個場景:用飛書辦公了半天,想看看照片讓眼睛放松下。
直接在飛書發一句「用我的紅心歌單幫我生成一個照片墻」。于是出現下圖。
![]()
這就是ncm-cli 加上 OpenClaw 今天能做到的事。
“不知道聽什么”一直是個痛點,直到OpenClaw 出現
如大家所知,OpenClaw 代表著 Agent 交互方式的一個轉折點:AI 不再只是瀏覽器里的對話界面,它可以是你 IM 里隨時響應的助手,在你的機器上執行真實的操作。
我們意識到,在這個背景下,音樂是一個非常適合驗證這個范式的場景
為什么?因為「不知道聽什么」是我們日常遇到最典型的模糊意圖之一——你不是想搜索某首具體的歌,你想要的是「適合現在這個狀態的音樂」。這種模糊意圖,正是 AI 擅長處理的,用傳統搜索界面反而別扭。
而且音樂操作有一個天然的特點:輸入和輸出分離。你用手機發消息(輸入),電腦放音樂(輸出)。OpenClaw 的跨設備特性和這個場景完美契合。
我們是怎么思考工具形態的
確定這件事值得做之后,第一個問題是:做成什么形態?
App 不合適——要維護 UI,更新重,和 AI Agent 集成反而繞了一圈。插件或 SDK 依賴特定平臺,換一個 Agent 就要重做。
我們選擇了CLI。
這個判斷背后有一個很直接的邏輯:CLI 命令是 AI Agent 最天然的工具調用形式。一個ncm-cli play --song xxx的命令,對Claude、OpenClaw 里的 AI、或者任何其他 Agent 框架來說,調用方式完全一樣。CLI 本身不依賴任何 AI 框架,它就是一個能被任何東西調用的原子工具。
同時,CLI 也保留了「直接用」的可能性——人工輸入命令、Shell 腳本集成、自動化流水線,都沒問題。
基于這個形態,我們還設計了兩個Skill去真正的融入到Agent中:
netease-music-cli—— 適合「我知道要聽什么」的場景。搜歌、播放、控制隊列、管理歌單,直來直去。
這個Skill 有一個有意思的設計:我們沒有在Skill 定義里枚舉所有命令,而是讓 AI 自己通過--help去漸進式發現。
AI 拿到任務后,會先執行ncm-cli --help看頂層有什么,再根據需要鉆進具體子命令查參數,最后再執行。整個過程和人第一次用一個新CLI 工具的探索方式完全一樣。
![]()
這個設計有兩個好處:一是Skill 定義本身不需要隨命令的增減而更新;二是和后面將要介紹的動態命令系統形成了自然的協同——服務端新下發了一個命令,AI 下次就能通過--help發現并使用它,整條鏈路都不需要人工介入。
netease-music-assistant—— 適合「我不知道聽什么」的場景。它會先讀取你的紅心歌曲,分析你的偏好(曲風、情緒、時間段習慣),然后制定多維度搜索策略,從歌單、專輯、單曲多個維度混合推薦,每條結果都附帶個性化的推薦理由,還會自動去重(不重復推薦你已經收藏或近期推薦過的內容)。
兩個Skill 的分工很清晰:前者是執行層,后者是決策層。
我們做了什么
ncm-cli 支持三種使用方式:
![]()
命令設計:不是從按鈕出發,從AI“原子操作” 的視角出發
命令覆蓋范圍的選取,我們不是從「用戶會點哪些按鈕」出發,而是從「AI 完成一個音樂任務需要哪些原子操作」出發。
AI 處理一個請求,本質上是一個多步推理 + 執行的過程。以「幫我播放一首適合現在心情的歌」為例,AI 需要能做這些事:
![]()
圍繞這個流程,我們把命令分成了幾個層次:
![]()
另外有一個細節值得一提:所有命令默認輸出JSON,格式穩定,AI 可以直接解析,不需要做文本解析。
動態命令:讓CLI 保持「活」的
傳統CLI 有一個固有限制:命令是編譯進代碼的,新增一個功能,必須改代碼、發版、等用戶升級,整條鏈路很長。
ncm-cli 引入了一套動態命令系統,核心思想是:把命令的定義從代碼里移到服務端
傳統CLI的發版鏈路:
![]()
動態命令的更新流程:
![]()
CLI 啟動時,會向服務端發送一次同步請求,告知「我本地已經緩存了哪些命令的哪個版本」。服務端只返回有變化的部分,CLI 用這些增量數據在本地重建命令樹。
效果是:業務團隊可以獨立地添加、修改、下線命令,用戶不需要升級客戶端,下次啟動就能用到新功能。CLI 從一個靜態工具變成了一個持續生長的命令執行引擎。
播放形態
播放后端支持兩種:
內置播放器(mpv):跨平臺,macOS/Linux/Windows 均可用。即使沒有安裝網易云音樂客戶端,也能直接播起來。
網易云音樂桌面客戶端:這個模式帶來了一種不同的體驗——AI 操控的不是一個獨立的播放進程,而是你已經安裝的那個 App 本身。技術上,ncm-cli 通過orpheus://URL Scheme 向客戶端發送指令,客戶端后臺常駐進程監聽并響應。App 沒有運行時會自動啟動。這意味著:你對 AI 說「幫我播放林俊杰的曹操專輯」,打開的是完整的網易云音樂界面——專輯封面、歌詞、音質、紅心、社交……全套 App 體驗,只是控制方式從點擊變成了自然語言。App 沒有被取代,它獲得了一個新的控制界面。
TUI 播放器是我們比較喜歡的功能之一——黑膠旋轉動畫、卡拉 OK 風格歌詞同步、場景切換,在終端里有一種莫名的儀式感。
![]()
TUI 有一個值得一說的特性:它可以和CLI 命令同時工作。TUI 跑著的時候,你仍然可以在另一個終端執行ncm-cli next、ncm-cli volume 80,TUI 界面會實時響應。這對 AI Agent 來說尤為自然——Agent 發出的命令和人在 TUI 里的操作是完全對等的。
怎么用
詳細使用指南見:網易云音樂CLI 使用指南
首先你需要安裝ncm-cli:
npm install -g @music163/ncm-cli
前往網易云音樂開放平臺完成入駐并獲取API 憑證,然后運行配置向導:
ncm-cli configure
接下來就可以使用了。有多種使用方式:
方式一:OpenClaw
詳細教程見:OpenClaw ncm-cli 快速上手指南
安裝OpenClaw 并連接你的飛書等IM軟件,然后安裝我們提供的skill:https://github.com/NetEase/skills,之后你就可以從手機隨時控制電腦上的音樂播放。
這種方式最適合日常使用:不需要打開終端,不需要記命令,用IM 發消息就好。
一個有趣的例子:你在飛書發一句「用我的紅心歌單幫我生成一個照片墻」。
![]()
這個請求看起來和音樂播放沒什么關系,但它展示了Agent 模式更大的想象空間——
![]()
ncm-cli 在這里不只是播放工具,而是音樂數據的結構化接口。Agent 拿到這些數據之后,可以做任何事——生成圖片、寫報告、分析偏好、發郵件,取決于你的想象力和 Agent 能調用的其他工具。
這是CLI 作為 Agent 工具的核心價值:一個專注、穩定的數據和控制接口,Agent 決定怎么用它
方式二:Claude Code Skills
npx skills add
https://github.com/NetEase/skills
安裝后,直接在Claude Code 對話:
> 幫我推薦幾首適合專注的純音樂
> 播放我最近聽的歌曲
> 下一首
> 把這首歌加到紅心
![]()
![]()
方式三:直接CLI
npm install -g @music/ncm-cli
ncm-cli configure # 配置憑證
ncm-cli login # 掃碼登錄
ncm-cli tui # 啟動 TUI 播放器
歡迎反饋
做這件事的初衷很簡單:「合適的」音樂應該更容易「被找到」,而不是每次都要在推薦算法和自己的猶豫之間拉鋸。AI Agent 提供了一個新的可能性——用自然語言表達當下的狀態,讓 AI 替你做決策。
ncm-cli 是我們探索這個方向的一個起點,還有很多沒做好的地方。
幾個問題想聽聽大家的想法:
你日常聽歌的「痛點」是什么?是找歌難,還是管理歌單煩,還是別的?
如果AI 能更主動地介入你的聽歌體驗(比如感知你的狀態、主動推薦),你希望它怎么做,又不希望它怎么做?
如果你有技術背景,有沒有想貢獻的方向?
歡迎在評論區聊,也歡迎到GitHub 提 issue。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.