microsoft / botbuilder-js

Welcome to the Bot Framework SDK for JavaScript repository, which is the home for the libraries and packages that enable developers to build sophisticated bot applications using JavaScript.
https://github.com/Microsoft/botframework
MIT License
680 stars 277 forks source link

SkillDialog saving state while receiving multiple quick-succession Typing activities leads to failed storage writes #4360

Open stevengum opened 1 year ago

stevengum commented 1 year ago

Versions

SDK version 4.8.x to Latest

Describe the bug

SkillDialog attempts to save conversation state when all activities are forwarded to the skill.

https://github.com/microsoft/botbuilder-js/blob/b1a27a1a5b756660786ff086f10b9aab86a7692a/libraries/botbuilder-dialogs/src/skillDialog.ts#L264-L267

This means that informational but not necessarily actionable activities such as Typing activities trigger state saves.

Human Handoff scenario

Typing activities should continue to be forwarded to skill, in case the skill acts as a middleman and routes typing activities to a human agent who is speaking with the end-user.

E.g.

sequenceDiagram
    participant Customer's Web Chat
    Note right of Customer's Web Chat: Web Chat instance<br/>is configured to send Typing activities
    participant Root bot
    participant Skill bot
    participant Human agent
    Customer's Web Chat-->>Root bot: Customer says: <br/> "Escalate to agent"
    Root bot-->>Skill bot: Begin handoff
    Skill bot-->>Human agent: Customer seeking agent
    Human agent-->>Customer's Web Chat: Human agent says<br/> "Hello, how can I help you today?"
    Note right of Customer's Web Chat: Customer begins typing for 12 seconds
    Customer's Web Chat-->>Root bot: Web Chat sends<br/>a 3 second debounced Typing activities<br/>to Root bot, etc.

Which leads to four attempts by the Root bot trying to save the state while trying to send four typing activities to the Skill bot. These typing activities should be forwarded to the human agent, but there are no meaningful state changes in either bot whilst the customer is speaking to the agent.

Additionally, by saving state whilst sending Typing activities to storage can lead to 404s and/or 412s depending on the stoage provider.

Note: Loading state is still necessary as otherwise the root bot would not be able to send the Typing activity to the skill.

Additional context

Any changes needs to be ported to the other SDK languages as well.

tracyboehrer commented 3 months ago

Both DotNet and JS force a state save. I wonder why because if no changes have been made to state, it wouldn't make sense to save in any case?