BotSharp/src/Infrastructure/BotSharp.Core.Rules/Engines/RuleEngine.cs

96 lines
3.2 KiB
C#
Raw Normal View History

2025-01-08 20:49:15 +00:00
using BotSharp.Abstraction.Conversations;
using BotSharp.Abstraction.Models;
using BotSharp.Abstraction.Repositories.Filters;
using BotSharp.Abstraction.Utilities;
using Microsoft.Extensions.Logging;
using System.Data;
2025-01-02 21:29:30 +00:00
namespace BotSharp.Core.Rules.Engines;
public class RuleEngine : IRuleEngine
{
private readonly IServiceProvider _services;
2025-01-08 20:49:15 +00:00
private readonly ILogger _logger;
public RuleEngine(IServiceProvider services, ILogger<RuleEngine> logger)
2025-01-02 21:29:30 +00:00
{
_services = services;
2025-01-08 20:49:15 +00:00
_logger = logger;
2025-01-02 21:29:30 +00:00
}
public async Task<IEnumerable<string>> Triggered(IRuleTrigger trigger, string data, List<MessageState>? states = null)
2025-01-02 21:29:30 +00:00
{
// Pull all user defined rules
2025-01-08 20:49:15 +00:00
var agentService = _services.GetRequiredService<IAgentService>();
var agents = await agentService.GetAgents(new AgentFilter
{
Pager = new Pagination
{
Size = 1000
}
});
var preFilteredAgents = agents.Items.Where(x =>
x.Rules.Exists(r => r.TriggerName == trigger.Name &&
!x.Disabled)).ToList();
// Trigger the agents
2025-01-02 21:29:30 +00:00
var instructService = _services.GetRequiredService<IInstructService>();
var newConversationIds = new List<string>();
2025-01-08 20:49:15 +00:00
foreach (var agent in preFilteredAgents)
{
2025-01-28 23:00:08 +00:00
var convService = _services.GetRequiredService<IConversationService>();
2025-01-08 20:49:15 +00:00
var conv = await convService.NewConversation(new Conversation
{
2025-01-16 21:57:50 +00:00
Channel = trigger.Channel,
Title = data,
2025-01-08 20:49:15 +00:00
AgentId = agent.Id
});
var message = new RoleDialogModel(AgentRole.User, data);
2025-01-28 23:00:08 +00:00
var allStates = new List<MessageState>
2025-01-08 20:49:15 +00:00
{
2025-01-28 23:00:08 +00:00
new("channel", trigger.Channel)
2025-01-08 20:49:15 +00:00
};
2025-01-28 23:00:08 +00:00
if (states != null)
{
allStates.AddRange(states);
}
convService.SetConversationId(conv.Id, allStates);
2025-01-08 20:49:15 +00:00
await convService.SendMessage(agent.Id,
message,
null,
msg => Task.CompletedTask);
2025-01-28 23:00:08 +00:00
convService.SaveStates();
newConversationIds.Add(conv.Id);
2025-01-28 23:00:08 +00:00
2025-01-08 20:49:15 +00:00
/*foreach (var rule in agent.Rules)
{
var userSay = $"===Input data with Before and After values===\r\n{data}\r\n\r\n===Trigger Criteria===\r\n{rule.Criteria}\r\n\r\nJust output 1 or 0 without explanation: ";
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
var result = await instructService.Execute(BuiltInAgentId.RulesInterpreter, new RoleDialogModel(AgentRole.User, userSay), "criteria_check", "#TEMPLATE#");
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
// Check if meet the criteria
if (result.Text == "1")
{
// Hit rule
_logger.LogInformation($"Hit rule {rule.TriggerName} {rule.EntityType} {rule.EventName}, {data}");
2025-01-02 21:29:30 +00:00
2025-01-08 20:49:15 +00:00
await convService.SendMessage(agent.Id,
new RoleDialogModel(AgentRole.User, $"The conversation was triggered by {rule.Criteria}"),
null,
msg => Task.CompletedTask);
}
}*/
}
return newConversationIds;
2025-01-02 21:29:30 +00:00
}
}