Built-in Skills¶
Weather — builtin_skills/weather.py¶
Provides current conditions and multi-day forecasts using the National Weather Service API (US only, no API key required). Geocoding uses Nominatim (OpenStreetMap).
Skills¶
| Function | Description |
|---|---|
get_current_weather(location) |
Current temperature, conditions, humidity, wind |
get_forecast(location, days) |
Multi-day forecast; days defaults to 3 |
Configuration¶
The weather skill has no per-skill keys. When the user doesn't name a location it
uses the top-level location: block in llm.yaml (city + state; optional
latitude/longitude skip a geocoding step and are otherwise derived from city/state).
Output is in °F.
News — builtin_skills/news.py¶
Fetches headlines and article summaries from configurable RSS feeds. Articles are extracted with trafilatura and summarized by a sub-LLM call.
Skills¶
| Function | Description |
|---|---|
get_news(category) |
Returns a numbered list of headlines for the given category |
get_news_article(category, article_number) |
Fetches and summarizes a specific article by its position in the list |
Configuration (skills.news in llm.yaml)¶
| Key | Default | Description |
|---|---|---|
max_headlines |
5 |
Maximum headlines returned per request |
model |
"gpt-4o" |
Model used for article summarization |
base_url |
— | Base URL for local model providers |
feeds |
(see below) | Map of category name → RSS feed URL |
Default feeds:
feeds:
latest: "https://moxie.foxnews.com/google-publisher/latest.xml"
world: "https://moxie.foxnews.com/google-publisher/world.xml"
politics: "https://moxie.foxnews.com/google-publisher/politics.xml"
local: "https://myfox8.com/feed/"
Add or replace any category by editing the feeds map. Any RSS 2.0 or Atom feed works.
Stocks — builtin_skills/stocks.py¶
Returns stock quotes using yfinance.
Skills¶
| Function | Description |
|---|---|
get_stock_info(tickers) |
Price, day range, 52-week range, and percentage change for one or more symbols |
Example response¶
Apple Inc. (AAPL)
Price: 213.45 USD +5.32 (+2.56%) [REGULAR]
Day range: 208.10 – 214.20
52-week range: 164.08 – 237.23
200-day avg: 198.45
Home Assistant — builtin_skills/home_assistant.py¶
Controls and queries smart home devices via the Home Assistant REST API. See Home Assistant for full setup documentation.
Skills¶
| Function | Description |
|---|---|
handle_home_control(request, speaker) |
Natural language control of lights, fans, locks, covers, and thermostats |
Configuration (skills.home_assistant in llm.yaml)¶
| Key | Default | Description |
|---|---|---|
url |
"http://homeassistant.local:8123" |
Home Assistant base URL |
model |
"gpt-4o" |
Model used for device resolution |
base_url |
— | Base URL for local model providers |
device_ids_yaml |
"data/home_assistant/device_ids.yaml" |
Device hierarchy (human-readable aliases) |
device_ids_json |
"data/home_assistant/device_ids.json" |
Alias → HA entity ID mapping |
default_room |
"" |
Room assumed when the user does not specify one |
Requires: HA_API_KEY in .env
Random Tools — builtin_skills/random_tools.py¶
Utility skills for randomness and selection.
| Function | Description |
|---|---|
flip_coin() |
Returns "heads" or "tails" |
roll_dice(sides, count) |
Rolls one or more dice; sides defaults to 6 |
pick_number(min, max) |
Random integer in the given range |
pick_from_list(items) |
Picks one item from a list |
yes_no_maybe() |
Returns "yes", "no", or "maybe" |
Note
yes_no_maybe and pick_from_list include explicit docstring clauses that instruct the LLM not to use them for factual or deterministic questions.
About — builtin_skills/about.py¶
| Function | Description |
|---|---|
get_assistant_version() |
Returns the installed Kenzy package version |
Announce — builtin_skills/announce.py¶
Broadcasts a spoken message to other rooms. Say "Hey Kenzy… tell everyone dinner's ready" and Kenzy speaks it in every room, then confirms in the room you asked from.
| Function | Description |
|---|---|
announce(message, rooms="") |
Speak message aloud in other rooms; rooms is an optional comma-separated list of room names (empty = everywhere) |
This is the first user of the server-actions mechanism: the skill can't speak in other rooms itself (it runs in kenzy-llm), so it queues an action that kenzy-server actuates via its existing announce() (synthesize once, stream to the target nodes). The asking room is excluded from the broadcast so it doesn't hear the message twice. The server tells the model which room names are currently connected, so it targets real rooms.
Intercom — builtin_skills/intercom.py¶
Starts a live two-way voice call to another room. Say "call the living room" and Kenzy rings that room; the call connects only after someone there says "yes" to accept it.
| Function | Description |
|---|---|
connect_room(room) |
Ring room for a live intercom call (the other room must verbally accept) |
Like announce, this queues a server action. The server rings the target room, plays a spoken consent prompt, and bridges audio only on a clear spoken "yes" (default-deny on silence/ambiguity/timeout). During an active call a wake word at either end ends it immediately. Requires a speakerphone with hardware echo cancellation.