Proactive music suggestion. An agent skill from autonomous-ai/Physical-AI-Operating-System.

Apache-2.0Auto-check passed

Install Music Suggestion

skills CLI
$ npx skills add autonomous-ai/Physical-AI-Operating-System --skill music-suggestion -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install autonomous-ai/Physical-AI-Operating-System music-suggestion --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/autonomous-ai/Physical-AI-Operating-System.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/music-suggestion .claude/skills/music-suggestion && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
music-suggestion
GitHub stars
407
Token cost
~2.6k tokens
SKILL.md length
1,084 words
Files
2
Skills in repo
28
Repo updated
First seen
Licence
Apache-2.0

At a glance

Proactive music suggestion. An agent skill from autonomous-ai/Physical-AI-Operating-System.

  • SKILL.md covers Spoken output, Triggers, User attribution and What to read (pre-fetched in…, plus 7 more sections
  • Calls curl

What it does

Music Suggestion is an agent skill from autonomous-ai/Physical-AI-Operating-System. Proactive music suggestion. Routed in by user-emotion-detection/SKILL.md (the router) on emotion.detected (camera) and speechemotion.detected (voice) events when the synthesized mood is suggestion-worthy (sad/stressed/tired/excited/happy/bored) AND audio is idle AND cooldown is clear. Reuses injected context and emits log HW markers in the same reply as mood. Does NOT fire on motion.activity / [activity] events — those route to wellbeing/SKILL.md only. NOT for user-initiated music requests (those use the music…

Its SKILL.md is about 2.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `skill.json`).

The repository describes itself as: The open-source operating system for physical AI. The licence is Apache-2.0.

Example prompts

  • “/music-suggestion”

What it can do on your machine

Read from SKILL.md and the folder at commit d5efe9d. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use curl, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Music Suggestion loads about 2.6k tokens when it runs. Until then it costs about 135 tokens; SKILL.md has 1,084 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~135
When it runs · the whole SKILL.md, loaded when a task matches
~2.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from autonomous-ai/Physical-AI-Operating-System at commit d5efe9d, republished under its Apache-2.0 licence (© autonomous-ai). 1,084 words, ~2,552 tokens.

Download SKILL.mdSave it as .claude/skills/music-suggestion/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
music-suggestion
description
Proactive music suggestion. Routed in by user-emotion-detection/SKILL.md (the router) on emotion.detected (camera) and speech_emotion.detected (voice) events when the synthesized mood is suggestion-worthy (sad/stressed/tired/excited/happy/bored) AND audio is idle AND cooldown is clear. Reuses injected context and emits log HW markers in the same reply as mood. Does NOT fire on motion.activity / [activity] events — those route to wellbeing/SKILL.md only. NOT for user-initiated music requests (those use the music skill).

Music Suggestion (Proactive)

unknown users count. Always run suggestion checks when current_user is "unknown" — speak only, no DM. Never skip because the user is unknown/unconfirmed.

Spoken output

For a routed suggestion, emit all required mood/suggestion/emotion markers and one short invitation to play one song, normally at most 20 words. Do not add a separate mood checkin or a second confirmation. Keep genre selection, cooldown checks and marker construction in the provider's native thinking channel; do not summarize them in text before/after tools or in the final answer. If native thinking is unavailable, omit analysis. Use the supplied context and finish once a suitable suggestion is ready, without rereading skills to polish it. This changes wording only: preserve routing, logging, user consent before play, and the existing known-user DM behavior.

Triggers

Only one trigger: Mood — after logging a mood decision that is suggestion-worthy (sad, stressed, tired, excited, happy, bored). Activity events ([activity] Activity detected: ..., whether sedentary, drink/break, or celebrate) route to wellbeing/SKILL.md and never to this skill.

User attribution

{name} MUST come from [context: current_user=X] tag. If missing, use "unknown". NEVER infer from memory or chat history.

What to read (pre-fetched in [emotion_context: ...])

The backend injects everything you need on emotion.detected (face) or speech_emotion.detected (voice) — same block, same fields:

  • audio_playing (bool) — replaces GET /audio/status.
  • last_suggestion_age_min (int, -1 if none today) — replaces music-suggestion-history?last=1.
  • prior_decision + is_decision_stale — replaces mood-history?kind=decision&last=1. The freshly synthesized decision from THIS turn still lives in your thinking.
  • audio_recent ({track,duration_s,stopped}) — replaces audio/history?last=1.
  • music_pattern_for_hour ({preferred_genre,strength,peak_hour} or null) — replaces cat patterns.json matching by current hour ±1.
  • suggestion_worthy (bool) — pre-applied bucket gate (true for sad/stressed/tired/excited/happy/bored).
  • mapped_mood — convenient mirror of user-emotion-detection's mapping; useful when no fresh decision exists yet.

Do NOT fire any read tool calls when this block is present.

Fallback (only if [emotion_context: ...] is missing)

If the message has no context block (pre-fetch failed), fall back to the concurrent GET batch:

bash
curl -s http://127.0.0.1:5001/audio/status &
curl -s "http://127.0.0.1:5000/api/openclaw/music-suggestion-history?user={name}&last=1" &
curl -s "http://127.0.0.1:5000/api/openclaw/mood-history?user={name}&kind=decision&last=1" &
curl -s "http://127.0.0.1:5001/audio/history?person={name}&last=1" &
cat /root/local/users/{name}/habit/patterns.json 2>/dev/null &
wait

Routing precedence

user-emotion-detection/SKILL.md is the router for emotion responses. It picks one of music / checkin / action / silent per turn from the same [emotion_context: ...] block.

This skill produces output only when the router picks music — i.e. all of:

  • suggestion_worthy == true (mapped_mood ∈ sad/stressed/tired/excited/happy/bored)
  • audio_playing == false
  • last_suggestion_age_min ∉ [0, 7) (cooldown not active — shared with checkin) (production: change to 30 min before ship)
  • is_decision_stale == false OR a fresh mood decision was synthesized this turn

If any condition fails → router took another path (action / checkin / silent). Skip silently — do NOT emit a music-suggestion marker, do NOT speak. The router (or downstream skill) handles the output. Use audio_recent to personalize genre when proceeding.

Pick genre

Use music_pattern_for_hour from the context block (already matched by current hour ± 1; do NOT re-cat patterns.json).

If music_pattern_for_hour is non-null → use its preferred_genre. Otherwise fall back to the default table below. The pattern is bootstrapped lazily by wellbeing on its first threshold nudge; absent = no habit data yet, fall back without invoking habit Flow A here.

Otherwise, fall back to default genre table:

User stateDefault genre
Tired / fatiguedCalm piano, gentle acoustic, nature sounds
Stressed / tenseSoft jazz, classical, meditation
Happy / energeticUpbeat pop, jazz, feel-good classics
Bored / restlessFun pop, disco, upbeat indie
Sedentary (no mood)Lo-fi, ambient, study beats

If audio history shows a clear preference (e.g. K-pop, classical) → override both habit and table.

Suggest (speak only)

  • NEVER auto-play — only suggest. Play after user confirms.
  • ONE sentence, conversational: "How about some Norah Jones?"
  • Suggest 1 song at a time.
  • Known users — speak + DM via Telegram: [HW:/emotion:{"emotion":"caring","intensity":0.5}][HW:/dm:{"telegram_id":"<id>"}] Your suggestion text. telegram_id is in the injected [user_info: ...] block — never fetch.
  • Unknown users — speak only (no DM): [HW:/emotion:{"emotion":"caring","intensity":0.5}] Your suggestion text. Log with user:"unknown".
Show full SKILL.md (493 more words)Show less

What to write (HW marker — fires async, no tool turn)

Embed at the start of your spoken reply, alongside the mood signal/decision markers and the emotion / dm markers:

[HW:/music-suggestion/log:{"user":"{name}","trigger":"mood:tired","message":"Want some calm piano?"}]

The runtime parses, strips, fires the POST in a goroutine. Skip the marker entirely when you skipped the suggestion (NO_REPLY path).

Do NOT use curl exec for this log — same reason as the mood logs: a tool turn for a side-effect with nothing to wait on.

Regex caveat: the body must not contain }. The message field is usually a short caring sentence, but if it would contain } (rare — emoji, formula text) fall back to curl.

