Skip to content

Commit c798ed2

Browse files
authored
Merge pull request #113 from hchen2020/master
Allow agent redirect directly.
2 parents 76b1e6d + c93b8f9 commit c798ed2

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

src/Infrastructure/BotSharp.Abstraction/Agents/Models/RoutingTable.cs

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public class RoutingTable
1313
[JsonPropertyName("required")]
1414
public List<string> RequiredFields { get; set; }
1515

16+
[JsonPropertyName("redirect_to")]
17+
public string RedirectTo { get; set; }
18+
1619
public override string ToString()
1720
{
1821
return AgentName;

src/Infrastructure/BotSharp.Core/Functions/RouteToAgentFn.cs

+22-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ public async Task<bool> Execute(RoleDialogModel message)
2828
}
2929
else
3030
{
31-
if (!HasMissingRequiredField(message, out var agentId))
31+
var missingfield = HasMissingRequiredField(message, out var agentId);
32+
if (missingfield && message.CurrentAgentId != agentId)
33+
{
34+
message.CurrentAgentId = agentId;
35+
}
36+
else
3237
{
3338
message.CurrentAgentId = agentId;
3439
message.ExecutionResult = $"Routed to {args.AgentName}";
@@ -47,21 +52,21 @@ private bool HasMissingRequiredField(RoleDialogModel message, out string agentId
4752
var args = JsonSerializer.Deserialize<RoutingArgs>(message.FunctionArgs);
4853

4954
var routes = GetRoutingTable();
50-
var agent = routes.FirstOrDefault(x => x.AgentName.ToLower() == args.AgentName.ToLower());
55+
var routingRule = routes.FirstOrDefault(x => x.AgentName.ToLower() == args.AgentName.ToLower());
5156

52-
if (agent == null)
57+
if (routingRule == null)
5358
{
5459
agentId = message.CurrentAgentId;
5560
message.ExecutionResult = $"Can't find agent {args.AgentName}";
5661
return true;
5762
}
5863

59-
agentId = agent.AgentId;
64+
agentId = routingRule.AgentId;
6065

6166
// Check required fields
6267
var jo = JsonSerializer.Deserialize<object>(message.FunctionArgs);
6368
bool hasMissingField = false;
64-
foreach (var field in agent.RequiredFields)
69+
foreach (var field in routingRule.RequiredFields)
6570
{
6671
if (jo is JsonElement root)
6772
{
@@ -71,9 +76,21 @@ private bool HasMissingRequiredField(RoleDialogModel message, out string agentId
7176
hasMissingField = true;
7277
break;
7378
}
79+
else if (root.EnumerateObject().Any(x => x.Name == field) &&
80+
string.IsNullOrEmpty(root.EnumerateObject().FirstOrDefault(x => x.Name == field).Value.ToString()))
81+
{
82+
message.ExecutionResult = $"missing {field}.";
83+
hasMissingField = true;
84+
break;
85+
}
7486
}
7587
}
7688

89+
if (hasMissingField && !string.IsNullOrEmpty(routingRule.RedirectTo))
90+
{
91+
agentId = routingRule.RedirectTo;
92+
}
93+
7794
return hasMissingField;
7895
}
7996

0 commit comments

Comments
 (0)