In this chapter, you can learn about State basis.
Let's see src/index.ts. And you can find CountState class as below.
class CountState extends ContainerControlState {
constructor() {
super();
this.value = 0;
}
}The basis of State is very simple. It is the class just having value property with any types.
Maybe as you know, State has more features and roles. But in this chapter, we just use State as value store to keep context during the skill session.
To use State in Control, we need to set its instance in constructor of Control class.
constructor(props) {
super(props);
this.state = new CountState();
}And then, you can use State to store value. In this sample code, State value is increased when handleIncrementIntent is executed. And decreased when handleDecrementIntent is executed.
private async handleIncrementIntent(
input: ControlInput,
resultBuilder: ControlResultBuilder,
) {
this.state.value += 1;
resultBuilder.addAct(new CountResultAct(this, this.state.value));
}
private async handleDecrementIntent(
input: ControlInput,
resultBuilder: ControlResultBuilder,
) {
this.state.value -= 1;
resultBuilder.addAct(new CountResultAct(this, this.state.value));
}Let's see test/index.test.ts. You can see details behaviour of this sample code.
Control keeps state value with multiple turns as below.
test('Increase and decrease the number', async () => {
const tester = new SkillTester(
new ControlHandler(new CountControlManager()),
);
await tester.testTurn(
'U: Increase the number',
TestInput.of('IncrementIntent'),
'A: Okay, now count is 1',
);
await tester.testTurn(
'U: Increase the number',
TestInput.of('IncrementIntent'),
'A: Okay, now count is 2',
);
await tester.testTurn(
'U: Decrease the number',
TestInput.of('DecrementIntent'),
'A: Okay, now count is 1',
);
});See chapter01.
And I prepared the recognition model to interactionModel.json. You can build interaction model by using it.