Spotify
Hermes 可以使用 Spotify 官方 Web API 配合 PKCE OAuth 直接控制 Spotify——包括播放、队列、搜索、播放列表、已保存的曲目/专辑以及收听历史。令牌存储在 ~/.hermes/auth.json 中,并在收到 401 错误时自动刷新;每台机器只需登录一次。
与 Hermes 内置的 OAuth 集成(Google、GitHub Copilot、Codex)不同,Spotify 要求每个用户注册自己的轻量级开发者应用。Spotify 不允许第三方发布可供任何人使用的公共 OAuth 应用。这大约需要两分钟,hermes auth spotify 会引导你完成整个过程。
前提条件
- 一个 Spotify 账户。免费账户适用于搜索、播放列表、库和活动工具。Premium 账户是控制播放(播放、暂停、跳过、定位、音量、添加至队列、转移播放)所必需的。
- 已安装并运行 Hermes Agent。
- 对于播放工具:需要一个活跃的 Spotify Connect 设备——至少在一个设备(手机、桌面端、网页播放器、扬声器)上打开 Spotify 应用,以便 Web API 有可控制的对象。如果没有活跃设备,你将收到带有“no active device”消息的
403 Forbidden错误;在任何设备上打开 Spotify 并重试即可。
设置
一键式:hermes tools
最快的方式。运行:
hermes tools
滚动到 🎵 Spotify,按空格键切换为开启状态,然后按 s 保存。Hermes 会直接进入 OAuth 流程——如果你还没有 Spotify 应用,它会引导你内联创建一个应用。完成后,工具集将在一次操作中同时启用并完成认证。
如果你希望分开执行这些步骤(或者稍后重新认证),请使用下面的两步流程。
两步流程
1. 启用工具集
hermes tools
切换 🎵 Spotify 为开启状态,保存,当内联向导打开时,将其关闭(Ctrl+C)。工具集保持开启状态;仅推迟认证步骤。
2. 运行登录向导
hermes auth spotify
只有在完成第 1 步后,7 个 Spotify 工具才会出现在 agent 的工具集中——它们默认处于关闭状态,这样不需要它们的用户就不会在每次 API 调用中携带额外的工具 schema。
如果未设置 HERMES_SPOTIFY_CLIENT_ID,Hermes 会引导你内联完成应用注册:
- 在浏览器中打开
https://developer.spotify.com/dashboard - 打印出需要粘贴到 Spotify “Create app”表单中的确切值
- 提示你输入获得的 Client ID
- 将其保存到
~/.hermes/.env,以便后续运行跳过此步骤 - 直接进入 OAuth 同意流程
批准后,令牌将写入 ~/.hermes/auth.json 下的 providers.spotify 中。当前推理提供程序不会更改——Spotify 认证独立于你的 LLM 提供程序。
创建 Spotify 应用(向导所需内容)
当仪表板打开时,点击 Create app 并填写:
| 字段 | 值 |
|---|---|
| App name | 任意名称(例如 hermes-agent) |
| App description | 任意描述(例如 personal Hermes integration) |
| Website | 留空 |
| Redirect URI | http://127.0.0.1:43827/spotify/callback |
| Which API/SDKs? | 勾选 Web API |
同意条款并点击 Save。在下一页点击 Settings → 复制 Client ID 并将其粘贴到 Hermes 提示符中。这是 Hermes 需要的唯一值——PKCE 不使用 client secret。
通过 SSH / 在无头环境中运行
如果设置了 SSH_CLIENT 或 SSH_TTY,Hermes 会在向导和 OAuth 步骤中跳过自动打开浏览器。复制 Hermes 打印的仪表板 URL 和授权 URL,在本地机器的浏览器中打开它们,并正常继续——本地 HTTP 监听器仍在远程主机的 43827 端口上运行。如果你需要通过 SSH 隧道访问它,请转发该端口:ssh -L 43827:127.0.0.1:43827 remote。
验证
hermes auth status spotify
显示是否存在令牌以及访问令牌何时过期。刷新是自动的:当任何 Spotify API 调用返回 401 时,客户端会交换刷新令牌并重试一次。刷新令牌在 Hermes 重启后依然有效,因此只有你在 Spotify 账户设置中撤销应用或运行 hermes auth logout spotify 时才需要重新认证。
使用
登录后,agent 可以访问 7 个 Spotify 工具。你可以自然地与 agent 对话——它会选择正确的工具和动作。为了获得最佳行为,agent 会加载一个配套技能,教授规范的使用模式(单次搜索然后播放、何时不应预检 get_state 等)。
> play some miles davis
> what am I listening to
> add this track to my Late Night Jazz playlist
> skip to the next song
> make a new playlist called "Focus 2026" and add the last three songs I played
> which of my saved albums are by Radiohead
> search for acoustic covers of Blackbird
> transfer playback to my kitchen speaker
工具参考
所有改变播放状态的操作都接受一个可选的 device_id 以指定特定设备。如果省略,Spotify 将使用当前活跃的设备。
spotify_playback
控制和检查播放状态,以及获取最近播放的历史记录。
| 操作 | 用途 | 需要 Premium? |
|---|---|---|
get_state | 完整播放状态(曲目、设备、进度、随机/重复) | 否 |
get_currently_playing | 仅当前曲目(在返回 204 时返回空 — 见下文) | 否 |
play | 开始/恢复播放。可选参数:context_uri、uris、offset、position_ms | 是 |
pause | 暂停播放 | 是 |
next / previous | 跳过曲目 | 是 |
seek | 跳转到 position_ms | 是 |
set_repeat | state = track / context / off | 是 |
set_shuffle | state = true / false | 是 |
set_volume | volume_percent = 0-100 | 是 |
recently_played | 最近播放的曲目。可选参数 limit、before、after(Unix 毫秒时间戳) | 否 |
spotify_devices
| 操作 | 用途 |
|---|---|
list | 您的账户可见的所有 Spotify Connect 设备 |
transfer | 将播放转移到 device_id。可选参数 play: true 可在转移时开始播放 |
spotify_queue
| 操作 | 用途 | 需要 Premium? |
|---|---|---|
get | 当前队列中的曲目 | 否 |
add | 将 uri 添加到队列末尾 | 是 |
spotify_search
搜索目录。query 为必填项。可选参数:types(track / album / artist / playlist / show / episode 数组)、limit、offset、market。
spotify_playlists
| 操作 | 用途 | 必需参数 |
|---|---|---|
list | 用户的播放列表 | — |
get | 单个播放列表及其曲目 | playlist_id |
create | 新建播放列表 | name(+ 可选参数 description、public、collaborative) |
add_items | 添加曲目 | playlist_id、uris(可选参数 position) |
remove_items | 移除曲目 | playlist_id、uris(+ 可选参数 snapshot_id) |
update_details | 重命名/编辑 | playlist_id + name、description、public、collaborative 中的任意项 |
spotify_albums
| 操作 | 用途 | 必需参数 |
|---|---|---|
get | 专辑元数据 | album_id |
tracks | 专辑曲目列表 | album_id |
spotify_library
统一访问已保存的曲目和已保存的专辑。使用 kind 参数选择集合。
| 操作 | 用途 |
|---|---|
list | 分页库列表 |
save | 将 ids / uris 添加到库中 |
remove | 从库中移除 ids / uris |
必需参数:kind = tracks 或 albums,以及 action。
功能矩阵:Free 与 Premium
只读工具适用于 Free 账户。任何改变播放状态或队列的操作都需要 Premium。
| 适用于 Free | 需要 Premium |
|---|---|
spotify_search(全部) | spotify_playback — play, pause, next, previous, seek, set_repeat, set_shuffle, set_volume |
spotify_playback — get_state, get_currently_playing, recently_played | spotify_queue — add |
spotify_devices — list | spotify_devices — transfer |
spotify_queue — get | |
spotify_playlists(全部) | |
spotify_albums(全部) | |
spotify_library(全部) |
调度:Spotify + cron
由于 Spotify 工具是常规的 Hermes 工具,因此在 Hermes 会话中运行的 cron 任务可以按任何计划触发播放。无需新代码。
早晨唤醒播放列表
hermes cron add \
--name "morning-commute" \
"0 7 * * 1-5" \
"Transfer playback to my kitchen speaker and start my 'Morning Commute' playlist. Volume to 40. Shuffle on."
每个工作日早上 7 点发生的情况:
- Cron 启动一个无头 Hermes 会话。
- Agent 读取提示,调用
spotify_devices list按名称查找“kitchen speaker”,然后执行spotify_devices transfer→spotify_playback set_volume→spotify_playback set_shuffle→spotify_search+spotify_playback play。 - 音乐在目标扬声器上开始播放。总成本:一个会话,几次工具调用,无需人工输入。
夜间放松
hermes cron add \
--name "wind-down" \
"30 22 * * *" \
"Pause Spotify. Then set volume to 20 so it's quiet when I start it again tomorrow."
注意事项
- Cron 触发时必须存在活跃设备。 如果没有运行 Spotify 客户端(手机/桌面/Connect 扬声器),播放操作将返回
403 no active device。对于早晨播放列表,技巧是定位始终在线的设备(Sonos、Echo、智能扬声器),而不是您的手机。 - 任何改变播放状态的操作都需要 Premium — 播放、暂停、跳过、音量、转移。只读 cron 任务(例如定时“通过电子邮件发送我最近播放的曲目”)在 Free 账户上正常工作。
- Cron agent 继承您激活的工具集。 必须在
hermes tools中启用 Spotify,cron 会话才能看到 Spotify 工具。 - Cron 任务以
skip_memory=True运行,因此它们不会写入您的记忆存储。
完整 cron 参考:Cron Jobs。
退出登录
hermes auth logout spotify
从 ~/.hermes/auth.json 中移除令牌。若要同时清除应用配置,请从 ~/.hermes/.env 中删除 HERMES_SPOTIFY_CLIENT_ID(如果设置了 HERMES_SPOTIFY_REDIRECT_URI 也一并删除),或再次运行向导。
要在 Spotify 端撤销应用权限,请访问 连接到您账户的应用 并点击 REMOVE ACCESS。
故障排除
403 Forbidden — Player command failed: No active device found — 您需要在至少一个设备上运行 Spotify。在手机、桌面或网页播放器上打开 Spotify 应用,播放任意曲目几秒钟以注册设备,然后重试。spotify_devices list 显示当前可见的设备。
403 Forbidden — Premium required — 你使用的是免费账户,但尝试执行会改变播放状态的操作。请参阅上方的功能矩阵。
get_currently_playing 返回 204 No Content — 当前没有任何设备正在播放内容。这是 Spotify 的正常响应,并非错误;Hermes 将其表现为一个说明性的空结果(is_playing: false)。
INVALID_CLIENT: Invalid redirect URI — 你的 Spotify 应用设置中的重定向 URI 与 Hermes 使用的不匹配。默认值为 http://127.0.0.1:43827/spotify/callback。请将该地址添加到你的应用允许的重定向 URI 列表中,或者在 ~/.hermes/.env 中设置 HERMES_SPOTIFY_REDIRECT_URI 为你注册的 URI。
429 Too Many Requests — 触发了 Spotify 的速率限制。Hermes 会返回一个友好的错误提示;请等待一分钟后再重试。如果问题持续存在,你可能在脚本中运行了紧密循环 — Spotify 的配额大约每 30 秒重置一次。
401 Unauthorized 持续出现 — 你的刷新令牌已被撤销(通常是因为你从账户中移除了该应用,或者该应用已被删除)。请再次运行 hermes auth spotify。
向导未打开浏览器 — 如果你通过 SSH 连接或在没有显示界面的容器中运行,Hermes 会检测到这种情况并跳过自动打开浏览器的步骤。请复制它打印出的仪表板 URL 并手动打开。
高级:自定义 scopes
默认情况下,Hermes 会请求所有内置工具所需的 scopes。如果你希望限制访问权限,可以进行覆盖:
hermes auth spotify --scope "user-read-playback-state user-modify-playback-state playlist-read-private"
Scope 参考:Spotify Web API scopes。如果你请求的 scopes 少于某个工具所需,该工具的调用将因 403 错误而失败。
高级:自定义 client ID / 重定向 URI
hermes auth spotify --client-id <id> --redirect-uri http://localhost:3000/callback
或者在 ~/.hermes/.env 中永久设置它们:
HERMES_SPOTIFY_CLIENT_ID=<your_id>
HERMES_SPOTIFY_REDIRECT_URI=http://localhost:3000/callback
重定向 URI 必须在你的 Spotify 应用设置中被列入允许列表。默认设置适用于绝大多数用户 — 仅当端口 43827 被占用时才需要更改它。
文件位置
| 文件 | 内容 |
|---|---|
~/.hermes/auth.json → providers.spotify | access token、refresh token、过期时间、scope、重定向 URI |
~/.hermes/.env | HERMES_SPOTIFY_CLIENT_ID,可选的 HERMES_SPOTIFY_REDIRECT_URI |
| Spotify 应用 | 由你在 developer.spotify.com/dashboard 拥有;包含 Client ID 和重定向 URI 允许列表 |