Skip to content

Commit d3f2b5a

Browse files
authored
Merge pull request #303 from iceljc/features/add-typing-event
add sender action event
2 parents 9960f0e + 8403651 commit d3f2b5a

File tree

5 files changed

+63
-29
lines changed

5 files changed

+63
-29
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using BotSharp.Abstraction.Messaging.Enums;
2+
3+
namespace BotSharp.Abstraction.Conversations.Models;
4+
5+
public class ConversationSenderActionModel
6+
{
7+
[JsonPropertyName("conversation_id")]
8+
public string ConversationId { get; set; }
9+
[JsonPropertyName("sender_action")]
10+
public SenderActionEnum SenderAction { get; set; }
11+
}

src/Plugins/BotSharp.Plugin.MetaMessenger/MessagingModels/SenderActionEnum.cs renamed to src/Infrastructure/BotSharp.Abstraction/Messaging/Enums/SenderActionEnum.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
namespace BotSharp.Plugin.MetaMessenger.MessagingModels;
1+
using System.Runtime.Serialization;
2+
3+
namespace BotSharp.Abstraction.Messaging.Enums;
24

35
public enum SenderActionEnum
46
{
57
[EnumMember(Value = "typing_on")]
6-
TypingOn,
8+
TypingOn = 1,
79
[EnumMember(Value = "typing_off")]
810
TypingOff,
911
[EnumMember(Value = "mark_seen")]

src/Plugins/BotSharp.Plugin.ChatHub/Hooks/ChatHubConversationHook.cs

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using BotSharp.Abstraction.Loggers.Models;
22
using BotSharp.Abstraction.Messaging;
3+
using BotSharp.Abstraction.Messaging.Enums;
34
using BotSharp.Abstraction.Messaging.JsonConverters;
45
using BotSharp.Abstraction.Messaging.Models.RichContent;
56
using BotSharp.Abstraction.Repositories;
@@ -96,14 +97,19 @@ public override async Task OnMessageReceived(RoleDialogModel message)
9697
Sender = UserViewModel.FromUser(sender)
9798
});
9899

100+
// Send typing-on to client
101+
await _chatHub.Clients.User(_user.Id).SendAsync("OnSenderActionGenerated", new ConversationSenderActionModel
102+
{
103+
ConversationId = conv.ConversationId,
104+
SenderAction = SenderActionEnum.TypingOn
105+
});
106+
99107
await base.OnMessageReceived(message);
100108
}
101109

102110
public override async Task OnResponseGenerated(RoleDialogModel message)
103111
{
104112
var conv = _services.GetRequiredService<IConversationService>();
105-
var state = _services.GetRequiredService<IConversationStateService>();
106-
107113
var json = JsonSerializer.Serialize(new ChatResponseModel()
108114
{
109115
ConversationId = conv.ConversationId,
@@ -118,29 +124,15 @@ public override async Task OnResponseGenerated(RoleDialogModel message)
118124
Role = AgentRole.Assistant
119125
}
120126
}, _serializerOptions);
121-
await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json);
122-
await _chatHub.Clients.User(_user.Id).SendAsync("OnConversateStatesGenerated", BuildConversationStates(conv.ConversationId, state.GetStates(), message));
123127

124-
await base.OnResponseGenerated(message);
125-
}
126-
127-
private string BuildConversationStates(string conversationId, Dictionary<string, string> states, RoleDialogModel message)
128-
{
129-
var log = new ConversationStateLogModel
128+
// Send typing-off to client
129+
await _chatHub.Clients.User(_user.Id).SendAsync("OnSenderActionGenerated", new ConversationSenderActionModel
130130
{
131-
ConversationId = conversationId,
132-
MessageId = message.MessageId,
133-
States = states,
134-
CreateTime = DateTime.UtcNow
135-
};
136-
137-
var convSettings = _services.GetRequiredService<ConversationSetting>();
138-
if (convSettings.EnableStateLog)
139-
{
140-
var db = _services.GetRequiredService<IBotSharpRepository>();
141-
db.SaveConversationStateLog(log);
142-
}
131+
ConversationId = conv.ConversationId,
132+
SenderAction = SenderActionEnum.TypingOff
133+
});
134+
await _chatHub.Clients.User(_user.Id).SendAsync("OnMessageReceivedFromAssistant", json);
143135

