2023-09-19 12:17:50 +00:00
|
|
|
using BotSharp.Abstraction.Agents.Models;
|
2023-09-23 21:33:05 +00:00
|
|
|
using BotSharp.Abstraction.Functions.Models;
|
2023-09-19 12:17:50 +00:00
|
|
|
using BotSharp.Abstraction.Routing;
|
2023-09-20 10:31:50 +00:00
|
|
|
using BotSharp.Abstraction.Routing.Settings;
|
2023-09-27 12:51:15 +00:00
|
|
|
|
2023-09-19 12:17:50 +00:00
|
|
|
namespace BotSharp.Core.Routing;
|
|
|
|
|
|
2023-09-27 12:51:15 +00:00
|
|
|
public partial class RoutingService : IRoutingService
|
2023-09-19 12:17:50 +00:00
|
|
|
{
|
|
|
|
|
private readonly IServiceProvider _services;
|
2023-09-20 10:31:50 +00:00
|
|
|
private readonly RoutingSettings _settings;
|
2023-09-27 12:51:15 +00:00
|
|
|
private readonly IRouterInstance _routerInstance;
|
2023-09-19 12:17:50 +00:00
|
|
|
private readonly ILogger _logger;
|
|
|
|
|
private List<RoleDialogModel> _dialogs;
|
2023-09-25 22:46:00 +00:00
|
|
|
public List<RoleDialogModel> Dialogs {
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (_dialogs == null)
|
|
|
|
|
{
|
|
|
|
|
var conv = _services.GetRequiredService<IConversationService>();
|
|
|
|
|
_dialogs = conv.GetDialogHistory();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _dialogs;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-09-19 12:17:50 +00:00
|
|
|
|
2023-10-20 23:57:45 +00:00
|
|
|
public void ResetRecursiveCounter()
|
|
|
|
|
{
|
|
|
|
|
_currentRecursionDepth = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-19 17:24:00 +00:00
|
|
|
public void RefreshDialogs()
|
|
|
|
|
{
|
|
|
|
|
_dialogs = null;
|
|
|
|
|
}
|
|
|
|
|
|
2023-09-20 10:31:50 +00:00
|
|
|
public RoutingService(IServiceProvider services,
|
|
|
|
|
RoutingSettings settings,
|
2023-09-27 12:51:15 +00:00
|
|
|
ILogger<RoutingService> logger,
|
|
|
|
|
IRouterInstance routerInstance)
|
2023-09-19 12:17:50 +00:00
|
|
|
{
|
|
|
|
|
_services = services;
|
2023-09-20 10:31:50 +00:00
|
|
|
_settings = settings;
|
2023-09-19 12:17:50 +00:00
|
|
|
_logger = logger;
|
2023-09-27 12:51:15 +00:00
|
|
|
_routerInstance = routerInstance;
|
2023-09-19 12:17:50 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-27 20:36:26 +00:00
|
|
|
public async Task<bool> ExecuteOnce(Agent agent, RoleDialogModel message)
|
2023-09-23 21:33:05 +00:00
|
|
|
{
|
|
|
|
|
var handlers = _services.GetServices<IRoutingHandler>();
|
|
|
|
|
|
|
|
|
|
var handler = handlers.FirstOrDefault(x => x.Name == "route_to_agent");
|
2023-09-25 22:46:00 +00:00
|
|
|
handler.SetDialogs(Dialogs);
|
2023-10-27 20:36:26 +00:00
|
|
|
|
2023-09-27 12:51:15 +00:00
|
|
|
var result = await handler.Handle(this, new FunctionCallFromLlm
|
2023-09-23 21:33:05 +00:00
|
|
|
{
|
2023-09-25 22:46:00 +00:00
|
|
|
Function = "route_to_agent",
|
2023-10-27 20:36:26 +00:00
|
|
|
Question = message.Content,
|
|
|
|
|
Reason = message.Content,
|
2023-09-25 22:46:00 +00:00
|
|
|
AgentName = agent.Name
|
2023-10-27 20:36:26 +00:00
|
|
|
}, message);
|
2023-09-23 21:33:05 +00:00
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-27 20:36:26 +00:00
|
|
|
public async Task<bool> InstructLoop(RoleDialogModel message)
|
2023-09-19 12:17:50 +00:00
|
|
|
{
|
2023-10-20 03:47:14 +00:00
|
|
|
_routerInstance.Load();
|
2023-09-27 12:51:15 +00:00
|
|
|
var router = _routerInstance.Router;
|
|
|
|
|
|
2023-09-22 20:38:58 +00:00
|
|
|
var handlers = _services.GetServices<IRoutingHandler>();
|
|
|
|
|
|
2023-09-19 12:17:50 +00:00
|
|
|
int loopCount = 0;
|
2023-09-23 21:33:05 +00:00
|
|
|
var stop = false;
|
|
|
|
|
while (!stop && loopCount < 5)
|
2023-09-19 12:17:50 +00:00
|
|
|
{
|
|
|
|
|
loopCount++;
|
|
|
|
|
|
2023-10-12 21:42:39 +00:00
|
|
|
var inst = await GetNextInstruction();
|
2023-10-27 20:36:26 +00:00
|
|
|
message.Instruction = inst;
|
|
|
|
|
inst.Question = message.Content;
|
2023-09-19 12:17:50 +00:00
|
|
|
|
2023-09-27 12:51:15 +00:00
|
|
|
var handler = handlers.FirstOrDefault(x => x.Name == inst.Function);
|
2023-09-22 20:38:58 +00:00
|
|
|
if (handler == null)
|
|
|
|
|
{
|
|
|
|
|
handler = handlers.FirstOrDefault(x => x.Name == "get_next_instruction");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
handler.SetRouter(router);
|
2023-09-25 22:46:00 +00:00
|
|
|
handler.SetDialogs(Dialogs);
|
2023-09-19 12:17:50 +00:00
|
|
|
|
2023-10-27 20:36:26 +00:00
|
|
|
message.FunctionName = inst.Function;
|
|
|
|
|
message.Role = AgentRole.Function;
|
|
|
|
|
message.FunctionArgs = inst.Arguments == null ? "{}" : JsonSerializer.Serialize(inst.Arguments);
|
|
|
|
|
|
|
|
|
|
await handler.Handle(this, inst, message);
|
|
|
|
|
|
|
|
|
|
inst.Response = message.Content;
|
2023-09-19 12:17:50 +00:00
|
|
|
|
2023-09-23 21:33:05 +00:00
|
|
|
stop = !_settings.EnableReasoning;
|
2023-09-19 12:17:50 +00:00
|
|
|
}
|
|
|
|
|
|
2023-10-27 20:36:26 +00:00
|
|
|
return true;
|
2023-09-19 12:17:50 +00:00
|
|
|
}
|
|
|
|
|
|
2023-09-27 12:51:15 +00:00
|
|
|
protected void SaveStateByArgs(JsonDocument args)
|
2023-09-20 10:31:50 +00:00
|
|
|
{
|
2023-09-27 12:51:15 +00:00
|
|
|
if (args == null)
|
2023-09-24 16:20:02 +00:00
|
|
|
{
|
2023-09-27 12:51:15 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2023-09-24 16:20:02 +00:00
|
|
|
|
2023-09-27 12:51:15 +00:00
|
|
|
var stateService = _services.GetRequiredService<IConversationStateService>();
|
|
|
|
|
if (args.RootElement is JsonElement root)
|
2023-09-20 10:31:50 +00:00
|
|
|
{
|
2023-09-27 12:51:15 +00:00
|
|
|
foreach (JsonProperty property in root.EnumerateObject())
|
2023-09-24 16:20:02 +00:00
|
|
|
{
|
2023-09-27 12:51:15 +00:00
|
|
|
if (!string.IsNullOrEmpty(property.Value.ToString()))
|
2023-09-26 03:04:04 +00:00
|
|
|
{
|
2023-09-27 12:51:15 +00:00
|
|
|
stateService.SetState(property.Name, property.Value);
|
|
|
|
|
}
|
2023-09-24 16:20:02 +00:00
|
|
|
}
|
2023-09-27 12:51:15 +00:00
|
|
|
}
|
2023-09-22 20:38:58 +00:00
|
|
|
}
|
2023-09-19 12:17:50 +00:00
|
|
|
}
|