Skip to content

Commit f8ce505

Browse files
authored
Merge pull request #785 from kerryjiang/master
Introduce ConversationHookProvider to avoid ordering conversation hooks in runtime
2 parents d1654cc + 7089f8f commit f8ce505

File tree

16 files changed

+126
-67
lines changed

16 files changed

+126
-67
lines changed

src/Infrastructure/BotSharp.Abstraction/Conversations/ConversationHookBase.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,23 @@ namespace BotSharp.Abstraction.Conversations;
22

33
public abstract class ConversationHookBase : IConversationHook
44
{
5-
protected Agent _agent;
6-
public Agent Agent => _agent;
5+
public Agent Agent { get; private set; }
76

8-
protected Conversation _conversation;
9-
public Conversation Conversation => _conversation;
7+
public Conversation Conversation { get; private set; }
108

11-
protected List<RoleDialogModel> _dialogs;
12-
public List<RoleDialogModel> Dialogs => _dialogs;
9+
public List<RoleDialogModel> Dialogs { get; private set; }
1310

14-
protected int _priority = 0;
15-
public int Priority => _priority;
11+
public int Priority { get; protected set; } = 0;
1612

1713
public IConversationHook SetAgent(Agent agent)
1814
{
19-
_agent = agent;
15+
Agent = agent;
2016
return this;
2117
}
2218

2319
public IConversationHook SetConversation(Conversation conversation)
2420
{
25-
_conversation = conversation;
21+
Conversation = conversation;
2622
return this;
2723
}
2824

@@ -37,7 +33,7 @@ public virtual Task OnDialogRecordLoaded(RoleDialogModel dialog)
3733

3834
public virtual Task OnDialogsLoaded(List<RoleDialogModel> dialogs)
3935
{
40-
_dialogs = dialogs;
36+
Dialogs = dialogs;
4137
return Task.CompletedTask;
4238
}
4339

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
namespace BotSharp.Abstraction.Conversations;
2+
3+
public class ConversationHookProvider
4+
{
5+
public IEnumerable<IConversationHook> Hooks { get; }
6+
7+
private readonly Lazy<IEnumerable<IConversationHook>> _hooksOrderByPriority;
8+
9+
public IEnumerable<IConversationHook> HooksOrderByPriority
10+
=> _hooksOrderByPriority.Value;
11+
12+
public ConversationHookProvider(IEnumerable<IConversationHook> conversationHooks)
13+
{
14+
Hooks = conversationHooks;
15+
_hooksOrderByPriority = new Lazy<IEnumerable<IConversationHook>>(() =>
16+
{
17+
return conversationHooks.OrderBy(hook => hook.Priority).ToArray();
18+
});
19+
}
20+
}

src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.SendMessage.cs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public async Task<bool> SendMessage(string agentId,
2828
var dialogs = conv.GetDialogHistory();
2929

3030
var statistics = _services.GetRequiredService<ITokenStatistics>();
31-
var hooks = _services.GetServices<IConversationHook>().ToList();
31+
var hookProvider = _services.GetRequiredService<ConversationHookProvider>();
3232

3333
RoleDialogModel response = message;
3434
bool stopCompletion = false;
@@ -44,9 +44,7 @@ public async Task<bool> SendMessage(string agentId,
4444
message.Payload = replyMessage.Payload;
4545
}
4646

47-
// Before chat completion hook
48-
hooks = ReOrderConversationHooks(hooks);
49-
foreach (var hook in hooks)
47+
foreach (var hook in hookProvider.HooksOrderByPriority)
5048
{
5149
hook.SetAgent(agent)
5250
.SetConversation(conversation);
@@ -173,18 +171,4 @@ await hook.OnResponseGenerated(response)
173171
// Add to dialog history
174172
_storage.Append(_conversationId, response);
175173
}
176-
177-
private List<IConversationHook> ReOrderConversationHooks(List<IConversationHook> hooks)
178-
{
179-
var target = "ChatHubConversationHook";
180-
var chathub = hooks.FirstOrDefault(x => x.GetType().Name == target);
181-
var otherHooks = hooks.Where(x => x.GetType().Name != target).ToList();
182-
183-
if (chathub != null)
184-
{
185-
var newHooks = new List<IConversationHook> { chathub }.Concat(otherHooks);
186-
return newHooks.ToList();
187-
}
188-
return hooks;
189-
}
190174
}

src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.TruncateMessage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public async Task<bool> TruncateConversation(string conversationId, string messa
99
var deleteMessageIds = db.TruncateConversation(conversationId, messageId, cleanLog: true);
1010
fileStorage.DeleteMessageFiles(conversationId, deleteMessageIds, messageId, newMessageId);
1111

12-
var hooks = _services.GetServices<IConversationHook>().ToList();
12+
var hooks = _services.GetServices<IConversationHook>();
1313
foreach (var hook in hooks)
1414
{
1515
await hook.OnMessageDeleted(conversationId, messageId);

src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.UpdateBreakpoint.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public async Task UpdateBreakpoint(bool resetStates = false, string? reason = nu
3131
states.CleanStates(excludedStates);
3232
}
3333

34-
var hooks = _services.GetServices<IConversationHook>()
35-
.OrderBy(x => x.Priority)
36-
.ToList();
34+
var hooks = _services
35+
.GetRequiredService<ConversationHookProvider>()
36+
.HooksOrderByPriority;
3737

3838
// Before executing functions
3939
foreach (var hook in hooks)

src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ public async Task<Conversation> NewConversation(Conversation sess)
103103

104104
db.CreateNewConversation(record);
105105

106-
var hooks = _services.GetServices<IConversationHook>().ToList();
106+
var hooks = _services.GetServices<IConversationHook>();
107+
107108
foreach (var hook in hooks)
108109
{
109110
// If user connect agent first time

src/Infrastructure/BotSharp.Core/Evaluations/EvaluationConversationHook.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,45 +15,45 @@ public EvaluationConversationHook(IExecutionLogger logger, ConversationSetting c
1515

1616
public override Task OnMessageReceived(RoleDialogModel message)
1717
{
18-
if (_conversation != null && _convSettings.EnableExecutionLog)
18+
if (Conversation != null && _convSettings.EnableExecutionLog)
1919
{
20-
_logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}");
20+
_logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}");
2121
}
2222
return base.OnMessageReceived(message);
2323
}
2424

2525
public override Task OnFunctionExecuted(RoleDialogModel message)
2626
{
27-
if (_conversation != null && _convSettings.EnableExecutionLog)
27+
if (Conversation != null && _convSettings.EnableExecutionLog)
2828
{
29-
_logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.FunctionName}({message.FunctionArgs}) => {message.Content}");
29+
_logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.FunctionName}({message.FunctionArgs}) => {message.Content}");
3030
}
3131
return base.OnFunctionExecuted(message);
3232
}
3333

3434
public override Task OnResponseGenerated(RoleDialogModel message)
3535
{
36-
if (_conversation != null && _convSettings.EnableExecutionLog)
36+
if (Conversation != null && _convSettings.EnableExecutionLog)
3737
{
38-
_logger.Append(_conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}");
39-
}
38+
_logger.Append(Conversation.Id, $"[{DateTime.Now}] {message.Role}: {message.Content}");
39+
}
4040
return base.OnResponseGenerated(message);
4141
}
4242

