Add onFunctionExecuting to SendMessage.

This commit is contained in:
hchen 2023-08-07 12:48:09 -05:00
parent e81e01f8e3
commit b6c0d47b02
8 changed files with 85 additions and 8 deletions

View file

@ -8,7 +8,7 @@ public interface IConversationService
Task<Conversation> GetConversation(string id);
Task<List<Conversation>> GetConversations();
Task DeleteConversation(string id);
Task<bool> SendMessage(string agentId, string conversationId, RoleDialogModel lastDalog, Func<RoleDialogModel, Task> onMessageReceived);
Task<bool> SendMessage(string agentId, string conversationId, RoleDialogModel lastDalog, Func<RoleDialogModel, Task> onMessageReceived, Func<RoleDialogModel, Task> onFunctionExecuting);
Task<bool> SendMessage(string agentId, string conversationId, List<RoleDialogModel> wholeDialogs, Func<RoleDialogModel, Task> onMessageReceived);
List<RoleDialogModel> GetDialogHistory(string agentId, string conversationId, int lastCount = 20);
Task CleanHistory(string agentId);

View file

@ -51,6 +51,9 @@ public class ConversationController : ControllerBase, IApiAdapter
await conv.SendMessage(agentId, conversationId, new RoleDialogModel("user", input.Text), async msg =>
{
response.Text += msg.Content;
}, async fn =>
{
});
return response;

View file

@ -67,7 +67,9 @@ public class ConversationService : IConversationService
return record.ToConversation();
}
public async Task<bool> SendMessage(string agentId, string conversationId, RoleDialogModel lastDalog, Func<RoleDialogModel, Task> onMessageReceived)
public async Task<bool> SendMessage(string agentId, string conversationId, RoleDialogModel lastDalog,
Func<RoleDialogModel, Task> onMessageReceived,
Func<RoleDialogModel, Task> onFunctionExecuting)
{
_storage.Append(agentId, conversationId, lastDalog);
@ -81,6 +83,8 @@ public class ConversationService : IConversationService
var functions = _services.GetServices<IFunctionCallback>().Where(x => x.Name == msg.FunctionName);
foreach (var fn in functions)
{
await onFunctionExecuting(msg);
msg.ExecutionResult = await fn.Execute(msg.Content);
var result = msg.ExecutionResult.Replace("\r", " ").Replace("\n", " ");

View file

@ -5,6 +5,7 @@ using BotSharp.Abstraction.Conversations.Models;
using BotSharp.Abstraction.Functions.Models;
using BotSharp.Abstraction.MLTasks;
using BotSharp.Plugin.AzureOpenAI.Settings;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text.Json;
@ -15,10 +16,12 @@ namespace BotSharp.Plugin.AzureOpenAI.Providers;
public class ChatCompletionProvider : IChatCompletion
{
private readonly AzureOpenAiSettings _settings;
private readonly ILogger _logger;
public ChatCompletionProvider(AzureOpenAiSettings settings)
public ChatCompletionProvider(AzureOpenAiSettings settings, ILogger<ChatCompletionProvider> logger)
{
_settings = settings;
_logger = logger;
}
public string GetChatCompletions(Agent agent, List<RoleDialogModel> conversations)
@ -38,6 +41,8 @@ public class ChatCompletionProvider : IChatCompletion
output += message.Content;
}
_logger.LogInformation(output);
return output.Trim();
}
@ -124,6 +129,9 @@ public class ChatCompletionProvider : IChatCompletion
choice = response.Value.Choices[0];
message = choice.Message;
_logger.LogInformation(message.Content);
await onMessageReceived(new RoleDialogModel(ChatRole.Assistant.ToString(), message.Content));
return true;
@ -161,6 +169,9 @@ public class ChatCompletionProvider : IChatCompletion
continue;
Console.Write(message.Content);
output += message.Content;
_logger.LogInformation(message.Content);
await onMessageReceived(new RoleDialogModel(message.Role.ToString(), message.Content));
}

View file

@ -14,6 +14,7 @@ using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Refit;
namespace BotSharp.Plugin.MetaMessenger.Controllers;
@ -58,7 +59,6 @@ public class WebhookController : ControllerBase
// TODO validate request
// https://developers.facebook.com/docs/messenger-platform/webhooks#verification-requests
try
{
// received message
@ -69,10 +69,6 @@ public class WebhookController : ControllerBase
string content = "";
var sessionId = req.Entry[0].Messaging[0].Sender.Id;
var input = req.Entry[0].Messaging[0].Message.Text;
var result = await conv.SendMessage(agentId, sessionId, new RoleDialogModel("user", input), async msg =>
{
content = msg.Content;
});
var setting = _services.GetRequiredService<MetaMessengerSetting>();
var messenger = _services.GetRequiredService<IMessengerGraphAPI>();
@ -80,14 +76,58 @@ public class WebhookController : ControllerBase
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
// Marking seen
/*await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
SenderAction = SenderActionEnum.MarkSeen
});*/
// Typing on
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
SenderAction = SenderActionEnum.TypingOn
});
// Go to LLM
var result = await conv.SendMessage(agentId, sessionId, new RoleDialogModel("user", input), async msg =>
{
content = msg.Content;
}, async fn =>
{
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Message = JsonSerializer.Serialize(new { Text = "I'm pulling the relevent information, please wait a second ..." }, jsonOpt)
});
});
// Response to user
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Message = JsonSerializer.Serialize(new { Text = content }, jsonOpt)
});
// Typing off
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
SenderAction = SenderActionEnum.TypingOff
});
}
}
catch (ApiException ex)
{
Console.WriteLine(ex.Content);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());

View file

@ -0,0 +1,13 @@
using System.Runtime.Serialization;
namespace BotSharp.Plugin.MetaMessenger.MessagingModels;
public enum SenderActionEnum
{
[EnumMember(Value = "typing_on")]
TypingOn,
[EnumMember(Value = "typing_off")]
TypingOff,
[EnumMember(Value = "mark_seen")]
MarkSeen
}

View file

@ -24,4 +24,7 @@ public class SendingMessageRequest
[AliasAs("messaging_type")]
public string MessagingType { get; set; } = "RESPONSE";
[AliasAs("sender_action")]
public SenderActionEnum? SenderAction { get; set; }
}

View file

@ -59,6 +59,9 @@ namespace BotSharp.Plugin.WeChat
var result = await conversationService.SendMessage(AgentId, latestConversationId, new RoleDialogModel("user", message), async msg =>
{
await ReplyTextMessageAsync(openid, msg.Content);
}, async fn =>
{
});
}