diff --git a/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs b/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs index 90adac267..d62b9ec0d 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Utilities/StringExtensions.cs @@ -22,4 +22,9 @@ public static string[] SplitByNewLine(this string input) { return input.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); } + + public static bool IsEqualTo(this string str1, string str2, StringComparison option = StringComparison.OrdinalIgnoreCase) + { + return str1.Equals(str2, option); + } } diff --git a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs index ce43e58bc..113f2da16 100644 --- a/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs +++ b/src/Infrastructure/BotSharp.Core/Agents/Services/AgentService.CreateAgent.cs @@ -1,6 +1,7 @@ using BotSharp.Abstraction.Agents.Models; using BotSharp.Abstraction.Functions.Models; using BotSharp.Abstraction.Repositories; +using BotSharp.Abstraction.Utilities; using System.IO; namespace BotSharp.Core.Agents.Services; @@ -71,7 +72,7 @@ private Agent FetchAgentFileByName(string agentName, string filePath) { var agentJson = File.ReadAllText(Path.Combine(dir, "agent.json")); var agent = JsonSerializer.Deserialize(agentJson, _options); - if (agent != null && agent.Name == agentName) + if (agent != null && agent.Name.IsEqualTo(agentName)) { var functions = FetchFunctionsFromFile(dir); var instruction = FetchInstructionFromFile(dir); @@ -99,13 +100,16 @@ private string FetchInstructionFromFile(string fileDir) private List FetchTemplatesFromFile(string fileDir) { var templates = new List(); - foreach (var file in Directory.GetFiles(fileDir)) + var templateDir = Path.Combine(fileDir, "templates"); + if (!Directory.Exists(templateDir)) return templates; + + foreach (var file in Directory.GetFiles(templateDir)) { var fileName = file.Split(Path.DirectorySeparatorChar).Last(); var splits = fileName.ToLower().Split('.'); var name = splits[0]; var extension = splits[1]; - if (name != "instruction" && extension == _agentSettings.TemplateFormat) + if (extension.IsEqualTo(_agentSettings.TemplateFormat)) { var content = File.ReadAllText(file); templates.Add(new AgentTemplate(name, content)); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs index 19a7d1287..bf92c5a46 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs @@ -399,23 +399,21 @@ private void UpdateAgentTemplates(string agentId, List templates) var (agent, agentFile) = GetAgentFromFile(agentId); if (agent == null) return; - var baseDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId); + var templateDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId, "templates"); - foreach (var file in Directory.GetFiles(baseDir)) + if (!Directory.Exists(templateDir)) { - var fileName = file.Split(Path.DirectorySeparatorChar).Last(); - var splits = fileName.ToLower().Split('.'); - var name = splits[0]; - var extension = splits[1]; - if (name != "instruction" && extension == _agentSettings.TemplateFormat) - { - File.Delete(file); - } + Directory.CreateDirectory(templateDir); + } + + foreach (var file in Directory.GetFiles(templateDir)) + { + File.Delete(file); } foreach (var template in templates) { - var file = Path.Combine(baseDir, $"{template.Name}.{_agentSettings.TemplateFormat}"); + var file = Path.Combine(templateDir, $"{template.Name}.{_agentSettings.TemplateFormat}"); File.WriteAllText(file, template.Content); } } @@ -427,8 +425,7 @@ private void UpdateAgentResponses(string agentId, List responses) var (agent, agentFile) = GetAgentFromFile(agentId); if (agent == null) return; - var baseDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId); - var responseDir = Path.Combine(baseDir, "responses"); + var responseDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId, "responses"); if (!Directory.Exists(responseDir)) { Directory.CreateDirectory(responseDir); @@ -512,17 +509,16 @@ public Agent GetAgent(string agentId) public string GetAgentTemplate(string agentId, string templateName) { - var fileDir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId); - if (!Directory.Exists(fileDir)) return string.Empty; + var dir = Path.Combine(_dbSettings.FileRepository, _agentSettings.DataDir, agentId, "templates"); + if (!Directory.Exists(dir)) return string.Empty; - var lowerTemplateName = templateName?.ToLower(); - foreach (var file in Directory.GetFiles(fileDir)) + foreach (var file in Directory.GetFiles(dir)) { var fileName = file.Split(Path.DirectorySeparatorChar).Last(); var splits = fileName.ToLower().Split('.'); var name = splits[0]; var extension = splits[1]; - if (name == lowerTemplateName && extension == _agentSettings.TemplateFormat) + if (name.IsEqualTo(templateName) && extension.IsEqualTo(_agentSettings.TemplateFormat)) { return File.ReadAllText(file); } @@ -742,14 +738,16 @@ private List FetchFunctions(string fileDir) private List FetchTemplates(string fileDir) { var templates = new List(); + var templateDir = Path.Combine(fileDir, "templates"); + if (!Directory.Exists(templateDir)) return templates; - foreach (var file in Directory.GetFiles(fileDir)) + foreach (var file in Directory.GetFiles(templateDir)) { var fileName = file.Split(Path.DirectorySeparatorChar).Last(); var splits = fileName.ToLower().Split('.'); var name = splits[0]; var extension = splits[1]; - if (name != "instruction" && extension == _agentSettings.TemplateFormat) + if (extension.Equals(_agentSettings.TemplateFormat, StringComparison.OrdinalIgnoreCase)) { var content = File.ReadAllText(file); templates.Add(new AgentTemplate(name, content)); diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/FunctionDefMongoElement.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/FunctionDefMongoElement.cs index d99435771..ec9699c0e 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/FunctionDefMongoElement.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/FunctionDefMongoElement.cs @@ -38,7 +38,7 @@ public static FunctionDef ToDomainElement(FunctionDefMongoElement mongoFunction) Parameters = new FunctionParametersDef { Type = mongoFunction.Parameters.Type, - Properties = JsonSerializer.Deserialize(mongoFunction.Parameters.Properties), + Properties = JsonSerializer.Deserialize(mongoFunction.Parameters.Properties.IfNullOrEmptyAs("{}")), Required = mongoFunction.Parameters.Required, } };