diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index 258fd3e6..dd0b264a 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -102,7 +102,7 @@ public interface IBotSharpRepository #endregion #region Knowledge - bool SaveKnowledgeCollectionConfigs(List configs); + bool ResetKnowledgeCollectionConfigs(List configs); VectorCollectionConfig? GetKnowledgeCollectionConfig(string collectionName); #endregion } diff --git a/src/Infrastructure/BotSharp.Abstraction/VectorStorage/Models/VectorCollectionConfigModel.cs b/src/Infrastructure/BotSharp.Abstraction/VectorStorage/Models/VectorCollectionConfigModel.cs index 45f2dfe0..45516ba3 100644 --- a/src/Infrastructure/BotSharp.Abstraction/VectorStorage/Models/VectorCollectionConfigModel.cs +++ b/src/Infrastructure/BotSharp.Abstraction/VectorStorage/Models/VectorCollectionConfigModel.cs @@ -16,6 +16,12 @@ public class VectorCollectionConfig [JsonPropertyName("text_embedding")] public KnowledgeEmbeddingConfig TextEmbedding { get; set; } + + [JsonPropertyName("create_date")] + public DateTime CreateDate { get; set; } = DateTime.UtcNow; + + [JsonPropertyName("create_user_id")] + public string CreateUserId { get; set; } = string.Empty; } public class KnowledgeEmbeddingConfig diff --git a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs index ca5d810d..a96d20dd 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/BotSharpDbContext.cs @@ -235,7 +235,7 @@ public class BotSharpDbContext : Database, IBotSharpRepository #endregion #region Knowledge - public bool SaveKnowledgeCollectionConfigs(List configs) => + public bool ResetKnowledgeCollectionConfigs(List configs) => throw new NotImplementedException(); public VectorCollectionConfig? GetKnowledgeCollectionConfig(string collectionName) => diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Knowledge.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Knowledge.cs index f3108439..512eb965 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Knowledge.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Knowledge.cs @@ -5,7 +5,7 @@ namespace BotSharp.Core.Repository; public partial class FileRepository { - public bool SaveKnowledgeCollectionConfigs(List configs) + public bool ResetKnowledgeCollectionConfigs(List configs) { var dir = Path.Combine(_dbSettings.FileRepository, KNOWLEDGE_FOLDER, VECTOR_FOLDER); if (!Directory.Exists(dir)) @@ -20,6 +20,13 @@ public partial class FileRepository public VectorCollectionConfig? GetKnowledgeCollectionConfig(string collectionName) { - throw new NotImplementedException(); + if (string.IsNullOrWhiteSpace(collectionName)) return null; + + var file = Path.Combine(_dbSettings.FileRepository, KNOWLEDGE_FOLDER, VECTOR_FOLDER, COLLECTION_CONFIG_FILE); + if (!File.Exists(file)) return null; + + var str = File.ReadAllText(file); + var configs = JsonSerializer.Deserialize>(str, _options) ?? new(); + return configs.FirstOrDefault(x => x.Name == collectionName); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Common.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Common.cs index 51a746e6..7d278773 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Common.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Common.cs @@ -5,7 +5,17 @@ public partial class KnowledgeService public async Task RefreshVectorKnowledgeConfigs(VectorCollectionConfigsModel configs) { var db = _services.GetRequiredService(); - var saved = db.SaveKnowledgeCollectionConfigs(configs.Collections); + var collections = configs.Collections ?? new(); + var userService = _services.GetRequiredService(); + var user = await userService.GetUser(_user.Id); + + foreach (var collection in collections) + { + collection.CreateDate = DateTime.UtcNow; + collection.CreateUserId = user.Id; + } + + var saved = db.ResetKnowledgeCollectionConfigs(collections); return await Task.FromResult(saved); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs index c668e07e..24db19b1 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs @@ -3,15 +3,18 @@ namespace BotSharp.Plugin.KnowledgeBase.Services; public partial class KnowledgeService : IKnowledgeService { private readonly IServiceProvider _services; + private readonly IUserIdentity _user; private readonly KnowledgeBaseSettings _settings; private readonly ILogger _logger; public KnowledgeService( IServiceProvider services, + IUserIdentity user, KnowledgeBaseSettings settings, ILogger logger) { _services = services; + _user = user; _settings = settings; _logger = logger; } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/KnowledgeCollectionConfigDocument.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/KnowledgeCollectionConfigDocument.cs new file mode 100644 index 00000000..1bf282e1 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Collections/KnowledgeCollectionConfigDocument.cs @@ -0,0 +1,10 @@ +namespace BotSharp.Plugin.MongoStorage.Collections; + +public class KnowledgeCollectionConfigDocument : MongoBase +{ + public string Name { get; set; } + public string Type { get; set; } + public KnowledgeEmbeddingConfigMongoModel TextEmbedding { get; set; } + public DateTime CreateDate { get; set; } + public string CreateUserId { get; set; } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Models/KnowledgeEmbeddingConfigMongoModel.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/KnowledgeEmbeddingConfigMongoModel.cs new file mode 100644 index 00000000..31049e5d --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Models/KnowledgeEmbeddingConfigMongoModel.cs @@ -0,0 +1,30 @@ +using BotSharp.Abstraction.VectorStorage.Models; + +namespace BotSharp.Plugin.MongoStorage.Models; + +public class KnowledgeEmbeddingConfigMongoModel +{ + public string Provider { get; set; } + public string Model { get; set; } + public int Dimension { get; set; } + + public static KnowledgeEmbeddingConfigMongoModel ToMongoModel(KnowledgeEmbeddingConfig model) + { + return new KnowledgeEmbeddingConfigMongoModel + { + Provider = model.Provider, + Model = model.Model, + Dimension = model.Dimension + }; + } + + public static KnowledgeEmbeddingConfig ToDomainModel(KnowledgeEmbeddingConfigMongoModel model) + { + return new KnowledgeEmbeddingConfig + { + Provider = model.Provider, + Model = model.Model, + Dimension = model.Dimension + }; + } +} diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs index 1c9f7467..649cd96f 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/MongoDbContext.cs @@ -153,4 +153,7 @@ public class MongoDbContext public IMongoCollection TranslationMemories => Database.GetCollection($"{_collectionPrefix}_TranslationMemories"); + + public IMongoCollection KnowledgeCollectionConfigs + => Database.GetCollection($"{_collectionPrefix}_KnowledgeCollectionConfigs"); } diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Knowledge.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Knowledge.cs index 121786d1..338670b3 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Knowledge.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Knowledge.cs @@ -4,9 +4,40 @@ namespace BotSharp.Plugin.MongoStorage.Repository; public partial class MongoRepository { - public bool SaveKnowledgeCollectionConfigs(List configs) => - throw new NotImplementedException(); + public bool ResetKnowledgeCollectionConfigs(List configs) + { + var docs = configs?.Select(x => new KnowledgeCollectionConfigDocument + { + Id = Guid.NewGuid().ToString(), + Name = x.Name, + Type = x.Type, + TextEmbedding = KnowledgeEmbeddingConfigMongoModel.ToMongoModel(x.TextEmbedding), + CreateDate = x.CreateDate, + CreateUserId = x.CreateUserId, + })?.ToList() ?? new List(); - public VectorCollectionConfig? GetKnowledgeCollectionConfig(string collectionName) => - throw new NotImplementedException(); + var filter = Builders.Filter.Empty; + _dc.KnowledgeCollectionConfigs.DeleteMany(filter); + _dc.KnowledgeCollectionConfigs.InsertMany(docs); + + return true; + } + + public VectorCollectionConfig? GetKnowledgeCollectionConfig(string collectionName) + { + if (string.IsNullOrWhiteSpace(collectionName)) return null; + + var filter = Builders.Filter.Eq(x => x.Name, collectionName); + var config = _dc.KnowledgeCollectionConfigs.Find(filter).FirstOrDefault(); + if (config == null) return null; + + return new VectorCollectionConfig + { + Name = config.Name, + Type = config.Type, + TextEmbedding = KnowledgeEmbeddingConfigMongoModel.ToDomainModel(config.TextEmbedding), + CreateDate = config.CreateDate, + CreateUserId = config.CreateUserId + }; + } }