mycroft-core/mycroft/skills/intent_services/fallback_service.py

67 lines
2.4 KiB
Python

# Copyright 2020 Mycroft AI Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""Intent service for Mycroft's fallback system."""
from collections import namedtuple
from .base import IntentMatch
FallbackRange = namedtuple('FallbackRange', ['start', 'stop'])
class FallbackService:
"""Intent Service handling fallback skills."""
def __init__(self, bus):
self.bus = bus
def _fallback_range(self, utterances, lang, message, fb_range):
"""Send fallback request for a specified priority range.
Args:
utterances (list): List of tuples,
utterances and normalized version
lang (str): Langauge code
message: Message for session context
fb_range (FallbackRange): fallback order start and stop.
Returns:
IntentMatch or None
"""
msg = message.reply(
'mycroft.skills.fallback',
data={'utterance': utterances[0][0],
'lang': lang,
'fallback_range': (fb_range.start, fb_range.stop)}
)
response = self.bus.wait_for_response(msg, timeout=10)
if response and response.data['handled']:
ret = IntentMatch('Fallback', None, {}, None)
else:
ret = None
return ret
def high_prio(self, utterances, lang, message):
"""Pre-padatious fallbacks."""
return self._fallback_range(utterances, lang, message,
FallbackRange(0, 5))
def medium_prio(self, utterances, lang, message):
"""General fallbacks."""
return self._fallback_range(utterances, lang, message,
FallbackRange(5, 90))
def low_prio(self, utterances, lang, message):
"""Low prio fallbacks with general matching such as chat-bot."""
return self._fallback_range(utterances, lang, message,
FallbackRange(90, 101))