Skip to main content

Boilerplate for Snips skills in Python3

Project description

snips-skill

Helpers to keep Snips skills in Python3 free of boilerplate code.

Snips used to be a French company with a decent voice assistant. They were bought by Sonos and discontinued all services. Snips also created the Hermes MQTT protocol, which is compatible with the Rhasspy voice assistant.

A 'skill' (in Snips parlance) is an MQTT client that may read sensors, do computations, or trigger devices.

Contents

  • MqttClient: A thin wrapper around paho-mqtt
  • CommandLineClient skeleton MQTT command line client with connection settings.
  • SnipsClient: Reads connection parameters from /etc/snips/toml
  • Snips-specific decorators for callbacks, see below.
  • MultiRoomConfig: Utilities for multi-room setups.
  • Skill: Base class for Snips actions.
  • @intent decorator, see below.
  • StateAwareMixin with @when and @conditional decorators for stateful MQTT clients.

Plain MQTT clients

Plain MQTT is supported via the MqttClient and CommandLineClient classes and the @topic decorator.

A CommandLineClient provides argument parsing for connection parameters and includes standard logging. For message handling, define a function or method as above, and decorate it with @topic. This registers the method (or function) as a callback for the given MQTT topic.

Usage example

from snips_skill import CommandLineClient, topic

class Logger(CommandLineClient):
    'Log all incoming MQTT messages'
    
    @topic('#')
    def print_msg(self, userdata, msg):
        self.log.info("%s: %s", msg.topic, msg.payload[:64])

if __name__ == '__main__':
    Logger().run()

Snips session event decorators

The Skill class provides automatic connection configuration via /etc/snips/toml. Also, the following Snips-specific decorators for session events are provided:

  • on_intent: Handle intents,
  • on_intent_not_recognized: Handle unknown intents,
  • on_start_session: Called before session start,
  • on_continue_session: Called for subsequent session prompts,
  • on_session_started: Called at session start,
  • on_end_session: Called before session end,
  • on_session_ended: Called at session end.

All decorators can be used either on standalone callback functions, or on methods of the various client classes (including Skill).

Methods should expect the parameters self, userdata, msg, and standalone functions should expect client, userdata, msg.

Multiple decorators on the same method are possible, but if they have inconsistent qos values, the results will be unpredictable. Also note that multiple decorators will produce repetitive log lines with DEBUG level. Set log_level=None on all but one decorator to fix it.

The @intent decorator

@intent-decorated callbacks receive msg.paylod as an IntentPayload object, a parsed version of the JSON intent data. Slot values are converted to appropriate Python types.

The next step in the Snips session depends on the outcome of the decorated function or method:

  • If the function returns a string or raises a SnipsError, the session ends with a message,
  • If it returns en empty string, the session is ended silently.
  • If it raises a SnipsClarificationError, the session is continued with a question. This can be used to narrow down parameters or to implement question-and-answer sequences.

To require a minimum level of confidence for an intent, put @min_confidence below @intent.

To ensure that certain slots are present in the intent, put @require_slot with a slot name below @intent.

The @intent decorator should not be used in combination with any on_* decorators.

Example usage

from snips_skill import intent, Skill

class HelloSkill(Skill):
    'Snips skill to say hello'
    
    @intent('example:hello')
    def say_hello(self, userdata, msg):
        return 'Hello, there'
        
if __name__ == '__main__':
    HelloSkill().run()

StateAwareMixin, @when and @conditional decorators

These define actions triggered by state changes on MQTT. Example: Sensor registers motion -> switch the light on

Clients can use StateAwareMixin to track the last known state of relevant topics. For that, a status_topic needs to be configured in the global section of config.ini. Topics and payloads are kept in self.current_state.

Change handlers should be decorated with either @when or @conditional. The former triggers the handler whenever a boolean condition on the current state is fulfilled, the latter whenever a MQTT topic relevant for the given boolean condition changes.

Usage

  @when('topic/a > 0')
  def topic_a_handler(self):
    ... # do something
  
  @conditional('topic/a != 0 or topic/b != 0')
  def topic_a_or_b_handler(self, on):
    if on:
      ... # switch something on
    else:
      ... # switch it off

Boolean expressions, numeric comparisons, string (in)equality and string matching with regular expressions are supported. As usual, parentheses can be used to control the evaluation order.

See test_expr.py for the exact grammar.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

snips_skill-0.1.31.tar.gz (29.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

snips_skill-0.1.31-py3-none-any.whl (33.7 kB view details)

Uploaded Python 3

File details

Details for the file snips_skill-0.1.31.tar.gz.

File metadata

  • Download URL: snips_skill-0.1.31.tar.gz
  • Upload date:
  • Size: 29.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for snips_skill-0.1.31.tar.gz
Algorithm Hash digest
SHA256 c05969eb755fce6615cb11b3af515872185313afc452d727f658d05ba635c4d7
MD5 3f04870b8f309128facd882faa494694
BLAKE2b-256 1fbbbcbc29bd248c5ca9d8b1fc363fb0ae10fb3d782ca52be8817fd32591b8cc

See more details on using hashes here.

File details

Details for the file snips_skill-0.1.31-py3-none-any.whl.

File metadata

  • Download URL: snips_skill-0.1.31-py3-none-any.whl
  • Upload date:
  • Size: 33.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for snips_skill-0.1.31-py3-none-any.whl
Algorithm Hash digest
SHA256 71be0e61e6647d6c6449537bb0557fcb54f1a91a7eb7fa16c74b7f53cc796a86
MD5 90dbad63374d7f59ccf9030204b6cb36
BLAKE2b-256 3d55f45f4416d21c28790159b79d40ac35b1b668e16ad734b774529cb210f894

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page