mirror of
https://github.com/leon-ai/leon.git
synced 2024-12-25 09:44:22 +03:00
feat(server): support dialog type action after slots filled
This commit is contained in:
parent
d9f0144e62
commit
c934d0e30d
@ -2,130 +2,130 @@
|
|||||||
"$schema": "../../../../schemas/global-data/global-entity.json",
|
"$schema": "../../../../schemas/global-data/global-entity.json",
|
||||||
"options": {
|
"options": {
|
||||||
"en-US": {
|
"en-US": {
|
||||||
"synonyms": ["english", "british", "american"]
|
"synonyms": ["English", "British", "American"]
|
||||||
},
|
},
|
||||||
"zh-CN": {
|
"zh-CN": {
|
||||||
"synonyms": ["mandarin", "chinese"]
|
"synonyms": ["Mandarin", "Chinese"]
|
||||||
},
|
},
|
||||||
"hi-IN": {
|
"hi-IN": {
|
||||||
"synonyms": ["hindi", "indian"]
|
"synonyms": ["Hindi", "Indian"]
|
||||||
},
|
},
|
||||||
"es-ES": {
|
"es-ES": {
|
||||||
"synonyms": ["spanish"]
|
"synonyms": ["Spanish"]
|
||||||
},
|
},
|
||||||
"fr-FR": {
|
"fr-FR": {
|
||||||
"synonyms": ["french"]
|
"synonyms": ["French"]
|
||||||
},
|
},
|
||||||
"ar-SA": {
|
"ar-SA": {
|
||||||
"synonyms": ["arabic"]
|
"synonyms": ["Arabic"]
|
||||||
},
|
},
|
||||||
"ru-RU": {
|
"ru-RU": {
|
||||||
"synonyms": ["russian"]
|
"synonyms": ["Russian"]
|
||||||
},
|
},
|
||||||
"pt-PT": {
|
"pt-PT": {
|
||||||
"synonyms": ["portuguese"]
|
"synonyms": ["Portuguese"]
|
||||||
},
|
},
|
||||||
"bn-IN": {
|
"bn-IN": {
|
||||||
"synonyms": ["bengali"]
|
"synonyms": ["Bengali"]
|
||||||
},
|
},
|
||||||
"in-ID": {
|
"in-ID": {
|
||||||
"synonyms": ["indonesian"]
|
"synonyms": ["Indonesian"]
|
||||||
},
|
},
|
||||||
"ja-JP": {
|
"ja-JP": {
|
||||||
"synonyms": ["japanese"]
|
"synonyms": ["Japanese"]
|
||||||
},
|
},
|
||||||
"de-DE": {
|
"de-DE": {
|
||||||
"synonyms": ["german"]
|
"synonyms": ["German"]
|
||||||
},
|
},
|
||||||
"ko-KR": {
|
"ko-KR": {
|
||||||
"synonyms": ["korean"]
|
"synonyms": ["Korean"]
|
||||||
},
|
},
|
||||||
"tr-TR": {
|
"tr-TR": {
|
||||||
"synonyms": ["turkish"]
|
"synonyms": ["Turkish"]
|
||||||
},
|
},
|
||||||
"it-IT": {
|
"it-IT": {
|
||||||
"synonyms": ["italian"]
|
"synonyms": ["Italian"]
|
||||||
},
|
},
|
||||||
"vi-VN": {
|
"vi-VN": {
|
||||||
"synonyms": ["vietnamese"]
|
"synonyms": ["Vietnamese"]
|
||||||
},
|
},
|
||||||
"th-TH": {
|
"th-TH": {
|
||||||
"synonyms": ["thai"]
|
"synonyms": ["Thai"]
|
||||||
},
|
},
|
||||||
"nl-NL": {
|
"nl-NL": {
|
||||||
"synonyms": ["dutch"]
|
"synonyms": ["Dutch"]
|
||||||
},
|
},
|
||||||
"pl-PL": {
|
"pl-PL": {
|
||||||
"synonyms": ["polish"]
|
"synonyms": ["Polish"]
|
||||||
},
|
},
|
||||||
"sv-SE": {
|
"sv-SE": {
|
||||||
"synonyms": ["swedish"]
|
"synonyms": ["Swedish"]
|
||||||
},
|
},
|
||||||
"da-DK": {
|
"da-DK": {
|
||||||
"synonyms": ["danish"]
|
"synonyms": ["Danish"]
|
||||||
},
|
},
|
||||||
"fi-FI": {
|
"fi-FI": {
|
||||||
"synonyms": ["finnish"]
|
"synonyms": ["Finnish"]
|
||||||
},
|
},
|
||||||
"no-NO": {
|
"no-NO": {
|
||||||
"synonyms": ["norwegian"]
|
"synonyms": ["Norwegian"]
|
||||||
},
|
},
|
||||||
"cs-CZ": {
|
"cs-CZ": {
|
||||||
"synonyms": ["czech"]
|
"synonyms": ["Czech"]
|
||||||
},
|
},
|
||||||
"hu-HU": {
|
"hu-HU": {
|
||||||
"synonyms": ["hungarian"]
|
"synonyms": ["Hungarian"]
|
||||||
},
|
},
|
||||||
"el-GR": {
|
"el-GR": {
|
||||||
"synonyms": ["greek"]
|
"synonyms": ["Greek"]
|
||||||
},
|
},
|
||||||
"ro-RO": {
|
"ro-RO": {
|
||||||
"synonyms": ["romanian"]
|
"synonyms": ["Romanian"]
|
||||||
},
|
},
|
||||||
"uk-UA": {
|
"uk-UA": {
|
||||||
"synonyms": ["ukrainian"]
|
"synonyms": ["Ukrainian"]
|
||||||
},
|
},
|
||||||
"hr-HR": {
|
"hr-HR": {
|
||||||
"synonyms": ["croatian"]
|
"synonyms": ["Croatian"]
|
||||||
},
|
},
|
||||||
"sr-RS": {
|
"sr-RS": {
|
||||||
"synonyms": ["serbian"]
|
"synonyms": ["Serbian"]
|
||||||
},
|
},
|
||||||
"bg-BG": {
|
"bg-BG": {
|
||||||
"synonyms": ["bulgarian"]
|
"synonyms": ["Bulgarian"]
|
||||||
},
|
},
|
||||||
"sk-SK": {
|
"sk-SK": {
|
||||||
"synonyms": ["slovak"]
|
"synonyms": ["Slovak"]
|
||||||
},
|
},
|
||||||
"sl-SI": {
|
"sl-SI": {
|
||||||
"synonyms": ["slovenian"]
|
"synonyms": ["Slovenian"]
|
||||||
},
|
},
|
||||||
"et-EE": {
|
"et-EE": {
|
||||||
"synonyms": ["estonian"]
|
"synonyms": ["Estonian"]
|
||||||
},
|
},
|
||||||
"lv-LV": {
|
"lv-LV": {
|
||||||
"synonyms": ["latvian"]
|
"synonyms": ["Latvian"]
|
||||||
},
|
},
|
||||||
"lt-LT": {
|
"lt-LT": {
|
||||||
"synonyms": ["lithuanian"]
|
"synonyms": ["Lithuanian"]
|
||||||
},
|
},
|
||||||
"mt-MT": {
|
"mt-MT": {
|
||||||
"synonyms": ["maltese"]
|
"synonyms": ["Maltese"]
|
||||||
},
|
},
|
||||||
"is-IS": {
|
"is-IS": {
|
||||||
"synonyms": ["icelandic"]
|
"synonyms": ["Icelandic"]
|
||||||
},
|
},
|
||||||
"mk-MK": {
|
"mk-MK": {
|
||||||
"synonyms": ["macedonian"]
|
"synonyms": ["Macedonian"]
|
||||||
},
|
},
|
||||||
"sq-AL": {
|
"sq-AL": {
|
||||||
"synonyms": ["albanian"]
|
"synonyms": ["Albanian"]
|
||||||
},
|
},
|
||||||
"bs-BA": {
|
"bs-BA": {
|
||||||
"synonyms": ["bosnian"]
|
"synonyms": ["Bosnian"]
|
||||||
},
|
},
|
||||||
"ur-PK": {
|
"ur-PK": {
|
||||||
"synonyms": ["urdu"]
|
"synonyms": ["Urdu"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -251,6 +251,11 @@
|
|||||||
"route": "/api/action/utilities/translator-poc/setup",
|
"route": "/api/action/utilities/translator-poc/setup",
|
||||||
"params": []
|
"params": []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"method": "GET",
|
||||||
|
"route": "/api/action/utilities/translator-poc/ready",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"method": "GET",
|
"method": "GET",
|
||||||
"route": "/api/action/utilities/translator-poc/translate",
|
"route": "/api/action/utilities/translator-poc/translate",
|
||||||
|
@ -106,6 +106,11 @@ export default class Brain {
|
|||||||
LogHelper.title('Brain')
|
LogHelper.title('Brain')
|
||||||
LogHelper.info('Talking...')
|
LogHelper.info('Talking...')
|
||||||
|
|
||||||
|
if (!answer) {
|
||||||
|
LogHelper.warning('No answer to say')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (answer !== '') {
|
if (answer !== '') {
|
||||||
const textAnswer = typeof answer === 'string' ? answer : answer.text
|
const textAnswer = typeof answer === 'string' ? answer : answer.text
|
||||||
const speechAnswer = typeof answer === 'string' ? answer : answer.speech
|
const speechAnswer = typeof answer === 'string' ? answer : answer.speech
|
||||||
|
@ -73,6 +73,7 @@ export class SlotFilling {
|
|||||||
...DEFAULT_NLU_RESULT, // Reset entities, slots, etc.
|
...DEFAULT_NLU_RESULT, // Reset entities, slots, etc.
|
||||||
utterance,
|
utterance,
|
||||||
newUtterance: utterance,
|
newUtterance: utterance,
|
||||||
|
skillConfigPath,
|
||||||
classification: {
|
classification: {
|
||||||
domain,
|
domain,
|
||||||
skill: skillName,
|
skill: skillName,
|
||||||
@ -110,12 +111,19 @@ export class SlotFilling {
|
|||||||
if (!NLU.conversation.areSlotsAllFilled()) {
|
if (!NLU.conversation.areSlotsAllFilled()) {
|
||||||
BRAIN.talk(`${BRAIN.wernicke('random_context_out_of_topic')}.`)
|
BRAIN.talk(`${BRAIN.wernicke('random_context_out_of_topic')}.`)
|
||||||
} else {
|
} else {
|
||||||
|
const { actions } = await SkillDomainHelper.getSkillConfig(
|
||||||
|
skillConfigPath,
|
||||||
|
BRAIN.lang
|
||||||
|
)
|
||||||
|
const nextActionName = NLU.conversation.activeContext.nextAction
|
||||||
|
const hasNextAction = !!nextActionName
|
||||||
|
const doesNextActionHaveAnswers =
|
||||||
|
!!actions[NLU.conversation.activeContext.nextAction]?.answers
|
||||||
|
|
||||||
NLU.nluResult = {
|
NLU.nluResult = {
|
||||||
...DEFAULT_NLU_RESULT, // Reset entities, slots, etc.
|
...DEFAULT_NLU_RESULT, // Reset entities, slots, etc.
|
||||||
// Assign slots only if there is a next action
|
// Assign slots only if there is a next action
|
||||||
slots: NLU.conversation.activeContext.nextAction
|
slots: hasNextAction ? NLU.conversation.activeContext.slots : {},
|
||||||
? NLU.conversation.activeContext.slots
|
|
||||||
: {},
|
|
||||||
utterance: NLU.conversation.activeContext.originalUtterance ?? '',
|
utterance: NLU.conversation.activeContext.originalUtterance ?? '',
|
||||||
newUtterance: utterance,
|
newUtterance: utterance,
|
||||||
skillConfigPath,
|
skillConfigPath,
|
||||||
@ -124,18 +132,19 @@ export class SlotFilling {
|
|||||||
skill: skillName,
|
skill: skillName,
|
||||||
action: NLU.conversation.activeContext.nextAction,
|
action: NLU.conversation.activeContext.nextAction,
|
||||||
confidence: 1
|
confidence: 1
|
||||||
}
|
},
|
||||||
|
// Prepare answers if the next action has them
|
||||||
|
answers:
|
||||||
|
hasNextAction && doesNextActionHaveAnswers
|
||||||
|
? (actions[nextActionName]?.answers?.map((answer) => ({
|
||||||
|
answer
|
||||||
|
})) as { answer: string }[])
|
||||||
|
: []
|
||||||
}
|
}
|
||||||
|
|
||||||
const processedData = await BRAIN.execute(NLU.nluResult)
|
const processedData = await BRAIN.execute(NLU.nluResult)
|
||||||
|
|
||||||
/**
|
|
||||||
* Clean active context if the skill action returns isInActionLoop as false
|
|
||||||
* to avoid looping indefinitely in the same action once all slots have been filled
|
|
||||||
*/
|
|
||||||
if (processedData.core?.isInActionLoop === false) {
|
|
||||||
NLU.conversation.cleanActiveContext()
|
NLU.conversation.cleanActiveContext()
|
||||||
}
|
|
||||||
|
|
||||||
return processedData
|
return processedData
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,14 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"next_action": "ready"
|
||||||
|
},
|
||||||
|
"ready": {
|
||||||
|
"type": "dialog",
|
||||||
"answers": [
|
"answers": [
|
||||||
"Let's start translating to %target_language%.",
|
"Let's start translating to {{ target_language }}.",
|
||||||
"Okay, you can input the text you want to translate.",
|
"Okay, you can input the text you want to translate to {{ target_language }}.",
|
||||||
"Alright, let's start translating to %target_language%."
|
"Alright, let's start translating to {{ target_language }}."
|
||||||
],
|
],
|
||||||
"next_action": "translate"
|
"next_action": "translate"
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user