diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs new file mode 100644 index 00000000..da4add53 --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Hooks/KnowledgeHook.cs @@ -0,0 +1,105 @@ +namespace BotSharp.Plugin.KnowledgeBase.Hooks; + +public class KnowledgeHook : IKnowledgeHook +{ + private readonly IKnowledgeService _knowledgeService; + private readonly ITextEmbedding _textEmbedding; + private readonly IServiceProvider _services; + + public KnowledgeHook( + IKnowledgeService knowledgeService, + ITextEmbedding textEmbedding, + IServiceProvider services) + { + _knowledgeService = knowledgeService; + _textEmbedding = textEmbedding; + _services = services; + } + + private async Task> GetKnowledgeBaseNameByAgentIdAsync(string agentId) + { + var agentService = _services.GetRequiredService(); + var agent = await agentService.GetAgent(agentId); + return agent.KnowledgeBases; + } + + public async Task> GetDomainKnowledges(RoleDialogModel message, string text) + { + // Get agent Id by knowledge base name + var knowledgeBases = await GetKnowledgeBaseNameByAgentIdAsync(message.CurrentAgentId); + var results = new List(); + + foreach (var knowledgeBase in knowledgeBases) + { + if (knowledgeBase.Type == "relationships") + { + var options = new GraphSearchOptions + { + Method = "local" + }; + var result = await _knowledgeService.SearchGraphKnowledge(text, options); + results.Add(result.Result); + } + else + { + var options = new VectorSearchOptions + { + Fields = null, + Limit = 5, + Confidence = 0.5f, + WithVector = true + }; + var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); + results.AddRange(result.Where(x => x.Data != null && (x.Data.ContainsKey("text") || x.Data.ContainsKey("answer"))) + .Select(x => x.Data.ContainsKey("answer") ? x.Data["text"].ToString() + "\r\n\r\n" + x.Data["answer"].ToString() : x.Data["text"].ToString()) + .Where(x => x != null)!); + + } + } + + return results; + } + + public async Task> GetGlobalKnowledges(RoleDialogModel message) + { + var text = message.Content; + var results = new List(); + + // Get all knowledge bases + var knowledgeBases = await _knowledgeService.GetVectorCollections(); + + foreach (var knowledgeBase in knowledgeBases) + { + if (knowledgeBase.Type == "relationships") + { + var options = new GraphSearchOptions + { + Method = "local" + }; + var result = await _knowledgeService.SearchGraphKnowledge(text, options); + results.Add(result.Result); + } + else + { + var options = new VectorSearchOptions + { + Fields = null, + Limit = 5, + Confidence = 0.5f, + WithVector = true + }; + var result = await _knowledgeService.SearchVectorKnowledge(text, knowledgeBase.Name, options); + results.AddRange(result.Where(x => x.Data != null && (x.Data.ContainsKey("text") || x.Data.ContainsKey("answer"))) + .Select(x => x.Data.ContainsKey("answer") ? x.Data["text"].ToString() + "\r\n\r\n" + x.Data["answer"].ToString() : x.Data["text"].ToString()) + .Where(x => x != null)!); + } + } + + return results; + } + + public async Task> CollectChunkedKnowledge() + { + return new List(); + } +} \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs index 8d89daf6..31fa964c 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/KnowledgeBasePlugin.cs @@ -26,6 +26,8 @@ public class KnowledgeBasePlugin : IBotSharpPlugin services.AddSingleton(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); + } public bool AttachMenu(List menu)