Adding Description to the Susi AI Skills

Susi skill CMS is an editor to write and edit skill easily. It follows an API-centric approach where the Susi server acts as API server and a web front-end act as the client for the API and provides the user interface. A skill is a set of intents. One text file represents one skill, it may contain several intents which all belong together. All the skills are stored in Susi Skill Data repository and the schema is as following. Using this, one can access any skill based on four tuples parameters model, group, language, skill. To know what a skill is about we needed to add a !description operator which identifies the text as a description for the skill. Let’s check out how to achieve it.Susi Skill class provides parser methods for the set of intents, given as text files. public static JSONObject readEzDSkill(BufferedReader br) throws JSONException {} if (line.startsWith("!") && (thenpos = line.indexOf(':')) > 0) { String head = line.substring(1, thenpos).trim().toLowerCase(); String tail = line.substring(thenpos + 1).trim(); if (head.equals("description")) { description =tail; } } if (description.length() > 0) intent.put("description", description); The method readEzDSkill parses the skill txt file, it checks if a line starts with ‘!description’ (‘bang operator with description’) it then stores the content in string variable description. If a description is found in a skill, it is recorded and put into Json Array of intents. private final Map<String, Set<String>> skillDescriptions; if (intent.getDescription() !=null) { Set<String> descriptions = this.skillDescriptions.get(intent.getSkill()); if (descriptions == null) { descriptions = new LinkedHashSet<>(); this.skillDescriptions.put(intent.getSkill(), descriptions); } descriptions.add(intent.getDescription()); } SusiMind class  process this json and stores the description in a map of skill path and description. This map is used by DescriptionSkillService to list descriptions for all the skills given its model, group and language. For adding the description servlet we need to inherit the service class from AbstractAPIHandler and implement APIhandler interface.In Susi Server, an abstract class AbstractAPIHandler extending HttpServelets and implementing API handler interface is provided. @Override public BaseUserRole getMinimalBaseUserRole() { return BaseUserRole.ANONYMOUS; } @Override public JSONObject getDefaultPermissions(BaseUserRole baseUserRole) { return null; } @Override public String getAPIPath() { return "/cms/getDescriptionSkill.json"; } The getAPIPath() methods sets the API endpoint path, it gets appended to base path which is 127.0.0.1:4000/cms/getDescriptionSkill.json for local host. The getMinimalBaseRole method tells the minimum Userrole required to access this servlet it can also be ADMIN, USER. In our case it is Anonymous. A User need not log in to access this endpoint. Next, we implement serviceimpl method which gives us the desired response in JSON format. @Override public ServiceResponse serviceImpl(Query call, HttpServletResponse response, Authorization rights, final JsonObjectWithDefault permissions) { String model = call.get("model", ""); String group = call.get("group", ""); String language = call.get("language", ""); JSONObject descriptions = new JSONObject(true); for (Map.Entry<String, Set<String>> entry : DAO.susi.getSkillDescriptions().entrySet()) { String path = entry.getKey(); if ((model.length() == 0 || path.indexOf("/" + model + "/") > 0) &&(group.length() == 0 || path.indexOf("/" + group + "/") > 0) &&(language.length() == 0 || path.indexOf("/" + language + "/") > 0)) { descriptions.put(path, entry.getValue()); } }…

Continue ReadingAdding Description to the Susi AI Skills