Exploring the foundational components of a basic Mycroft Skill.
Video Tutorial: Anatomy of a Skill
If we now navigate to our new Skill, we can see that it is made up of a number of files and folders.
$ ls -l
drwxr-xr-x 3 kris kris 4096 Oct 8 22:21 dialog
-rw-r--r-- 1 kris kris 299 Oct 8 22:21 __init__.py
-rw-r--r-- 1 kris kris 9482 Oct 8 22:21 LICENSE
-rw-r--r-- 1 kris kris 283 Oct 8 22:21 README.md
-rw-r--r-- 1 kris kris 642 Oct 8 22:21 settingsmeta.yaml
drwxr-xr-x 3 kris kris 4096 Oct 8 22:21 vocab
We will look at each of these in turn.
localedirectories contain subdirectories for each spoken language the skill supports. The subdirectories are named using the IETF language tag for the language. For example, Brazilian Portugues is 'pt-br', German is 'de-de', and Australian English is 'en-au'.
By default, your new Skill contains one subdirectory for United States English - 'en-us'. If more languages were supported, then there would be additional language directories.
$ ls -l dialog
drwxr-xr-x 2 kris kris 4096 Oct 8 22:21 en-us
There will be one file in the language subdirectory (ie.
en-us) for each type of dialog the Skill will use. Currently this will contain all of the phrases you input when creating the Skill.
$ ls -l dialog/en-us
-rw-r--r-- 1 kris kris 10 Oct 8 22:21 first.dialog
When instructed to use a particular dialog, Mycroft will choose one of these lines at random. This is closer to natural speech. That is, many similar phrases mean the same thing.
For example, how do you say 'goodbye' to someone?
- Bye for now
- See you round
- Catch you later
- See ya!
Each Skill defines one or more Intents. Intents are defined in the
vocabdirectory is organized by language, just like the
We will learn about Intents in more detail shortly. For now, we can see that within the
vocabdirectory you may find multiple types of files:
.intentfiles used for defining Padatious Intents
.vocfiles define keywords primarily used in Adapt Intents
.entityfiles define a named entity also used in Adapt Intents
In our current example we might see something like:
$ ls -l vocab/en-us
-rw-r--r-- 1 kris kris 23 Oct 8 22:21 first.intent
.intentfile will contain all of the sample utterances we provided when creating the Skill.
This directory is a newer addition to Mycroft and combines
vocabinto a single directory. This was requested by the Community to reduce the complexity of a Skills structure, particularly for smaller Skills. Any of the standard file types that we've looked at so far will be treated the same if they are contained in the
This also includes the
regexdirectory that you will learn about later in the tutorial.
__init__.pyfile is where most of the Skill is defined using Python code. We will learn more about the contents of this file in the next section.
Let's take a look:
from adapt.intent import IntentBuilder
from mycroft import MycroftSkill, intent_handler
This section of code imports the required libraries. Some libraries will be required on every Skill, and your skill may need to import additional libraries.
classdefinition extends the
The class should be named logically, for example "TimeSkill", "WeatherSkill", "NewsSkill", "IPaddressSkill". If you would like guidance on what to call your Skill, please join the ~skills Channel on Mycroft Chat.
Inside the class, methods are then defined.
This method is the constructor. It is called when the Skill is first constructed. It is often used to declare state variables or perform setup actions, however it cannot utilise MycroftSkill methods as the class does not yet exist. You don't have to include the constructor.
__init__method might be:
self.already_said_hello = False
self.be_friendly = True
Perform any final setup needed for the skill here. This function is invoked after the skill is fully constructed and registered with the system. Intents will be registered and Skill settings will be available.
my_setting = self.settings.get('my_setting')
initializefunction was used to register intents, however our new
@intent_handlerdecorator is a cleaner way to achieve this. We will learn all about the different Intents shortly. You may also see the
@intent_file_handlerdecorator used in Skills. This has been deprecated and you can now replace any instance of this with the simpler
In our current HelloWorldSkill we can see two different styles.
- 1.An Adapt handler, triggered by a keyword defined in a
ThankYouKeyword.vocfile.@intent_handler(IntentBuilder('ThankYouIntent').require('ThankYouKeyword'))def handle_thank_you_intent(self, message):self.speak_dialog("welcome")
- 2.A Padatious intent handler, triggered using a list of sample phrases.@intent_handler('HowAreYou.intent')def handle_how_are_you_intent(self, message):self.speak_dialog("how.are.you")
In both cases, the function receives two parameters:
self- a reference to the HelloWorldSkill object itself
message- an incoming message from the
Both intents call the
self.speak_dialog()method, passing the name of a dialog file to it. In this case
You will usually also have a
This tells Mycroft what your Skill should do if a stop intent is detected.
In the above code block, the
passstatement is used as a placeholder; it doesn't actually have any function. However, if the Skill had any active functionality, the stop() method would terminate the functionality, leaving the Skill in a known good state.
The final code block in our Skill is the
create_skillfunction that returns our new Skill:
This is required by Mycroft and is responsible for actually creating an instance of your Skill that Mycroft can load.
Please note that this function is not scoped within your Skills class. It should not be indented to the same level as the methods discussed above.
This file contains the full text of the license your Skill is being distributed under. It is not required for the Skill to work, however all Skills submitted to the Marketplace must be released under an appropriate open source license.
You have now successfully created a new Skill and have an understanding of the basic components that make up a Mycroft Skill.