X-Twilio-BotSharp

This commit is contained in:
Haiping Chen 2025-01-08 14:49:15 -06:00
parent 9df4cd8f44
commit 15363f4765
7 changed files with 72 additions and 10 deletions

View file

@ -8,4 +8,5 @@ public class ConversationChannel
public const string Messenger = "messenger";
public const string Email = "email";
public const string Cron = "cron";
public const string Database = "database";
}

View file

@ -1,26 +1,85 @@
using BotSharp.Abstraction.Conversations;
using BotSharp.Abstraction.Conversations.Enums;
using BotSharp.Abstraction.Models;
using BotSharp.Abstraction.Repositories.Filters;
using BotSharp.Abstraction.Routing;
using BotSharp.Abstraction.Utilities;
using BotSharp.Core.Rules.Triggers;
using Microsoft.Extensions.Logging;
using System.Data;
namespace BotSharp.Core.Rules.Engines;
public class RuleEngine : IRuleEngine
{
private readonly IServiceProvider _services;
public RuleEngine(IServiceProvider services)
private readonly ILogger _logger;
public RuleEngine(IServiceProvider services, ILogger<RuleEngine> logger)
{
_services = services;
_logger = logger;
}
public async Task Triggered(IRuleTrigger trigger, string data)
{
// Pull all user defined rules
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
var instructService = _services.GetRequiredService<IInstructService>();
var convService = _services.GetRequiredService<IConversationService>();
var userSay = $"===Input data===\r\n{data}\r\n\r\nWhen WO NTE is greater than 100, notify resident.";
foreach (var agent in preFilteredAgents)
{
var conv = await convService.NewConversation(new Conversation
{
AgentId = agent.Id
});
var result = await instructService.Execute(BuiltInAgentId.RulesInterpreter, new RoleDialogModel(AgentRole.User, data), "criteria_check", "#TEMPLATE#");
var message = new RoleDialogModel(AgentRole.User, data);
string[] rules = [];
// Check if meet the criteria
var states = new List<MessageState>
{
new("channel", ConversationChannel.Database),
new("channel_id", trigger.EntityId)
};
convService.SetConversationId(conv.Id, states);
await convService.SendMessage(agent.Id,
message,
null,
msg => Task.CompletedTask);
/*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: ";
var result = await instructService.Execute(BuiltInAgentId.RulesInterpreter, new RoleDialogModel(AgentRole.User, userSay), "criteria_check", "#TEMPLATE#");
// Check if meet the criteria
if (result.Text == "1")
{
// Hit rule
_logger.LogInformation($"Hit rule {rule.TriggerName} {rule.EntityType} {rule.EventName}, {data}");
await convService.SendMessage(agent.Id,
new RoleDialogModel(AgentRole.User, $"The conversation was triggered by {rule.Criteria}"),
null,
msg => Task.CompletedTask);
}
}*/
}
}
}

View file

@ -4,7 +4,8 @@ public interface IRuleTrigger
{
string Channel => throw new NotImplementedException("Please set the channel of trigger");
string EventName { get; set; }
string Name { get; set; }
string EntityType { get; set; }
string EntityId { get; set; }

View file

@ -1,7 +1,7 @@
{
"id": "201e49a2-40b3-4ccd-b8cc-2476565a1b40",
"name": "Rules Agent",
"description": "Utility assistant that can be used to complete many different tasks",
"description": "Rules understands and converts user-defined rules into Triggers, Criterias and Actions",
"type": "static",
"createdDateTime": "2024-12-30T00:00:00Z",
"updatedDateTime": "2024-12-30T00:00:00Z",

View file

@ -1,4 +1,4 @@
You are a rule interpreter, analyze and respond according to the following steps:
1. Understand the rules customized by the user;
2. Determine whether the input data meets the user's action execution conditions;
3. If it meets the conditions, output "true", otherwise output "false"
3. If it meets the conditions, output number "1", otherwise output "0"

View file

@ -9,7 +9,7 @@ namespace BotSharp.Plugin.HttpHandler.Functions;
public class HandleHttpRequestFn : IFunctionCallback
{
public string Name => "util-http-handle_http_request";
public string Indication => "Handling http request";
public string Indication => "Give me a second, I'm taking care of it!";
private readonly IServiceProvider _services;
private readonly ILogger<HandleHttpRequestFn> _logger;

View file

@ -65,6 +65,7 @@ namespace BotSharp.Plugin.Twilio.Services
var httpContext = sp.GetRequiredService<IHttpContextAccessor>();
httpContext.HttpContext = new DefaultHttpContext();
httpContext.HttpContext.User = new ClaimsPrincipal(new ClaimsIdentity());
httpContext.HttpContext.Request.Headers["X-Twilio-BotSharp"] = "LOST";
AssistantMessage reply = null;
var inputMsg = new RoleDialogModel(AgentRole.User, message.Content);