Skip to content
BloopbotDocumentation

Run your channel

Smarter song requests with AI

Find a song from a description with !findsong, or let AI match requests, screen out trolls and check a song policy.

9 min readUpdated

Before you start

For flows that queue tracks, set up song requests first. Only want a suggestion? Find a song from a description needs Spotify linked, but does not need request flows enabled. Each capability below is its own AI feature, so your channel may include one and not the other; check Your plan from the Flows page:

FeatureWhat it adds
Smarter song matchingA Find a song step that picks the right track out of several near-identical results.
Song policyAn AI: song fits my rules? step for troll screening and your own plain-English policy.
Intent trigger + Judge & route nodesBoth together are what let a request work with no !sr in front of it at all — see “No command at all” below.

Start from the template

  1. Open Flows → Explore packs and find Smart !sr (find, check, queue), in the AI helpers pack.
  2. Install it. You get the same shape as the plain !sr, with the AI in it: !sr → an Only if step that stops a bare !sr quietly → Can they request a song?, which checks your five song variables and answers a refusal with one line, replying with $(from.rules.reason)Find a song with the AI picking the track → a second Can they request a song? on the found track, which skips a song already in the queue quietly → AI: song fits my rules?, which skips a troll upload quietly → Request a song. Nothing found, or Spotify not answering, gets one “couldn’t find that song” line.
  3. Reword the two lines, or add the replies you want, the same as in any other flow.

Two changes people often make to their copy:

  1. Say why a troll upload was skipped. Add a Chat message such as @$(user) that looks like a troll upload, so I’m skipping it. and wire AI: song fits my rules?’s troll output to it.
  2. Add your own song policy. Type a rule into the screen’s Your song policy box, such as “chill music only, no screamo”, and wire its breaks policy output to a line of your own — see Screen out trolls and enforce your own rules.

Already have an !sr flow? Either replace it with this one — pause the old one, or both will answer the same command — or drop a Find a song step in front of your existing Request a song and open the song box and choose that step’s Track value from the Insert… menu — or drag a data wire from its uri value onto the song box.

Let AI pick the right track

This section describes Search for → A title or Spotify link, the default mode. A sentence that describes a song instead is a different case, covered at the end of this section; Find a song from a description is the same artist search offered as a suggestion-only command.

Normally a song request queues Spotify’s first search result. The Find a song step looks at the top few results instead and asks the AI judge which one the viewer actually meant, from their own wording — the original rather than a karaoke cover, the artist they named rather than the loudest upload.

Its Pick the track the viewer meant (AI) switch is on by default. Turn it off and the step takes Spotify’s first hit, exactly as a plain song request always has. A Spotify link is never sent to the judge, because a link already names one track.

The step hands the track forward as data the rest of the flow can use: uri, title, artist, album, explicit, duration, the confidence behind the pick, and the runner-up it found — the alt_uri value in the Insert… menu.

When the request describes a song instead of naming it. “That Bowie astronaut song” is not a title, so the search in Smart !sr and Plain-English song requests usually finds nothing for it: Smart !sr answers with its “couldn’t find that song” line, and Plain-English song requests stays quiet, because nobody typed a command. Find a song from a description is the command for a description: it picks the artist out of the words, searches that artist’s tracks and suggests the one that matches, without queuing it.

A smarter !wrongsong

The next-best candidate comes out of Find a song as the alt_uri pin, so “that’s the wrong song, give me the other one” is a flow you build and can read rather than something the bot quietly remembered.

The Wrong song (swap to the runner-up) template is exactly that: !wrongsong and the song they meant → find it → check there really is a runner-up → take back what they last asked for → queue the runner-up that Find a song offers on the Insert… menu instead.

Request a song with no command at all

Install Plain-English song requests, also in the AI helpers pack, and someone can type “can you play Space Oddity by David Bowie” — no !sr — to request it. AI: chat means… notices the request, AI: pick out a detail picks title-and-artist words already in the sentence, and Find a song searches for those words, the same as above.

Because it uses AI: chat means…, it needs the Intent trigger feature too, and because AI: pick out a detail is a Judge & route node, it needs that feature as well — so this template asks more of your channel than Smart !sr does. Without Intent trigger it never starts; without Judge & route nodes it cannot extract a title.

AI: pick out a detail is its own step, not tied to songs — set What to pick out to a username, a game or category name, a number, or describe your own in plain English, and any trigger can drive it. The template uses it to read Text ($(message)) and pick out A song title, then points Find a song’s search box at that step’s value, picked from the Insert… menu or drawn there as a data wire.

It screens the track with an AI: song fits my rules? step of its own, set up the same way as Smart !sr’s — a request with no command in front of it is not a request that skips the rules.

Nobody typed a command here, so nobody is waiting on a reply: before anything is picked out or searched for, the template checks your song variables with Can they request a song?, and every way a request can end without a song — turned down by your limits, no title in the sentence, nothing found, already in the queue, a troll upload — is left unwired, so it simply stops. Wire one to a quiet chat line yourself if you would rather it said something, such as @$(user) $(from.rules.reason) on the first check’s Refused output.

Two smaller templates in the same pack cover the other things people say without a command: Plain-English “what song is this?” answers someone asking what is playing, and Plain-English “take my song off” takes back the request of whoever asked — only ever their own, and it says so, so a misread sentence costs one request and no more.

Find a song from a description

Remember the artist and a clue, but not the title? Find a song from a description adds !findsong: it replies with a possible Spotify match and never queues a song. The song-request templates search for a title; this is the command for a description, and it only ever suggests, so you see the match before anything is queued.

