diff --git a/libs/sepia-assist-v2.3.0-javadoc.jar b/libs/sepia-assist-v2.3.0-javadoc.jar deleted file mode 100644 index 0573c46..0000000 Binary files a/libs/sepia-assist-v2.3.0-javadoc.jar and /dev/null differ diff --git a/libs/sepia-assist-v2.3.1-javadoc.jar b/libs/sepia-assist-v2.3.1-javadoc.jar new file mode 100644 index 0000000..8afcd09 Binary files /dev/null and b/libs/sepia-assist-v2.3.1-javadoc.jar differ diff --git a/libs/sepia-assist-v2.3.0.jar b/libs/sepia-assist-v2.3.1.jar similarity index 74% rename from libs/sepia-assist-v2.3.0.jar rename to libs/sepia-assist-v2.3.1.jar index 1b92b13..38e3c00 100644 Binary files a/libs/sepia-assist-v2.3.0.jar and b/libs/sepia-assist-v2.3.1.jar differ diff --git a/libs/sepia-chat-v1.2.0.jar b/libs/sepia-chat-v1.2.0.jar deleted file mode 100644 index 19bbc44..0000000 Binary files a/libs/sepia-chat-v1.2.0.jar and /dev/null differ diff --git a/libs/sepia-chat-v1.2.1.jar b/libs/sepia-chat-v1.2.1.jar new file mode 100644 index 0000000..a1c8e3d Binary files /dev/null and b/libs/sepia-chat-v1.2.1.jar differ diff --git a/libs/sepia-core-tools-v2.2.2-javadoc.jar b/libs/sepia-core-tools-v2.2.2-javadoc.jar deleted file mode 100644 index 72a4f6a..0000000 Binary files a/libs/sepia-core-tools-v2.2.2-javadoc.jar and /dev/null differ diff --git a/libs/sepia-core-tools-v2.2.2.jar b/libs/sepia-core-tools-v2.2.2.jar deleted file mode 100644 index 16c46e6..0000000 Binary files a/libs/sepia-core-tools-v2.2.2.jar and /dev/null differ diff --git a/libs/sepia-core-tools-v2.2.3-javadoc.jar b/libs/sepia-core-tools-v2.2.3-javadoc.jar new file mode 100644 index 0000000..d2e8dd0 Binary files /dev/null and b/libs/sepia-core-tools-v2.2.3-javadoc.jar differ diff --git a/libs/sepia-core-tools-v2.2.3.jar b/libs/sepia-core-tools-v2.2.3.jar new file mode 100644 index 0000000..21a65c6 Binary files /dev/null and b/libs/sepia-core-tools-v2.2.3.jar differ diff --git a/pom.xml b/pom.xml index 20211d1..27775db 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ net.b07z.sepia.sdk sepia-sdk-java - 0.9.11 + 0.9.12 SEPIA SDK Tools to develop services for the SEPIA framework https://sepia-framework.github.io @@ -27,7 +27,7 @@ net.b07z.sepia.server.assist sepia-assist-API - 2.3.0 + 2.3.1 --> @@ -50,7 +50,7 @@ com.fasterxml.jackson.core jackson-databind - 2.9.9.2 + 2.9.10 commons-lang @@ -85,9 +85,9 @@ net.b07z.sepia.server.core sepia-core-tools - 2.2.2 + 2.2.3 system - ${basedir}/libs/sepia-core-tools-v2.2.2.jar + ${basedir}/libs/sepia-core-tools-v2.2.3.jar @@ -98,9 +98,9 @@ net.b07z.sepia.websockets sepia-websockets - 1.2.0 + 1.2.1 system - ${basedir}/libs/sepia-chat-v1.2.0.jar + ${basedir}/libs/sepia-chat-v1.2.1.jar @@ -116,29 +116,29 @@ net.b07z.sepia.server.assist sepia-assist-API - 2.3.0 + 2.3.1 system - ${basedir}/libs/sepia-assist-v2.3.0.jar + ${basedir}/libs/sepia-assist-v2.3.1.jar - - + + diff --git a/src/main/java/net/b07z/sepia/sdk/services/uid1007/PythonBridgeDemo.java b/src/main/java/net/b07z/sepia/sdk/services/uid1007/PythonBridgeDemo.java new file mode 100644 index 0000000..b98461b --- /dev/null +++ b/src/main/java/net/b07z/sepia/sdk/services/uid1007/PythonBridgeDemo.java @@ -0,0 +1,186 @@ +package net.b07z.sepia.sdk.services.uid1007; + +import java.util.TreeSet; + +import net.b07z.sepia.server.assist.answers.ServiceAnswers; +import net.b07z.sepia.server.assist.assistant.LANGUAGES; +import net.b07z.sepia.server.assist.data.Parameter; +import net.b07z.sepia.server.assist.interpreters.NluResult; +import net.b07z.sepia.server.assist.parameters.WebApiParameter; +import net.b07z.sepia.server.assist.services.ServiceBuilder; +import net.b07z.sepia.server.assist.services.ServiceInfo; +import net.b07z.sepia.server.assist.services.ServiceInterface; +import net.b07z.sepia.server.assist.services.ServiceResult; +import net.b07z.sepia.server.assist.services.ServiceInfo.Content; +import net.b07z.sepia.server.assist.services.ServiceInfo.Type; +import net.b07z.sepia.server.core.data.Answer; +import net.b07z.sepia.server.core.data.Language; +import net.b07z.sepia.server.core.tools.Sdk; + +/** + * Demonstration of how to use SEPIA Python-Bridge to enhance NLU and services. + * + * @author Florian Quirin + * + */ +public class PythonBridgeDemo implements ServiceInterface { + + //Command name of your service (will be combined with userId to be unique, e.g. 'uid1007.python_bridge') + private static final String CMD_NAME = "python_bridge"; + + //Define some sentences for testing: + + @Override + public TreeSet getSampleSentences(String lang) { + TreeSet samples = new TreeSet<>(); + //GERMAN + if (lang.equals(Language.DE.toValue())){ + samples.add("Ich würde gerne die Python Brücke testen."); + //OTHER + }else{ + samples.add("I'd like to test the Python bridge."); + } + return samples; + } + + //Basic service setup: + + //Overriding the 'getAnswersPool' methods enables you to define custom answers with more complex features. + //You can build a pool of answers that can have multiple versions of the same answer used for different + //situations like a repeated question (what was the time? -> sorry say again, what was the time? -> ...). + + @Override + public ServiceAnswers getAnswersPool(String language) { + ServiceAnswers answerPool = new ServiceAnswers(language); + + //Build English answers + if (language.equals(LANGUAGES.EN)){ + answerPool + //simple method to add answers + .addAnswer(successAnswer, 0, "Test successful.") + //complete method to add answers + .addAnswer(new Answer( + Language.from(language), okAnswer, + "Message received but I could not fulfill your request.", + Answer.Character.neutral, 0, 5 + )) + + .addAnswer(askCodeWord, 0, "What's your code word?") + .addAnswer(askCodeWord, 1, "Wrong, try again please. What's your code word?") + .addAnswer(askCodeWord, 2, "Still wrong. Do you know the mines of Moria? Speak, 'friend', and enter.") + ; + return answerPool; + + //Other languages not yet supported + }else{ + answerPool + .addAnswer(successAnswer, 0, "Test erfolgreich.") + .addAnswer(okAnswer, 0, "Die Anfrage ist angekommen aber ich kann sie nicht bearbeiten.") + + .addAnswer(askCodeWord, 0, "Wie lautet das Schlüsselwort?") + .addAnswer(askCodeWord, 1, "Falsch, versuch es noch einmal bitte. Wie lautet das Schlüsselwort?") + .addAnswer(askCodeWord, 2, "Immer noch falsch. Kennst du die Minen von Moria? Sprich, 'Freund', und tritt ein.") + ; + return answerPool; + } + } + //We keep a reference here for easy access in getResult - Note that custom answers need to start with a certain prefix + private static final String failAnswer = "error_0a"; + private static final String successAnswer = ServiceAnswers.ANS_PREFIX + CMD_NAME + "_success_0a"; + private static final String okAnswer = ServiceAnswers.ANS_PREFIX + CMD_NAME + "_still_ok_0a"; + private static final String askCodeWord = ServiceAnswers.ANS_PREFIX + CMD_NAME + "_ask_code_1a"; + + + @Override + public ServiceInfo getInfo(String language) { + //Type of service (for descriptions, choose what you think fits best) + ServiceInfo info = new ServiceInfo(Type.plain, Content.data, false); + + //Should be available publicly or only for the developer? Set this when you are done with testing and want to release + //info.makePublic(); + + //Command + info.setIntendedCommand(Sdk.getMyCommandName(this, CMD_NAME)); + + //Direct-match trigger sentences in different languages + //NOTE: we use SEPIA internal NLU for direct match here and Python for more complex stuff to see how both work in parallel + String EN = Language.EN.toValue(); + info.addCustomTriggerSentence("Test Python bridge.", EN); + String DE = Language.DE.toValue(); + info.addCustomTriggerSentence("Python Brücke testen.", DE); + + //Regular expression triggers + //NOTE: we don't use those here because we want to do complex NLU via the Python bridge + //info.setCustomTriggerRegX(".*\\b(python bridge)\\b.*", EN); + //info.setCustomTriggerRegXscoreBoost(5); //boost service a bit to increase priority over similar ones + + //Parameters: + + //This service has a one required parameter, the code word. + //Required parameters will be asked automatically by SEPIA using the defined question. + Parameter p1 = new Parameter(new CodeWord()) + .setRequired(true) + .setQuestion(askCodeWord); + info.addParameter(p1); + + //Answers (these are the default answers, you can trigger a custom answer at any point in the module + //with serviceBuilder.setCustomAnswer(..)): + info.addSuccessAnswer(successAnswer) + .addFailAnswer(failAnswer) + .addOkayAnswer(okAnswer) + .addCustomAnswer("askCodeWord", askCodeWord); //optional, just for info + + //Add answer parameters that are used to replace <1>, <2>, ... in your answers. + //The name is arbitrary but you need to use the same one in getResult(...) later for api.resultInfoPut(...) + info.addAnswerParameters("code"); //<1>=code, <2>=... + + return info; + } + + @Override + public ServiceResult getResult(NluResult nluResult) { + //initialize result + ServiceBuilder api = new ServiceBuilder(nluResult, + getInfoFreshOrCache(nluResult.input, this.getClass().getCanonicalName()), + getAnswersPool(nluResult.language)); + + //get required parameters: + + //-code + Parameter codeParameter = nluResult.getRequiredParameter(CodeWord.class.getName()); + String code = codeParameter.getValueAsString(); + + //get optional parameters: + //NONE + + //Set answer parameters as defined in getInfo(): + api.resultInfoPut("code", code); + + // ... here you could put some code that runs after successful code word. + // wrong code will automatically lead to rejection before reaching this part ... + + //all good + api.setStatusSuccess(); + + //build the API_Result + ServiceResult result = api.buildResult(); + return result; + } + + //----------------- custom parameters ------------------- + + /** + * Parameter handler that tries to extract code word via Python bridge. + */ + public static class CodeWord extends WebApiParameter { + + @Override + public String getApiUrl(){ + //Enter the URL to your SEPIA Python-Bridge here including parameter path + String nluBridgeUrl = "http://localhost:20731/nlu/"; + String parameterPath = "get_parameter/code_word"; + return nluBridgeUrl + parameterPath; + } + } + +} diff --git a/src/main/java/net/b07z/sepia/sdk/services/uid1007/RestaurantDemo.java b/src/main/java/net/b07z/sepia/sdk/services/uid1007/RestaurantDemo.java index 85b1a14..cf3e94b 100644 --- a/src/main/java/net/b07z/sepia/sdk/services/uid1007/RestaurantDemo.java +++ b/src/main/java/net/b07z/sepia/sdk/services/uid1007/RestaurantDemo.java @@ -97,7 +97,7 @@ public ServiceAnswers getAnswersPool(String language) { ; return answerPool; - //Other languages not yet supported + //Other languages are not used in this demo yet }else{ return null; } diff --git a/src/main/java/net/b07z/sepia/sdk/services/uid1007/WorkoutHelperDemo.java b/src/main/java/net/b07z/sepia/sdk/services/uid1007/WorkoutHelperDemo.java index 928d299..952dcb1 100644 --- a/src/main/java/net/b07z/sepia/sdk/services/uid1007/WorkoutHelperDemo.java +++ b/src/main/java/net/b07z/sepia/sdk/services/uid1007/WorkoutHelperDemo.java @@ -10,6 +10,7 @@ import net.b07z.sepia.server.assist.assistant.LANGUAGES; import net.b07z.sepia.server.assist.data.Parameter; import net.b07z.sepia.server.assist.interpreters.NluResult; +import net.b07z.sepia.server.assist.interviews.Interview; import net.b07z.sepia.server.assist.interviews.InterviewData; import net.b07z.sepia.server.assist.services.ServiceAccessManager; import net.b07z.sepia.server.assist.services.ServiceBuilder; @@ -20,6 +21,7 @@ import net.b07z.sepia.server.assist.services.ServiceInfo.Type; import net.b07z.sepia.server.core.assistant.PARAMETERS; import net.b07z.sepia.server.core.data.Language; +import net.b07z.sepia.server.core.tools.Debugger; import net.b07z.sepia.server.core.tools.JSON; import net.b07z.sepia.server.core.tools.Sdk; @@ -108,9 +110,17 @@ public ServiceInfo getInfo(String language) { //Direct-match trigger sentences in different languages: String EN = Language.EN.toValue(); - info.addCustomTriggerSentence("Start a simple workout.", EN); + info.addCustomTriggerSentence("Start a simple workout.", EN) + .addCustomTriggerSentenceWithExtractedParameters("7 minutes workout.", EN, JSON.make( + PARAMETERS.TIME, Interview.INPUT_RAW, //This will tell the 'Interview' module to extract the time from the raw text + PARAMETERS.ACTION, "" //This is what the Action parameter handler usually extracts for ON/START/ACTIVATE etc. + )); String DE = Language.DE.toValue(); - info.addCustomTriggerSentence("Ein einfaches Workout starten.", DE); + info.addCustomTriggerSentence("Ein einfaches Workout starten.", DE) + .addCustomTriggerSentenceWithRawParameters("7 Minuten Workout.", DE, JSON.make( + PARAMETERS.TIME, "7 Minuten", //Here we use raw text, ... + PARAMETERS.ACTION, "starten" //... and let the 'Interview' module normalize and extract the parameter + )); //Regular expression triggers: info.setCustomTriggerRegX(".*\\b(" @@ -129,7 +139,9 @@ public ServiceInfo getInfo(String language) { Parameter p1 = new Parameter(PARAMETERS.TIME) .setRequired(false); - info.addParameter(p1); + Parameter p2 = new Parameter(PARAMETERS.ACTION) + .setRequired(false); + info.addParameter(p1).addParameter(p2); //Answers (these are the default answers, you can trigger a custom answer at any point in the module //with serviceBuilder.setCustomAnswer(..)): @@ -155,7 +167,7 @@ public ServiceResult getResult(NluResult nluResult) { //test-load stored data ServiceAccessManager sam0 = new ServiceAccessManager("demokey"); JSONObject userData = api.readServiceDataForUser(sam0, "tasks"); - System.out.println("result: " + userData); + Debugger.println(CMD_NAME + " result: " + userData, 3); //DEBUG //get optional parameters: