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

161 lines
5.6 KiB
C#
Raw Normal View History

2023-08-19 00:15:02 +00:00
using BotSharp.Abstraction.ApiAdapters;
2023-11-27 03:04:48 +00:00
using BotSharp.Abstraction.Conversations.Enums;
2023-08-19 00:15:02 +00:00
using BotSharp.Abstraction.Conversations.Models;
2023-10-27 15:18:48 +00:00
using BotSharp.Abstraction.Models;
2023-08-19 00:15:02 +00:00
using BotSharp.OpenAPI.ViewModels.Conversations;
2023-11-14 01:25:25 +00:00
using BotSharp.OpenAPI.ViewModels.Users;
2023-11-09 21:11:36 +00:00
using Microsoft.AspNetCore.Http;
2023-11-14 14:13:54 +00:00
using Microsoft.VisualBasic;
2023-11-09 21:11:36 +00:00
using System.Net.Http.Headers;
2023-08-19 00:15:02 +00:00
namespace BotSharp.OpenAPI.Controllers;
[Authorize]
[ApiController]
public class ConversationController : ControllerBase, IApiAdapter
{
private readonly IServiceProvider _services;
private readonly IUserIdentity _user;
public ConversationController(IServiceProvider services,
2023-08-19 00:15:02 +00:00
IUserIdentity user)
{
_services = services;
_user = user;
}
[HttpPost("/conversation/{agentId}")]
2023-10-27 15:18:48 +00:00
public async Task<ConversationViewModel> NewConversation([FromRoute] string agentId, [FromBody] MessageConfig config)
2023-08-19 00:15:02 +00:00
{
var service = _services.GetRequiredService<IConversationService>();
2023-10-27 15:18:48 +00:00
var conv = new Conversation
2023-08-19 00:15:02 +00:00
{
2023-11-14 01:25:25 +00:00
AgentId = agentId,
2023-11-27 03:04:48 +00:00
Channel = ConversationChannel.OpenAPI,
2023-11-14 01:25:25 +00:00
UserId = _user.Id
2023-08-19 00:15:02 +00:00
};
2023-10-27 15:18:48 +00:00
conv = await service.NewConversation(conv);
2023-11-20 17:08:05 +00:00
service.SetConversationId(conv.Id, config.States);
2023-10-27 15:18:48 +00:00
return ConversationViewModel.FromSession(conv);
2023-08-19 00:15:02 +00:00
}
2023-11-14 01:25:25 +00:00
[HttpGet("/conversations/{agentId}")]
public async Task<IEnumerable<ConversationViewModel>> GetConversations()
{
var service = _services.GetRequiredService<IConversationService>();
var conversations = await service.GetConversations();
var userService = _services.GetRequiredService<IUserService>();
2023-11-15 13:33:46 +00:00
var list = conversations.Select(x => ConversationViewModel.FromSession(x)).ToList();
2023-11-14 01:25:25 +00:00
foreach (var item in list)
{
var user = await userService.GetUser(item.User.Id);
item.User = UserViewModel.FromUser(user);
}
return list;
}
2023-11-14 14:13:54 +00:00
[HttpGet("/conversation/{conversationId}/dialogs")]
public async Task<IEnumerable<ChatResponseModel>> GetDialogs([FromRoute] string conversationId)
{
var conv = _services.GetRequiredService<IConversationService>();
conv.SetConversationId(conversationId, new List<string>());
var history = conv.GetDialogHistory();
var userService = _services.GetRequiredService<IUserService>();
var dialogs = new List<ChatResponseModel>();
foreach (var message in history)
{
var user = await userService.GetUser(message.SenderId);
dialogs.Add(new ChatResponseModel
{
ConversationId = conversationId,
MessageId = message.MessageId,
CreatedAt = message.CreatedAt,
Text = message.Content,
Sender = UserViewModel.FromUser(user)
});
}
return dialogs;
}
[HttpDelete("/conversation/{conversationId}")]
2023-11-26 06:29:06 +00:00
public async Task<bool> DeleteConversation([FromRoute] string conversationId)
2023-08-19 00:15:02 +00:00
{
2023-11-26 06:29:06 +00:00
var conversationService = _services.GetRequiredService<IConversationService>();
var response = await conversationService.DeleteConversation(conversationId);
return response;
2023-08-19 00:15:02 +00:00
}
[HttpPost("/conversation/{agentId}/{conversationId}")]
2023-11-14 04:56:06 +00:00
public async Task<ChatResponseModel> SendMessage([FromRoute] string agentId,
[FromRoute] string conversationId,
2023-09-09 15:37:38 +00:00
[FromBody] NewMessageModel input)
2023-08-19 00:15:02 +00:00
{
var conv = _services.GetRequiredService<IConversationService>();
2023-09-14 01:41:51 +00:00
conv.SetConversationId(conversationId, input.States);
2023-11-27 03:04:48 +00:00
conv.States.SetState("provider", input.Provider)
.SetState("model", input.Model)
.SetState("temperature", input.Temperature)
.SetState("sampling_factor", input.SamplingFactor);
2023-09-14 01:41:51 +00:00
2023-11-14 04:56:06 +00:00
var response = new ChatResponseModel();
2023-10-27 15:18:48 +00:00
var inputMsg = new RoleDialogModel("user", input.Text);
2023-11-27 03:04:48 +00:00
await conv.SendMessage(agentId, input.Channel, inputMsg,
2023-08-19 00:15:02 +00:00
async msg =>
{
2023-10-30 16:48:18 +00:00
response.Text = msg.Content;
response.Function = msg.FunctionName;
response.RichContent = msg.RichContent;
response.Instruction = msg.Instruction;
response.Data = msg.Data;
},
async fnExecuting =>
{
},
async fnExecuted =>
{
});
2023-08-19 00:15:02 +00:00
2023-11-03 14:16:16 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
response.States = state.GetStates();
2023-10-27 15:18:48 +00:00
response.MessageId = inputMsg.MessageId;
2023-11-14 14:13:54 +00:00
response.ConversationId = conversationId;
2023-09-22 20:38:58 +00:00
2023-08-19 00:15:02 +00:00
return response;
}
2023-11-09 21:11:36 +00:00
2023-11-14 14:13:54 +00:00
[HttpPost("/conversation/{conversationId}/attachments")]
public IActionResult UploadAttachments([FromRoute] string conversationId,
2023-11-09 21:11:36 +00:00
IFormFile[] files)
{
if (files != null && files.Length > 0)
{
var attachmentService = _services.GetRequiredService<IConversationAttachmentService>();
var dir = attachmentService.GetDirectory(conversationId);
foreach (var file in files)
{
// Save the file, process it, etc.
var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
var filePath = Path.Combine(dir, fileName);
using (var stream = new FileStream(filePath, FileMode.Create))
{
file.CopyTo(stream);
}
}
return Ok(new { message = "File uploaded successfully." });
}
return BadRequest(new { message = "Invalid file." });
}
2023-08-19 00:15:02 +00:00
}