1
1
mirror of https://github.com/leon-ai/leon.git synced 2024-09-11 18:27:21 +03:00

feat: support dynamic variables on skill NLU settings for logic type

This commit is contained in:
louistiti 2022-06-12 10:49:07 +08:00
parent c5edf6488b
commit 10d10a1690
No known key found for this signature in database
GPG Key ID: 7ECA3DD523793FE6
14 changed files with 63 additions and 102 deletions

View File

@ -27,7 +27,7 @@ def get_intent_obj():
return intent_obj
def translate(key, d = { }):
def translate(key, dict = { }):
"""Pickup the language file according to the cmd arg
and return the value according to the params"""
@ -38,14 +38,19 @@ def translate(key, d = { }):
file.close()
prop = obj['answers'][key]
variables = obj['variables']
if isinstance(prop, list):
output = choice(prop)
else:
output = prop
if d:
for k in d:
output = output.replace('%' + k + '%', str(d[k]))
if dict:
for key in dict:
output = output.replace('%' + key + '%', str(dict[key]))
if variables:
for key in variables:
output = output.replace('%' + key + '%', str(variables[key]))
# "Temporize" for the data buffer ouput on the core
sleep(0.1)

View File

@ -85,7 +85,12 @@
},
{
"method": "GET",
"route": "/api/action/leon/introduction/fill",
"route": "/api/action/leon/introduction/introduce_leon",
"params": []
},
{
"method": "GET",
"route": "/api/action/leon/introduction/gather_basic_info",
"params": []
},
{
@ -118,11 +123,6 @@
"route": "/api/action/leon/welcome/run",
"params": []
},
{
"method": "GET",
"route": "/api/action/leon/who_am_i/run",
"params": []
},
{
"method": "POST",
"route": "/api/action/news/github_trends/run",

View File

@ -110,40 +110,6 @@ export default () => new Promise(async (resolve, reject) => {
nlp.assignDomain(lang, `${skillName}.${actionName}`, currentDomain.name)
/**
* TODO:
* 1. [OK] Merge person, location and organization to the
* NER before processing NLU (cf. line 210 in nlu.js)
* 2. [OK] Grab intents with slots
* 3. [OK] .addSlot() as per the slots config
* 4. [OK] Handle random questions picking
* srcAnswer has the array, need to activate context now?
* to detect we should pick .srcAnswer
* 5.1 [OK] Reorganize code before to proceed to next steps
* 5.2 [OK] Activate context and fill slots
* 5.3 [OK] Keep action activated in context + forward slot data to next action
* 6. Make entities + slots way lighter with simple properties
* to be used in skills without too much properties and nested props.
* Currently: slots['players_nb']['value']['sourceText']
* Should be: slots['players_nb']['value']
* And possible: slots['players_nb']['sourceText']
* 7. [OK] Train resolvers (affirm_deny: boolean value)
* 8. [OK] Map resolvers to skill actions
* 9. Utterance item type to get raw input from utterance
* 10. Create superheroes skill (just for testing):
* to ask Leon questions by saving context
* or just use the color or to do list skill?
* - I want to know about the red color
* > Well, the red color...
* - Do you like this color?
* > Red is cool, but I prefer...
* 11. [OK] "Add potatoes to my shopping list" ... "Actually remove it"
* The entities are already persistent in context.
* Just need to check in current context and loop through classifications intent.
* If the skill is found, then use that intent. So an intent should not always be
* the one with the highest confidence
* 12. Modify skills as per new code (skill params became dictionary [OK], etc.)
*/
if (slots) {
for (let l = 0; l < slots.length; l += 1) {
const slotObj = slots[l]

View File

@ -180,9 +180,11 @@ class Brain {
* python bridges/python/main.py server/src/intent-object.sample.json
*/
const slots = { }
Object.keys(obj.slots).forEach((slotName) => {
slots[slotName] = obj.slots[slotName].value
})
if (obj.slots) {
Object.keys(obj.slots)?.forEach((slotName) => {
slots[slotName] = obj.slots[slotName].value
})
}
const intentObj = {
id: utteranceId,
lang: this._lang,

View File

@ -1,6 +1,23 @@
{
"variables": {
"leon_introduction_1": "I'm your daily personal assistant. I have been created by Louis. I'm very happy to serve you everyday.",
"leon_introduction_2": "The question is, who are you? I'm kidding! I'm your daily personal assistant. Louis created me to make your life easier.",
"leon_introduction_3": "Firstly, I'm not a criminal as you might relatively think about a popular movie. Secondly, Louis is the guy who gave me life. Thirdly, I'm your personal assistant and I'm very glad to help you."
},
"actions": {
"fill": {
"introduce_leon": {
"type": "logic",
"utterance_samples": [
"Who are you?",
"How they call you?",
"What's your name?",
"Tell me who you are",
"Introduce yourself",
"I want to know you"
],
"next_action": "gather_basic_info"
},
"gather_basic_info": {
"type": "dialog",
"utterance_samples": [
"Do you know who am I?",
@ -42,6 +59,16 @@
"remembered": [
"I'm going to remember that %owner_name%",
"Good to know a bit more about you %owner_name%"
],
"leon_introduction": [
"%leon_introduction_1%",
"%leon_introduction_2%",
"%leon_introduction_3%"
],
"leon_introduction_with_question": [
"%leon_introduction_1% How about you?",
"%leon_introduction_2% How about you?",
"%leon_introduction_3% How about you?"
]
}
}

View File

@ -2,7 +2,7 @@
"name": "Introduction",
"bridge": "python",
"version": "1.0.0",
"description": "Leon remembers basic information about you.",
"description": "Leon introduce himself and remembers basic information about you.",
"author": {
"name": "Louis Grenard",
"email": "louis.grenard@gmail.com",

View File

@ -0,0 +1,14 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import utils
def introduce_leon(params):
"""TODO"""
has_info = True
if has_info == False:
return utils.output('end', 'remembered', utils.translate('remembered', { 'owner_name': owner_name }))
return utils.output('end', 'leon_introduction', utils.translate('leon_introduction'))

View File

@ -2,8 +2,6 @@
# -*- coding:utf-8 -*-
import utils
from datetime import datetime
from random import randint
def remember(params):
"""Save name and birth date into Leon's memory"""

View File

@ -1,20 +0,0 @@
{
"actions": {
"run": {
"type": "dialog",
"utterance_samples": [
"Who are you?",
"How they call you?",
"What's your name?",
"Tell me who you are",
"Introduce yourself",
"I want to know you"
],
"answers": [
"I'm your daily personal assistant. I have been created by Louis. I'm very happy to serve you everyday.",
"The question is, who are you? I'm kidding! I'm your daily personal assistant. Louis created me to make your life easier.",
"Firstly, I'm not a criminal as you might relatively think about a popular movie. Secondly, Louis is the guy who gave me life. Thirdly, I'm your personal assistant and I'm very glad to help you."
]
}
}
}

View File

@ -1,20 +0,0 @@
{
"actions": {
"run": {
"type": "dialog",
"utterance_samples": [
"Qui es-tu ?",
"Comment t'appelles-tu ?",
"Comment tu t'appelles ?",
"Dis-moi qui tu es",
"Présente-toi",
"Je veux te connaître"
],
"answers": [
"Je suis votre assistant personnel quotidien. J'ai été créé par Louis. Je suis heureux de vous servir chaque jour.",
"La question est plutôt qui êtes-vous ? Je plaisante ! Je suis votre assistant personnel quotidien. Louis m'a conçu pour rendre votre vie plus facile.",
"Premièrement, je ne suis pas un criminel comme vous pouvez le penser au sujet d'un film populaire. Deuxièmement, Louis est celui qui m'a donné la vie. Troisièmement, je suis votre assistant personnel et je suis honoré de vous aider."
]
}
}
}

View File

@ -1,11 +0,0 @@
{
"name": "Who Am I",
"bridge": null,
"version": "1.0.0",
"description": "Leon introduces himself.",
"author": {
"name": "Louis Grenard",
"email": "louis.grenard@gmail.com",
"url": "https://github.com/louistiti"
}
}