+
Skip to content
This repository was archived by the owner on Nov 4, 2023. It is now read-only.
This repository was archived by the owner on Nov 4, 2023. It is now read-only.

[FR] Session API #37

@iceBear67

Description

@iceBear67

摘要

一个用于在各种 ChatChannel 创建会话的机制。

动机

在真实场景里,人们总是倾向于和 bot 交互而不只是使用命令。然而,具有交互性的 bot 对于开发人员的要求很高,因为他们需要自己去管理状态,处理回调以及考虑可能的极端情况。这些事情非常繁杂,使得开发人员难以花时间在真正有价值的业务上。

Dash 将提供 Session API 解决这一问题。

描述

Session

Session 接口代表了一个 临时的自托管 的"会话"。举个例子,一个表单机器人可以在一个会话里询问用户多个问题来填充它的表单,一些机器人在做一些事情之前可以询问用户是否确认这么做。

一个 Session 由以下三部分组成:

  1. participants Session 的参与者
  2. state 目前的 状态,一会解释。
  3. channels 会话发生的地点。

以及具有这些特质

  1. scope 这个 Session 的作用范围 (比如, @bot PROMPT 或者直接 PROMPT)
  2. timeout 用户输入的时限,可能依赖于 scope 的类型

(details TBD because I left my notebook in the school)

状态

一个会话(Session)由多个状态组成,其中,总有一个状态一直受理应答。

image

并且,他们之间可以构成环路。让我们看的仔细一些:

image

真实的场景总比这要复杂得多,而代码的表述也总比这更加清晰的多。

在这些图中的圆圈即代表 ISessionState , 他们可以 指向其他 state, 返回到上一个 state 或者干脆 结束 session.

接下来给出该接口的大致定义:

interface ISessionState {
  void init(reason, oldState);
  void onMessage(message);
  void terminate(newState)
}

reason 使得 SessionState 可以根据具体的情况作出回应。配合 oldSession,上图中的 State DeleteDB 实际上是同一个类在作用。

会话上下文

会话上下文(SessionContext)储存会话的相关信息,同时托管当前的状态以及状态的轨迹以便于回溯。

要注意的是,Session 实际上是可以嵌套的。我们将通过 JDK Loom 实现类似 await 的效果。

种类 (scope)

会话分为 strictcatchy 型。

strict 要求所有参与会话的消息必须要达成某种不能太宽泛的条件,比如带上 @Bot 的前缀。
catchy 将会捕获所有来自当前 chatchannel 以及 paticipant 的消息,具有严格的时限。

Conversation

比起 Session 的抽象接口,Conversation 更像是为了表单机器人量身定做的。

例子

Conversations.of(new MyFormBean())
  .required("Please input your name", MyFormBean::setName)
  .optional("What's your gender? You can send anything wrong to skip this answer", MyFormBean::setGender)
  .with(prompt,mapper,setter)

(details TBD)

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions

    点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载