2023-08-19 00:15:02 +00:00
|
|
|
using BotSharp.Abstraction.Knowledges.Models;
|
2023-08-31 15:48:59 +00:00
|
|
|
using BotSharp.Abstraction.Knowledges.Settings;
|
2024-08-06 21:02:02 +00:00
|
|
|
using BotSharp.OpenAPI.ViewModels.Knowledges;
|
2023-08-19 00:15:02 +00:00
|
|
|
|
|
|
|
|
namespace BotSharp.OpenAPI.Controllers;
|
|
|
|
|
|
|
|
|
|
[Authorize]
|
|
|
|
|
[ApiController]
|
2023-12-30 03:54:41 +00:00
|
|
|
public class KnowledgeBaseController : ControllerBase
|
2023-08-19 00:15:02 +00:00
|
|
|
{
|
|
|
|
|
private readonly IKnowledgeService _knowledgeService;
|
2023-08-28 15:24:43 +00:00
|
|
|
private readonly IServiceProvider _services;
|
|
|
|
|
|
2023-12-30 03:54:41 +00:00
|
|
|
public KnowledgeBaseController(IKnowledgeService knowledgeService, IServiceProvider services)
|
2023-08-19 00:15:02 +00:00
|
|
|
{
|
|
|
|
|
_knowledgeService = knowledgeService;
|
2023-08-28 15:24:43 +00:00
|
|
|
_services = services;
|
2023-08-19 00:15:02 +00:00
|
|
|
}
|
2023-12-30 03:54:41 +00:00
|
|
|
|
2023-08-19 00:15:02 +00:00
|
|
|
[HttpGet("/knowledge/{agentId}")]
|
|
|
|
|
public async Task<List<RetrievedResult>> RetrieveKnowledge([FromRoute] string agentId, [FromQuery(Name = "q")] string question)
|
|
|
|
|
{
|
|
|
|
|
return await _knowledgeService.GetAnswer(new KnowledgeRetrievalModel
|
|
|
|
|
{
|
|
|
|
|
AgentId = agentId,
|
|
|
|
|
Question = question
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-30 03:54:41 +00:00
|
|
|
[HttpPost("/knowledge-base/upload")]
|
|
|
|
|
public async Task<IActionResult> UploadKnowledge(IFormFile file, [FromQuery] int? startPageNum, [FromQuery] int? endPageNum)
|
|
|
|
|
{
|
|
|
|
|
var setttings = _services.GetRequiredService<KnowledgeBaseSettings>();
|
|
|
|
|
var textConverter = _services.GetServices<IPdf2TextConverter>()
|
|
|
|
|
.First(x => x.GetType().FullName.EndsWith(setttings.Pdf2TextConverter));
|
|
|
|
|
|
|
|
|
|
var filePath = Path.GetTempFileName();
|
|
|
|
|
using (var stream = System.IO.File.Create(filePath))
|
|
|
|
|
{
|
|
|
|
|
await file.CopyToAsync(stream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var content = await textConverter.ConvertPdfToText(filePath, startPageNum, endPageNum);
|
|
|
|
|
|
|
|
|
|
// Process uploaded files
|
|
|
|
|
// Don't rely on or trust the FileName property without validation.
|
|
|
|
|
|
|
|
|
|
// Add FeedWithMetaData
|
|
|
|
|
await _knowledgeService.EmbedKnowledge(new KnowledgeCreationModel
|
|
|
|
|
{
|
|
|
|
|
Content = content
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return Ok(new { count = 1, file.Length });
|
|
|
|
|
}
|
|
|
|
|
|
2023-08-19 00:15:02 +00:00
|
|
|
[HttpPost("/knowledge/{agentId}")]
|
2023-08-23 17:42:36 +00:00
|
|
|
public async Task<IActionResult> FeedKnowledge([FromRoute] string agentId, List<IFormFile> files, [FromQuery] int? startPageNum, [FromQuery] int? endPageNum, [FromQuery] bool? paddleModel)
|
2023-08-19 00:15:02 +00:00
|
|
|
{
|
2023-08-28 15:24:43 +00:00
|
|
|
var setttings = _services.GetRequiredService<KnowledgeBaseSettings>();
|
|
|
|
|
var textConverter = _services.GetServices<IPdf2TextConverter>().First(x => x.GetType().FullName.EndsWith(setttings.Pdf2TextConverter));
|
2023-08-19 00:15:02 +00:00
|
|
|
long size = files.Sum(f => f.Length);
|
|
|
|
|
|
|
|
|
|
foreach (var formFile in files)
|
|
|
|
|
{
|
2023-12-30 03:54:41 +00:00
|
|
|
var filePath = Path.GetTempFileName();
|
2024-02-27 20:59:49 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
|
|
|
|
{
|
|
|
|
|
await formFile.CopyToAsync(stream);
|
|
|
|
|
await stream.FlushAsync(); // Ensure all data is written to the file
|
|
|
|
|
}
|
2023-08-28 15:24:43 +00:00
|
|
|
|
2023-12-30 03:54:41 +00:00
|
|
|
var content = await textConverter.ConvertPdfToText(filePath, startPageNum, endPageNum);
|
2023-08-19 00:15:02 +00:00
|
|
|
|
|
|
|
|
// Process uploaded files
|
|
|
|
|
// Don't rely on or trust the FileName property without validation.
|
2023-08-28 15:24:43 +00:00
|
|
|
|
|
|
|
|
// Add FeedWithMetaData
|
2023-08-19 00:15:02 +00:00
|
|
|
await _knowledgeService.Feed(new KnowledgeFeedModel
|
|
|
|
|
{
|
|
|
|
|
AgentId = agentId,
|
|
|
|
|
Content = content
|
|
|
|
|
});
|
2024-02-27 20:59:49 +00:00
|
|
|
|
|
|
|
|
// Delete the temp file after processing to clean up
|
|
|
|
|
System.IO.File.Delete(filePath);
|
2023-08-19 00:15:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Ok(new { count = files.Count, size });
|
|
|
|
|
}
|
2024-08-06 21:02:02 +00:00
|
|
|
|
|
|
|
|
|
2024-08-07 16:50:23 +00:00
|
|
|
[HttpPost("/knowledge/{collection}/data")]
|
|
|
|
|
public async Task<StringIdPagedItems<KnowledgeCollectionDataViewModel>> GetKnowledgeCollectionData([FromRoute] string collection, [FromBody] KnowledgeFilter filter)
|
2024-08-08 22:15:51 +00:00
|
|
|
{
|
2024-08-07 16:50:23 +00:00
|
|
|
var data = await _knowledgeService.GetKnowledgeCollectionData(collection, filter);
|
2024-08-06 22:43:11 +00:00
|
|
|
var items = data.Items?.Select(x => KnowledgeCollectionDataViewModel.ToViewModel(x))?
|
|
|
|
|
.ToList() ?? new List<KnowledgeCollectionDataViewModel>();
|
|
|
|
|
|
2024-08-07 14:57:07 +00:00
|
|
|
return new StringIdPagedItems<KnowledgeCollectionDataViewModel>
|
2024-08-06 22:43:11 +00:00
|
|
|
{
|
|
|
|
|
Count = data.Count,
|
|
|
|
|
NextId = data.NextId,
|
|
|
|
|
Items = items
|
|
|
|
|
};
|
|
|
|
|
}
|
2024-08-08 22:15:51 +00:00
|
|
|
|
|
|
|
|
[HttpPost("/knowledge/{collection}/similar")]
|
|
|
|
|
public async Task<IEnumerable<KnowledgeCollectionDataViewModel>> GetSimilarKnowledgeData([FromRoute] string collection, [FromBody] KnowledgeFilter filter)
|
|
|
|
|
{
|
|
|
|
|
var data = await _knowledgeService.GetKnowledgeCollectionData(collection, filter);
|
|
|
|
|
var items = data.Items?.Select(x => KnowledgeCollectionDataViewModel.ToViewModel(x))?
|
|
|
|
|
.ToList() ?? new List<KnowledgeCollectionDataViewModel>();
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpDelete("/knowledge/{collection}/data/{id}")]
|
|
|
|
|
public async Task<bool> DeleteKnowledgeCollectionData([FromRoute] string collection, [FromRoute] string id)
|
|
|
|
|
{
|
|
|
|
|
return await _knowledgeService.DeleteKnowledgeCollectionData(collection, id);
|
|
|
|
|
}
|
2023-08-19 00:15:02 +00:00
|
|
|
}
|