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.