# What SkillKit Gives You

> Find SkillKit helpers by task, from what you want the skill to do to the call that does it and the page that explains it.

Source: https://docs.thalovant.com/developers/skillkit-capabilities/

---
SkillKit is a small library for writing Thalovant skills without copying the plumbing every skill needs. OVOS still owns intent routing, speech, sessions, and scheduling; SkillKit gives your code the pieces around them. This page is the map. Pick what you want to do, and it names the helper and the page that shows it working.

## Answer

| You want to | Use | Shown in |
| --- | --- | --- |
| Answer a spoken command | `ThalovantSkill` with `@intent_handler` and an `.intent` file | [Choose the right base](/developers/writing-a-skill/#choose-the-right-base) |
| Answer a topic nothing else claimed | `ThalovantFallbackSkill` with `can_answer`, `reply`, and `FALLBACK_PRIORITY` | [Choose a fallback priority](/developers/writing-a-skill/#choose-a-fallback-priority) |
| Keep a conversation going | `ThalovantConversationalSkill` with `can_converse` and `converse` | [Lesson 3 of the quiz](/developers/skillkit-tutorial/#lesson-3-build-the-game) |
| Do both, or play media | `ThalovantConversationalFallbackSkill`, `ThalovantCommonPlaySkill` | [Choose the right base](/developers/writing-a-skill/#choose-the-right-base) |
| Speak to the room that asked, in its language | `self.speak_to(message, text)` | [Lesson 2 of the quiz](/developers/skillkit-tutorial/#lesson-2-give-it-two-languages) |
| Show a reply without speaking | `preview_reply` | [Lesson 1 of the quiz](/developers/skillkit-tutorial/#lesson-1-make-it-speak) |

## Understand what was said

| You want to | Use | Shown in |
| --- | --- | --- |
| Read the words, the language, or the location | `self.utterance`, `self.lang_of`, `self.location_of` | [What you can call](/developers/writing-a-skill/#what-you-can-call) |
| Match a keyword people inflect ("logs", "logging") | `self.mentions`, `self.mentioned_term` | [What you can call](/developers/writing-a-skill/#what-you-can-call) |
| Check a whole phrase against an intent file | `locale_resources.matches_literal_intent` | [Lesson 2 of the quiz](/developers/skillkit-tutorial/#lesson-2-give-it-two-languages) |
| Check alternative transcripts | `message.utterances` | [Read alternative transcripts](/developers/writing-a-skill/#read-alternative-transcripts) |
| Write optional phrases and slots | `.intent` templates and `thalovant-skillkit check` | [Write intent phrases](/developers/writing-a-skill/#write-intent-phrases-ovos-can-read) |
| Compare text the way vocabulary files are compared | `fold`, `fold_words`, `strip_accents` | [What you can call](/developers/writing-a-skill/#what-you-can-call) |

## Say it in the right words

| You want to | Use | Shown in |
| --- | --- | --- |
| Pick a translated line, with placeholders | `self.dialog("name", lang, data)` | [Lesson 2 of the quiz](/developers/skillkit-tutorial/#lesson-2-give-it-two-languages) |
| Add pauses or pronunciation hints | `self.dialog`, `.ssml` twins, `ssml.say`, `ssml.digits` | [Add pauses and pronunciation](/developers/writing-a-skill/#add-pauses-and-pronunciation) |
| Vary replies without repeating | `self.speak_varied_dialog` | [Find sounds once](/developers/skillkit-runtime/#find-sounds-once-then-pick-quickly) |
| Serve a regional variant without a second translation | `locale/regional.json` and `thalovant-skillkit locales --write` | [Support regional variations](/developers/writing-a-skill/#support-regional-variations) |
| Say a date, time, or duration for ears and for a screen | `moments.date_text`, `time_text`, `duration_text`, `speak_with_written` | [Say a date or time both ways](/developers/writing-a-skill/#say-a-date-or-time-both-ways) |
| Read one skill setting safely | `self.setting("key", default)` | [What you can call](/developers/writing-a-skill/#what-you-can-call) |

## Remember and fetch

| You want to | Use | Shown in |
| --- | --- | --- |
| Keep one game or state per player | `SessionStateStore` | [Keep one game per player](/developers/skillkit-runtime/#keep-one-game-per-player) |
| Call a web service with a time budget | `JsonServiceClient`, `RequestBudget` | [Give online work a time budget](/developers/skillkit-runtime/#give-online-work-a-time-budget) |
| Ask the Thalovant knowledge service | `knowledge.knowledge_reply` | [Ask the knowledge service](/developers/writing-a-skill/#ask-the-knowledge-service) |
| Ship many sounds and pick without repeats | `bundled_files`, `ShuffleBagPool` | [Find sounds once](/developers/skillkit-runtime/#find-sounds-once-then-pick-quickly) |
| Refresh a catalog in the background | `PeriodicWorker` | [Refresh away from the reply](/developers/skillkit-runtime/#refresh-away-from-the-reply) |
| Keep optional shared state in Redis or PostgreSQL | `JsonStateStore` | [Save state without copying backend code](/developers/skillkit-runtime/#save-state-without-copying-backend-code) |
| Get your own reply back on a shared bus topic | `bus.wait_for_response` | [Keep shared bus replies with their caller](/developers/writing-a-skill/#keep-shared-bus-replies-with-their-caller) |

## Test and ship

| You want to | Use | Shown in |
| --- | --- | --- |
| Test without a running assistant | `testing.message`, `testing.FakeBus`, `preview_reply` | [Test it](/developers/writing-a-skill/#test-it) |
| Test through the real OVOS bus | `skill_harness`, `managed_minicroft`, `capture_turn` | [Exercise the real OVOS bus](/developers/writing-a-skill/#exercise-the-real-ovos-bus) |
| Start a project | `thalovant-skillkit new` | [Start from a working skill](/developers/writing-a-skill/#start-from-a-working-skill) |
| Check resources, and that no other skill owns your phrases | `thalovant-skillkit check` | [Ship it](/developers/skillkit-tutorial/#ship-it) |
| Check that the built package carries its files | `thalovant-skillkit check-artifacts` | [Check what you built](/developers/writing-a-skill/#check-what-you-built) |

## What SkillKit Leaves To OVOS

Recognising which skill a sentence belongs to, turning text into speech, keeping a session alive, and running timers and alarms are OVOS's jobs. `self.speak`, `self.speak_dialog`, `self.play_audio`, the intent decorators, and the scheduler all keep working exactly as they do in any OVOS skill.

The [SkillKit reference](https://github.com/thalovant/thalovant-skillkit/blob/main/docs/reference.md) has every signature and return value.