4343
public override Task OnHumanInterventionNeeded(RoleDialogModel message)
4444
{
45-
if (_conversation != null && _convSettings.EnableExecutionLog)
45+
if (Conversation != null && _convSettings.EnableExecutionLog)
4646
{
47-
_logger.Append(_conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})");
47+
_logger.Append(Conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})");
4848
}
4949
return base.OnHumanInterventionNeeded(message);
5050
}
5151

5252
public override Task OnConversationEnding(RoleDialogModel message)
5353
{
54-
if (_conversation != null && _convSettings.EnableExecutionLog)
54+
if (Conversation != null && _convSettings.EnableExecutionLog)
5555
{
56-
_logger.Append(_conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})");
56+
_logger.Append(Conversation.Id, $"[{DateTime.Now}] {AgentRole.Function}: trigger_event({{\"event\": \"{message.FunctionName}\"}})");
5757
}
5858
return base.OnConversationEnding(message);
5959
}

src/Infrastructure/BotSharp.Core/Routing/Functions/HumanInterventionNeededFn.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ public HumanInterventionNeededFn(IServiceProvider services)
1515

1616
public async Task<bool> Execute(RoleDialogModel message)
1717
{
18-
var hooks = _services.GetServices<IConversationHook>()
19-
.OrderBy(x => x.Priority)
20-
.ToList();
18+
var hooks = _services
19+
.GetRequiredService<ConversationHookProvider>()
20+
.HooksOrderByPriority;
2121

2222
foreach (var hook in hooks)
2323
{

src/Infrastructure/BotSharp.Core/Routing/RoutingService.InvokeFunction.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public async Task<bool> InvokeFunction(string name, RoleDialogModel message)
1818
var clonedMessage = RoleDialogModel.From(message);
1919
clonedMessage.FunctionName = name;
2020

21-
var hooks = _services.GetServices<IConversationHook>()
22-
.OrderBy(x => x.Priority)
23-
.ToList();
21+
var hooks = _services
22+
.GetRequiredService<ConversationHookProvider>()
23+
.HooksOrderByPriority;
2424

2525
var progressService = _services.GetService<IConversationProgressService>();
2626

src/Infrastructure/BotSharp.Logger/Hooks/RateLimitConversationHook.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public override async Task OnMessageReceived(RoleDialogModel message)
3434
}
3535

3636
// Check message sending frequency
37-
var userSents = _dialogs.Where(x => x.Role == AgentRole.User)
37+
var userSents = Dialogs.Where(x => x.Role == AgentRole.User)
3838
.TakeLast(2).ToList();
3939

4040
if (userSents.Count > 1)

0 commit comments

Comments
 (0)