diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs index fe3f9193..5663e9a5 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationStateService.cs @@ -17,6 +17,6 @@ public interface IConversationStateService int activeRounds = -1, string valueType = StateDataType.String, string source = StateSource.User, bool readOnly = false); void SaveStateByArgs(JsonDocument args); bool RemoveState(string name); - void CleanStates(); + void CleanStates(params string[] keepStates); void Save(); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/StateConst.cs b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/StateConst.cs index 8b7fc37c..442c8ef8 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/StateConst.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Infrastructures/Enums/StateConst.cs @@ -7,4 +7,6 @@ public class StateConst public const string NEXT_ACTION_AGENT = "next_action_agent"; public const string NEXT_ACTION_REASON = "next_action_reason"; public const string USER_GOAL_AGENT = "user_goal_agent"; + + public const string LANGUAGE = "language"; } diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs index 6a3397fc..7453a202 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs @@ -1,3 +1,5 @@ +using BotSharp.Abstraction.Infrastructures.Enums; + namespace BotSharp.Core.Conversations.Services; public partial class ConversationService : IConversationService @@ -19,7 +21,8 @@ public partial class ConversationService : IConversationService if (resetStates) { var states = _services.GetRequiredService(); - states.CleanStates(); + // keep language state + states.CleanStates(StateConst.LANGUAGE); } var hooks = _services.GetServices() diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs index 636d622e..4901a7c6 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationStateService.cs @@ -270,7 +270,7 @@ public class ConversationStateService : IConversationStateService, IDisposable return true; } - public void CleanStates() + public void CleanStates(params string[] keepStates) { var routingCtx = _services.GetRequiredService(); var curMsgId = routingCtx.MessageId; @@ -278,6 +278,12 @@ public class ConversationStateService : IConversationStateService, IDisposable foreach (var key in _curStates.Keys) { + // skip state + if (keepStates.Contains(key)) + { + continue; + } + var value = _curStates[key]; if (value == null || !value.Versioning || value.Values.IsNullOrEmpty()) continue; diff --git a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs index 885728a1..5e0ca8ac 100644 --- a/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs +++ b/src/Infrastructure/BotSharp.Core/Routing/RoutingService.cs @@ -88,7 +88,7 @@ public partial class RoutingService : IRoutingService { var translator = _services.GetRequiredService(); - var language = states.GetState("language", LanguageType.UNKNOWN); + var language = states.GetState(StateConst.LANGUAGE, LanguageType.UNKNOWN); if (language != LanguageType.ENGLISH) { message.SecondaryContent = message.Content; diff --git a/src/Infrastructure/BotSharp.Core/Translation/TranslationResponseHook.cs b/src/Infrastructure/BotSharp.Core/Translation/TranslationResponseHook.cs index d79c73a0..755aa110 100644 --- a/src/Infrastructure/BotSharp.Core/Translation/TranslationResponseHook.cs +++ b/src/Infrastructure/BotSharp.Core/Translation/TranslationResponseHook.cs @@ -31,7 +31,7 @@ namespace BotSharp.Logger.Hooks var agentService = _services.GetRequiredService(); var router = await agentService.LoadAgent(AIAssistant); var translator = _services.GetRequiredService(); - var language = _states.GetState("language", LanguageType.ENGLISH); + var language = _states.GetState(StateConst.LANGUAGE, LanguageType.ENGLISH); if (language != LanguageType.UNKNOWN && language != LanguageType.ENGLISH) { if (message.RichContent != null) diff --git a/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs b/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs index 07c2c973..4f23ade1 100644 --- a/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs +++ b/src/Infrastructure/BotSharp.Core/Translation/TranslationService.cs @@ -61,10 +61,10 @@ public class TranslationService : ITranslationService { // Override language if it's Unknown, it's used to output the corresponding language. var states = _services.GetRequiredService(); - if (!states.ContainsState("language")) + if (!states.ContainsState(StateConst.LANGUAGE)) { var inputLanguage = string.IsNullOrEmpty(translatedStringList.InputLanguage) ? LanguageType.ENGLISH : translatedStringList.InputLanguage; - states.SetState("language", inputLanguage, activeRounds: 1); + states.SetState(StateConst.LANGUAGE, inputLanguage, activeRounds: 1); } var translatedTexts = translatedStringList.Texts; @@ -302,7 +302,7 @@ public class TranslationService : ITranslationService TemplateDict = new Dictionary { { "text_list", texts }, - { "language", language } + { StateConst.LANGUAGE, language } } };