diff --git a/src/Infrastructure/BotSharp.Abstraction/Loggers/IContentGeneratingHook.cs b/src/Infrastructure/BotSharp.Abstraction/Loggers/IContentGeneratingHook.cs
index c82e2fc3..44f229ae 100644
--- a/src/Infrastructure/BotSharp.Abstraction/Loggers/IContentGeneratingHook.cs
+++ b/src/Infrastructure/BotSharp.Abstraction/Loggers/IContentGeneratingHook.cs
@@ -11,6 +11,18 @@ public interface IContentGeneratingHook
///
Task BeforeGenerating(Agent agent, List conversations) => Task.CompletedTask;
+ ///
+ /// Before function is invoked
+ ///
+ ///
+ Task BeforeFunctionInvoked(RoleDialogModel message, TokenStatsModel tokenStats) => Task.CompletedTask;
+
+ ///
+ /// After function is invoked
+ ///
+ ///
+ Task AfterFunctionInvoked(RoleDialogModel message, TokenStatsModel tokenStats) => Task.CompletedTask;
+
///
/// After content generated.
///
diff --git a/src/Infrastructure/BotSharp.Logger/Hooks/VerboseLogHook.cs b/src/Infrastructure/BotSharp.Logger/Hooks/VerboseLogHook.cs
index f93532d8..00b68d4d 100644
--- a/src/Infrastructure/BotSharp.Logger/Hooks/VerboseLogHook.cs
+++ b/src/Infrastructure/BotSharp.Logger/Hooks/VerboseLogHook.cs
@@ -24,8 +24,10 @@ public class VerboseLogHook : IContentGeneratingHook
if (!_convSettings.ShowVerboseLog) return;
var dialog = conversations.Last();
- var log = $"{dialog.Role}: {dialog.Content}";
+ var log = $"[msg_id: {dialog.MessageId}] {dialog.Role}: {dialog.Content}";
_logger.LogInformation(log);
+
+ await Task.CompletedTask;
}
public async Task AfterGenerated(RoleDialogModel message, TokenStatsModel tokenStats)
@@ -36,8 +38,8 @@ public class VerboseLogHook : IContentGeneratingHook
var agent = await agentService.LoadAgent(message.CurrentAgentId);
var log = message.Role == AgentRole.Function ?
- $"[{agent.Name}]: {message.FunctionName}({message.FunctionArgs})" :
- $"[{agent.Name}]: {message.Content}";
+ $"[[msg_id: {message.MessageId}] [{agent.Name}]: {message.FunctionName}({message.FunctionArgs})" :
+ $"[[msg_id: {message.MessageId}] [{agent.Name}]: {message.Content}";
_logger.LogInformation(tokenStats.Prompt);
_logger.LogInformation(log);
diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs
index 0a5a18c2..d2bd08a1 100644
--- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs
+++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/ChatCompletionProvider.cs
@@ -40,8 +40,10 @@ public class ChatCompletionProvider : IChatCompletion
var contentHooks = _services.GetServices().ToList();
// Before chat completion hook
- Task.WaitAll(contentHooks.Select(hook =>
- hook.BeforeGenerating(agent, conversations)).ToArray());
+ foreach (var hook in contentHooks)
+ {
+ hook.BeforeGenerating(agent, conversations).Wait();
+ }
var client = ProviderHelper.GetClient(_model, _settings);
var (prompt, chatCompletionsOptions) = PrepareOptions(agent, conversations);
@@ -74,14 +76,16 @@ public class ChatCompletionProvider : IChatCompletion
}
// After chat completion hook
- Task.WaitAll(contentHooks.Select(hook =>
+ foreach(var hook in contentHooks)
+ {
hook.AfterGenerated(responseMessage, new TokenStatsModel
{
Prompt = prompt,
Model = _model,
PromptCount = response.Value.Usage.PromptTokens,
CompletionCount = response.Value.Usage.CompletionTokens
- })).ToArray());
+ }).Wait();
+ }
return responseMessage;
}
@@ -94,8 +98,10 @@ public class ChatCompletionProvider : IChatCompletion
var hooks = _services.GetServices().ToList();
// Before chat completion hook
- Task.WaitAll(hooks.Select(hook =>
- hook.BeforeGenerating(agent, conversations)).ToArray());
+ foreach (var hook in hooks)
+ {
+ await hook.BeforeGenerating(agent, conversations);
+ }
var client = ProviderHelper.GetClient(_model, _settings);
var (prompt, chatCompletionsOptions) = PrepareOptions(agent, conversations);
@@ -111,14 +117,16 @@ public class ChatCompletionProvider : IChatCompletion
};
// After chat completion hook
- Task.WaitAll(hooks.Select(hook =>
- hook.AfterGenerated(msg, new TokenStatsModel
+ foreach (var hook in hooks)
+ {
+ await hook.AfterGenerated(msg, new TokenStatsModel
{
Prompt = prompt,
Model = _model,
PromptCount = response.Value.Usage.PromptTokens,
CompletionCount = response.Value.Usage.CompletionTokens
- })).ToArray());
+ });
+ }
if (choice.FinishReason == CompletionsFinishReason.FunctionCall)
{