BotSharp/src/Infrastructure/BotSharp.OpenAPI/Controllers/KnowledgeBaseController.cs

94 lines
3.3 KiB
C#
Raw Normal View History

2023-08-19 00:15:02 +00:00
using BotSharp.Abstraction.Knowledges.Models;
using BotSharp.Abstraction.Knowledges.Settings;
using Microsoft.AspNetCore.Http;
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}")]
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();
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
});
// 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 });
}
}