BotSharp/src/Infrastructure/BotSharp.Core/Templating/ResponseTemplateService.cs

124 lines
3.9 KiB
C#
Raw Normal View History

2023-09-03 04:54:22 +00:00
using BotSharp.Abstraction.Repositories;
using BotSharp.Abstraction.Routing.Models;
2023-08-30 23:29:01 +00:00
using BotSharp.Abstraction.Templating;
using System.Reflection;
namespace BotSharp.Core.Templating;
public class ResponseTemplateService : IResponseTemplateService
{
private readonly IServiceProvider _services;
2023-09-01 15:42:16 +00:00
private readonly ILogger _logger;
public ResponseTemplateService(IServiceProvider services, ILogger<ResponseTemplateService> logger)
2023-08-30 23:29:01 +00:00
{
_services = services;
2023-09-01 15:42:16 +00:00
_logger = logger;
2023-08-30 23:29:01 +00:00
}
2023-08-31 11:40:51 +00:00
public async Task<string> RenderFunctionResponse(string agentId, RoleDialogModel message)
2023-08-30 23:29:01 +00:00
{
// Find response template
2023-09-03 04:54:22 +00:00
var db = _services.GetRequiredService<IBotSharpRepository>();
2023-09-09 20:13:19 +00:00
var responses = db.GetAgentResponses(agentId, "func", message.FunctionName);
2023-08-30 23:29:01 +00:00
if (responses.Count == 0)
{
return string.Empty;
}
var randomIndex = new Random().Next(0, responses.Count);
2023-09-03 04:54:22 +00:00
var template = responses[randomIndex];
2023-08-30 23:29:01 +00:00
var render = _services.GetRequiredService<ITemplateRender>();
// Convert args and execute data to dictionary
var dict = new Dictionary<string, object>();
2023-08-31 11:40:51 +00:00
2023-09-01 15:42:16 +00:00
if (message.FunctionArgs != null)
{
ExtractArgs(JsonSerializer.Deserialize<JsonDocument>(message.FunctionArgs), dict);
}
if (message.ExecutionData != null)
{
ExtractExecuteData(message.ExecutionData, dict);
}
2023-08-31 11:40:51 +00:00
var text = render.Render(template, dict);
return text;
}
public async Task<string> RenderIntentResponse(string agentId, RoleDialogModel message)
{
// Find response template
2023-09-03 04:54:22 +00:00
//var agentService = _services.GetRequiredService<IAgentService>();
//var dir = Path.Combine(agentService.GetAgentDataDir(agentId), "responses");
//if (!Directory.Exists(dir))
//{
// return string.Empty;
//}
//var responses = Directory.GetFiles(dir)
// .Where(f => f.Split(Path.DirectorySeparatorChar).Last().Split('.')[1] == message.IntentName)
// .ToList();
var db = _services.GetRequiredService<IBotSharpRepository>();
var context = _services.GetRequiredService<RoutingContext>();
var responses = db.GetAgentResponses(agentId, "intent", context.IntentName);
2023-08-31 11:40:51 +00:00
if (responses.Count == 0)
{
return string.Empty;
}
var randomIndex = new Random().Next(0, responses.Count);
2023-09-03 04:54:22 +00:00
//var template = File.ReadAllText(responses[randomIndex]);
var template = responses[randomIndex];
2023-08-31 11:40:51 +00:00
var render = _services.GetRequiredService<ITemplateRender>();
// Convert args and execute data to dictionary
var dict = new Dictionary<string, object>();
2023-08-31 22:00:31 +00:00
if (!string.IsNullOrEmpty(message.FunctionArgs))
{
ExtractArgs(JsonSerializer.Deserialize<JsonDocument>(message.FunctionArgs), dict);
}
if (message.ExecutionData != null)
{
ExtractExecuteData(message.ExecutionData, dict);
}
2023-08-30 23:29:01 +00:00
var text = render.Render(template, dict);
return text;
}
private void ExtractArgs(JsonDocument args, Dictionary<string, object> dict)
{
if (args.RootElement is JsonElement root)
{
foreach (JsonProperty property in root.EnumerateObject())
{
if (!string.IsNullOrEmpty(property.Value.ToString()))
{
dict[property.Name] = property.Value.ToString();
}
}
}
}
private void ExtractExecuteData(object data, Dictionary<string, object> dict)
{
foreach (PropertyInfo property in data.GetType().GetProperties())
{
var value = property.GetValue(data, null);
if (value != null)
{
dict[property.Name] = value;
}
}
}
}