Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using BotSharp.Abstraction.SideCar.Models;

namespace BotSharp.Abstraction.SideCar;

public interface IConversationSideCar
Expand All @@ -11,5 +13,8 @@ public interface IConversationSideCar
ConversationBreakpoint? GetConversationBreakpoint(string conversationId);
void UpdateConversationStates(string conversationId, List<StateKeyValue> states);
Task<RoleDialogModel> SendMessage(string agentId, string text,
PostbackMessageModel? postback = null, List<MessageState>? states = null, List<DialogElement>? dialogs = null);
PostbackMessageModel? postback = null,
List<MessageState>? states = null,
List<DialogElement>? dialogs = null,
SideCarOptions? options = null);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace BotSharp.Abstraction.SideCar.Models;

public class SideCarOptions
{
public bool IsInheritStates { get; set; }
public IEnumerable<string>? InheritStateKeys { get; set; }

public static SideCarOptions Empty()
{
return new SideCarOptions();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ You may obtain a copy of the License at
limitations under the License.
******************************************************************************/

using BotSharp.Abstraction.SideCar.Models;
using BotSharp.Core.Infrastructures;

namespace BotSharp.Core.SideCar.Services;
Expand All @@ -24,6 +25,7 @@ public class BotSharpConversationSideCar : IConversationSideCar
private readonly ILogger<BotSharpConversationSideCar> _logger;

private Stack<ConversationContext> _contextStack = new();
private SideCarOptions? _sideCarOptions;

private bool _enabled = false;
private string _conversationId = string.Empty;
Expand Down Expand Up @@ -98,8 +100,13 @@ public void UpdateConversationStates(string conversationId, List<StateKeyValue>
}

public async Task<RoleDialogModel> SendMessage(string agentId, string text,
PostbackMessageModel? postback = null, List<MessageState>? states = null, List<DialogElement>? dialogs = null)
PostbackMessageModel? postback = null,
List<MessageState>? states = null,
List<DialogElement>? dialogs = null,
SideCarOptions? options = null)
{
_sideCarOptions = options;

BeforeExecute(dialogs);
var response = await InnerExecute(agentId, text, postback, states);
AfterExecute();
Expand Down Expand Up @@ -166,7 +173,7 @@ private void AfterExecute()
var node = _contextStack.Pop();

// Recover
state.SetCurrentState(node.State);
RestoreStates(node.State);
routing.Context.SetRecursiveCounter(node.RecursiveCounter);
routing.Context.SetAgentStack(node.RoutingStack);
routing.Context.SetDialogs(node.RoutingDialogs);
Expand All @@ -181,4 +188,43 @@ private bool IsValid(string conversationId)
&& !string.IsNullOrEmpty(conversationId)
&& !string.IsNullOrEmpty(_conversationId);
}

private void RestoreStates(ConversationState prevStates)
{
var innerStates = prevStates;
var state = _services.GetRequiredService<IConversationStateService>();

if (_sideCarOptions?.IsInheritStates == true)
{
var curStates = state.GetCurrentState();
foreach (var pair in curStates)
{
var endNode = pair.Value.Values.LastOrDefault();
if (endNode == null) continue;

if (_sideCarOptions?.InheritStateKeys?.Any() == true
&& !_sideCarOptions.InheritStateKeys.Contains(pair.Key))
{
continue;
}

if (innerStates.ContainsKey(pair.Key))
{
innerStates[pair.Key].Values.Add(endNode);
}
else
{
innerStates[pair.Key] = new StateKeyValue
{
Key = pair.Key,
Versioning = pair.Value.Versioning,
Readonly = pair.Value.Readonly,
Values = [endNode]
};
}
}
}

state.SetCurrentState(innerStates);
}
}
3 changes: 2 additions & 1 deletion src/Infrastructure/BotSharp.Core.SideCar/Using.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
global using BotSharp.Abstraction.Models;
global using BotSharp.Abstraction.Routing;
global using BotSharp.Abstraction.SideCar;
global using BotSharp.Abstraction.SideCar.Models;
global using BotSharp.Abstraction.Utilities;
global using BotSharp.Core.SideCar.Settings;
global using BotSharp.Core.SideCar.Settings;
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,7 @@ public ConversationState GetCurrentState()

public void SetCurrentState(ConversationState state)
{
var values = _curStates.Values.ToList();
var values = state.Values.ToList();
var copy = JsonSerializer.Deserialize<List<StateKeyValue>>(JsonSerializer.Serialize(values));
_curStates = new ConversationState(copy ?? []);
}
Expand Down
Loading