一个Java版的Rasa SDK
<dependency>
<groupId>io.github</groupId>
<artifactId>jrasa</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>
Rasa: >=3.5.1
在使用之前,请先阅读Rasa SDK文档,了解Rasa SDK中的基本概念。
你可以使用你喜欢的Java web框架来运行Rasa SDK Action Server。 这是一个SpringBoot的示例。
你可以通过实现 Action接口来定义一个自定义action。
import io.github.jrasa.Action;
import io.github.jrasa.CollectingDispatcher;
import io.github.jrasa.domain.Domain;
import io.github.jrasa.event.Event;
import io.github.jrasa.exception.RejectExecuteException;
import io.github.jrasa.tracker.Tracker;
import java.util.List;
public class CustomAction implements Action {
@Override
public String name() {
return "action_name";
}
@Override
public List<? extends Event> run(CollectingDispatcher collectingDispatcher, Tracker tracker, Domain domain) throws RejectExecuteException {
return Action.empty();
}
}
💡 如果没有事件可供返回,你可以使用Action.empty()
返回一个空列表。
因为Java是静态编程语言,所以你必须指定你要获取的slot的值的类型。
目前,有五个方法可以用来获取slot的值:
Object getSlot(String key)
<T> T getSlot(String key, Class<T> type)
String getStringSlot(String key)
Boolean getBoolSlot(String key)
Double getDoubleSlot(String key)
Object getSlot(String key)
可以获取任意类型的slot值。
你可以使用<T> T getSlot(String key, Class<T> type)
去获取指定type的slot值。
String getStringSlot(String key)
Boolean getBoolSlot(String key)
Double getDoubleSlot(String key)
用于获取常见类型的slot值。
💡 JSON中的小数在反序列时,会被转化为Java中的double类型,所以这里使用了Double而不是Float。
因为Java中的方法不支持默认参数,所以这里使用了Message类来表示消息响应。
你可以使用建造者模式来构建一个Message
实例:
Message message = Message.builder()
.text("Hello")
.image("https://i.imgur.com/nGF1K8f.jpg")
.response("utter_greet")
.attachment("")
.kwargs(new HashMap<String, Object>(){{
put("name", "uncle-lv");
}})
.build();
然后,使用 utterMessage
方法发送消息:
dispatcher.utterMessage(message);
所有事件都是抽象类Event的子类。事件的属性和官方文档中的相同。一些有较多属性的事件需要用建造者模式构造。
SlotSet SlotSet = new SlotSet("name", "Mary");
AllSlotsReset allSlotsReset = new AllSlotsReset();
ReminderScheduled reminderScheduled = ReminderScheduled.builder("EXTERNAL_dry_plant")
.name("remind_water_plants")
.entities(new ArrayList<Entity>(){{
add(Entity.builder().entity("plant", "orchid").build());
}})
.triggerDateTime(LocalDateTime.parse("2018-09-03T11:41:10.128172", DateTimeFormatter.ISO_LOCAL_DATE_TIME))
.build();
ReminderCancelled reminderCancelled = ReminderCancelled.builder()
.name("remind_water_plants")
.build();
ConversationPaused conversationPaused = new ConversationPaused();
ConversationResumed conversationResumed = new ConversationResumed();
FollowupAction followupAction = new FollowupAction("action_say_goodbye");
UserUtteranceReverted userUtteranceReverted = new UserUtteranceReverted();
ActionReverted actionReverted = new ActionReverted();
Restarted restarted = new Restarted();
SessionStarted sessionStarted = new SessionStarted();
UserUttered userUttered = UserUttered.builder()
.text("Hello bot")
.build();
BotUttered botUttered = BotUttered.builder()
.text("Hello user")
.build();
ActionExecuted actionExecuted = ActionExecuted.builder("action_greet_user")
.build();
🛠️ 尚未实现。
Slot Validation Actions与官方SDK只有一点不同。
在官方SDK中,方法/函数被命名为validate_<slot_name>
/extract_<slot name>
(下划线命名)。在JRasa中,它们应该遵循Java命名规范,被命名为validate<SlotName>
/extract<SlotName>
(驼峰命名)。
感谢您的任何反馈。