Definition of the Hermes protocol used by the Snips platform
hermes-protocol
This repository contains the definition of the hermes
protocol used by
the Snips platform.
hermes
?hermes
is a protocol used by all the components of the Snips platform
to communicate with each other. For example an user app for the platform
can use hermes
to be notified that a new intent was detected. An other
example could when the dialogue component asks the Automatic Speech
Recognition (ASR) component to start capturing user speech, this will also
be done through hermes
.
The various messages that can be sent using hermes
are defined in what
we call an ontology. It is an ensemble of rust struct
s definitions.
Relevant parts of the ontology are available in the guest languages that
hermes supports.
An important notion when using the Snips platform is the notion of "site". A site can be seen as an "interaction locus". It is throught a site than an user will interact with the platform. A site consists at least of a voice input (a microphone) and also probably of speakers and maybe other devices used to give information to the user (leds, screens...).
A site is identified in hermes
by a site_id
. When there is a single
site, it is usually default
.
The Snips platform consists of multiple components (for example the ASR,
the dialogue, the TTS, the NLU...) and hermes
has been designed around
theses components.
Each component is represented in hermes by two "facades":
Facades are retrieved through a ProtocolHandler
more on that later.
Let's take the example of the detection of an hotword:
hotword
method on the ProtocolHandler
subscribeDetected
or
subscribeAllDetected
methods on the facade (the first one provides
and handy way to filter the hotword detected only on a specific site)snips-hotword
)
needs to publish the event when an hotword is detected:hotwork_backend
method on the ProtocolHandler
publishDetected
method on
the facade1.
and the
code can react how it wants to the the hotword.When writing an app for the Snips platform, the facade you'll want to use is the main dialogue facade. The dialogue component orchestrates the interaction with the user and your app should interact with the platform through it. You can find an overview of the available apis on the Snips documentation.
ProtocolHandler
shermes
has two implementations: one over MQTT and one using an
inprocess bus. A standard installation on a RaspberryPi uses the MQTT
version whereas the Android and iOs sdks use the inprocess one.
The rust crates hermes-mqtt
and hermes-inprocess
provide
ProtocolHandler
s implementation for the two communication layers.
The guest language bindings for hermes
wrap hermes-mqtt
.
hermes
ontology and facades (ie protocol) definitionshermes-ffi
ffi bindings for ontology and facadeshermes-ffi-test
echo lib that can be used to test guest language
bindingshermes-inprocess
protocol implementation using an in-process bus
(ripb) for communicationhermes-mqtt
protocol implementation using MQTT for communicationhermes-mqtt-ffi
lib exposing the MQTT impl to guest languageshermes-test-suite
test suite used to verify implementation
correctnessplatforms
guest language bindings
c
C headerhermes-kotlin
jvm implhermes-python
python implhermes-javascript
js implLicensed under either of
Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.