-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathshow.example.yaml
More file actions
196 lines (174 loc) · 7.82 KB
/
Copy pathshow.example.yaml
File metadata and controls
196 lines (174 loc) · 7.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
show:
name: "Morning Drive"
host: "Alex"
tone: "upbeat, energetic, witty"
style: "morning drive radio"
# Location used by the built-in weather tool. Any city name or "City, Country" format.
location: "New York, US"
# Default RSS feed URL for the built-in news tool.
# Can be overridden per-segment via: tools: [{ name: news, url: "https://..." }]
news_feed: "https://feeds.bbci.co.uk/news/rss.xml"
# Register as a local Spotify Connect device via librespot (brew install librespot).
# When set, no external Spotify app is needed — audio plays directly on this machine.
connect_device_name: "AI Radio Station"
# When true, any external pause detected via polling (e.g. pausing in the Spotify app)
# is ignored and playback is automatically resumed. Useful for unattended setups.
# ignore_external_pause: true
# How to handle music during timed (interval_minutes) segments:
# duck — fade music to duck_volume%, play TTS on top, fade back up (requires librespot)
# pause — pause Spotify, play TTS, resume (works without librespot)
segment_audio: "duck"
duck_volume: 15 # 0-100
# Optional: override the default system prompt
# system_prompt: "You are Alex, a chill radio host who loves indie music..."
ai:
provider: "anthropic" # anthropic | openai | google
model: "claude-sonnet-4-6"
# Optional: connect to MCP (Model Context Protocol) servers to fetch live data for segments.
# Each server must expose an SSE endpoint. Tools from these servers can be used in any segment
# just like built-in tools, and their output is available as {{mcp.<server>.<tool>}} in prompts.
# mcp:
# servers:
# - name: my-server # Unique name used to reference this server in segment tools
# url: http://localhost:3000/sse
elevenlabs:
# Find voice IDs at: https://elevenlabs.io/app/voice-library
voice_id: "0S5oIfi8zOZixuSj8K6n" # Ivanna
model_id: "eleven_turbo_v2_5" # Low latency model
spotify:
# Find playlist IDs from the Spotify URL: open.spotify.com/playlist/<ID>
playlists:
- id: "35OyUAE7vwajoFPc5GkWci"
name: "Morning Drive"
- id: "0SHCREbo3cUVBiyYKCw5so"
name: "Upbeat Vibes"
# Default transition thresholds for all groups. Individual groups can override these.
# transition_after_minutes: 20
# transition_after_songs: 8
# Alternative: group playlists by genre/mood and have the station rotate through them.
# Groups play in random order. After all groups have played, the order is reshuffled and
# loops. A group_transition segment fires between groups (see segments below).
# Remove or comment out `playlists` above when using `groups`.
#
# groups:
# - id: country
# name: Country Music
# transition_after_minutes: 20 # switch after 20 minutes (whichever fires first)
# transition_after_songs: 8 # switch after 8 songs
# playlists:
# - id: "<playlist_id>"
# name: "Classic Country"
# - id: "<playlist_id>"
# name: "Modern Country"
# - id: pop
# name: Pop Hits
# transition_after_minutes: 15
# playlists:
# - id: "<playlist_id>"
# name: "Top Pop"
# - id: rock
# name: Rock Classics
# transition_after_songs: 6
# playlists:
# - id: "<playlist_id>"
# name: "Rock Anthems"
# Optional: target a specific Spotify Connect device (use --list-devices to find)
# device: "My Speaker"
segments:
- id: "intro"
trigger: "show_start"
prompt: >
Kick off {{show.name}} with a short energetic intro. Welcome listeners to the show,
introduce yourself as {{host}}, and get them excited for the music ahead.
Keep it under 10 seconds.
- id: "song_intro"
trigger: "before_song"
interval: 2 # Fire every 2 songs
prompt: >
Introduce the upcoming song "{{track.name}}" by {{track.artist}}.
Make it feel natural and conversational, like a real radio host would.
Maybe mention something interesting about the artist or why this song fits the vibe.
Keep it to 1-2 sentences and under 10 seconds.
- id: "time_check"
trigger: "interval_minutes"
interval_minutes: 30
prompt: >
Do a quick time check and energy boost for listeners. It's {{time}}.
Keep it short and punchy — just a few sentences to keep the energy going.
Keep it under 5 seconds.
# Weather update using the built-in weather tool.
# Tools run before the prompt is rendered and inject template variables.
# Built-in tools: weather, news
# Custom tools: provide a path to a .ts file exporting a default async function
- id: "weather_update"
trigger: "interval_minutes"
interval_minutes: 60
tools:
- weather # built-in: fetches current conditions for show.location
# Or with a custom location override:
# - name: weather
# location: "Los Angeles, US"
# Or a custom tool file:
# - path: ./my-tool.ts
prompt: >
Give listeners a quick weather update for {{weather.location}}.
Right now it's {{weather.temperature}}°C ({{weather.temperature_f}}°F) and {{weather.description}}.
Feels like {{weather.feels_like}}°C with {{weather.humidity}}% humidity and winds at {{weather.wind_speed}} km/h.
Keep it casual and under 10 seconds, like a real radio host would mention it.
# News briefing using the built-in news tool.
# Fetches headlines from the RSS feed configured in show.news_feed.
- id: "news_briefing"
trigger: "interval_minutes"
interval_minutes: 30
# Optional: override the global voice and narrator name for this segment.
# voice_id: "NMilCCbfoygNnI2VZ7ME" # A different ElevenLabs voice for news
# host: "Max" # Narrator name used in AI prompt & {{host}} template
tools:
- news # built-in: fetches headlines from show.news_feed
# Or with a custom feed and headline count:
# - name: news
# url: "https://feeds.bbci.co.uk/news/world/rss.xml"
# count: 3
prompt: >
Give listeners a quick news briefing from {{news.source}}.
Here are the latest headlines:
{{news.headlines}}
Summarise the top stories in a natural, conversational way like a radio host would.
Keep it to 2-3 sentences and under 15 seconds. Don't read headlines verbatim.
- id: "fun_fact"
trigger: "after_song"
interval: 4 # Fire after every 4th song
prompt: >
Share a quick, interesting music fact or trivia. It can be about
"{{track.name}}" by {{track.artist}} we just heard, or any fun music fact.
Keep it to 1-2 sentences and under 10 seconds.
- id: "outro"
trigger: "show_end"
prompt: >
Wrap up {{show.name}} with a warm outro. Thank the listeners for tuning in,
say goodbye as {{host}}, and leave them with something memorable.
Keep it under 8 seconds.
# Genre/group transition — fires between groups when using spotify.groups.
# {{group.name}} is the group we're leaving; {{group.next_name}} is the one coming up.
# - id: "genre_switch"
# trigger: "group_transition"
# prompt: >
# You just wrapped up the {{group.name}} block. Now smoothly transition into
# {{group.next_name}} — get listeners excited for the vibe shift ahead.
# Keep it natural and under 10 seconds.
# Example: MCP server tool usage.
# Calls the "get_headlines" tool on the "my-server" MCP server and injects the result
# as {{mcp.my-server.get_headlines}} in the prompt. Requires mcp.servers to be configured above.
# - id: "mcp_news"
# trigger: "interval_minutes"
# interval_minutes: 45
# tools:
# - mcp: my-server
# tool: get_headlines
# arguments:
# category: technology
# count: 3
# prompt: >
# Share a quick tech news update based on these headlines:
# {{mcp.my-server.get_headlines}}
# Keep it casual and under 15 seconds.