Workaround for adapt issue with context + one_of (#1789)

Adapt doesn't populate the entry from the one_of correctly from context. To work around the issue intent structure is scanned for empty keys and tries to populate them from entities in __tags__
pull/1808/head
Åke 2018-09-24 22:17:13 +02:00 committed by Steve Penrod
parent f091f44c85
commit 1ad41ef5ec
1 changed files with 20 additions and 0 deletions

View File

@ -31,6 +31,20 @@ class AdaptIntent(IntentBuilder):
super().__init__(name) super().__init__(name)
def workaround_one_of_context(best_intent):
""" Handle Adapt issue with context injection combined with one_of.
For all entries in the intent result where the value is None try to
populate using a value from the __tags__ structure.
"""
for key in best_intent:
if best_intent[key] is None:
for t in best_intent['__tags__']:
if key in t:
best_intent[key] = t[key][0]['entities'][0]['key']
return best_intent
class ContextManager(object): class ContextManager(object):
""" """
ContextManager ContextManager
@ -367,6 +381,12 @@ class IntentService(object):
# update active skills # update active skills
skill_id = best_intent['intent_type'].split(":")[0] skill_id = best_intent['intent_type'].split(":")[0]
self.add_active_skill(skill_id) self.add_active_skill(skill_id)
# adapt doesn't handle context injection for one_of keywords
# correctly. Workaround this issue if possible.
try:
best_intent = workaround_one_of_context(best_intent)
except LookupError:
LOG.error('Error during workaround_one_of_context')
return best_intent return best_intent
def handle_register_vocab(self, message): def handle_register_vocab(self, message):