When the user responds in a later turn (accept / reject), POST status via curl as before — that's a regular agent action, not a fire-and-forget side effect:

bash
curl -s -X POST http://127.0.0.1:5000/api/music-suggestion/status \
  -H 'Content-Type: application/json' \
  -d '{"user":"{name}","day":"<day>","seq":<seq>,"status":"accepted"}'
  • Accepts → "status":"accepted"
  • Rejects → "status":"rejected"
  • Ignores → no update
Fallback (only if HW marker is rejected by the runtime)
bash
curl -s -X POST http://127.0.0.1:5000/api/music-suggestion/log \
  -H 'Content-Type: application/json' \
  -d '{"user":"{name}","trigger":"mood:tired","message":"Want some calm piano?"}'

Learning from history

Use audio_recent from the injected context to personalize; only use GET /audio/history in the missing-context fallback above:

  • Song ended naturally + listened > 3 min → user enjoyed it → suggest similar artist/genre.
  • User stopped manually + listened < 30s → didn't like it → try different direction.
  • No history → fall back to genre table above.

Examples

  • Mood: tired (known user) → [HW:/emotion:{"emotion":"caring","intensity":0.5}][HW:/dm:{"telegram_id":"158406741"}] You seem tired — want some calm piano?
  • Mood: tired (unknown) → [HW:/emotion:{"emotion":"caring","intensity":0.5}] You seem tired — want some calm piano?
  • Mood: stressed (known user) → [HW:/emotion:{"emotion":"caring","intensity":0.6}][HW:/dm:{"telegram_id":"158406741"}] You look a bit tense — want some soft piano to ease into?
  • Mood: stressed (unknown) → [HW:/emotion:{"emotion":"caring","intensity":0.6}] You look a bit tense — want some soft piano?
  • Mood: sad (unknown) → [HW:/emotion:{"emotion":"caring","intensity":0.6}] Rough moment? Some gentle acoustic might help.
  • Mood: bored (unknown) → [HW:/emotion:{"emotion":"caring","intensity":0.5}] Need a lift? How about some upbeat indie?
  • Mood: excited (unknown) → [HW:/emotion:{"emotion":"happy","intensity":0.7}] Riding the energy — feel-good pop?
  • Mood: happy, music already playing → NO_REPLY
  • After user confirms (known user) → [HW:/audio/play:{"query":"Bill Evans Waltz for Debby","person":"{name}"}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Great choice!
  • After user confirms (unknown) → [HW:/audio/play:{"query":"Bill Evans Waltz for Debby"}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Great choice!

Rules

  • All computation stays in thinking — reply is only the suggestion sentence (with HW markers) or NO_REPLY.
  • Never mention "cooldown", "interval", "threshold", or timestamps in the reply.
  • person field in /audio/play is {name} — the speaker identified in the injected context, lowercase. Omit the field when the context has no identified user (the "(unknown)" cases above). Never copy a name from an example or guess one; unmatched names land in the shared unknown bucket anyway.
  • Never open with a greeting. This is an emotion-driven mood event, NOT a presence/arrival event. Forbidden openers: hello, hi, hey, welcome back, oh, you're back, anything containing again or referencing the user re-arriving. Greetings belong only to presence.enter in sensing/SKILL.md.
  • Tone must match the mood. For Fear → stressed and Sad → sad decisions, use the caring emotion marker and a gentle acknowledging sentence — never cheerful or playful phrasing. If you can't produce a tone-appropriate one-liner, output NO_REPLY.
  • Don't reference the camera or detection. No "I noticed you look…", "I can see…", "your face shows…" — speak as if you simply care, not as if you're describing a sensor reading.

© autonomous-ai, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in skills/music-suggestion of autonomous-ai/Physical-AI-Operating-System.

  • SKILL.md
  • skill.json

Open the folder on GitHubat commit d5efe9d

Compare with similar skills

Music Suggestion next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Music Suggestion compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Music Suggestion this skillautonomous-ai/Physical-AI-Operating-System407—~2.6kAutomated safety check: PassApache-2.0
OmniRoute Routing CLIdiegosouzapw/OmniRoute75k—~342Automated safety check: PassMIT
Music to Videoheygen-com/hyperframes60k3 repos~4.7kAutomated safety check: NotesApache-2.0
MiniMax Music Generationbytedance/deer-flow84k—~717Automated safety check: PassMIT
Venice Audio Musicnexu-io/open-design100k—~297Automated safety check: PassApache-2.0
AI Music Albumnexu-io/open-design100k—~328Automated safety check: PassApache-2.0

Similar skills

  • OmniRoute Routing CLI

    diegosouzapw/OmniRoute

    Creates, switches, and inspects OmniRoute model-routing combos, plus a suggestion command with cost and latency constraints.

    75k GitHub stars~342 tokensUpdated today
    AI & LLM EngineeringAuto-check passed
  • Music to Video

    heygen-com/hyperframes

    Turns a music track into a beat-synced HyperFrames video such as a lyric video, slideshow or kinetic promo, with any supplied images or clips cut onto the beat grid.

    60k GitHub starsUsed in 3 repos~4.7k tokens
    Media & CreativeAuto-check: notes
  • MiniMax Music Generation

    bytedance/deer-flow

    Generates songs, jingles or instrumental tracks as MP3 files from a style prompt and optional lyrics through the MiniMax music API.

    84k GitHub stars~717 tokensUpdated today
    Media & CreativeAuto-check passed
  • Venice Audio Music

    nexu-io/open-design

    Music generation queueing, retrieval, and completion endpoints via Venice.ai.

    100k GitHub stars~297 tokensUpdated yesterday
    Media & CreativeAuto-check passed
  • AI Music Album

    nexu-io/open-design

    Full-lifecycle AI music album production — concept, lyric drafting, track sequencing, and export.

    100k GitHub stars~328 tokensUpdated yesterday
    Media & CreativeAuto-check passed
  • OmniRoute Combo Routing

    diegosouzapw/OmniRoute

    Manages OmniRoute routing combos through its REST API: create and update combos, choose from 19 strategies, set fallback chains, test outcomes and read metrics.

    75k GitHub stars~2.1k tokensUpdated today
    Backend & APIsAuto-check passed

More from autonomous-ai/Physical-AI-Operating-System

All 28 skills in this repo
  • Agent Management

    autonomous-ai/Physical-AI-Operating-System

    Legacy Autonomous Buddy control for explicitly requested Buddy coding sessions.

    407 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Claude Code Buddy

    autonomous-ai/Physical-AI-Operating-System

    Push Claude Code activity to the user's device (e.g. An agent skill from autonomous-ai/Physical-AI-Operating-System.

    407 GitHub stars~2.4k tokensUpdated yesterday
    Auto-check: notes
  • Computer Use

    autonomous-ai/Physical-AI-Operating-System

    Operate apps/websites on the paired Mac via Buddy: Calendar, Notes, forms, screenshots, files.

    407 GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • Connectors

    autonomous-ai/Physical-AI-Operating-System

    Discover and use linked third-party services (Gmail, Google Calendar, Google Drive, Notion, Figma, Asana, Linear, GitHub, Ahrefs, Facebook Fan Page and others).

    407 GitHub stars~10k tokensUpdated yesterday
    Auto-check: notes
  • Harness Use

    autonomous-ai/Physical-AI-Operating-System

    Delegate digital work to agents on the computer paired through Harness; discover Store packages and prepare an agent when needed.

    407 GitHub stars~8k tokensUpdated yesterday
    Auto-check passed
  • Audio

    autonomous-ai/Physical-AI-Operating-System

    Low-level speaker and microphone hardware control — adjust volume, play test tones, record raw audio.

    407 GitHub stars~1k tokensUpdated yesterday
    Auto-check passed

Questions about Music Suggestion

What does Music Suggestion do?

Proactive music suggestion. An agent skill from autonomous-ai/Physical-AI-Operating-System. Music Suggestion is an agent skill from autonomous-ai/Physical-AI-Operating-System. Proactive music suggestion.

How do I install Music Suggestion in Claude Code?

Run `npx skills add autonomous-ai/Physical-AI-Operating-System --skill music-suggestion -a claude-code`. Or copy the skill folder (skills/music-suggestion in autonomous-ai/Physical-AI-Operating-System) into .claude/skills/music-suggestion in your project. Claude Code loads it when a task matches its description.

How do I install Music Suggestion in Codex?

Run `npx skills add autonomous-ai/Physical-AI-Operating-System --skill music-suggestion -a codex`. Or copy the skill folder (skills/music-suggestion in autonomous-ai/Physical-AI-Operating-System) into .agents/skills/music-suggestion in your project. Codex loads it when a task matches its description.

Can I use Music Suggestion in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add autonomous-ai/Physical-AI-Operating-System --skill music-suggestion -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/music-suggestion, .gemini/skills/music-suggestion, .github/skills/music-suggestion and .opencode/skills/music-suggestion in your project.

What does Music Suggestion need to run?

Going by SKILL.md and its folder, Music Suggestion needs the command-line tools its instructions call (curl).

Does Music Suggestion access the network?

SKILL.md contains no URLs. Its commands use curl, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Music Suggestion safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Music Suggestion use?

Music Suggestion is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Music Suggestion use?

About 2.6k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Music Suggestion?

Skills that share tags, products or a category with Music Suggestion: OmniRoute Routing CLI (diegosouzapw/OmniRoute, 75k stars), Music to Video (heygen-com/hyperframes, 60k stars), MiniMax Music Generation (bytedance/deer-flow, 84k stars) and Venice Audio Music (nexu-io/open-design, 100k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Music Suggestion?

autonomous-ai (a GitHub organization) maintains it in autonomous-ai/Physical-AI-Operating-System, which has 407 GitHub stars. The repository holds 28 skills in this directory. The repository was last updated on October 10, 2026.

Source: autonomous-ai/Physical-AI-Operating-System on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.