Merge pull request #1089 from iceljc/bugfix/fix-sidecar-reset-states

refine side car states
This commit is contained in:
iceljc 2025-07-07 12:58:50 -05:00 committed by GitHub
commit 5d5abf5865
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 69 additions and 5 deletions

View file

@ -1,3 +1,5 @@
using BotSharp.Abstraction.SideCar.Models;
namespace BotSharp.Abstraction.SideCar;
public interface IConversationSideCar
@ -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);
}

View file

@ -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();
}
}

View file

@ -14,6 +14,7 @@
limitations under the License.
******************************************************************************/
using BotSharp.Abstraction.SideCar.Models;
using BotSharp.Core.Infrastructures;
namespace BotSharp.Core.SideCar.Services;
@ -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;
@ -98,8 +100,13 @@ public class BotSharpConversationSideCar : IConversationSideCar
}
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();
@ -166,7 +173,7 @@ public class BotSharpConversationSideCar : IConversationSideCar
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);
@ -181,4 +188,43 @@ public class BotSharpConversationSideCar : IConversationSideCar
&& !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);
}
}

View file

@ -16,5 +16,6 @@ global using BotSharp.Abstraction.Conversations.Models;
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;

View file

@ -443,7 +443,7 @@ public class ConversationStateService : IConversationStateService
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 ?? []);
}