diff --git a/src/AI/Console/JsonConsoleLoggingExtensions.cs b/src/AI/Console/JsonConsoleLoggingExtensions.cs
index cb2a773..6da2786 100644
--- a/src/AI/Console/JsonConsoleLoggingExtensions.cs
+++ b/src/AI/Console/JsonConsoleLoggingExtensions.cs
@@ -19,7 +19,7 @@ public static class JsonConsoleLoggingExtensions
/// The options type to configure for HTTP logging.
/// The options instance to configure.
///
- /// NOTE: this is the lowst-level logging after all chat pipeline processing has been done.
+ /// NOTE: this is the lowest-level logging after all chat pipeline processing has been done.
///
/// If the options already provide a transport, it will be wrapped with the console
/// logging transport to minimize the impact on existing configurations.
@@ -36,8 +36,7 @@ public static TOptions UseJsonConsoleLogging(this TOptions pipelineOpt
if (consoleOptions.InteractiveOnly && !ConsoleExtensions.IsConsoleInteractive)
return pipelineOptions;
- pipelineOptions.Transport = new ConsoleLoggingPipelineTransport(pipelineOptions.Transport ?? HttpClientPipelineTransport.Shared, consoleOptions);
-
+ pipelineOptions.AddPolicy(new JsonConsoleLoggingPipelinePolicy(consoleOptions), PipelinePosition.BeforeTransport);
return pipelineOptions;
}
@@ -62,16 +61,33 @@ public static ChatClientBuilder UseJsonConsoleLogging(this ChatClientBuilder bui
return builder.Use(inner => new JsonConsoleLoggingChatClient(inner, consoleOptions));
}
- class ConsoleLoggingPipelineTransport(PipelineTransport inner, JsonConsoleOptions consoleOptions) : PipelineTransport
+ class JsonConsoleLoggingPipelinePolicy(JsonConsoleOptions consoleOptions) : PipelinePolicy
{
- public static PipelineTransport Default { get; } = new ConsoleLoggingPipelineTransport();
+ public override void Process(PipelineMessage message, IReadOnlyList pipeline, int currentIndex)
+ {
+ message.BufferResponse = true;
+ ProcessNext(message, pipeline, currentIndex);
+
+ if (message.Request.Content is not null)
+ {
+ using var memory = new MemoryStream();
+ message.Request.Content.WriteTo(memory);
+ memory.Position = 0;
+ using var reader = new StreamReader(memory);
+ var content = reader.ReadToEnd();
+ AnsiConsole.Write(consoleOptions.CreatePanel(content));
+ }
- public ConsoleLoggingPipelineTransport() : this(HttpClientPipelineTransport.Shared, JsonConsoleOptions.Default) { }
+ if (message.Response != null)
+ {
+ AnsiConsole.Write(consoleOptions.CreatePanel(message.Response.Content.ToString()));
+ }
+ }
- protected override async ValueTask ProcessCoreAsync(PipelineMessage message)
+ public override async ValueTask ProcessAsync(PipelineMessage message, IReadOnlyList pipeline, int currentIndex)
{
message.BufferResponse = true;
- await inner.ProcessAsync(message);
+ await ProcessNextAsync(message, pipeline, currentIndex);
if (message.Request.Content is not null)
{
@@ -88,9 +104,6 @@ protected override async ValueTask ProcessCoreAsync(PipelineMessage message)
AnsiConsole.Write(consoleOptions.CreatePanel(message.Response.Content.ToString()));
}
}
-
- protected override PipelineMessage CreateMessageCore() => inner.CreateMessage();
- protected override void ProcessCore(PipelineMessage message) => inner.Process(message);
}
class JsonConsoleLoggingChatClient(IChatClient inner, JsonConsoleOptions consoleOptions) : DelegatingChatClient(inner)