Before you start, check Links → Spotify shows Connectedthe Spotify linking guide covers linking — and check Your plan includes both Judge & route nodes and Smarter song matching. These AI features may not be available on your channel yet. This command does not need Intent trigger or Song policy: it only suggests, so it does not screen or approve a request.

  1. Open Flows → Explore packs. Find Find a song from a description among the individual templates in AI helpers and install that template only. Do not reinstall the whole pack: existing installed flows stay unchanged, and extra copies can answer twice.
  2. Open Canvas and inspect the command’s path: !findsong → cooldown → AI: pick out a detailFind a song → a chat reply. Keep the cooldown before both AI steps: it waits 5 seconds across the channel and 20 seconds per viewer. There is no Request a song action.
  3. Check the extraction step: Text is $(query) and What to pick out is A music artist. In Find a song, keep Search for set to A description of an artist’s song, What to search for at $(from.artist.value), Original song description at $(query), and Pick the track the viewer meant (AI) on. The artist narrows the search; the full original clue tells the judge what to pick.
  4. Review the three replies — the suggestion, the one asking for an artist and a clue, and the miss — press Save, then enable the flow. Make sure only one enabled flow answers !findsong.
  5. In Twitch chat, type !findsong that Bowie astronaut song?. Keep the text after the command to at most 32 words and 500 characters, including a named artist and a clue to one song. Inspect the reply and the flow’s Run log.

Expected result: if Spotify returns Space Oddity among the candidates and the judge confidently matches the clue, chat may reply “Possible match: Space Oddity by David Bowie” with its Spotify URI. That is a possible result, not a guarantee. Nothing is queued. If it is the song you want and your channel’s request flows are enabled, send !sr followed by the returned URI; that separate request still goes through your normal request checks.

If the result is not what you expected:

  • “I could not tell which song you mean”: a bare !findsong, no named artist, text over the input limit, or a judge that was not confident. Retry with a full artist name and one specific clue, and check both required features in Your plan. Missing AI answers and uncertainty never become a first-hit suggestion.
  • “No match in the tracks I checked”: the search returned no usable match, or Spotify did not answer — not proof that the song does not exist. Check Spotify is still Connected on Links, try a clearer artist name, or use a known title or Spotify link in your request flow. The Run log shows whether the search failed.
  • No reply at all? A search asked for again within a cooldown stops without a reply: wait 5 seconds, or 20 for your own next search. Otherwise check the flow is enabled, the command name is unchanged and its reply branches are connected.

Screen out trolls and enforce your own rules

The AI: song fits my rules? step runs two independent checks on a track before anything queues — never a timeout or a ban, just a branch you decide what to do with:

  • Screen troll / meme / earrape uploads — joke uploads, shock edits and bait tracks. On by default. A real song that happens to also be a meme still passes.
  • Your song policy — write a rule in plain English, e.g. “chill music only, no screamo”, and a track that breaks it leaves by the Breaks policy branch. Leave it empty and that check is never asked.

One How strict picker covers both: Only the obvious ones, Balanced (the default, and the safe starting point) or Strict — turns down anything borderline. Each branch is yours to wire: reply in chat, queue it anyway, log it quietly, or leave it unconnected so nothing happens at all.

The Unsure branch matters

Every AI step has an Unsure output. On a channel that doesn’t include the feature, that is the branch every request leaves by: the step is skipped rather than run, so a step that checks a track simply doesn’t check it, and the request carries on with the track the flow already has.

Find a song, in its default title/link mode, is different: it is never skipped for missing the feature. With or without Smarter song matching, it searches and hands a track on — by Found when it is entitled and confident, and still by Found (Spotify’s first result) the moment the feature is unavailable, exactly as with its AI switch off. Artist-description search is the one exception: it needs Smarter song matching to run at all, and supplies no track when unavailable or when the judge is unsure — see the description guide. Leave Unsure unwired on a checking step and your song requests quietly stop being screened, and the editor puts a warning on the step if you do.

Troubleshooting

  • Still queuing the first search result in title/link mode? Check your channel includes Smarter song matching and that Pick the track the viewer meant (AI) is on. In that mode, a low-confidence pick carries the first result on Unsure, which Smart !sr queues. Artist-description search never uses that fallback and the !findsong template never queues.
  • A genuine request turned down as a troll? Move How strict down a step, or switch troll screening off on the step.
  • Policy turning down things it shouldn’t? Reread it for anything stricter than you meant — the judge follows it literally.
  • Nothing queues at all? Check the Unsure branch is wired on every checking step (AI: song fits my rules? and the like) — those are skipped without Smarter song matching or Judge & route nodes, and a skipped check with Unsure unwired carries no track onward. Using artist-description search specifically, also check your channel includes Smarter song matching: that mode alone needs it to run at all. Title/link Find a song is not the cause — it always hands a track on, feature or no feature.
  • AI parts silent but requests still work? That is the intended fallback: a judge outage, or a missing feature on a step that screens a track, and the request carries on without that step. A missing feature on Find a song is the one that does not stand down on its own — with its AI switch on, the step is skipped. In title/link mode you can turn that switch off or give it a fallback (see “Let AI pick the right track”); artist-description mode always needs the matcher and asks for a retry instead.
  • A request that describes a song isn’t found? The request templates search for a title. Use !findsong for a description — Find a song from a description — and request the suggestion it gives with !sr.
  • Want the newer, simpler version of a template you installed earlier? An installed flow does not change by itself. Open Flows → Explore packs, choose the same template again and install it — you get a paused copy — then pause or delete the older one; templates and packs explains how copies work.
  • A troll upload or a repeat request gets no reply? That is how the template is drawn: those checks stop quietly. Start from the template shows how to wire a line of your own to them.