Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public IConversationCompletionHook SetChatCompletion(IChatCompletion chatComplet
return this;
}

public virtual Task OnStateLoaded(ConversationState state, Action<Agent, string>? onAgentSwitched = null)
public virtual Task OnStateLoaded(ConversationState state, Action<Agent>? onAgentSwitched = null)
{
return Task.CompletedTask;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public interface IConversationCompletionHook
IChatCompletion ChatCompletion { get; }
IConversationCompletionHook SetChatCompletion(IChatCompletion chatCompletion);

Task OnStateLoaded(ConversationState state, Action<Agent, string>? onAgentSwitched = null);
Task OnStateLoaded(ConversationState state, Action<Agent>? onAgentSwitched = null);
Task BeforeCompletion();
Task OnFunctionExecuting(string name, string args);
Task AfterCompletion(RoleDialogModel message);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using BotSharp.Abstraction.Conversations;
using BotSharp.Abstraction.Conversations.Models;
using BotSharp.Abstraction.Functions;
using BotSharp.Abstraction.Knowledges.Models;
Expand Down Expand Up @@ -118,9 +119,20 @@ public async Task<bool> SendMessage(string agentId, string conversationId, List<
{
var agent = await _services.GetRequiredService<IAgentService>()
.GetAgent(agentId);

var converation = await GetConversation(conversationId);

// Create conversation if this conversation not exists
if (converation == null)
{
var sess = new Conversation
{
Id = conversationId,
AgentId = agentId
};
converation = await NewConversation(sess);
}

// load state
var stateService = _services.GetRequiredService<IConversationStateService>();
var state = stateService.Load(conversationId);
Expand Down Expand Up @@ -149,11 +161,7 @@ public async Task<bool> SendMessage(string agentId, string conversationId, List<
.SetDialogs(wholeDialogs)
.SetChatCompletion(chatCompletion);

await hook.OnStateLoaded(state, onAgentSwitched: (x, prompt) =>
{
agent = x;
wholeDialogs.Add(new RoleDialogModel("user", prompt));
});
await hook.OnStateLoaded(state, onAgentSwitched: x => agent = x);
await hook.BeforeCompletion();
}

Expand Down
8 changes: 6 additions & 2 deletions src/Infrastructure/BotSharp.Core/Repository/FileRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,12 @@ public IQueryable<ConversationRecord> Conversation
_conversations = new List<ConversationRecord>();
foreach (var d in Directory.GetDirectories(dir))
{
var json = File.ReadAllText(Path.Combine(d, "conversation.json"));
_conversations.Add(JsonSerializer.Deserialize<ConversationRecord>(json, _options));
var path = Path.Combine(d, "conversation.json");
if (File.Exists(path))
{
var json = File.ReadAllText(path);
_conversations.Add(JsonSerializer.Deserialize<ConversationRecord>(json, _options));
}
}
return _conversations.AsQueryable();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,10 @@ public async Task<bool> GetChatCompletionsAsync(Agent agent, List<RoleDialogMode

_logger.LogInformation(message.Content);

await onMessageReceived(new RoleDialogModel(ChatRole.Assistant.ToString(), message.Content));
if (!string.IsNullOrEmpty(message.Content))
{
await onMessageReceived(new RoleDialogModel(ChatRole.Assistant.ToString(), message.Content));
}

return true;
}
Expand Down
12 changes: 0 additions & 12 deletions src/Plugins/BotSharp.Plugin.ChatbotUI/ChatbotUiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,6 @@ public async Task SendMessage([FromBody] OpenAiMessageInput input)

var conversationService = _services.GetRequiredService<IConversationService>();

// Check if this conversation exists
var converation = await conversationService.GetConversation(input.ConversationId);
if(converation == null)
{
var sess = new Conversation
{
Id = input.ConversationId,
AgentId = input.AgentId
};
converation = await conversationService.NewConversation(sess);
}

var result = await conversationService.SendMessage(input.AgentId,
input.ConversationId,
conversations,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public async Task<ActionResult<WebhookResponse>> Messages([FromRoute] string age
var conv = _services.GetRequiredService<IConversationService>();

string content = "";
var sessionId = req.Entry[0].Messaging[0].Sender.Id;
var senderId = req.Entry[0].Messaging[0].Sender.Id;
var input = req.Entry[0].Messaging[0].Message.Text;

var setting = _services.GetRequiredService<MetaMessengerSetting>();
Expand All @@ -78,38 +78,38 @@ public async Task<ActionResult<WebhookResponse>> Messages([FromRoute] string age
};

// Marking seen
/*await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Recipient = JsonSerializer.Serialize(new { Id = senderId }, 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),
Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt),
SenderAction = SenderActionEnum.TypingOn
});

// Go to LLM
var result = await conv.SendMessage(agentId, sessionId, new RoleDialogModel("user", input), async msg =>
var result = await conv.SendMessage(agentId, senderId, new RoleDialogModel("user", input), async msg =>
{
content = msg.Content;
}, async fn =>
{
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
/*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)
});
});*/

await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt),
SenderAction = SenderActionEnum.TypingOn
});
});
Expand All @@ -118,15 +118,15 @@ public async Task<ActionResult<WebhookResponse>> Messages([FromRoute] string age
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Recipient = JsonSerializer.Serialize(new { Id = senderId }, 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),
Recipient = JsonSerializer.Serialize(new { Id = senderId }, jsonOpt),
SenderAction = SenderActionEnum.TypingOff
});
}
Expand Down