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

193 lines
7 KiB
C#
Raw Normal View History

2024-09-12 16:51:23 +00:00
using BotSharp.Abstraction.Files.Utilities;
2024-08-15 23:19:10 +00:00
using BotSharp.Abstraction.Graph.Models;
2023-08-19 00:15:02 +00:00
using BotSharp.Abstraction.Knowledges.Models;
2024-08-15 23:19:10 +00:00
using BotSharp.Abstraction.VectorStorage.Models;
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
2024-08-29 19:30:47 +00:00
#region Vector
2024-08-15 23:19:10 +00:00
[HttpGet("knowledge/vector/collections")]
2024-09-09 19:16:09 +00:00
public async Task<IEnumerable<string>> GetVectorCollections([FromQuery] string type)
2024-08-13 18:26:57 +00:00
{
2024-09-09 19:16:09 +00:00
return await _knowledgeService.GetVectorCollections(type);
2024-08-13 18:26:57 +00:00
}
2024-09-09 19:16:09 +00:00
[HttpPost("knowledge/vector/create-collection")]
public async Task<bool> CreateVectorCollection([FromBody] CreateVectorCollectionRequest request)
2024-08-29 19:30:47 +00:00
{
2024-09-09 19:16:09 +00:00
return await _knowledgeService.CreateVectorCollection(request.CollectionName, request.CollectionType, request.Dimension, request.Provider, request.Model);
2024-08-29 19:30:47 +00:00
}
[HttpDelete("knowledge/vector/{collection}/delete-collection")]
2024-09-10 19:02:25 +00:00
public async Task<bool> DeleteVectorCollection([FromRoute] string collection)
2024-08-29 19:30:47 +00:00
{
return await _knowledgeService.DeleteVectorCollection(collection);
}
2024-08-15 23:19:10 +00:00
[HttpPost("/knowledge/vector/{collection}/search")]
public async Task<IEnumerable<VectorKnowledgeViewModel>> SearchVectorKnowledge([FromRoute] string collection, [FromBody] SearchVectorKnowledgeRequest request)
2023-08-19 00:15:02 +00:00
{
2024-08-15 23:19:10 +00:00
var options = new VectorSearchOptions
2023-08-19 00:15:02 +00:00
{
2024-08-15 03:46:01 +00:00
Fields = request.Fields,
Limit = request.Limit ?? 5,
Confidence = request.Confidence ?? 0.5f,
WithVector = request.WithVector
};
2023-08-19 00:15:02 +00:00
2024-08-15 23:19:10 +00:00
var results = await _knowledgeService.SearchVectorKnowledge(request.Text, collection, options);
return results.Select(x => VectorKnowledgeViewModel.From(x)).ToList();
2023-08-19 00:15:02 +00:00
}
2024-08-06 21:02:02 +00:00
2024-08-23 18:49:06 +00:00
[HttpPost("/knowledge/vector/{collection}/page")]
public async Task<StringIdPagedItems<VectorKnowledgeViewModel>> GetPagedVectorCollectionData([FromRoute] string collection, [FromBody] VectorFilter filter)
2024-08-08 22:15:51 +00:00
{
2024-08-23 18:49:06 +00:00
var data = await _knowledgeService.GetPagedVectorCollectionData(collection, filter);
2024-08-15 23:19:10 +00:00
var items = data.Items?.Select(x => VectorKnowledgeViewModel.From(x))?
.ToList() ?? new List<VectorKnowledgeViewModel>();
2024-08-06 22:43:11 +00:00
2024-08-15 23:19:10 +00:00
return new StringIdPagedItems<VectorKnowledgeViewModel>
2024-08-06 22:43:11 +00:00
{
Count = data.Count,
NextId = data.NextId,
Items = items
};
}
2024-08-08 22:15:51 +00:00
2024-08-23 16:25:44 +00:00
[HttpPost("/knowledge/vector/{collection}/create")]
public async Task<bool> CreateVectorKnowledge([FromRoute] string collection, [FromBody] VectorKnowledgeCreateRequest request)
{
var create = new VectorCreateModel
{
Text = request.Text,
2024-09-12 22:48:47 +00:00
DataSource = request.DataSource,
2024-08-23 16:25:44 +00:00
Payload = request.Payload
};
var created = await _knowledgeService.CreateVectorCollectionData(collection, create);
return created;
}
2024-08-23 03:13:40 +00:00
[HttpPut("/knowledge/vector/{collection}/update")]
public async Task<bool> UpdateVectorKnowledge([FromRoute] string collection, [FromBody] VectorKnowledgeUpdateRequest request)
{
var update = new VectorUpdateModel
{
Id = request.Id,
Text = request.Text,
2024-09-12 22:48:47 +00:00
DataSource = request.DataSource,
2024-08-23 03:13:40 +00:00
Payload = request.Payload
};
var updated = await _knowledgeService.UpdateVectorCollectionData(collection, update);
return updated;
}
2024-08-15 23:19:10 +00:00
[HttpDelete("/knowledge/vector/{collection}/data/{id}")]
public async Task<bool> DeleteVectorCollectionData([FromRoute] string collection, [FromRoute] string id)
2024-08-08 22:15:51 +00:00
{
2024-08-15 23:19:10 +00:00
return await _knowledgeService.DeleteVectorCollectionData(collection, id);
2024-08-08 22:15:51 +00:00
}
2024-08-29 19:30:47 +00:00
#endregion
2024-08-15 23:19:10 +00:00
2024-09-09 15:00:46 +00:00
#region Document
2024-09-10 19:02:25 +00:00
[HttpPost("/knowledge/document/{collection}/upload")]
public async Task<UploadKnowledgeResponse> UploadKnowledgeDocuments([FromRoute] string collection, [FromBody] VectorKnowledgeUploadRequest request)
2024-09-09 22:42:09 +00:00
{
2024-09-10 19:02:25 +00:00
var response = await _knowledgeService.UploadKnowledgeDocuments(collection, request.Files);
return response;
}
2024-09-12 16:51:23 +00:00
[HttpPost("/knowledge/document/{collection}/form-upload")]
public async Task<UploadKnowledgeResponse> UploadKnowledgeDocuments([FromRoute] string collection, [FromForm] IEnumerable<IFormFile> files)
{
if (files.IsNullOrEmpty())
{
return new UploadKnowledgeResponse();
}
var docs = new List<ExternalFileModel>();
foreach (var file in files)
{
var data = FileUtility.BuildFileDataFromFile(file);
docs.Add(new ExternalFileModel
{
FileName = file.FileName,
FileData = data
});
}
var response = await _knowledgeService.UploadKnowledgeDocuments(collection, docs);
return response;
}
2024-09-10 19:02:25 +00:00
[HttpDelete("/knowledge/document/{collection}/delete/{fileId}")]
public async Task<bool> DeleteKnowledgeDocument([FromRoute] string collection, [FromRoute] string fileId)
{
var response = await _knowledgeService.DeleteKnowledgeDocument(collection, fileId);
2024-09-09 22:42:09 +00:00
return response;
}
2024-09-10 19:33:42 +00:00
[HttpGet("/knowledge/document/{collection}/list")]
public async Task<IEnumerable<KnowledgeFileViewModel>> GetKnowledgeDocuments([FromRoute] string collection)
{
var files = await _knowledgeService.GetKnowledgeDocuments(collection);
return files.Select(x => KnowledgeFileViewModel.From(x));
}
2024-09-10 20:07:56 +00:00
[HttpGet("/knowledge/document/{collection}/file/{fileId}")]
public async Task<IActionResult> GetKnowledgeDocument([FromRoute] string collection, [FromRoute] string fileId)
{
var file = await _knowledgeService.GetKnowledgeDocumentBinaryData(collection, fileId);
2024-09-12 16:51:23 +00:00
var stream = file.FileBinaryData.ToStream();
stream.Position = 0;
return new FileStreamResult(stream, file.ContentType) { FileDownloadName = file.FileName };
2024-09-10 20:07:56 +00:00
}
2024-09-09 16:32:31 +00:00
#endregion
2024-09-10 19:33:42 +00:00
2024-09-12 22:48:47 +00:00
#region Graph
[HttpPost("/knowledge/graph/search")]
public async Task<GraphKnowledgeViewModel> SearchGraphKnowledge([FromBody] SearchGraphKnowledgeRequest request)
{
var options = new GraphSearchOptions
{
Method = request.Method
};
var result = await _knowledgeService.SearchGraphKnowledge(request.Query, options);
return new GraphKnowledgeViewModel
{
Result = result.Result
};
}
#endregion
2024-09-09 16:32:31 +00:00
#region Common
[HttpPost("/knowledge/vector/refresh-configs")]
public async Task<string> RefreshVectorCollectionConfigs([FromBody] VectorCollectionConfigsModel request)
{
var saved = await _knowledgeService.RefreshVectorKnowledgeConfigs(request);
return saved ? "Success" : "Fail";
}
2024-08-29 19:30:47 +00:00
#endregion
2023-08-19 00:15:02 +00:00
}