Before you start
For flows that queue tracks, set up song requests first; if no request flow is on yet, the Song requests page’s Song request flows row adds them (Check the request flows). 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 Plan & billing:
| Feature | What it adds |
|---|---|
| Smarter song matching | A Find a song step that picks the right track out of several near-identical results. |
| Song policy | An AI: song fits my rules? step for troll screening and your own plain-English policy. |
| Intent trigger + Judge & route nodes | Both 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
- Open Flows, press Marketplace, and find Smart !sr (find, check, queue), in the AI helpers pack.
- 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!srquietly → 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. - 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:
- 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. - 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, with its alt_title, alt_artist, alt_album, alt_duration and alt_explicit beside it.
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 → check it is not already in the queue and not a troll upload → take back what they last asked for → queue the runner-up that Find a song offers on the Insert… menu instead.
The two checks are the same ones Smart !sr uses, pointed at the runner-up. If the runner-up is already queued or looks like a troll upload, the flow ends quietly and nothing changes: the viewer keeps the song they asked for.
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 Connections → Spotify shows Connected — the 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.
- Open Flows → Add, find Find a song from a description, in the AI helpers pack, and add that flow on its own. Do not reinstall the whole pack: existing installed flows stay unchanged, and extra copies can answer twice.
- Open Canvas and inspect the command’s path:
!findsong→ cooldown → AI: pick out a detail → Find 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. - 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. - 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. - 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 Plan & billing. 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 Connections, 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 your rules in plain English, one per line, e.g. “Nothing explicit” on one line and “No screamo” on the next. Each line is checked on its own, and a track that breaks any of them 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 step hands on The rule it breaks, so a reply can say which one: wire Breaks policy to a Chat message such as @$(user) that song breaks a channel rule: $(from.check.broken_rule), picking the value from the Insert… menu. The track it checks includes whether Spotify marks it explicit, so a “Nothing explicit” rule is judged on that flag rather than guessed from the title.
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? Check The rule it breaks in the Run log, then reread that line for anything stricter than you meant — the judge follows each rule literally. Two rules on one line are judged as one, so split them onto their own lines.
- Nothing queues at all? Check the Unsure branch is wired on every checking step (AI: song fits my rules? and the like) — a check without Song policy takes that branch, and an unwired branch stops the request. For artist-description search, also check that your channel includes Smarter song matching: that mode needs it to find a track. Title/link Find a song still hands a track on when matching is unavailable.
- AI parts silent but requests still work? That is the intended fallback: a judge outage or a missing Song policy feature skips the screen, and the request carries on with the track already found. Title/link Find a song still searches without Smarter song matching, using the first result. Artist-description mode needs matching and asks for a clearer clue when it cannot settle on a track.
- A request that describes a song isn’t found? The request templates search for a title. Use
!findsongfor 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 → Add, open the same flow’s review again and press its button — 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.
Was this guide helpful?
Thanks. Your answer helps us decide which guides to improve.