Skip to content

Hive Messages

JarbasAI edited this page Aug 29, 2021 · 1 revision

Message types

The HiveMind can be seen as a global Mycroft bus shared across devices, but not everyone gets every message!

Messages consist of 2 parts, a message_type and a payload.

The message_type defines how the message is routed. Each node may ignore specific message_types (either globally or per client) depending on its configuration.

The payload can be another HiveMessage, a Mycroft Message, or even binary, depending on the message_type.

Payload Messages

the payload of these messages is a mycroft Message object

Bus

BUS is single hop and flows from slave -> master and master -> slave

when master receives a BUS message, it will check it's global whitelist/blacklist and slave permissions, if the slave is authorized to inject that message in the mycroft-core messagebus then it will be injected. Any messages from master's mycroft-core that are a direct response to the injected message will be forwarded back to the slave

Permissions can be defined as a combination of msg_type, intent_type, skill_id, accessKey and ip_address rules

you can find the dedicated page on how these messages are handled by mycroft here

The most common example will be injecting a user utterance and receiving the responses, here is the output from master -> slave to the injected utterance "tell me a joke"

{'msg_type': 'bus', 'payload': {'type': 'skill.converse.request', 'data': {'skill_id': 'mycroft-joke.mycroftai', 'utterances': ['tell me a joke'], 'lang': 'en-us'}, 'context': {'source': 'HiveMind', 'destination': 'tcp4:127.0.0.1:52772', 'platform': 'HiveMessageBusClientV0.0.1', 'peer': 'tcp4:127.0.0.1:52772', 'client_name': 'HiveMindV0.7'}}, 'route': [], 'node': None, 'source_peer': 'tcp4:0.0.0.0:5678'}
{'msg_type': 'bus', 'payload': {'type': 'mycroft-joke.mycroftai:JokingIntent', 'data': {'intent_type': 'mycroft-joke.mycroftai:JokingIntent', 'mycroft_joke_mycroftaiJoke': 'joke', 'target': None, 'confidence': 0.3333333333333333, '__tags__': [{'match': 'joke', 'key': 'joke', 'start_token': 3, 'entities': [{'key': 'joke', 'match': 'joke', 'data': [['joke', 'mycroft_joke_mycroftaiJoke']], 'confidence': 1.0}], 'end_token': 3, 'from_context': False}], 'utterance': 'tell me a joke'}, 'context': {'source': 'HiveMind', 'destination': 'tcp4:127.0.0.1:52772', 'platform': 'HiveMessageBusClientV0.0.1', 'peer': 'tcp4:127.0.0.1:52772', 'client_name': 'HiveMindV0.7'}}, 'route': [], 'node': None, 'source_peer': 'tcp4:0.0.0.0:5678'}
{'msg_type': 'bus', 'payload': {'type': 'mycroft.skill.handler.start', 'data': {'name': 'JokingSkill.handle_general_joke'}, 'context': {'source': 'HiveMind', 'destination': 'tcp4:127.0.0.1:52772', 'platform': 'HiveMessageBusClientV0.0.1', 'peer': 'tcp4:127.0.0.1:52772', 'client_name': 'HiveMindV0.7'}}, 'route': [], 'node': None, 'source_peer': 'tcp4:0.0.0.0:5678'}
{'msg_type': 'bus', 'payload': {'type': 'speak', 'data': {'utterance': "When Chuck Norris breaks the build, you can't fix it, because there is not a single line of code left.", 'expect_response': False, 'meta': {'skill': 'JokingSkill'}}, 'context': {'source': 'HiveMind', 'destination': 'tcp4:127.0.0.1:52772', 'platform': 'HiveMessageBusClientV0.0.1', 'peer': 'tcp4:127.0.0.1:52772', 'client_name': 'HiveMindV0.7'}}, 'route': [], 'node': None, 'source_peer': 'tcp4:0.0.0.0:5678'}
{'msg_type': 'bus', 'payload': {'type': 'mycroft.skill.handler.complete', 'data': {'name': 'JokingSkill.handle_general_joke'}, 'context': {'source': 'HiveMind', 'destination': 'tcp4:127.0.0.1:52772', 'platform': 'HiveMessageBusClientV0.0.1', 'peer': 'tcp4:127.0.0.1:52772', 'client_name': 'HiveMindV0.7'}}, 'route': [], 'node': None, 'source_peer': 'tcp4:0.0.0.0:5678'}

Shared Bus

SHARED_BUS is single hop and flows from slave -> master

the master passively monitors everything going on the slave mycroft-core instance's messagebus

SHARED_BUS needs to be explicitly enabled in the slave device configuration, by default the mycroft-core bus is not shared

in the case of terminals, messages of the type BUS are injected in their master, these will also be forwarded as SHARED_BUS to the next master

Transport Messages

the payload of these messages is another HiveMessage object

Broadcast

BROADCAST is multi-hop and flows from master -> slave

Send message to all of the recipient's slaves ("send the message down")

Escalate

ESCALATE is multi-hop and flows from slave -> master

Send message up the authority chain, never to a slave ("send the message up")

Propagate

PROPAGATE is multi-hop and flows both from master -> slave and slave -> master

Send message to all your direct connections ("send the message everywhere")