using BotSharp.Abstraction.Knowledges.Models; using BotSharp.OpenAPI.ViewModels.Knowledges; namespace BotSharp.OpenAPI.Controllers; [Authorize] [ApiController] public class KnowledgeBaseController : ControllerBase { private readonly IKnowledgeService _knowledgeService; private readonly IServiceProvider _services; public KnowledgeBaseController(IKnowledgeService knowledgeService, IServiceProvider services) { _knowledgeService = knowledgeService; _services = services; } [HttpPost("/knowledge/{collection}/search")] public async Task> SearchKnowledge([FromRoute] string collection, [FromBody] SearchKnowledgeModel model) { var options = new KnowledgeRetrievalOptions { Text = model.Text, Fields = model.Fields, Limit = model.Limit ?? 5, Confidence = model.Confidence ?? 0.5f, WithVector = model.WithVector }; var results = await _knowledgeService.SearchKnowledge(collection, options); return results.Select(x => KnowledgeRetrivalViewModel.From(x)).ToList(); } [HttpPost("/knowledge/{collection}/data")] public async Task> GetKnowledgeCollectionData([FromRoute] string collection, [FromBody] KnowledgeFilter filter) { var data = await _knowledgeService.GetKnowledgeCollectionData(collection, filter); var items = data.Items?.Select(x => KnowledgeCollectionDataViewModel.From(x))? .ToList() ?? new List(); return new StringIdPagedItems { Count = data.Count, NextId = data.NextId, Items = items }; } [HttpDelete("/knowledge/{collection}/data/{id}")] public async Task DeleteKnowledgeCollectionData([FromRoute] string collection, [FromRoute] string id) { return await _knowledgeService.DeleteKnowledgeCollectionData(collection, id); } [HttpPost("/knowledge/{collection}/upload")] public async Task UploadKnowledge([FromRoute] string collection, [FromForm] IFormFile file, [FromForm] int? startPageNum, [FromForm] int? endPageNum) { var setttings = _services.GetRequiredService(); var textConverter = _services.GetServices().FirstOrDefault(x => x.Name == setttings.Pdf2TextConverter); var filePath = Path.GetTempFileName(); using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) { await file.CopyToAsync(stream); await stream.FlushAsync(); } var content = await textConverter.ConvertPdfToText(filePath, startPageNum, endPageNum); await _knowledgeService.FeedKnowledge(collection, new KnowledgeCreationModel { Content = content }); System.IO.File.Delete(filePath); return Ok(new { count = 1, file.Length }); } }