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

599 lines
24 KiB
C#
Raw Normal View History

2023-12-12 18:37:49 +00:00
using BotSharp.Abstraction.Agents.Models;
2024-08-28 16:08:12 +00:00
using BotSharp.Abstraction.Files.Utilities;
2023-09-01 22:26:25 +00:00
using BotSharp.Abstraction.Instructs;
using BotSharp.Abstraction.Instructs.Models;
2023-10-13 20:08:59 +00:00
using BotSharp.Core.Infrastructures;
2023-09-07 22:06:41 +00:00
using BotSharp.OpenAPI.ViewModels.Instructs;
2023-09-01 22:26:25 +00:00
namespace BotSharp.OpenAPI.Controllers;
[Authorize]
[ApiController]
2023-12-27 15:53:54 +00:00
public class InstructModeController : ControllerBase
2023-09-01 22:26:25 +00:00
{
private readonly IServiceProvider _services;
2024-05-14 16:51:39 +00:00
private readonly ILogger<InstructModeController> _logger;
2023-09-01 22:26:25 +00:00
2024-05-14 16:51:39 +00:00
public InstructModeController(IServiceProvider services, ILogger<InstructModeController> logger)
2023-09-01 22:26:25 +00:00
{
_services = services;
2024-05-14 16:51:39 +00:00
_logger = logger;
2023-09-01 22:26:25 +00:00
}
[HttpPost("/instruct/{agentId}")]
2024-08-27 15:42:48 +00:00
public async Task<InstructResult> InstructCompletion([FromRoute] string agentId, [FromBody] InstructMessageModel input)
2023-09-01 22:26:25 +00:00
{
2023-10-23 23:20:18 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2024-04-05 18:53:37 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, activeRounds: x.ActiveRounds, source: StateSource.External));
state.SetState("provider", input.Provider, source: StateSource.External)
.SetState("model", input.Model, source: StateSource.External)
.SetState("model_id", input.ModelId, source: StateSource.External)
.SetState("instruction", input.Instruction, source: StateSource.External)
.SetState("input_text", input.Text, source: StateSource.External)
2025-07-21 21:02:40 +00:00
.SetState("template_name", input.Template, source: StateSource.External)
.SetState("channel", input.Channel, source: StateSource.External);
2023-10-23 23:20:18 +00:00
var instructor = _services.GetRequiredService<IInstructService>();
2023-10-28 20:59:26 +00:00
var result = await instructor.Execute(agentId,
new RoleDialogModel(AgentRole.User, input.Text),
2023-12-15 17:54:44 +00:00
templateName: input.Template,
2025-03-31 20:16:46 +00:00
instruction: input.Instruction,
files: input.Files);
2023-10-25 00:36:02 +00:00
result.States = state.GetStates();
return result;
2023-09-01 22:26:25 +00:00
}
2023-10-13 20:08:59 +00:00
[HttpPost("/instruct/text-completion")]
2025-02-21 04:52:02 +00:00
public async Task<string> TextCompletion([FromBody] IncomingInstructRequest input)
2023-10-13 20:08:59 +00:00
{
2023-10-23 23:20:18 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2024-04-05 18:53:37 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, activeRounds: x.ActiveRounds, source: StateSource.External));
2024-07-24 15:03:12 +00:00
state.SetState("provider", input.Provider ?? "azure-openai", source: StateSource.External)
2024-04-05 18:53:37 +00:00
.SetState("model", input.Model, source: StateSource.External)
.SetState("model_id", input.ModelId, source: StateSource.External);
2023-10-23 00:37:33 +00:00
2025-03-05 23:22:46 +00:00
var agentId = input.AgentId ?? Guid.Empty.ToString();
2023-10-13 20:08:59 +00:00
var textCompletion = CompletionProvider.GetTextCompletion(_services);
2025-03-05 23:22:46 +00:00
var response = await textCompletion.GetCompletion(input.Text, agentId, Guid.NewGuid().ToString());
2025-05-15 02:48:08 +00:00
await HookEmitter.Emit<IInstructHook>(_services, async hook =>
2025-03-05 23:22:46 +00:00
await hook.OnResponseGenerated(new InstructResponseModel
{
AgentId = agentId,
Provider = textCompletion.Provider,
Model = textCompletion.Model,
TemplateName = input.Template,
UserMessage = input.Text,
CompletionText = response
2025-05-15 07:25:08 +00:00
}), agentId);
2025-05-15 02:48:08 +00:00
2025-03-05 23:22:46 +00:00
return response;
2023-10-13 20:08:59 +00:00
}
2023-12-12 18:32:04 +00:00
2024-07-19 17:01:07 +00:00
#region Chat
2023-12-12 18:32:04 +00:00
[HttpPost("/instruct/chat-completion")]
2025-02-21 04:52:02 +00:00
public async Task<string> ChatCompletion([FromBody] IncomingInstructRequest input)
2023-12-12 18:32:04 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2024-04-05 18:53:37 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, activeRounds: x.ActiveRounds, source: StateSource.External));
state.SetState("provider", input.Provider, source: StateSource.External)
.SetState("model", input.Model, source: StateSource.External)
.SetState("model_id", input.ModelId, source: StateSource.External);
2023-12-12 18:32:04 +00:00
2025-03-05 23:22:46 +00:00
var agentId = input.AgentId ?? Guid.Empty.ToString();
2025-02-21 04:52:02 +00:00
var completion = CompletionProvider.GetChatCompletion(_services);
var message = await completion.GetChatCompletions(new Agent()
2023-12-12 18:32:04 +00:00
{
2025-03-05 23:22:46 +00:00
Id = agentId,
2025-02-21 04:52:02 +00:00
Instruction = input.Instruction
2023-12-12 18:32:04 +00:00
}, new List<RoleDialogModel>
{
new RoleDialogModel(AgentRole.User, input.Text)
2025-03-31 20:16:46 +00:00
{
2025-05-29 18:58:47 +00:00
Files = input.Files?.Select(x => new BotSharpFile
{
FileUrl = x.FileUrl,
FileData = x.FileData,
ContentType = x.ContentType
}).ToList() ?? []
2025-03-31 20:16:46 +00:00
}
2024-01-14 04:48:26 +00:00
});
2025-03-04 23:25:35 +00:00
2025-05-15 02:48:08 +00:00
await HookEmitter.Emit<IInstructHook>(_services, async hook =>
2025-03-04 23:25:35 +00:00
await hook.OnResponseGenerated(new InstructResponseModel
{
2025-03-05 23:22:46 +00:00
AgentId = agentId,
Provider = completion.Provider,
Model = completion.Model,
TemplateName = input.Template,
UserMessage = input.Text,
SystemInstruction = message.RenderedInstruction,
CompletionText = message.Content
2025-05-15 07:25:08 +00:00
}), agentId);
2025-05-15 02:48:08 +00:00
2024-01-14 04:48:26 +00:00
return message.Content;
2023-12-12 18:32:04 +00:00
}
2024-07-19 17:01:07 +00:00
#endregion
2024-05-14 16:51:39 +00:00
2024-07-19 17:01:07 +00:00
#region Read image
2024-05-14 16:51:39 +00:00
[HttpPost("/instruct/multi-modal")]
2025-05-28 02:23:20 +00:00
public async Task<string> MultiModalCompletion([FromBody] MultiModalFileRequest input)
2024-05-14 16:51:39 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-05-14 16:51:39 +00:00
try
{
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-03-31 20:16:46 +00:00
var content = await fileInstruct.ReadImages(input.Text, input.Files, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-08-26 22:24:07 +00:00
return content;
2024-05-14 16:51:39 +00:00
}
catch (Exception ex)
{
2025-06-12 22:12:53 +00:00
var error = $"Error in reading multi-modal files. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-06-24 19:32:52 +00:00
return error;
2024-05-14 16:51:39 +00:00
}
}
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/multi-modal/upload")]
2025-05-28 16:57:25 +00:00
public async Task<MultiModalViewModel> MultiModalCompletion([FromForm] IEnumerable<IFormFile> files, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var viewModel = new MultiModalViewModel();
try
{
2025-05-28 02:23:20 +00:00
var fileModels = files.Select(x => new InstructFileModel
2024-08-28 16:08:12 +00:00
{
2025-06-12 22:12:53 +00:00
FileData = FileUtility.BuildFileDataFromFile(x),
ContentType = x.ContentType
2025-05-28 02:23:20 +00:00
}).ToList();
2025-05-28 16:57:25 +00:00
2024-08-28 16:08:12 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-05-28 02:23:20 +00:00
var content = await fileInstruct.ReadImages(request?.Text ?? string.Empty, fileModels, new InstructOptions
2025-03-31 20:16:46 +00:00
{
2025-05-28 02:23:20 +00:00
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId,
TemplateName = request?.TemplateName
2025-03-31 20:16:46 +00:00
});
2024-08-28 16:08:12 +00:00
viewModel.Content = content;
return viewModel;
}
catch (Exception ex)
{
2025-06-12 22:12:53 +00:00
var error = $"Error in reading multi-modal files. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
viewModel.Message = error;
return viewModel;
}
}
2024-07-19 17:01:07 +00:00
#endregion
2024-06-24 18:03:05 +00:00
2024-07-19 17:01:07 +00:00
#region Generate image
2024-06-24 18:03:05 +00:00
[HttpPost("/instruct/image-generation")]
2024-08-27 15:42:48 +00:00
public async Task<ImageGenerationViewModel> ImageGeneration([FromBody] ImageGenerationRequest input)
2024-06-24 18:03:05 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-06-24 18:03:05 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-03-31 20:16:46 +00:00
var message = await fileInstruct.GenerateImage(input.Text, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-07-01 16:03:42 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
2024-06-24 18:03:05 +00:00
return imageViewModel;
}
catch (Exception ex)
{
2024-06-24 19:32:52 +00:00
var error = $"Error in image generation. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-06-24 18:03:05 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-07-19 17:01:07 +00:00
#endregion
2024-07-01 19:31:48 +00:00
2024-07-19 17:01:07 +00:00
#region Edit image
2024-07-18 22:07:14 +00:00
[HttpPost("/instruct/image-variation")]
2024-08-27 15:42:48 +00:00
public async Task<ImageGenerationViewModel> ImageVariation([FromBody] ImageVariationRequest input)
2024-07-18 22:07:14 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-07-18 22:07:14 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2024-08-27 15:42:48 +00:00
if (input.File == null)
2024-07-19 03:49:24 +00:00
{
return new ImageGenerationViewModel { Message = "Error! Cannot find an image!" };
}
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-03-31 20:16:46 +00:00
var message = await fileInstruct.VaryImage(input.File, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
2025-04-01 02:21:45 +00:00
AgentId = input.AgentId
2025-03-31 20:16:46 +00:00
});
2024-07-18 22:07:14 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
2024-08-28 16:41:42 +00:00
2024-07-18 22:07:14 +00:00
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image variation. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-07-18 22:07:14 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-07-18 20:17:40 +00:00
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/image-variation/upload")]
2025-05-28 16:57:25 +00:00
public async Task<ImageGenerationViewModel> ImageVariation(IFormFile file, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2025-03-31 20:16:46 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
var fileData = FileUtility.BuildFileDataFromFile(file);
2025-05-28 16:57:25 +00:00
var message = await fileInstruct.VaryImage(new InstructFileModel
{
FileData = fileData,
FileName = Path.GetFileNameWithoutExtension(file.FileName),
2025-05-29 18:58:47 +00:00
FileExtension = Path.GetExtension(file.FileName)
2025-05-28 16:57:25 +00:00
},
new InstructOptions
2024-08-28 16:08:12 +00:00
{
2025-05-28 16:57:25 +00:00
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId
2025-03-31 20:16:46 +00:00
});
2024-08-28 16:41:42 +00:00
2024-08-28 16:08:12 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image variation upload. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-07-19 17:01:07 +00:00
[HttpPost("/instruct/image-edit")]
2024-08-27 15:42:48 +00:00
public async Task<ImageGenerationViewModel> ImageEdit([FromBody] ImageEditRequest input)
2024-07-19 17:01:07 +00:00
{
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2024-07-19 17:01:07 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-07-19 17:01:07 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2024-08-27 15:42:48 +00:00
if (input.File == null)
2024-07-19 17:01:07 +00:00
{
2024-08-26 22:24:07 +00:00
return new ImageGenerationViewModel { Message = "Error! Cannot find a valid image file!" };
2024-07-19 17:01:07 +00:00
}
2025-03-31 20:16:46 +00:00
var message = await fileInstruct.EditImage(input.Text, input.File, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-07-19 17:01:07 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image edit. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-07-19 17:01:07 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/image-edit/upload")]
2025-05-28 16:57:25 +00:00
public async Task<ImageGenerationViewModel> ImageEdit(IFormFile file, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2025-03-31 20:16:46 +00:00
var fileData = FileUtility.BuildFileDataFromFile(file);
2025-05-28 16:57:25 +00:00
var message = await fileInstruct.EditImage(request?.Text ?? string.Empty, new InstructFileModel
2024-08-28 16:08:12 +00:00
{
2025-05-28 16:57:25 +00:00
FileData = fileData,
FileName = Path.GetFileNameWithoutExtension(file.FileName),
2025-05-29 18:58:47 +00:00
FileExtension = Path.GetExtension(file.FileName)
2025-05-28 16:57:25 +00:00
},
new InstructOptions
{
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId,
TemplateName = request?.TemplateName
2025-03-31 20:16:46 +00:00
});
2024-08-28 16:41:42 +00:00
2024-08-28 16:08:12 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
2024-08-28 16:41:42 +00:00
2024-08-28 16:08:12 +00:00
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image edit upload. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-07-19 17:01:07 +00:00
[HttpPost("/instruct/image-mask-edit")]
2024-08-27 15:42:48 +00:00
public async Task<ImageGenerationViewModel> ImageMaskEdit([FromBody] ImageMaskEditRequest input)
2024-07-19 17:01:07 +00:00
{
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2024-07-19 17:01:07 +00:00
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-07-19 17:01:07 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2024-08-27 15:42:48 +00:00
var image = input.File;
2024-07-19 17:01:07 +00:00
var mask = input.Mask;
if (image == null || mask == null)
{
2024-08-26 22:24:07 +00:00
return new ImageGenerationViewModel { Message = "Error! Cannot find a valid image or mask!" };
2024-07-19 17:01:07 +00:00
}
2025-03-31 20:16:46 +00:00
var message = await fileInstruct.EditImage(input.Text, image, mask, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-07-19 17:01:07 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image mask edit. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-07-19 17:01:07 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/image-mask-edit/upload")]
2025-05-28 16:57:25 +00:00
public async Task<ImageGenerationViewModel> ImageMaskEdit(IFormFile image, IFormFile mask, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var imageViewModel = new ImageGenerationViewModel();
try
{
2025-03-31 20:16:46 +00:00
var imageData = FileUtility.BuildFileDataFromFile(image);
var maskData = FileUtility.BuildFileDataFromFile(mask);
2025-05-28 16:57:25 +00:00
var message = await fileInstruct.EditImage(request?.Text ?? string.Empty,
new InstructFileModel
{
FileData = imageData,
FileName = Path.GetFileNameWithoutExtension(image.FileName),
2025-05-29 18:58:47 +00:00
FileExtension = Path.GetExtension(image.FileName)
2025-05-28 16:57:25 +00:00
},
new InstructFileModel
{
FileData = maskData,
FileName = Path.GetFileNameWithoutExtension(mask.FileName),
2025-05-29 18:58:47 +00:00
FileExtension = Path.GetExtension(mask.FileName)
2025-05-28 16:57:25 +00:00
},
new InstructOptions
{
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId,
TemplateName = request?.TemplateName
});
2024-08-28 16:08:12 +00:00
imageViewModel.Content = message.Content;
imageViewModel.Images = message.GeneratedImages.Select(x => ImageViewModel.ToViewModel(x)).ToList();
2024-08-28 16:41:42 +00:00
2024-08-28 16:08:12 +00:00
return imageViewModel;
}
catch (Exception ex)
{
var error = $"Error in image mask edit upload. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
imageViewModel.Message = error;
return imageViewModel;
}
}
2024-07-19 17:01:07 +00:00
#endregion
#region Pdf
2024-07-01 19:31:48 +00:00
[HttpPost("/instruct/pdf-completion")]
2025-05-28 02:23:20 +00:00
public async Task<PdfCompletionViewModel> PdfCompletion([FromBody] MultiModalFileRequest input)
2024-07-01 19:31:48 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-07-01 19:31:48 +00:00
var viewModel = new PdfCompletionViewModel();
try
{
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-03-31 20:16:46 +00:00
var content = await fileInstruct.ReadPdf(input.Text, input.Files, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-07-01 19:31:48 +00:00
viewModel.Content = content;
return viewModel;
}
catch (Exception ex)
{
var error = $"Error in pdf completion. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-07-01 19:31:48 +00:00
viewModel.Message = error;
return viewModel;
}
}
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/pdf-completion/upload")]
2025-05-28 16:57:25 +00:00
public async Task<PdfCompletionViewModel> PdfCompletion([FromForm] IEnumerable<IFormFile> files, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var viewModel = new PdfCompletionViewModel();
try
{
2025-05-28 16:57:25 +00:00
var fileModels = files.Select(x => new InstructFileModel
2024-08-28 16:08:12 +00:00
{
2025-06-12 22:12:53 +00:00
FileData = FileUtility.BuildFileDataFromFile(x),
ContentType = x.ContentType
2025-05-28 16:57:25 +00:00
}).ToList();
2024-08-28 16:08:12 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-05-28 16:57:25 +00:00
var content = await fileInstruct.ReadPdf(request?.Text ?? string.Empty, fileModels, new InstructOptions
2025-03-31 20:16:46 +00:00
{
2025-05-28 16:57:25 +00:00
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId,
TemplateName = request?.TemplateName
2025-03-31 20:16:46 +00:00
});
2024-08-28 16:08:12 +00:00
viewModel.Content = content;
return viewModel;
}
catch (Exception ex)
{
2025-06-12 22:12:53 +00:00
var error = $"Error in pdf completion. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
viewModel.Message = error;
return viewModel;
}
}
2024-07-19 17:01:07 +00:00
#endregion
2024-08-26 22:24:07 +00:00
#region Audio
2024-08-28 16:08:12 +00:00
[HttpPost("/instruct/speech-to-text")]
public async Task<SpeechToTextViewModel> SpeechToText([FromBody] SpeechToTextRequest input)
2024-08-26 22:24:07 +00:00
{
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var viewModel = new SpeechToTextViewModel();
2024-08-26 22:24:07 +00:00
try
{
2024-08-27 15:42:48 +00:00
var audio = input.File;
2024-08-26 22:24:07 +00:00
if (audio == null)
{
2024-08-28 16:08:12 +00:00
return new SpeechToTextViewModel { Message = "Error! Cannot find a valid audio file!" };
2024-08-26 22:24:07 +00:00
}
2025-03-31 20:16:46 +00:00
var content = await fileInstruct.SpeechToText(audio, input.Text, new InstructOptions
{
Provider = input.Provider,
Model = input.Model,
AgentId = input.AgentId,
TemplateName = input.TemplateName
});
2024-08-28 16:08:12 +00:00
viewModel.Content = content;
return viewModel;
}
catch (Exception ex)
{
var error = $"Error in speech to text. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-28 16:08:12 +00:00
viewModel.Message = error;
return viewModel;
}
}
[HttpPost("/instruct/speech-to-text/upload")]
2025-05-28 16:57:25 +00:00
public async Task<SpeechToTextViewModel> SpeechToText(IFormFile file, [FromForm] MultiModalRequest request)
2024-08-28 16:08:12 +00:00
{
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
request?.States?.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 16:08:12 +00:00
var viewModel = new SpeechToTextViewModel();
try
{
2025-04-21 16:19:56 +00:00
var audioData = FileUtility.BuildFileDataFromFile(file);
2025-05-28 16:57:25 +00:00
var content = await fileInstruct.SpeechToText(new InstructFileModel
{
FileData = audioData,
FileName = Path.GetFileNameWithoutExtension(file.FileName),
2025-05-29 18:58:47 +00:00
FileExtension = Path.GetExtension(file.FileName)
2025-05-28 16:57:25 +00:00
},
request?.Text ?? string.Empty,
new InstructOptions
2025-03-31 20:16:46 +00:00
{
2025-05-28 16:57:25 +00:00
Provider = request?.Provider,
Model = request?.Model,
AgentId = request?.AgentId,
TemplateName = request?.TemplateName
2025-03-31 20:16:46 +00:00
});
2024-08-28 16:08:12 +00:00
2024-08-26 22:24:07 +00:00
viewModel.Content = content;
return viewModel;
}
catch (Exception ex)
{
2025-06-12 22:12:53 +00:00
var error = $"Error in speech-to-text. {ex.Message}";
2025-05-28 00:56:14 +00:00
_logger.LogError(ex, error);
2024-08-26 22:24:07 +00:00
viewModel.Message = error;
return viewModel;
}
}
2024-08-28 18:43:37 +00:00
[HttpPost("/instruct/text-to-speech")]
public async Task<IActionResult> TextToSpeech([FromBody] TextToSpeechRequest input)
{
var state = _services.GetRequiredService<IConversationStateService>();
2025-05-28 16:57:25 +00:00
input.States.ForEach(x => state.SetState(x.Key, x.Value, source: StateSource.External));
2024-08-28 18:43:37 +00:00
2025-03-22 00:28:22 +00:00
var completion = CompletionProvider.GetAudioSynthesizer(_services, provider: input.Provider, model: input.Model);
var binaryData = await completion.GenerateAudioAsync(input.Text);
2024-08-28 18:43:37 +00:00
var stream = binaryData.ToStream();
stream.Position = 0;
return new FileStreamResult(stream, "audio/mpeg") { FileDownloadName = "output.mp3" };
}
2024-08-26 22:24:07 +00:00
#endregion
2023-09-01 22:26:25 +00:00
}