You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bot Framework v4中触发结束聊天会话?含超时场景

Bot Framework v4: Ending Conversations & Replicating v3's session.endChat()

Great question! Let's break this down clearly—first covering basic conversation termination in v4, then diving into how to replicate that full session reset behavior you relied on in v3.

Basic Conversation Termination

In v4, dialog flow is managed through the dialog stack, so there are two common ways to wrap up a flow:

  • To end the current dialog and pass control back to its parent (if you have nested dialogs), use EndDialogAsync() within your dialog logic. This is ideal when a specific task finishes but the overall session might keep going.
  • To clear the entire dialog stack and stop all active dialogs, use CancelAllDialogsAsync(). As you noted, this only resets the dialog flow—it doesn't kill the underlying session itself, so the same Conversation ID stays active.

Replicating v3's session.endChat() (Full Session Termination)

v3's session.endChat() didn't just clear the dialog stack—it fully terminated the session, forcing users to start fresh with a new Conversation ID. v4 doesn't have a direct equivalent method, but you can achieve the exact same result with a two-step approach:

1. Clear Session State

Bot Framework v4 stores conversation-specific data in ConversationState (and user-specific data in UserState if needed). To fully reset the session, you need to wipe this state clean:

// Example in C#
var conversationStateAccessors = _conversationState.CreateProperty<ConversationData>(nameof(ConversationData));
var conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData());

// Reset the conversation data to a blank state
conversationData = new ConversationData();
await conversationStateAccessors.SetAsync(turnContext, conversationData);
await _conversationState.SaveChangesAsync(turnContext);

// If you need to reset user-specific state for this session, repeat the process with UserState

For Node.js, the logic is identical in principle—you'll access your state managers and reset the relevant properties.

2. Send an EndOfConversation Activity

Most channels (like Web Chat, Teams, and Direct Line) support the EndOfConversation activity type, which tells the channel to close the current session entirely. When the user initiates a new interaction, a fresh Conversation ID will be generated automatically:

// Example in C#
// First, notify the user their session is timing out
await turnContext.SendActivityAsync(MessageFactory.Text("Your session has timed out. Please start a new conversation to continue."));

// Send the signal to terminate the session
var endOfConversationActivity = Activity.CreateEndOfConversationActivity();
endOfConversationActivity.Code = EndOfConversationCodes.CompletedSuccessfully;
await turnContext.SendActivityAsync(endOfConversationActivity);

Note: Channel support varies a little, but most modern channels handle this activity exactly as expected—just test with your target channel to confirm.

Bonus: Adaptive Dialogs Shortcut

If you're using Adaptive Dialogs (v4's more declarative approach), you can use the built-in EndConversation action. This handles both state cleanup and sending the EndOfConversation activity automatically, so you can skip writing the manual state code.

Putting It All Together for Your Timeout Bot

For your inactivity timer workflow:

  1. When the timer detects X minutes of no user interaction, trigger the two steps above.
  2. Clear the ConversationState to wipe all existing session data.
  3. Send the EndOfConversation activity to terminate the session in the channel.

This will match the exact behavior of v3's session.endChat()—users will have to start a new conversation, and a brand new Conversation ID will be used.

内容的提问来源于stack exchange,提问作者Perry Vo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:41:10