144-
return JsonSerializer.Serialize(log, _serializerOptions);
136+
await base.OnResponseGenerated(message);
145137
}
146138
}

src/Plugins/BotSharp.Plugin.ChatHub/Hooks/StreamingLogHook.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public override async Task OnMessageReceived(RoleDialogModel message)
3838
{
3939
var conversationId = _state.GetConversationId();
4040
var log = $"MessageId: {message.MessageId} ==>\r\n{message.Role}: {message.Content}";
41-
await _chatHub.Clients.User(_user.Id).SendAsync("OnContentLogGenerated", BuildLog(conversationId, _user.UserName, log, message));
41+
await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, _user.UserName, log, message));
4242
}
4343

4444
public async Task BeforeGenerating(Agent agent, List<RoleDialogModel> conversations)
@@ -65,16 +65,24 @@ public async Task AfterGenerated(RoleDialogModel message, TokenStatsModel tokenS
6565
var conversationId = _state.GetConversationId();
6666
var agent = await agentService.LoadAgent(message.CurrentAgentId);
6767

68-
await _chatHub.Clients.User(_user.Id).SendAsync("OnContentLogGenerated", BuildLog(conversationId, agent?.Name, tokenStats.Prompt, message));
68+
await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, agent?.Name, tokenStats.Prompt, message));
6969

7070
var log = message.Role == AgentRole.Function ?
7171
$"[{agent?.Name}]: {message.FunctionName}({message.FunctionArgs})" :
7272
$"[{agent?.Name}]: {message.Content}";
7373
log += $"\r\n<== MessageId: {message.MessageId}";
74-
await _chatHub.Clients.User(_user.Id).SendAsync("OnContentLogGenerated", BuildLog(conversationId, agent?.Name, log, message));
74+
await _chatHub.Clients.User(_user.Id).SendAsync("OnConversationContentLogGenerated", BuildContentLog(conversationId, agent?.Name, log, message));
7575
}
7676

77-
private string BuildLog(string conversationId, string? name, string content, RoleDialogModel message)
77+
public override async Task OnResponseGenerated(RoleDialogModel message)
78+
{
79+
var conv = _services.GetRequiredService<IConversationService>();
80+
var state = _services.GetRequiredService<IConversationStateService>();
81+
82+
await _chatHub.Clients.User(_user.Id).SendAsync("OnConversateStateLogGenerated", BuildStateLog(conv.ConversationId, state.GetStates(), message));
83+
}
84+
85+
private string BuildContentLog(string conversationId, string? name, string content, RoleDialogModel message)
7886
{
7987
var log = new ConversationContentLogModel
8088
{
@@ -95,4 +103,24 @@ private string BuildLog(string conversationId, string? name, string content, Rol
95103

96104
return JsonSerializer.Serialize(log, _serializerOptions);
97105
}
106+
107+
private string BuildStateLog(string conversationId, Dictionary<string, string> states, RoleDialogModel message)
108+
{
109+
var log = new ConversationStateLogModel
110+
{
111+
ConversationId = conversationId,
112+
MessageId = message.MessageId,
113+
States = states,
114+
CreateTime = DateTime.UtcNow
115+
};
116+
117+
var convSettings = _services.GetRequiredService<ConversationSetting>();
118+
if (convSettings.EnableStateLog)
119+
{
120+
var db = _services.GetRequiredService<IBotSharpRepository>();
121+
db.SaveConversationStateLog(log);
122+
}
123+
124+
return JsonSerializer.Serialize(log, _serializerOptions);
125+
}
98126
}

src/Plugins/BotSharp.Plugin.MetaMessenger/Using.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
global using BotSharp.Abstraction.Conversations.Models;
2121
global using BotSharp.Abstraction.Conversations;
2222
global using BotSharp.Abstraction.Messaging.Models.RichContent.Template;
23+
global using BotSharp.Abstraction.Messaging.Enums;

0 commit comments

Comments
 (0)